00 / guide
Stripe webhook works in test mode but not live
Test payments unlocked premium every time. Then you switched to live keys, a real customer paid, and nothing happened. Test and live mode are two separate setups. Here is what has to be copied over.
01 / what CheckoutAlarm checks
a
What it would catch here
Give it a live read-only key and it watches live mode: live events that stay undelivered, live endpoints that are disabled, and live sales that stall. A test key only reads test mode, so use a live key once you launch.
b
What it won't catch
It won't compare your test and live setups. It doesn't alert when live mode has no endpoint at all. Use the checklist below.
c
Plans
Free: 1 site, checked once a day. Pro: $19 a month, up to 3 sites checked hourly. You prove you own the site first. For Stripe we only take a restricted key with read access to Events, Webhook Endpoints and Charges. Full secret keys are refused. Compare plans
02 / the go-live checklist
1
Create a live endpoint
Objects in one mode can't be used in the other, and webhook endpoints are objects. Stripe's go-live list says to "update each webhook endpoint's URL and copy the new signing secret." Switch the dashboard to live and add the endpoint there. Stripe: switch to live mode
2
Use the live signing secret
"If you use the same endpoint for both test and live API keys, the secret is different for each one." Put the live whsec_ secret in your production settings. A test secret on live events fails the signature check. Stripe: verify events
3
Swap the API keys
Test keys start with sk_test_ or rk_test_. Live keys start with sk_live_ or rk_live_. Update them where your app reads them, then redeploy. Stripe: API keys
4
Swap the price IDs
Lovable's guide to going live says to switch to live price IDs, because they differ between modes. The same is true in any app. Lovable: Stripe go-live checklist
5
Use a real HTTPS address
In live mode the endpoint must use HTTPS. A tunnel or localhost URL that worked with the Stripe CLI won't work here. Stripe: receive events with HTTPS
03 / still failing?
a
Read the live deliveries
In live mode, open the endpoint's Event deliveries and match the status code to Stripe's table. Stripe: fix HTTP status codes Then see 400, 500 and timeouts or 401 errors.
b
Make one real purchase
Lovable's go-live list ends with a real purchase to confirm it works. Buy your own cheapest plan and check that premium unlocks. Lovable: go live
04 / questions
- Do test and live mode share webhook endpoints?
- No. Each mode has its own objects, and Stripe's go-live list says to update each endpoint's URL and copy the new signing secret. You set up the live endpoint separately.
- Is the signing secret the same in live mode?
- No. Stripe says that if you use the same endpoint URL for test and live keys, the secret is different for each one.
- My price IDs work in test but fail live. Why?
- Prices are objects, and objects made in test mode don't exist in live mode. Lovable's docs also say price IDs differ between modes.
05 / where CheckoutAlarm fits
With a live read-only key, CheckoutAlarm emails you when live events stay undelivered or a live endpoint is disabled. It doesn't alert on a missing live endpoint today.
CheckoutAlarm is new. It only checks sites you prove you own. How to verify
Watch my app free06 / sources
- Stripe: API keys (test and live prefixes, modes)
- Stripe: switch to live mode
- Stripe: verify events (secret differs per mode)
- Stripe: receive events with an HTTPS server
- Stripe: fix HTTP status codes
- Lovable: Stripe integration (go live, price IDs)
Docs checked on Oct 20, 2026.