Guides · Gumroad
Get a Mac notification for every Gumroad sale
Gumroad's Ping posts to a URL of yours the moment someone buys. Point it at EventBar and every sale pops up in your menu bar, with today's and this month's count a glance away, without refreshing the Gumroad dashboard. Ping is form-encoded rather than JSON; EventBar reads it either way.
Needs: the free EventBar app on your Mac, an EventBar account, and a Gumroad account. About five minutes. Gumroad preset, signature verified.
Steps
- Create the webhook URL. In the EventBar dashboard, open the Webhooks tab, pick the group this belongs to (one group per site or app is the usual shape), choose the provider Gumroad, name it, and press Create. Copy the URL; it stays visible and can be rotated any time.
- Paste it into Gumroad. In Gumroad: Settings, then Advanced, then the Ping section. Paste the URL into Ping endpoint and save. To have pings signed, turn on Sign pings in the same section and paste the secret Gumroad shows into the hook card in EventBar. Send test ping to URL then resends your latest sale with
testset, and it shows up assale.test. - Trigger one. Most services offer a test delivery; otherwise do the real thing once. It shows up in the dashboard's Events tab within a second and in the menu bar, as an undefined type named after the event. That first one is your proof the wiring works.
- Make it read well. Press Define on the new type and give it a title and a body template. Fields come from the payload, nested ones with dots. The table below is a starting point.
This preset is on Plus and Pro. Free can do the same with a Generic JSON hook and a type field of resource_name, without the signature check, but a retried ping can count twice and a test ping counts as a sale: Gumroad sends no id field for a Generic JSON hook to dedupe on.
What you'll see
| Type | Title | Body template |
|---|---|---|
sale | Sale | {product_name} · {price} US cents · {email} |
sale.test | Test ping | {product_name} · {email} |
refund | Refund | {product_name} · {price} US cents · {email} |
cancellation | Cancellation | {product_name} · {user_email} |
Every type has its own switch in the menu bar, so a noisy one can be quiet on this Mac and still counted. Counts cover the last hour, 24 hours, 7 days, 30 days and all time.
Worth knowing
- The Ping endpoint only gets sales. Refunds, disputes (
dispute,dispute_won) and membership changes (cancellation,subscription_updated,subscription_ended,subscription_restarted) come through Gumroad's API instead. Create an application under Settings, Advanced, Applications, generate an access token, and subscribe the same URL once per event:curl https://api.gumroad.com/v2/resource_subscriptions -X PUT -d access_token=YOUR_TOKEN -d resource_name=refund -d post_url=YOUR_HOOK_URL. Gumroad doesn't sign these, so on a hook that gets them leave the secret empty, or make a second hook for them. - The type is Gumroad's
resource_name, so a sale and its refund each get their own switch and count. Duplicates are dropped bysale_idtogether withresource_name, as Gumroad says to do: a refund repeats its sale's id, and a retry (Gumroad retries a 5xx after 1, 3 and 10 minutes) never counts twice. priceis in US cents whatever the product'scurrency, so1900is $19.00; a template can't divide.variants,url_paramsandcustom_fieldsarrive nested, so{variants.Edition}and{url_params.utm_source}work in a template.- A test, whether from Send test ping or from buying your own product, carries
test=trueand issale.test, never deduplicated, so it doesn't inflate your sale count. Mute it from the menu bar once you've seen one. - The signature is
X-Gumroad-Signature:t=the send time andv1=the hex HMAC-SHA256 of the time, a period and the raw body, the check in Gumroad's docs. A ping more than five minutes old is refused. If you rotate the secret in Gumroad, paste the new one at once: Gumroad doesn't retry a ping that was refused. - EventBar doesn't keep the buyer's
license_keyor thecarddetails from a Gumroad ping; the other fields are kept as usual (the buffer on paid plans, up to 2 KB).
The full contract, including how each preset reads a payload and what the answers mean, is in the API docs. Something about Gumroad's payload changed? Tell us and we'll fix the guide.