All use cases

How-to - inventory

How to prevent overselling on Shopify

By Founder of UpsellShark and a working Shopify merchantUpdated

Short answer

Shopify oversells because a unit is only set aside once the order exists, so two shoppers can buy the same last item, and a late warehouse sync leaves you selling stock that has already gone. Three fixes cover most of it: turn off Continue selling when out of stock unless you mean to backorder, stop faking a buffer by hand-editing counts, and hold a safety-stock floor a few units above zero. Easy Stock Buffer holds that floor inside Shopify rather than your theme, so it applies at Shop Pay and express buttons. Free for 10 variants.

Which fix do you actually need?

This page is the whole picture in one place: why Shopify lets an order through when the shelf is empty, and every lever that stops it. The setting sitting on the variant, the warehouse sync writing over your counts, the one location that actually serves your website, preorders, and what to do about an order that has already gone wrong. If you are not yet sure which of those is happening to you, read it end to end - the causes look identical from the outside and the fixes are completely different.

The pieces that need working through properly have pages of their own. Overselling, defined is the two-minute version if you have just met the word. Picking the number to hold back is arithmetic rather than a setting, so how to set a safety stock level takes a real product through it, and the safety stock definition carries the formulas and service levels underneath.

If you are choosing between tools rather than diagnosing a problem, order limits against safety stock sets out which of the two you need, and what to use now that Stocky is shutting down is for merchants arriving here from Shopify's own tool. And when the thing you are chasing is a count that disagrees with the shelf, the trail runs cold at 90 days, which we covered in seeing inventory history past that limit.

One thing this page deliberately leaves alone is what shoppers see once a product has already sold out, and what your store does about it: the sold-out page, the collection listing, hiding, redirects and restock capture. What happens when a Shopify product goes out of stock covers that side.

Why does Shopify oversell when inventory tracking is on?

Because tracking is a count and it is not a lock. Shopify sorts the stock at each location into a few buckets. The two that matter here are available, meaning units a shopper can still buy, and committed, meaning units that belong to an order somebody has already placed but you have not shipped yet. A unit only moves from available to committed at the moment the order is created. Not when someone adds it to a cart, and not while they are typing in their card details.

So two people can be paying for the same last unit at the same moment, both working from an available count of one, and both orders land. The window is short. It only ever matters on the final few units of a variant, which is why this shows up on your best sellers and during a flash sale and almost never on the long tail.

What happens after checkout does not help either. Once the order exists, Shopify works out which of your locations should ship each line and queues the work for whoever picks it. Nothing in that sequence stops to ask whether the units are actually on the shelf.

Is "Continue selling when out of stock" the reason?

It is the first thing to check, and on plenty of stores it is the whole answer. The setting lives in the Inventory section of a product or variant in your Shopify admin, and it does what it says: with it on, customers keep buying after the count reaches zero and the number goes negative. Shopify's guidance on selling when out of stock notes it only works when inventory is tracked in the first place.

Off is what a new variant starts with, and off is what almost every physical product wants, because switching it off is the one change that stops the sale on its own. Leave it on for pre-orders, made-to-order goods and anything a supplier ships for you, where there is no finite pile of stock to protect in the first place.

Auditing this one product at a time is miserable, so export your catalogue to CSV instead. The product CSV carries a column named "Continue selling when out of stock" holding deny or continue for every variant, which means you can sort the whole store in a spreadsheet and see what is unprotected in about a minute. It is usually a handful left over from a launch, plus whatever an old import quietly set.

Why your 3PL keeps undoing your inventory edits

The workaround everyone tries first is under-counting. Tell Shopify you hold 80 when you really hold 100, and the 20 you kept back becomes an invisible buffer. It works until the next sync, and then it is gone without telling you.

A warehouse or 3PL that keeps its own stock records is the authority on those numbers, and Shopify treats it that way. Its figures get written over yours on a timetable you do not control, your hand-edited 80 turns back into 100, and the product carries on selling down to a zero that was never real.

Two systems writing the same number is a problem in its own right, and Shopify documents how it goes wrong.

A warehouse tool reads 100 units. Twenty sell underneath it while it works. It then writes back 90, having only subtracted the ten it knew about, when the true figure was 70.

Twenty units appear out of nowhere and your store sells every one of them. There is a safeguard that makes the update fail when the count has moved since it was read, and not every connection bothers to use it.

A floor behaves differently because it never touches your count. Your 100 stays 100, every sync agrees with every report, and the rule sits on top saying stop at 20.

Why one location can oversell while another has stock

Multi-location is where the aggregate number starts lying to you. Only locations that fulfil online orders make stock sellable online, and Shopify's help docs are explicit that an item shows as out of stock when the location fulfilling online orders sits at zero or below, even while another location has plenty on the shelf.

Read that the other way round and you have the overselling version of it. Your dashboard says 14 units across three locations and the store keeps selling, while the one location that actually serves the website is down to its last two. A shop-wide buffer of three does nothing here, because it is being measured against a total you cannot ship from.

Easy Stock Buffer handles this with per-location thresholds on Pro. You set a minimum per location for a variant, and by default those minimums are added up into one number. Switch to strict counting in Settings and selling stops as soon as any single location with a minimum runs down to it, which is what you want when one warehouse is the only one shipping to customers.

Are preorders and backorders the same thing as overselling?

Mechanically yes, commercially no. A preorder runs on the same Continue selling setting that causes the accidental kind. The difference is whether the customer agreed to wait before they paid.

Separate the two deliberately. Products you can genuinely make or reorder keep continue-selling on, with the ship date on the product page and repeated in the confirmation email. Everything else has it switched off. And leave preorder variants without a stock floor, because a floor would block the exact sale you are trying to take.

