August 7, 2026 · CostSentry

Returns, Restocking and Shrink: Where They Belong in Your Margin Math

Sooner or later someone suggests solving returns and shrink by nudging the cost field up a few percent — "call it a 3% allowance and forget about it." It's tempting, it takes five minutes, and it quietly destroys the one number your supplier comparisons depend on. These are three different costs with three different shapes: returns are per order, restocking labour is per event, and shrink is per period. Each needs its own arithmetic, and none of them belongs inside cost per item.

What one return actually costs

Start with a single order and count everything that doesn't come back. Retail $80, supplier cost $52 — a 35% product margin, since (80 − 52) ÷ 80 = 0.35. Free shipping out, prepaid return label in, 2.9% + 30¢ payment processing.

Handling cost of one returned order · item resells at full price
Outbound label (not recovered)$6.80
Return label$7.50
Payment fee retained on refund$2.62
Packaging & pick-pack (spent)$0.85
Inspect, repack, put away — 8 min @ $22/hr$2.93
Total, best case−$20.70

That's the good outcome. The item is A-grade, goes back on the shelf, and will sell again at $80. You still spent $20.70 to end up exactly where you started. Two other dispositions are common, and both are worse:

Put those against what a good order earns. Gross profit is $28.00, minus $2.62 of payment fees, minus the $6.80 label, minus $0.85 of packing — $17.73 of contribution, using the per-order stack from the real net margin per order. So one A-grade return erases 1.17 clean orders. One unsellable return erases 4.1 of them.

Sizing an allowance you can actually use

You don't need the cost of a return, you need the cost of your returns — one blended number per category. Take your disposition mix from the last quarter's actual return log. Say 55% go back at full price, 30% become open-box, and 15% are written off:

cost per return = (0.55 × 20.70) + (0.30 × 36.70) + (0.15 × 72.70)
                = 11.39 + 11.01 + 10.91 = $33.30

Note how evenly the three terms land. The 15% you write off costs almost exactly as much in total as the 55% you recover cleanly — which is why disposition mix moves the answer more than return rate does, and why "we take everything back, most of it's fine" is an expensive sentence.

Now spread it across all orders, not just returned ones. At a 6% return rate: 0.06 × $33.30 = $2.00 per order, or 2.50% of an $80 ticket. Your 35% product margin is a 32.50% return-adjusted margin.

Return rate$20 per return$33 per return$50 per return
1%0.25 pts0.41 pts0.63 pts
3%0.75 pts1.24 pts1.88 pts
6%1.50 pts2.48 pts3.75 pts
10%2.50 pts4.13 pts6.25 pts
15%3.75 pts6.19 pts9.38 pts
20%5.00 pts8.25 pts12.50 pts

Margin points consumed by returns on an $80 average order, by return rate and blended cost per return.

Restocking labour is fixed per event — which punishes cheap items

Two words get used for two different things here. Restocking labour is what it costs you to receive, inspect, repackage and shelve a return. A restocking fee is what you charge the customer. They're related by intent and by almost nothing else.

The labour part barely varies with the value of the item. Receiving a $25 accessory takes the same eight minutes as receiving a $250 tool, and the return label often costs the same too. That $20.70 of handling is 26% of an $80 order and 83% of a $25 one. Past a certain point the arithmetic stops supporting a physical return at all: if handling exceeds the recoverable value, refunding without asking for the item back is the cheaper answer, and the only real question is what that policy does to abuse rates.

A restocking fee changes the recovery, not the cost. At 15% on an $80 order it returns $12.00 against $20.70 spent — meaningful, but never a profit centre, and it comes with consumer-protection rules that vary by jurisdiction and with a conversion cost you can't see in the return log. Treat it as a partial offset in the allowance, not as a reason to skip the calculation.

Shrink: a percentage of cost, converted into margin points

Shrink is inventory you paid for and can't sell: breakage, miscounts, mispicks shipped and written off, theft, expiry, obsolescence, and the occasional pallet that turns out to be a different part number than the label claims. Measure it against cost, over a period, from a physical count:

shrink rate = (book quantity at cost − counted quantity at cost) ÷ COGS for the period

The conversion into margin is the step most people skip. Shrink is a share of cost, margin is a share of revenue, so multiply by the cost side:

margin points lost = shrink rate × (1 − gross margin)

At 1.2% shrink and a 35% margin: 1.2% × 0.65 = 0.78 margin points. Small, and it should be. If it isn't, that's a warehouse problem rather than a pricing one.

