If you run Stripe webhooks through a Supabase Edge Function, these are the common ways it breaks. They all end the same way: Stripe and your subscriptions table disagree about who's paying, and nothing alerts you.
How to check what's broken: in the Stripe dashboard, open the webhook endpoint and read the recent deliveries (status code and response body). Then compare Stripe's active and canceled subscriptions against your table. A canceled customer who still has access in your table means 5 or 6.
Disclosure: I built a tool that does that comparison automatically. It uses a restricted read-only Stripe key and a read-only Postgres role (or a small read-only endpoint), never writes anywhere, and lists every customer the two sides disagree about with a suggested fix. The first scan is free, no account:
Dear_Cicada1806 discusses common issues when running Stripe webhooks through Supabase Edge Functions, including signature verification, JWT issues, and state drift in production. They provide solutions for each problem and offer a tool to compare Stripe and database states. Soccer_Vader suggests local testing and canaries as alternatives.
All of this is like a you problem, 15 mins of local testing would make all of the listed issue a nothing burger.
Also stripe sk test key means it's like free to run E2E test against them, why will I use your service when I can just run canaries?
Fair enough: signature, JWT, parsing, you'll catch those locally easy, and if you have e2e tests + canaries is solid setup.
What tests and canaries don't cover is state drift in production. A canary tells you the webhook works right now for a synthetic customer. It doesn't tell you which of your real customers are already wrong: the ones cancelled or refunded by hand in the dashboard when you don't subscribe to that event, the events lost while the endpoint was down past Stripe's ~3 days of retries, or the rows that went bad before you fixed the bug, which fixing the handler doesn't repair.
That's the gap - comparing what Stripe says with what your table says, customer by customer. If your setup already makes that impossible, you genuinely don't need it. The service is mostly for founders building on lovable and similar tools, who often don't know E2E tests or canaries exist, let alone set them up
Happy to help debug anyone's webhook in the comments.