- a failed charge,
- a subscription that dropped,
- a plan that shrank.
Webhooks are not required: the periodic re-read catches everything anyway.
They only shorten the gap between “the customer canceled” and “you found out”
— from hours to seconds. On Stripe it is already on; on AbacatePay and Asaas,
you turn it on.
Each gateway connects differently
How you wire the webhook changes with the source, because each one’s security model is different. One asks for zero work; the other two ask you to paste a URL.Stripe
Nothing to do. OAuth wires it all.
AbacatePay
Paste the URL in the webhooks panel.
Asaas
Paste the URL and the token — or one click.
Stripe — nothing to set up
Stripe connects over OAuth (Connect). A single Keep endpoint receives events from every connected account, and each delivery says which account it came from. You create no webhook: the moment you connect, the events already arrive. Each delivery comes signed (thestripe-signature header), and Keep
verifies the signature over the raw body before reading anything. An invalid
signature is rejected and never becomes a number.
What Stripe pushes: cancellation, plan change (up or down), a failed charge, a
trial that ended without a card, and the account disconnecting itself. Failed
payment, trial end, cancellation, and plan change turn into an instant alert —
respecting whatever you muted in Preferences — and all of them update MRR,
subscriptions, and the movement chart.
AbacatePay — paste the URL
AbacatePay has no OAuth, so the webhook is per connection: Keep generates an address that is yours alone, with an embedded secret, and you paste it into AbacatePay’s webhooks panel.1
Copy the URL in Integrations
In the AbacatePay card, under Integrations, Keep shows your webhook URL
— something like
https://usekeep.dev/api/abacatepay/webhook/…?webhookSecret=….
The secret is part of the URL; treat the whole URL as a secret.2
Paste it in AbacatePay's panel
Under webhooks, in AbacatePay’s panel, paste the URL. Nothing else to
configure — the authentication travels in the URL itself.
webhook-signature header) on top of the secret in the URL — either one
authenticates, and it is checked in constant time before any processing.
What AbacatePay pushes: subscription activated, subscription canceled, and a
failed charge. The failed payment turns into an instant alert; the birth and
death of a subscription update the numbers and the movement chart.
Asaas — paste the URL and the token
Asaas is also per connection, with a difference that matters: Asaas does not sign its webhooks. It sends back, in a header, a token the receiver configures. So Keep generates that token, and you paste it alongside the URL.1
Let Keep register it for you
In the Asaas card, under Integrations, there is a button that registers
the webhook for you, via the Asaas API — it creates the address, sets the
token, and marks the right events. It is the recommended path: one click and
done.
2
Or set it up by hand
If you would rather, copy the URL (
https://usekeep.dev/api/asaas/webhook/…)
and the token Keep shows, and paste both into Asaas’s webhooks panel — the
URL as the address, the token in the authentication token field.PAYMENT_OVERDUE). The overdue one turns into an instant alert;
the subscription ones update the numbers, the movement chart, and the churn
rate — it is what brings Asaas churn into the count.
How Keep guards the door
In all of them, the body is read raw (the proof of origin is over the exact
bytes), and what authenticates is checked before any processing. No secret
appears in a log or in the response.
Redelivery is safe
Gateways deliver at least once — the same event can arrive twice. Keep was built for it:- A revenue change is recorded by event identity, so a redelivery does not count the same cancellation twice or double the churn.
- An alert is claimed before it goes out, so Slack does not get the same message again.
- An event Keep decides to ignore returns
200, so the gateway stops resending it. Only a real failure on our side returns500, which is what deserves a retry.