Shrink (% of COGS)25% margin35% margin45% margin
0.5%0.38 pts0.33 pts0.28 pts
1.0%0.75 pts0.65 pts0.55 pts
1.5%1.13 pts0.98 pts0.83 pts
2.0%1.50 pts1.30 pts1.10 pts
3.0%2.25 pts1.95 pts1.65 pts
5.0%3.75 pts3.25 pts2.75 pts

Read left to right: the same shrink rate costs a thin-margin distributor more margin points than a high-margin retailer, because cost is a larger share of every sale.

Why none of this goes into cost per item

The shortcut — inflate cost by an allowance and let the margin numbers take care of themselves — fails in four specific ways.

1. It destroys the supplier diff

The recorded cost is the baseline every price-file comparison runs against. Inflate it by 3% and a supplier's genuine 3% increase looks like no change at all; drop your allowance from 3% to 2% and every SKU in the catalog appears to get cheaper on a day nobody quoted you anything. You lose the ability to answer the only question the file was supposed to answer: did the supplier move? Shopify already gives you one number per variant with no history; adding a private fudge factor to it means even the current value no longer means what it says.

2. The shapes don't match

Loading a cost onto a unit implies it scales with units sold. Returns roughly do. Shrink roughly doesn't — it tracks inventory held and time elapsed, so a slow-moving line generates shrink while generating no sales to carry the allowance. Restocking labour scales with return events, which is a different curve again.

3. It lands in the wrong period

An allowance baked into unit cost is recognised when the item sells. But the shrink it's meant to cover happened to units that will never sell, and the return happened after the sale. Shopify's profit reports multiply recorded cost by units sold, so an inflated cost overstates COGS on good sales while the real loss sits unrecorded elsewhere — the same class of blind spot covered in what COGS includes and silently misses.

4. It's the wrong number for every SKU

Return rates differ by an order of magnitude across a catalog — fitment-sensitive parts and anything sized behave nothing like consumables. One blended uplift over-prices your clean lines and under-prices your messy ones, which is exactly backwards.

Where they do belong. Keep cost per item as the supplier's landed cost and nothing else — see landed cost for what legitimately belongs in it. Then carry returns and shrink as separate, visible adjustments: raise the margin floor for a category by its return allowance, subtract both from contribution when you judge a product line, and book shrink as a period expense plus a quantity write-down that corrects on-hand — never as a change to unit cost.

What a supplier increase does to the whole stack

Returns and cost increases compound, because the unsellable share of returns loses cost, not retail. Take the same SKU with cost moving from $52.00 to $57.00 — a 9.6% increase — and look at both responses.

 BeforeHold price $80Reprice to $87.69
Supplier cost$52.00$57.00$57.00
Product margin35.00%28.75%35.00%
Blended cost per return$33.30$34.05$34.73
Return allowance @ 6%2.50%2.55%2.38%
Return-adjusted margin32.50%26.20%32.62%

Hold-margin price = 57.00 ÷ (1 − 0.35) = $87.69. Open-box markdown stays at 20% of retail and the retained payment fee tracks the ticket, so both rise with price; the write-off case rises with cost.

Two things worth noticing. Holding the price costs 6.3 points of return-adjusted margin, not the 6.25 points of product margin — returns add a little on top because write-offs got more expensive. And the repriced column lands marginally above where it started, because the same handling cost is spread over a larger ticket. The mechanics of that reprice, including how much extra volume you'd need if you chose not to, are in recalculating margin after a cost increase.

A practical setup

  1. Log disposition, not just returns. Three buckets — back to stock, open-box, written off — recorded at the receiving bench. Without this you cannot compute a blended cost per return, and the blend is where the money is.
  2. Compute one allowance per category, quarterly. Not per SKU (too noisy), not one for the whole store (too blunt). Categories that behave alike in returns should share a number.
  3. Add it to the floor, not to the cost. If a category runs a 2.5-point return allowance and 0.8 points of shrink, its margin floor sits 3.3 points above your baseline floor. The cost field stays clean and your alerts stay meaningful.
  4. Count inventory on a cycle. Annual counts give you an annual number, which is too late to act on. Rotating counts by velocity class give you a trend.
  5. Re-check after every meaningful price file. The write-off component of a return is priced in supplier cost, so it moves whenever your suppliers move.
The one trap to avoid. Once you have a return allowance and a shrink figure, resist the urge to "simplify" by folding them back into the cost field next quarter. It always looks tidier and it always ends the same way: six months later nobody can tell whether a cost changed because a supplier raised a price or because someone adjusted an assumption.

Clean costs first, allowances second

Every number on this page assumes your recorded costs are the supplier's actual costs. Load your latest price list and your Shopify product export into the free Supplier Price Margin Checker to see which SKUs have drifted — matched by SKU, entirely in your browser.

Open the free checker ↗
Runs in your browser. Nothing uploaded, no account.