You can pull stock reports out of NetSuite, your 3PL and Shopify and still not answer the question that matters in the moment. Why do these numbers disagree right now, and which one wins?
If you have ever had the warehouse swear blind you have units on the floor while NetSuite says zero, you already know the pain. It turns into the same mess of exports, emails and a snap decision that ends in cancellations or dead stock.
NetSuite should be the place you control inventory, and for most brands it eventually is. What breaks first is the assumption that control means one number. That falls apart the moment you run more than one location, or more than one definition of sellable.
Your stock number isn’t one number
There are a handful of stock buckets. Teams will mix these up and end up arguing which one's right, distracting them from infinitely more valuable work:
Physical stock is what the warehouse can actually locate. It’s specific to a bin and a status. It includes the awkward stuff like damaged or quarantined units, plus the cartons nobody can find.
Recorded stock is what NetSuite says exists based on transactions. Receipts, fulfilments, transfers, adjustments and the like move this number around. Finance cares because it drives valuation.
Sellable stock is recorded stock after you apply the rules you use to decide what can be allocated to an order. Location matters, inventory status matters, and commitments matter.
Published stock is what you let the public buy. Often you're taking what NetSuite holds and deducting from it buffer stock and the like, to reach the figure you share with your sales channels. It should trace back to NetSuite with named deductions that merch can control in NetSuite.
This is where it starts to unravel because NetSuite’s just doing NetSuite. On hand, committed, available and backordered are different buckets; if you treat them as interchangeable, you’ll end up reconciling noise and shipping problems.
It gets worse because other systems use the same labels to mean different things. It’s common for the warehouse on-hand number to include inventory that’s still in intake, while NetSuite only reflects it once someone’s actually done the receiving.
That’s comparing two different states and calling it a discrepancy.
Sometimes it's the opposite. Two brands can run near-identical setups, a few tens of thousands of child SKUs across a couple of locations, and one will sit within a handful of units of NetSuite at any point in the day while the other is out by hundreds and can't tell you why. The difference is whether the team doing the recon agreed on what they were measuring and when.
Timing matters. Treat it like part of the setup, not an annoyance.
Real-time doesn’t make it true
Real-time stock events cut lag. They don’t make the number right.
Real-time integrations can still miss weird sales order edits, especially when lines get changed after the initial order comes in. The boring fix is a scheduled full sync or comparison, so missed events don’t drift forever.
If you want SKU visibility, stop chasing a prettier dashboard and start insisting on a consistent level of detail. In a fashion or multi-location setup, the smallest unit that matters is a child SKU, by location, by inventory status, with a timestamp.
Anything more aggregated is how you convince yourself stock exists when it’s the wrong size, the wrong warehouse, or the wrong status.
Make the variance explainable
The most useful report isn’t total stock. It’s an exceptions report that tells you exactly how you got from NetSuite availability to what the channel is publishing.
Go look at your own reconciliation today. If a discrepancy shows up, can an operator tell whether to wait because an inbound receipt is still in intake, or whether they need to fix the transaction, change the status, or escalate it?
If the answer is no, you haven’t got visibility. You’ve got visibility theatre.
Start by separating the two boundaries you’re actually managing.
Warehouse to NetSuite is about whether the physical work has actually landed in the ERP. Missing receipts, transfer mismatches, and status mapping failures all live here. So do warehouse-only states. If the warehouse moves stock into locked or suspense because it can’t be found, and that state doesn’t map to a NetSuite status or location that affects availability, your website will happily keep selling ghost units. Then you get the death spiral. Short shipments, negative adjustments, stock mysteriously reappearing a week later when someone finds the carton, and nobody trusts any number.
NetSuite to channel is about whether the intended sellable quantity has been published correctly. Latency windows and missed events live here.
A single warehouse to Shopify comparison can’t tell you which boundary broke, so it can’t tell you what to do next.
Keep your fixes separate
If units exist but shouldn’t be sold, make them unavailable by status or a controlled location model. If units exist but are in the wrong place, transfer them properly. If you care about the in-transit state, use transfer orders so you can see the stock move from committed to in transit to received.
If you’re deliberately reserving stock for stores, wholesale, or a strategic drop, that’s a commercial holdback. If you’re hiding stock because you don’t trust the warehouse versus NetSuite position yet, that’s a temporary reconciliation buffer, and it needs a reason, an owner, and an expiry.
And if you’re using inventory adjustments to stop Shopify selling something, you’re using an accounting transaction to solve a storefront control problem. NetSuite adjustments change quantity, and they can change value. They post to an adjustment account. They should close a confirmed variance after you’ve done the work, not paper over uncertainty.
Counts need the same discipline. NetSuite takes a snapshot at the start of a count, and if stock keeps moving during the count window without a process that accounts for movements, you can manufacture variances that were just normal receipts and picks.
Once you’ve got this right, NetSuite becomes what ops needs it to be: the place where stock gets controlled and surfaced. And you can stop living in spreadsheet land where everyone has their own version of stock and nobody can prove they’re right.
SKU visibility is being able to explain, at a consistent unit and point in time, why physical stock, NetSuite stock, sellable stock, and published stock differ.
If you can’t explain the difference, you don’t have a stock figure. You’ve got an argument waiting to happen.





