Guides · Paddle
Get a Mac notification for every Paddle sale and subscription
Paddle Billing posts a notification for every transaction and subscription change, signed with the destination's secret key. The Paddle preset verifies it, takes the type from event_type, and gives sales, new subscriptions and cancellations their own switches and counts.
Needs: the free EventBar app on your Mac, an EventBar account, and a Paddle account with permission to add webhooks. About five minutes. Paddle 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 Paddle, name it, and press Create. Copy the URL; it stays visible and can be rotated any time.
- Paste it into Paddle. In Paddle: Developer tools, then Notifications, then New destination. Give it a description, type Webhook, URL the hook URL, and tick the events (
transaction.completed,subscription.created,subscription.canceled,transaction.payment_failed). After saving, open the destination and copy its secret key (starts withpdl_ntfset_); paste it into the hook card in EventBar and press Save secret. The type comes fromevent_typeon its own. - 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 type, without the signature check.
What you'll see
| Type | Title | Body template |
|---|---|---|
transaction.completed | Sale | {data.details.totals.total} {data.currency_code} · {data.customer_id} |
subscription.created | New subscription | {data.id} · {data.customer_id} |
subscription.canceled | Cancellation | {data.id} · {data.customer_id} |
transaction.payment_failed | Payment failed | {data.id} · {data.customer_id} |
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
- Totals are strings in the currency's smallest unit (
1900for 19.00 USD), as Paddle sends them; a template can't divide. - Sandbox and live are separate Paddle accounts with separate notification destinations; make two hooks in two groups if you want both.
- Duplicates are dropped by
event_id, so Paddle's retries never count twice. The signature check uses thetsinPaddle-Signaturewith a five-minute tolerance. Paddle Classic is a different product with a different payload; this guide is Billing only.
The full contract, including how each preset reads a payload and what the answers mean, is in the API docs. Something about Paddle's payload changed? Tell us and we'll fix the guide.