Backorders sit in between and they are fine when the date is real and stated up front. The version that generates chargebacks is the one where a customer works out they are waiting from a shipping delay notice three weeks later. Running one on purpose takes a walkthrough of its own, and how to set up backorders on Shopify covers the payment timing and the fulfillment hold that stops an empty box shipping.

An order already oversold. What do you do now?

Tell the customer the day you find out. Running our own store, the pattern is consistent: people told immediately, with a real date and a choice, mostly wait. People who work it out themselves from a silent refund four days later do not come back. Give them three options in that first email, which are waiting for a named restock date, swapping to something you hold, or taking a refund now.

If part of the order is shippable, ship it. Shopify lets you fulfil some lines and leave the rest open, which keeps the order alive instead of turning one apology into a cancellation.

Refunds carry a trap that is worth knowing about before you hit the button. Shopify offers to restock what you refund, and on a line you never shipped, saying yes adds that quantity straight back onto your available count. When the reason you are refunding is that those units never existed, restocking them hands the same phantom unit to the next shopper. Leave the restock option off in that case and correct the real number separately.

  • Email the customer the same day, with a real ship date and a choice.
  • Ship the lines you can and leave the rest of the order open.
  • Refunding stock that never existed? Turn the restock option off.
  • Recount the shelf and set on-hand from what is physically there.
  • Put a floor on that variant before the next drop.

Does Shopify have a safety stock setting?

There is a Safety stock category, and it is a long way from a setting that stops selling for you. Shopify counts safety stock as one of the unavailable kinds of stock, sitting alongside damaged units and units held for quality checks. Those units are still on your shelf, they show in your admin as unavailable, and nobody can buy them until you move them back.

Useful, and still not a floor. Moving five units into safety stock is a one-off split of stock you physically hold, done per variant and per location. Nothing recalculates it when your sales rate changes, your available count stops matching the shelf, and the storefront reports sold out while five units sit in the back room.

A floor is the rule version of the same idea. Your count stays true at 100, the sale stops when available reaches the number you chose, and it starts again on its own the moment you restock. Picking that number is a separate job: how to set a safety stock level on Shopify has the lead-time maths, and the safety stock definition covers service levels and how the floor differs from a reorder point.

Why a theme-level sold-out hack does not hold

Hiding the Add to cart button with theme code stops the shoppers who use the button. A link that jumps straight to checkout, a cart saved from yesterday, an express payment button, the Shop app and any storefront built outside your theme all skip that code, so hiding a button is advice rather than a rule.

Shopify does have one place a check like this can run inside Shopify itself, where it applies the whole way through checkout and a shopper cannot get around it. That includes express payments, so Shop Pay, PayPal, Google Pay and Apple Pay are all covered. You do not need Shopify Plus for it either, as long as the check comes from an app you installed from the Shopify App Store.

That is where Easy Stock Buffer sits. It keeps a live available count for every protected variant, updated by Shopify each time a count changes, and compares it against the floor, with the most specific rule winning: the variant's own floor first, then a floor it inherits from one of its collections, then your shop-wide default. The block works per unit rather than all or nothing, so a cart asking for four when only two sit above the floor is told that only two can be ordered, and the wording of that message is yours to edit.

One step is manual and it catches people out. The rule has to be switched on once in Settings, then Checkout, and until it is, nothing gets blocked - see activate the checkout rule. The cart page is deliberately permissive as well. It shows the message but still lets shoppers edit their basket, and the block itself is held at checkout.

Flow showing a shopper adding to cart with the cart left open, then checkout starting however they pay, then a stock floor check that runs inside Shopify rather than in the theme, which lets the order through when stock stays above the buffer and blocks it with your own message when the order would take stock below it
The cart stays editable on purpose. The stop is held at checkout, which is why it still works when someone pays with Shop Pay or another one-tap button.

FAQ

Common questions

Why did Shopify let someone buy an out-of-stock product?
Usually one of three things. The variant has Continue selling when out of stock switched on, the count in Shopify was higher than the shelf because a warehouse sync had not landed, or two people checked out the last unit within the same few seconds. Check the variant setting first, since it is the only one of the three you can fix with a click.
Does Continue selling when out of stock apply to Shopify POS?
No. Shopify says the setting does not apply to orders placed from Shopify POS. Staff can still oversell at the counter, but POS warns them before the sale goes through.
Can Shopify inventory go negative?
Yes, on any variant with Continue selling when out of stock switched on. The available count keeps dropping past zero with each order, and how far below zero it sits tells you roughly how many units you have promised beyond what you hold.
What stock buffer should I start with?
One or two units is enough to absorb simultaneous checkouts on a slow mover. For anything selling daily, size it to lead time: average daily sales multiplied by the days a reorder takes to arrive. How to set a safety stock level on Shopify works through it per product.
Will a stock buffer break my preorder products?
Only if you put a floor on them. Leave preorder and made-to-order variants without one and they keep selling past zero as intended, while the rest of the catalogue stays protected.
Does the block work on Shop Pay and express checkouts?
Yes. The check runs inside Shopify rather than in your theme, and it applies the whole way through checkout, so a shopper cannot get around it. That covers Shop Pay, express payment buttons, links that jump straight to checkout, and storefronts built outside your theme.
Is there a free way to prevent overselling?
Easy Stock Buffer's free plan covers 10 variants with a threshold, a shop-wide default, and up to 10 low-stock email alerts a month. Blocking the sale at checkout is included on the free plan rather than held back for the paid one. Pro is $7 a month for unlimited variants, per-location thresholds and bulk rules by collection, tag or product type.

Hold a floor instead of selling to zero

Easy Stock Buffer stops the sale a few units above zero and holds it at checkout however the shopper pays. Free for 10 variants, with checkout blocking included.

See Easy Stock Buffer