People search "perpetual inventory system" expecting a buying decision between two accounting methods. Periodic: count everything occasionally, infer what sold. Perpetual: update the count on every transaction, know the position live.
If you sell online, the choice was made for you. Shopify decrements stock on every order. You are running a perpetual system today. The real question is the one the textbook never asks: is the live number true?
Mostly, no. Every perpetual ledger drifts from the physical shelf, and everything downstream reads the ledger, not the shelf. The storefront's "in stock" is the ledger. The reorder trigger fires on the ledger. Every number in your stockout rate and days of inventory is the ledger. A drifting ledger quietly corrupts all of it.

Where the drift comes from
No single leak is dramatic. The sum is.
- Receiving. The PO says 100, the box holds 96, someone books 100. The ledger is born wrong by four.
- Returns. A return is refunded but never restocked, or restocked twice, or restocked in the wrong variant. Return-heavy categories drift fastest.
- Fulfilment substitutions. The picker grabs a Medium because the Large bin was empty, ships it, tells nobody. Two rows are now wrong in opposite directions.
- Damage and shrinkage. Units written off in reality but not in the system, or the reverse.
- Bundles and kits. A bundle sells and only the bundle SKU decrements, while the component units leave the shelf uncounted.
- Manual edits. The Tuesday someone "fixed" a number by eye, with no note, is now part of history.
Industry surveys of retail inventory records put record accuracy around 60 to 70% at any moment. Ecommerce with a single warehouse does better, but "better than retail" still means a meaningful slice of your variants are wrong right now. If you sync stock across channels, every leak above multiplies, because each channel reads a copy of a copy; that is half of why multichannel sync breaks.
What a wrong ledger costs
Overstated on-hand is the expensive direction. The system says 8, the shelf says 0. The page stays live, orders arrive, and you discover the truth as refund emails. It is a stockout wearing an "in stock" badge, invisible to every report until a customer finds it.
Understated on-hand is quieter: sales the storefront refused while sellable units sat in the building, and reorders placed early into stock you already had, drifting cover toward the dead stock pile.
Then the second-order cost: every model downstream trains on fiction. A forecast learns demand from sales the phantom stockout suppressed. A buffer is sized on variance the ledger invented. Data quality is not an IT virtue here. It is whether the buys are right.
Cycle counting, sized for a small team
The fix is not an annual full count. Annual counts reset the ledger once and let it drift 364 days. The fix is counting a little, always, weighted by what matters.
- Rank variants by contribution and velocity. The A rows, roughly the top slice carrying most of your revenue, get counted every 2 to 4 weeks. B rows quarterly. C rows twice a year.
- Count blind. The counter writes what the shelf holds without seeing the system number first.
- Log every discrepancy: variant, direction, size of the miss. Adjust the ledger the same day.
- Track one score: the share of counted rows that matched, week by week. That is your inventory record accuracy, and its trend tells you whether the process is winning.
- Chase causes monthly. Discrepancies cluster: one supplier's short deliveries, one return shelf, one bundle. Fix the leak, not just the number.
Twenty minutes a week on a few hundred variants is enough to hold A-row accuracy above 95%, and the exceptions surface while they are one box, not one quarter, wide.
The habit that makes it stick
Give every stock adjustment a reason code, however crude: received-short, return-not-restocked, damage, count-correction. Free-text "fixed" is how ledgers lose their memory. Three months of coded adjustments is a map of your leaks, ranked by cost, written by your own operation.
What's missing
This page can name the leaks and hand you the counting discipline. It cannot see which of your variants is drifting, because that pattern lives in your adjustment history, your return flows, and your count logs, watched over months.
SkuSense is being built to read that pattern for Shopify brands: accuracy scores by row, drift flags before the refund emails, and the leak map from your own adjustments.
Related: Stockout rate in ecommerce · Multichannel inventory sync · Demand forecasting for ecommerce