CheckoutWorks Shopify Partner

We fix Shopify bugs at a flat $49 per fix. Most fixes within 24 hours.

Fix My Bug →

Shopify Product Shows Sold Out but Has Inventory: How to Find the Cause

·Johnny Chen Founder & Shopify Developer at CheckoutWorks
Cover reading “SOLD OUT BUT IN STOCK?” beside a Shopify admin list showing 3 available for size M and a product page showing size M as sold out.

If a Shopify product shows Sold out while admin still lists stock, check whether that stock is sellable to the customer who is looking. For an inventory-tracked variant that doesn't continue selling when out of stock, the Online Store reads the variant's Available quantity at locations that fulfill online orders and ship to the customer's region. The On hand number in admin can be higher.

Before you change any settings, check the variant's Available inventory, then compare the same variant in a fresh copy of your theme. Together these checks show whether to start with the inventory data or with the storefront.

What you see Where to look
On hand is above 0, Available is 0 Inventory states
Stock exists only at a store or warehouse that doesn't fulfill online orders Location settings
Only customers in some countries see Sold out Locations that ship to their region
Only a bundle is sold out Bundle components
The quantity goes back to 0 after you fix it An app, ERP, or 3PL sync
A fresh copy of the theme can add the variant to cart, but your theme can't Theme code, template, or a storefront app
The collection card and the product page disagree Theme or app badge logic

Check the variant's Available inventory

Start with three basics on the affected variant. Confirm that inventory tracking is on, and check Continue selling when out of stock: when it is on, low stock shouldn't make the variant sold out, so go straight to the theme comparison. Then make sure the storefront has the variant you are checking selected. A product page can open on a different size or color from the one you updated.

Next, open Products → Inventory and find the variant. Shopify splits stock into several states, and only one of them can be sold:

  • Available: units you can sell now.
  • Committed: units held for unfulfilled orders, draft orders, or transfers marked as ready to ship.
  • Unavailable: units set aside by apps or held for reasons such as damage, quality control, or safety stock.
  • Incoming: units on their way from transfers, purchase orders, or apps. They become sellable when received.

On hand is Available plus Committed plus Unavailable. A variant can show 2 on hand and still be sold out when both units are marked as damaged.

If units are sellable, move them back to Available. If the Committed count comes from test orders, cancel and restock those orders; our Shopify BFCM checklist shows how a single test order holds stock. Avoid turning on Continue selling when out of stock to clear the label. That setting changes the selling policy and lets customers buy stock you don't have.

Compare the variant in a fresh theme

In Online Store → Themes, add a fresh copy of your current theme, ideally the same version, and leave it unpublished. If your theme isn't Horizon, add Horizon too. Preview the product with ?variant= and the variant ID, the number at the end of the variant's URL in admin. Keep the country and browser the same in both previews. A product on a custom template may fall back to the default template in the fresh theme, so note which template each one uses.

  • Sold out in the fresh theme too: a theme customization is unlikely to be the cause. Continue with inventory, locations, the customer's region, and apps that change store data.
  • Buyable in the fresh theme: start with your current theme, its template, and its apps. A template difference can also explain the result, so don't rule out inventory yet.

Product page in a modified Horizon theme with size L selected and a disabled Sold out button

The same product in unmodified Horizon 4.2.0 with size L selected and an active Add to cart button

Controlled demonstration in a development store. Size L has 0 in stock and continues selling when out of stock. The first screenshot comes from a copy of Horizon deliberately modified to ignore that setting, so it does not show a native Horizon bug. Unmodified Horizon 4.2.0, in the second, sells the variant.

A fresh theme drops your customizations and most app blocks and embeds, but apps that edit theme code or change inventory can still affect both previews. Our guide to a Shopify Add to cart button that isn't working covers this comparison in more detail.

Check which locations can sell the stock

Inventory at a location that doesn't fulfill online orders still counts toward your total, but not toward the online quantity. The online quantity decides whether the Online Store shows the product as available. This setup produces the most confusing version of the problem:

Location On hand Fulfills online orders
Retail store 20 No
Warehouse 0 Yes

