Why does my Shopify order confirmation say an item is sold out after the customer already paid?
A customer paid successfully, but the order confirmation email tells them the item is sold out. Here's why that happens and how to fix the template, not the order.
What's going on
A customer completes checkout, the payment goes through, and the order shows up fine in the admin — but the confirmation email (or the order status page) tells the customer the item is "sold out" or "currently unavailable." Understandably, this looks alarming: did the order actually go through? Will the item ship? Merchants who've hit this describe it as a scary moment where a perfectly good sale looks broken from the customer's side, even though nothing is actually wrong with the order itself.
The confusion usually comes down to timing. Shopify's checkout reserves inventory the moment a customer pays, so the order itself is real and valid. The sold-out message shows up separately, in whatever renders the confirmation email or order status page, and that rendering can be looking at current stock levels rather than the stock levels at the time of purchase. If the last unit of a product sells and inventory drops to zero right after (sometimes from that very order), any part of your notification flow that checks live availability will flag it as out of stock even though the transaction is done and paid for.
Why it happens
Shopify's default order confirmation notification is built from the order's own line item data, but many stores have customized this template over time — sometimes by different people, sometimes copied in from an old theme or app snippet. If that customization introduced a Liquid check against live product or variant availability (rather than the static order data), the email effectively asks "is this still in stock right now?" instead of "what did the customer buy?" Those are two different questions, and only the second one is relevant to a completed order.
This is made worse by simple timing: inventory counts update in real time as orders come in. If stock is thin, or if the order that just completed was itself the one that used up the last unit, a live-availability check performed even a few seconds after checkout can return "unavailable" for an item that was, in fact, successfully purchased. Add a second app into the mix (post-purchase upsell, review request, SMS confirmation) and you can get the same false sold-out message from a completely different source than the core Shopify notification.
5 ways to fix it
Check your Order confirmation template for live-availability tags (do this first)
Open Settings > Notifications > Order confirmation in your admin and look at the Liquid inside it. If someone previously customized it and pulled in `{{ product.available }}`, `{{ variant.available }}`, or similar current-stock checks instead of the order's own line item data, the email is re-checking inventory levels at send time, not at the moment the order was placed. If the item's stock happens to sit at zero right after the sale (including from the very order that just cleared it out), the email displays a sold-out message even though payment succeeded and the order is completely valid. Strip out any live-availability conditionals and let the template use the order's line item snapshot instead.
Review "Continue selling when out of stock" on the affected variant
Under the product's variant settings, the Inventory section has a toggle for continuing to sell once quantity hits zero. If it's off and your stock count is tight (or another concurrent order is draining the same pool), a customer can complete checkout in the moment stock is still available, only for the count to hit zero by the time confirmation renders. Decide deliberately: turn this on if you're comfortable with occasional backorders, or build in a small buffer/safety stock so counts don't bottom out exactly at the point of sale.
Audit any third-party app that also sends post-purchase messages
If you have upsell, review-request, loyalty, or SMS/email marketing apps that fire their own transactional messages after checkout, check whether they independently query live product availability rather than reading the order payload. It's common for a merchant to blame the core confirmation email when a bolt-on app's message is the one showing the stale or contradictory sold-out notice.
Do not auto-cancel orders that trigger this flag
Some merchants' instinct is to set up automatic cancellation or refund rules whenever a sold-out flag appears on an order. Resist that: the payment and order are legitimate, and auto-cancelling a paid order over a cosmetic notification bug creates real customer service problems (refund disputes, chargebacks, lost trust) for what is usually just a template rendering issue. Fix the template/setting instead of the order.
If the customization is tangled, get a developer to do a notification/theme audit
If your notification templates have been edited multiple times by different people (or copied from an old theme), it can be faster to have a developer review the full order-to-confirmation flow — templates, webhooks, and any apps touching order events — rather than guessing at which snippet is stale. This is a one-time cleanup, not something you need a subscription app for.
Bottom line
This is almost always a rendering/template problem, not an inventory problem: the order and payment are fine, but something in your confirmation email (or a connected app) is checking live stock instead of what was actually purchased. Start with the notification template Liquid and your variant's oversell setting before touching anything else, and avoid any automation that cancels or refunds orders based on this flag — a short one-time template cleanup, done yourself or with a developer, is the real fix here.
Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.