Stripe webhook
Failed payments, refunds, disputes, new subscriptions and large payments from Stripe, with typed amounts.
Setup
- In the Stripe Dashboard open Developers, then Webhooks, and choose Add endpoint. Use Test mode first if you want to try it safely.
- In PingLoom open Webhooks, choose New webhook source, pick Stripe, and paste the endpoint's signing secret (starts with whsec_). Stripe shows it after the endpoint exists, so create the endpoint with a placeholder URL first, then edit its URL.
- Tick the events in PingLoom's list, and select the same event types in Stripe: invoice.payment_failed, charge.failed, charge.dispute.created, charge.dispute.closed, charge.refunded, checkout.session.completed, customer.subscription.deleted, payment_intent.succeeded. Add customer.subscription.created and refund.created only if you want them.
- Optional: set Large payment minimum on the source (for example 500) and turn on Large payment. Payments at or above it then arrive as Large payment.
- Send a test event from Stripe. The request appears under Recent requests on the PingLoom source page.
Verification
Stripe sends a Stripe-Signature header (t=timestamp,v1=HMAC-SHA256 of the timestamp, a dot and the raw body), signed with the endpoint's whsec_ signing secret. PingLoom rejects requests whose timestamp is more than five minutes off, and uses the Stripe event id to drop repeats.
Events
You choose which events become alerts when you create the source, and you can change it later on the source page.
| Event | Priority | On by default |
|---|---|---|
| Invoice payment failed | high | Yes |
| Charge failed | high | Yes |
| Dispute opened | high | Yes |
| Dispute closed (lost is high, won is normal) | high | Yes |
| Charge refunded | normal | Yes |
| Checkout completed | normal | Yes |
| Subscription cancelled | normal | Yes |
| Payment succeeded | low | Yes |
| Refund created (repeats Charge refunded) | normal | No |
| Subscription started | low | No |
| Large payment | normal | No |
Every money alert carries data.amount (a whole number in the currency's smallest unit, so 4999 is 49.99 USD), data.currency, data.event_type and the Stripe object id. Customer emails, names and card details are never copied.
The large payment minimum is a number in the payment's own currency. It does not convert between currencies.