HookGet Open dashboard

Stripe → HookGet

Stripe calls HookGet; the request is verified at the door and becomes normalised events on the same pipeline as everything else you deliver.

In short

  • Stripe’s t=,v1= signature is verified over the raw bytes, with a replay window, before anything is stored.
  • payment_intent.succeeded becomes payment.succeeded; the amount is a metric in cents; the customer is the entity.
  • Events not in the mapping table arrive under their Stripe name rather than being dropped.
  • Stripe’s own event id is the idempotency key, so their redeliveries never duplicate.

What it produces

Stripe sendsBecomesData
payment_intent.succeeded / charge.succeededpayment.succeededamount_cents, currency, status
payment_intent.payment_failed / charge.failedpayment.failedamount_cents, currency
charge.refundedrefund.createdamount_cents
charge.dispute.created / .closeddispute.created / dispute.closed
invoice.paid / .payment_failedinvoice.paid / invoice.payment_failedamount_cents
customer.subscription.created / .updated / .deletedsubscription.started / .updated / .cancelled
checkout.session.completedcheckout.completedamount_cents
anything elsestripe.<their name> — passed through

Set up

curl -X POST https://api.hookget.com/v1/sources \
  -H "authorization: Bearer $HOOKGET_KEY" \
  -d '{"provider":"stripe","name":"prod payments"}'
# → paste the returned whsec_… secret into Stripe → Webhooks → your endpoint
"eventType": "payment.succeeded" Canonical, not vendor-flavoured — one alert covers every payment provider
"occurredAt": "2026-08-20T18:20:00.000Z" When it happened at the source. receivedAt is kept separately — provider delays stay visible
"entity": {"type":"customer","id":"cus_9"} Who or what it is about. Identifiers live here, never in attributes
"attributes": {"provider":"stripe","currency":"usd"} Only things you would group by. Ids, emails and URLs are refused by name
"metrics": {"amount_cents":4299} Finite numbers only, unit in the name. All money in cents, whatever the provider reports
"privacy": {"classification":"confidential","containsPii":true} Declared per event. The default is the strictest class, on purpose
The envelope a connector extracts, stored beside your payload — never inside it, so the bytes a signature covers and the body a consumer receives are untouched.

Stated plainly

Stripe has several hundred event types and the mapping covers the revenue pipeline. The rest are not lost — they arrive under their Stripe names, marked as passthrough. Sources created before connectors existed keep the old stripe.* names so existing filters never break.

Questions

Do I need to change my Stripe webhook configuration?

No. Point Stripe at the ingest URL, paste the secret, choose the events you want in Stripe's own dashboard. Verification uses Stripe's documented scheme with a timestamp tolerance, over the exact bytes they send.

What does a payment event look like to my consumers?

The body your consumers receive is Stripe's own payload, untouched — signatures cover the original bytes. The canonical envelope (event type, cents, entity) is stored alongside and returned by the events API.