Event

trigger.gumroad_event
TriggerBusiness appsconnection requiredruns in-engine

Registers a Gumroad resource subscription per event at publish and starts one run per ping. Emits {resource_name, sale_id, email, price, payload}.

Start a run when Gumroad reports a sale, refund, dispute or subscription change.

Connection

Required
Yes — the node will not save without one
Auth type
Bearer token
Providers
Gumroad
Secret shape
the Gumroad access token (or {"access_token": …})
Resolved by
config.connection_id, else node.connection_id
Note
The token needs the view_sales scope — Gumroad gates listing, creating and deleting resource subscriptions on it, and only delivers a ping while the application that owns the subscription still has a live view_sales or account token. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to a publicly resolvable URL: Gumroad resolves post_url when it is registered and refuses any address in a private or loopback range.

Configuration

1 field, none required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.

FieldTypeRequiredDefaultConstraintsExample
resource_names
Which Gumroad events to subscribe to. One resource subscription is registered per name and deleted again when the workflow is unpublished, disabled or archived.
arrayNo["sale"]1–8 characters; array of string—

Example configuration

Every value below is the contract’s own example or default — nothing invented.

{
  "resource_names": [
    "sale"
  ]
}

Output

One shape.

gumroad ping

A flat envelope over Gumroad's form-encoded ping, with the whole decoded body under `payload`. Which keys `payload` carries depends on the resource, so the shape is open below the declared fields.

Extra keys beyond the ones listed can appear.

FieldTypeExample
resource_name
Which subscription delivered this — sale, refund, dispute, dispute_won, cancellation, subscription_updated, subscription_ended or subscription_restarted. Branch on it when the trigger covers more than one.
stringsale
sale_id
Gumroad's id for the purchase, on the four purchase events (sale, refund, dispute, dispute_won). Empty on the subscription events, which are about a subscription rather than one charge.
stringEDPE-vlA1PmBmClJb-Ppcg==
subscription_id
The membership this event belongs to. Present on every subscription event and on a sale that is a recurring charge.
string—
order_number
The numeric order handle Gumroad shows the seller. Also what gumroad.list_sales filters on.
string524459995
product_id
The product's Gumroad id.
stringA-mMS-2Vd0Nn0-hHnZmMQQ==
product_name
The product's name.
stringThe Minimalist Entrepreneur
product_permalink
The product's public URL.
string—
email
The buyer's email address (Gumroad's `email` on a purchase event, `user_email` on a subscription one).
stringbuyer@example.com
price
What the buyer paid, in the smallest unit of `currency`. A string, like every other value: a form body carries no types.
string1000
currency
ISO code of the currency the product is listed in.
string—
sale_timestamp
When Gumroad recorded the sale (ISO-8601), or the subscription's created_at on a subscription event.
string2026-09-08T12:00:00Z
test
True when the buyer was the seller themselves, which is how Gumroad marks a test purchase. Check it before anything that ships goods or mails a customer.
booleanfalse
payload
Gumroad's whole form body, decoded — including the fields above and everything they do not lift out (quantity, refunded, license_key, variants, custom_fields, url_params, card…). Bracketed keys are put back together, so `card[visual]` reads as payload.card.visual.
object—
{
  "currency": "usd",
  "email": "buyer@example.com",
  "order_number": "524459995",
  "payload": {
    "card": {
      "type": "visa",
      "visual": "**** **** **** 4242"
    },
    "email": "buyer@example.com",
    "price": "1000",
    "quantity": "1",
    "refunded": "false",
    "resource_name": "sale",
    "sale_id": "EDPE-vlA1PmBmClJb-Ppcg=="
  },
  "price": "1000",
  "product_id": "A-mMS-2Vd0Nn0-hHnZmMQQ==",
  "product_name": "The Minimalist Entrepreneur",
  "product_permalink": "https://gumroad.com/l/minimalist",
  "resource_name": "sale",
  "sale_id": "EDPE-vlA1PmBmClJb-Ppcg==",
  "sale_timestamp": "2026-09-08T12:00:00Z",
  "subscription_id": "",
  "test": false
}

Notes

  • Gumroad does not sign its pings — there is no signature, timestamp or shared secret to check. The callback URL's unguessable id is what keeps it private, so treat the payload as untrusted input.
  • Deliveries are form-encoded, and every value in `payload` is a string.
  • A retry (Gumroad retries a 5xx up to four times with backoff) reuses the same ids, so it joins the run it already started instead of starting a second.
  • The subscriptions are deleted at Gumroad when the workflow is unpublished, disabled or archived — a seller never keeps pinging a dead workflow.

See Event run in a workflow.

In a technical demo we add the Gumroad connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.