Event
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.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
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. | array | No | ["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.
| Field | Type | Example |
|---|---|---|
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. | string | sale |
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. | string | EDPE-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. | string | 524459995 |
product_id The product's Gumroad id. | string | A-mMS-2Vd0Nn0-hHnZmMQQ== |
product_name The product's name. | string | The 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). | string | buyer@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. | string | 1000 |
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. | string | 2026-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. | boolean | false |
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.