Admin lists 20 units, and the product page says Sold out.

We reproduced this in a development store running Horizon 4.2.0. Size M had 3 units at a location named Test Retail, which doesn't fulfill online orders, and 0 at every other location.

Shopify admin variant list filtered to the Test Retail location, showing 3 available for size M and 3 available in total

Filtered to Test Retail, admin reports 3 available for size M.

Horizon product page with size M selected and crossed out, and a disabled Sold out button

The product page still shows size M as sold out.

The Available column in admin still counts units at a location that doesn't fulfill online orders, so that number alone doesn't tell you whether the Online Store can sell them. To check a location, open Settings → Locations, select it, and review Use inventory at this location to fulfill online orders in its Fulfillment section. You have two fixes:

  • Turn on online fulfillment at that location if it can really pack and ship them. Don't turn it on only to clear the Sold out label, because Shopify may route online orders there.
  • Transfer the stock to a location that already fulfills online orders if the store or warehouse shouldn't ship them.

A new location doesn't stock your existing products automatically. Until a variant is stocked there, admin shows a message such as "Inventory is not stocked at Test Retail" and won't accept a quantity. After you add a warehouse, check that the affected variants are stocked at it.

Apps that stock inventory for you, including dropshipping apps, third-party logistics services, and custom fulfillment services, appear as their own locations. If you recently installed, removed, or switched one, check which location holds the variant's stock.

When only some countries see Sold out

Customers can buy only stock held at locations that ship to their shipping zone. If a variant's only stock sits at a location whose shipping setup doesn't cover a customer's country, newer stores show it to that customer as out of stock. Stores created before April 2024 can instead choose Show all products under the fulfillable inventory link in Settings → Shipping and delivery, which keeps the product visible but still blocks checkout.

Preview the product with that country selected, then compare the locations holding stock with the shipping zones that cover the country. Add stock at a location that ships there, or extend the shipping setup of the location that has it.

Check the components of a Shopify bundle

With the Shopify Bundles app, a bundle has no stock of its own. Its quantity comes from the components: the component with the least available stock, relative to the quantity each bundle needs, sets the limit. A bundle that needs two mugs is sold out when only one mug is available, even if every other component is in stock.

Shopify documents that bundles count overall stock rather than stock at each location. We haven't tested a bundle whose component stock sits only at a location that doesn't fulfill online orders, so check each component's inventory by location too.

Find what keeps resetting the stock

If you correct the quantity and it returns to 0 later, another system is writing to Shopify. Common sources are an ERP, a 3PL, a dropshipping app, or an inventory sync app.

Open the product, select the variant, and click View adjustment history in its Inventory section. The Created by column names the staff member, app, or sales channel behind each change. The page covers the last 180 days.

When an outside system owns the inventory, fix the count or mapping in that system. Edits made directly in Shopify will be overwritten at the next sync.

Look at the theme when inventory is correct

If the variant is buyable in the fresh theme but not in yours, check these patterns:

  • The page opens on a sold-out variant. Horizon opens on the first available variant. A customized theme may open on the first variant even when it is sold out, which makes the whole product look unavailable.
  • Switching variants doesn't update the button. The price and image change, but the button keeps its previous state.
  • Custom code checks only the quantity. It ignores continue selling and untracked inventory, as in the demonstration above.
  • The collection card disagrees with the product page. In Horizon, the card shows a Sold out badge only when every variant is unavailable. A badge that ignores this rule or stays after a restock comes from theme or app code.

To test apps, turn off app embeds one at a time in a duplicate theme. If the cause is in theme or app code, our Shopify Bug Fix service can trace and fix it.

Verify the fix

After the change, retest:

  • Each affected variant, opened with ?variant=
  • The product page when it first opens, without a variant in the URL
  • Switching between sold-out and in-stock variants
  • Each country where customers reported the problem

Also retest collection cards and the cart if the problem appeared there, and repeat the checks on the live theme after you publish a theme change.

Get Shopify help _

Store says sold out but has stock?

We'll find what's blocking the sale.

$49 USD

ONE FOCUSED FIX · FIXED OR REFUNDED

Fix my sold-out products