CheckoutAlarmWatch my app free

Stripe "No such price" error: why checkout breaks after you go live

The checkout button worked while you were testing. Now it fails, and the server log says Stripe can't find the price. That means the price ID your code sends doesn't exist for the key it sends it with. There are four usual reasons, and each takes a minute to check.

Free tool: whether a key is a test or live key

What it would catch here

If your store already had steady sales and every checkout now fails, CheckoutAlarm sends a stalled-sales email at its next Stripe check (once a day on Free, hourly on Pro): no successful charges in 48 hours when the previous 14 days averaged at least 3 in a window that long.

What it won't catch

It never sees the API error. It won't alert for a store that just went live with no sales history, or when only one of several prices is wrong and other sales still go through. Check your server logs for the error.

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

Stripe can't find the ID

A 404 from Stripe means the requested resource doesn't exist. Stripe API: errors The error code is resource_missing: the ID isn't valid, either because the object doesn't exist or because it's an ID for a different kind of object. Stripe: error codes

It's about the key, not just the ID

The same price ID can work with one key and fail with another. Stripe looks for it in the mode and account that the key belongs to.

A test price with a live key

Each mode has its own keys, and objects in one mode aren't available in the other. Stripe's example: a sandbox product can't be part of a live payment. Stripe: sandbox versus live mode If you swapped in sk_live_ but left the price_ IDs from testing, this is the error you get. More in works in test mode but not live.

You copied the product to live, but kept the old ID

Stripe's Copy to live mode button copies the product and its prices. Each copy is a separate live product, and later changes to the sandbox product aren't carried over. Stripe: copy products to live mode So the live price has its own ID. Copy it from the live product page.

The key belongs to a different account

A key from another Stripe account, or a teammate's sandbox, can't see your prices. With Connect, a price that lives on a connected account needs that account's ID in the Stripe-Account header. Stripe: making API calls for connected accounts

A product ID where a price ID goes

Checkout's line_items take Prices. Stripe API: create a Checkout Session A prod_ ID in the price field is "an ID for a different resource". Stripe: error codes

Not this error, but close: an archived price

An archived price still exists but has active set to false, which means it can't be used for new purchases. Stripe API: the Price object Archiving a price also turns off payment links that use the product. Stripe: archive a price

Find the failing request

Stripe's Workbench request logs show each API request and its error. Stripe: API keys Note which key made the request and which price ID it sent.

Look the price up with the same key

Retrieve the price with the key your server uses. You get the price back if it exists, or an error if it doesn't. A price that comes back has a livemode field, so you can see which mode it's in. Stripe API: retrieve a price

Keep test and live IDs apart

Store price IDs in environment variables next to the keys, so the live deployment gets live IDs and live keys together.

Or look prices up by lookup key

Give each price a lookup_key, set the same key in test and live mode, and fetch the price with the lookup_keys filter instead of hard-coding the ID. Stripe: lookup keys Stripe API: list prices

What does "No such price" mean in Stripe?
The price ID in your request doesn't exist for the API key you sent it with. Stripe returns a 404 with the error code resource_missing.
Why does my price work in test mode but not live?
Test and live mode have separate objects. A price made in a sandbox can't be used in a live payment, and copying a product to live mode creates a new product with new price IDs.
Does CheckoutAlarm catch a "No such price" error?
Not the error itself. If your store had steady sales and checkout now fails every time, its stalled-sales check emails you once 48 hours pass with no successful charges, at its next Stripe check (once a day on Free, hourly on Pro). A new store with no sales history, or one wrong price among several working ones, won't trigger it.

CheckoutAlarm doesn't see the "No such price" error. If steady sales stop for 48 hours, it sends a stalled-sales email at its next Stripe check. It won't alert for a new store with no sales history.

CheckoutAlarm is new. It only checks sites you prove you own. How to verify

Watch my app free

Docs checked on Oct 21, 2026.