Keeping small apps alive

Stripe webhook signature verification failed: every error and its fix
Every error constructEvent can throw, with the cause and the fix for each. Most of them are one bug — a body parser changed the request bytes before verification ran — and exactly one of them isn't about the body at all.

Stripe webhook duplicate events: stop the double charge
Stripe's delivery is at-least-once, so the same event can arrive twice and charge a customer twice. Here's why it happens, and how to make your handler idempotent with the event id so running it twice is safe.

Stripe subscription not activating after payment
Paid but still not upgraded? The subscription's status splits it in two: stuck in 'incomplete' means the payment never finalized; active-in-Stripe-but-not-your-app means a webhook never landed. Here's how to tell which.

How to test Stripe webhooks locally (and what it won't prove)
The Stripe CLI brings events to your machine — stripe listen forwards them, stripe trigger fires them. Here are the commands, the signing-secret gotcha, and why passing locally doesn't prove the live endpoint works.

Is my website down, or is it just me?
Before you panic-redeploy at midnight: is the site actually down, or just down for you? A 30-second test, what each answer means, and why one check from your laptop can't really tell you.

My website is down — how to fix it
Don't randomly restart things — work a short list in order, cheapest check first. Confirm it's really down, read the error, rule out an expired cert, check your last deploy and your host. The calm playbook for a site that's down.

Why Supabase pauses your project — and how to stop it happening again
The pause always lands when you've stopped watching. Here's the real mechanic behind it, the 90-day deadline nobody mentions, and why most keep-alive scripts quietly stop working.