Phantom Stockouts: When Stock Is at Your 3PL but Shopify Shows Zero
A pallet of your best-selling SKU landed at your 3PL last Tuesday. It’s Friday, and Shopify says you’re sold out.
The stock is real. It’s fifty feet from the pick line. But as far as your store, your customers, and your ad spend are concerned, that product doesn’t exist. You’re losing sales on inventory you already paid for, and the first sign you’ll get is an email asking why a product that “was in stock yesterday” is suddenly gone.
That’s a phantom stockout, and it’s one of the most expensive blind spots in outsourced fulfillment.
The receiving window: where stock disappears
There’s a gap between “inventory arrives at the 3PL dock” and “inventory is sellable in Shopify.” Stock has to move through a few steps before your store can sell it:
- Dock: the truck is unloaded, the shipment is logged as arrived.
- Count: units are counted against the inbound shipment or PO.
- Reconcile: discrepancies get resolved (damaged units, shorts, a PO that doesn’t match what showed up).
- Sellable: the count is pushed to Shopify and the product goes live.
When that pipeline runs in a day, nobody notices. When it stalls (a backed-up receiving team, damaged-on-arrival units waiting on a decision, a PO that never got matched, a manual count someone has to patch by hand) the stock sits in limbo. Physically present, financially yours, commercially invisible.
Why none of your dashboards catch it
Phantom stockouts are invisible precisely because the stock exists. Every system involved is telling the truth from where it sits:
- Shopify trusts whatever number it was last given. If that number is 0, it shows 0 and stops selling.
- Your 3PL knows the pallet is on the floor, but its receiving queue isn’t something you’re watching in real time.
- Nobody is watching the gap between the two. That’s the whole problem. The truth is split across two systems, and the discrepancy lives in the space neither one shows you.
So the symptom surfaces where it hurts most: a customer can’t buy, or a “back in stock” notification never fires, or your paid traffic lands on a sold-out page. You find out days late, by accident.
This is the inbound cousin of a problem we’ve written about on the outbound side: your Shopify counts can be wrong in more than one way. Slow receiving and broken inventory sync produce the same customer-facing result, sold out when you shouldn’t be, from opposite ends of the pipeline.
The honest part: you can’t just “measure dock-to-stock”
Here’s where most advice gets it wrong. Every “3PL KPIs to track” article tells you to monitor dock-to-stock time, the hours from arrival to sellable. It’s a real metric, and it matters. But it’s a 3PL-internal number. You can’t measure it directly from your side, because you don’t see the dock, the count, or the reconcile step. Treating it as something you can pull on demand sets you up to be told “it’s fine” with no way to check.
What you can see is the gap from your own data:
- PO-sent-to-sellable lag. You know the day you shipped a PO to the 3PL. You know the day Shopify’s count finally moved. The distance between those two dates is yours to measure, no 3PL portal required.
- Stale-count age. A SKU whose count hasn’t changed since a known inbound shipment landed is a flag, especially if you expected receiving to be done by now.
- Could-have-sold signals. Backorders, “notify me” sign-ups, and traffic hitting sold-out pages for SKUs you believe are stocked. These are the lost-sale fingerprints of a phantom stockout.
None of these require the 3PL to hand you an internal metric. They’re brand-side proxies, built from data you already own, and they’re the honest way to catch the drift. (For the fuller version of which fulfillment numbers brands can verify versus which ones are 3PL self-report, see measuring 3PL performance.)
What to do about it
Three moves, in order of effort:
- Set a receiving expectation with your 3PL. Agree on a target window from arrival to sellable, and a notification when a shipment is received. “Tell me when it’s counted” is a reasonable ask, and it gives you a clock to measure against.
- Watch the proxies. Track PO-sent-to-sellable lag per shipment. Watch inventory accuracy on SKUs after a known inbound. Flag any hero SKU sitting at 0 when you know stock landed.
- Catch it before the customer does. The whole point is to find the gap on a Wednesday, from your own data, instead of from a support ticket on Saturday.
3PL Pulse already does this on the outbound side, watching whether orders actually ship on time across your providers, measured from your Shopify data instead of a 3PL’s self-report. Inbound receiving is a different question, and it’s one we’re actively deciding whether to build.
Would you want an alert when a PO has landed at your 3PL but the stock still isn't sellable in Shopify?
We're weighing whether to build this. Your tap helps us decide.
Stock you can’t sell is the same as stock you don’t have
A phantom stockout costs you exactly what a real one does: lost sales, wasted ad spend, a customer who tried to buy and couldn’t. The only difference is that the inventory is right there, which somehow makes it worse.
You don’t need access to your 3PL’s receiving queue to catch it. You need to watch the gap between when you sent the stock and when Shopify could finally sell it. Want to talk through how you’d track phantom stockouts for your setup? We’re happy to help.