Why Your Shopify Store Oversells When Your Warehouse Syncs Inventory

Overselling is expensive in a quiet, irritating way. You apologize to the customer, issue a refund, maybe add a coupon, and the product they wanted never shipped. Do it often enough and people stop trusting your stock numbers.

When a store tells me it oversells, the first thing I want to know is how inventory gets from the warehouse or 3PL into Shopify. The cause is almost always in that path.

The usual causes

The numbers are old. A warehouse system exports stock once an hour, or once a night. Between exports, Shopify happily sells units that are already gone.

The warehouse reports on hand, not available. On hand counts everything on the shelf. It does not know about orders that were paid for in Shopify but have not been picked yet. If you push that number straight into Shopify, you are telling customers about stock that is already spoken for.

The sync sets a number instead of adjusting it. Suppose the warehouse says 10 at noon and the sync runs a minute later. Meanwhile two orders came in, so Shopify’s own count should be 8. If the sync simply writes 10, it erases those sales. This one is easy to miss because it only shows up under load.

Multiple channels. Shopify, a marketplace and a wholesale portal all sell from the same shelf, and each one trusts a different copy of the count.

Edits and returns. Cancelled orders, restocks, and manual adjustments each change the number, and the sync does not hear about all of them.

A calculation that holds up

Here is the model I prefer. Keep the pieces separate and compute availability from them:

  • On hand is what the warehouse physically has. The warehouse system is the source of truth for this.
  • Committed is what customers have bought but the warehouse has not yet shipped. Shopify is the source of truth for this.
  • Safety stock is a buffer you choose, per product or per category, for items that sell fast or have a history of counting errors.

Available to sell equals on hand, minus committed, minus safety stock, never below zero.

Pending orders are the piece most syncs forget. If the 3PL only learns about an order when it is released for picking, there is a window where Shopify knows and the warehouse does not. Your calculation needs to cover that window.

Prefer changes over absolute numbers

Where the Shopify API allows it, send adjustments (a change of plus or minus some quantity) instead of overwriting a total. An adjustment is much harder to get wrong when two events happen close together. Recent versions of the API also give you ways to guard a write by checking the quantity you expect to be there first. Look at the current documentation for the details, since the inventory API has changed more than once.

Whichever you choose, make each update safe to repeat. If the same update is sent twice, the second one must not double count. The ideas in Shopify Webhooks Missing Orders apply here directly.

Make the sync visible

Even a well designed sync will drift sometimes, so build in a way to see it:

  • Run a nightly comparison between the warehouse and Shopify for every SKU and list the differences.
  • Track how many corrections you make each week. A rising number is an early warning.
  • Alert when a high volume SKU goes negative or when the sync has not run for longer than expected.

This audit pays for itself. It also gives you evidence to bring to your 3PL when you need to have an honest conversation about their counts.

Tune for your hot products

Not every SKU deserves the same care. A bestseller with 12 units left on a promotion day needs near real time updates and a larger buffer. A slow seller with 400 units on the shelf can be refreshed every few hours. Spend the effort where the risk is.

If your sync was built for ordinary days, it deserves a look before a big sale. I covered the traffic side of that in Shopify API Rate Limits During Black Friday.

If you are tired of refunding oversold orders, email kevin@kevinhq.com with a short description of how your stock gets from the warehouse into Shopify today. That one paragraph is usually enough for me to see where the numbers go wrong.


← Back to Homepage


Get occasional breakdowns

When I find something worth writing up — a fix, a pattern I keep seeing in client stores, something that actually moved revenue — I send it out. No schedule. No filler.