Symptoms
billing.webhooks.failingpages, from a stored billing event that recorded a failure.billing.reconcile.discrepancyarrives when events pile up unprocessed.asobeast_billing_events_unprocessedclimbs and does not drain.- A customer reports a
402after paying, or keeps full access after cancelling.
Triage
1
Check the webhook secret before anything else
An unverified endpoint refuses every delivery, so a paid subscription never provisions. If
STRIPE_WEBHOOK_SECRET is empty or stale, nothing else you do will hold.2
Read the workspace
storedPlan is what the database holds. plan is what entitlement resolves right now, which is what the customer actually experiences.3
Compare with the provider
Open the same customer in the provider dashboard. The provider is the source of truth for the subscription; the database is not.
Containment
-
Reconcile the one workspace, which corrects local state from the provider and records who did it and why:
- Reconciliation looks for a subscription on the workspace customer as well as by the stored id, so a customer who paid and whose webhook never landed is repaired by this step rather than needing the id pasted in by hand.
- If many workspaces are wrong, fix the webhook path first. Reconciling everyone against a broken cause just delays the same incident.
- Replayed events are safe. Webhook handling is idempotent and a stored event is processed once.
Recovery
- Confirm the daily reconciliation from
CRON_BILLING_RECONCILEruns clean, withasobeast_billing_events_unprocessedback at zero. - Confirm
asobeast_billing_events_failedis zero. It pages precisely so that a single failure does not sit unnoticed. - Re-register the webhook endpoint with the provider if the secret changed, and verify with one test delivery.
Who to tell
- The affected customer, directly, the same day. Say what happened, that access is restored, and whether they were charged.
- Every customer, only when checkout itself was down. A lockout affecting a handful of accounts is handled account by account.
- Nobody, for a payment that failed for the customer’s own reason. Dunning already emails them a portal link.