Part 1 — The Business of Fashion Wholesale
L Metrics, Planning and Decision-Making
Every number in a wholesale apparel business exists to trigger a decision: reorder, chase, mark down, kill, ship, hold, chase the cash, fire the customer. This chapter defines the metrics that actually run the business, shows the arithmetic with worked examples, and gives you the meeting cadence that turns numbers into action. It ends, as every chapter does, with the tables, constraints and screens your ERP has to provide so those numbers can be computed the same way twice.
In this chapter
- What you need to know first
- A metric earns its place by changing a decision
- The metric reference table
- Sell-through analysis in depth
- The reorder decision
- Aged inventory and liquidation
- Retail partner analytics
- Forecasting for a small brand, honestly
- Planning cadence: the meetings
- Building a reporting culture
- What this means for your ERP
What you need to know first
Before any formula makes sense, you need six pieces of measurement vocabulary. None of it is hard, and every one of the six is a place where beginners quietly compute the wrong thing without ever finding out. A plain-language table of the other trade words used in this chapter follows at the end of this section, so you can read the rest without stopping.
Units, dollars and the two cost bases
Units versus dollars. Every metric in this chapter can be computed in units (how many garments) or in dollars (how much money). The two bases give different answers because they answer different questions.
A style that sells 900 of 1,000 units has sold through 90% in units. If 700 of those units went out at full wholesale price and 200 went to an off-price buyer at a third of the price, the dollar sell-through against planned revenue is much lower. Off-price means a retailer such as a discount chain that buys leftover branded goods cheaply and sells them well below the original ticket.
Units tell you whether the product is wanted. Dollars tell you whether the business is healthy. Always say which one you mean. A report that just says "sell-through 90%" leaves every reader to guess which basis it used, so it settles nothing.
At cost versus at retail. Inventory can be valued at what you paid for it (cost) or at what you hope to sell it for (retail or wholesale value). Traditional department stores use the retail method, where the stock ledger is kept at retail selling price. Brands almost always keep inventory at cost, because that is what your accountant and your lender care about.
Some metrics demand one specific basis. GMROI — gross margin return on inventory investment, which you will meet shortly — is only meaningful with average inventory at cost. Mixing bases is the single most common cause of two people producing two different numbers from the same database.
Landed cost and the tariff-code problem
Landed cost. The cost of a garment is much more than the price on the factory invoice. Landed cost is the factory price plus freight, import duty, customs brokerage (the fee an agent charges to clear your goods through customs), insurance and any inbound handling, divided across the units received.
Every margin number in this chapter uses landed cost. If your system stores only the factory price, every margin you report is a flattering lie.
Do not hardcode a duty rate anywhere. What the United States charges to import a garment depends on the tariff code, which is the number in the Harmonized Tariff Schedule that describes exactly what the garment is made of and how it is made, and on the country it was made in.
One heading makes the point. Under heading 6110.30, which covers knitted pullovers and sweaters of man-made fibers, the ordinary rate published in the Harmonized Tariff Schedule as of July 2026 is:
- 6% if the garment is at least a quarter leather by weight;
- 6.3% if it is at least 30% silk;
- 17% if it is at least 23% wool;
- and 32% for everything else in that heading.
Four rates, one shape of garment, and a five-fold spread driven entirely by what the cloth is made of. Across apparel codes generally the ordinary rates run from zero to the low thirties in percent, and two shirts that look identical can sit in different codes because one is knitted and one is woven.
Tariffs since 2025, and what to store instead
On top of that base rate, the United States layered a series of additional tariffs from 2025 onward under emergency and trade-act powers, and those additions have been changed by executive action and challenged in court repeatedly.
On 20 February 2026 the Supreme Court held 6–3, in Learning Resources v. Trump and the consolidated V.O.S. Selections case, that the International Emergency Economic Powers Act does not authorize the President to impose tariffs at all. Collection of those deposits stopped days later, refunds began through a Customs and Border Protection process that opened in April 2026, and replacement tariffs were imposed under other statutes and promptly challenged in their turn.
As of July 2026 the litigation is still running. Any single percentage printed in a book is therefore wrong by the time you read it.
The practical consequence for your software is the important part, and it does not change with the politics. Store the duty and freight your customs broker actually billed on each receipt, as data, against that specific shipment. Never store a rate in a configuration file and multiply. Then a tariff change is one more number on one more receipt, your margin history stays honest across the change, and you can answer "what did this style cost us before and after?" without a rebuild.
In this chapter's worked examples a jacket invoiced at $28.00 lands at $38.00. Treat that $10.00 of freight, duty and handling purely as an illustration. Yours will differ, and yours will move.
Point-in-time, period and season
Point-in-time versus period. Some measures are a photograph: units on hand right now, money owed to you today, inventory value at month end. Others are a film: units shipped in the last four weeks, revenue for the season, returns in the third quarter.
When you combine a photograph with a film in one ratio, you have to decide which photograph. Inventory turnover divides a period (cost of goods sold for the year, usually written COGS — the landed cost of the goods you actually sold, not the cost of everything you own) by a photograph (inventory), so the convention is to use an average of several photographs, not one.
Different averaging choices produce different turn numbers, and both are defensible. Write down which one you use.
Season-to-date versus life-to-date. Apparel is sold in seasons. Spring/Summer and Fall/Winter are the classic two, and many brands run four or six drops a year.
A style belongs to a season, has a planned start-ship date (the earliest date the retailer will accept delivery) and a planned end date, and its performance is normally measured from the first day units were available to sell, not from the day the purchase order was cut and not from January 1. "Week 6 sell-through" means six weeks after that style became available in that channel.
If one report counts weeks from your warehouse receipt and another counts from the retailer's floor-set date — the day the store actually puts the goods out where shoppers can see them — the same style will show two very different curves. Both are correct. Only one is useful for the decision at hand.
Your sell-through and their sell-through
Your inventory versus their inventory. This is the big one, and it deserves the rest of this section. When you ship 300 jackets to a retailer, your inventory goes down by 300 and your revenue goes up. From your books, those jackets have sold. From the consumer's point of view, nothing has happened.
Those 300 jackets are now sitting in a retailer's distribution center or on their shop floor, and whether they ever reach a human body is a separate question with a separate number attached. A wholesale brand therefore lives with two sell-through numbers at all times:
- Your sell-through (wholesale sell-through, sometimes "sell-in"): units you shipped or booked, divided by units you made or bought. Answers "did I sell my production?"
- Their sell-through (retail sell-through, "sell-out" or "sell-through at retail"): units the retailer sold to consumers, divided by units the retailer received from you. Answers "does the end customer want this?"
Your number can be 100% while theirs is 20%. That is the classic path to disaster: you had a great season, the retailer had a terrible one, they mark the goods down, they demand a markdown allowance (a credit against your invoice to compensate for their discounting), and they do not reorder next season. The brands that survive are the ones that watch their number obsessively and treat their own sell-in as a lagging vanity metric.
Two more terms you will need. An order book (or backlog) is the set of confirmed customer orders you have accepted but not yet shipped. In prebook wholesale, where retailers commit to seasonal buys months ahead of delivery, the order book is a near-certain revenue forecast. The opposite arrangement is at-once, where a retailer orders from stock you already hold and expects it to ship this week; at-once brands have almost no order book and have to guess.
Open-to-buy, usually shortened to OTB, is a retail buyer's remaining budget for a period after everything already committed is deducted; when a buyer says "I have no OTB left," they mean their money for that month is already spent, and no amount of enthusiasm will produce an order.
The rest of the vocabulary, in plain words
These terms appear throughout the chapter. Read the table once, then carry on; each one is also explained again where it first does real work.
| Term | What it actually means | Why it matters to your software |
|---|---|---|
| Door | One physical store. An account with 40 doors is one customer with forty shops. "Six doors" means the product went to six locations. | Store-level data needs a location code, not just an account. |
| Colorway | One color version of a style. The same jacket in black, navy and olive is one style and three colorways. | Style, colorway and size are three separate levels in the item table. |
| Size curve | The proportional split of units across sizes, for example 5% XS, 20% S, 30% M, 25% L, 15% XL, 5% XXL. | Stored per category, used to explode a style buy into sizes. |
| Broken size run | The popular middle sizes have sold out and only the ends are left. The style looks dead but is actually unbuyable. | A flag on the sell-through screen, computed from size-level stock. |
| Carryover | A style you keep selling into the next season instead of retiring it. | A boolean on the style/season record; changes every reorder rule. |
| Chase | Getting extra units of a winner faster than a normal factory order allows, by paying more. | A separate order type with its own cost fields and lead time. |
| Chargeback | Money a retailer subtracts from your invoice as a penalty, usually for a paperwork or delivery failure. | Needs its own table; it never appears as an unpaid invoice. |
| Markdown allowance | A credit you give a retailer to compensate them for discounting your goods on their floor. | A deduction against net sales, not an expense buried in overheads. |
| Factor | A finance company that buys your unpaid invoices at a small discount and gives you cash now. With recourse, you repay the factor if the retailer never pays. Without recourse, the factor absorbs that loss and charges more for it. | Changes who owns the receivable and how you compute money owed. |
| Jobber | A trader who buys distressed stock outright for cash, no returns, and resells it wherever they can. | A disposal channel with its own approval rule and reason code. |
| Linesheet | The catalog of styles, colors, sizes and wholesale prices you sell a season from. | Generated from the item and price tables, not maintained by hand. |
| Greige fabric | Cloth that has been woven or knitted but not yet dyed or finished. Holding it lets you decide the color later. | A material stock type held at the mill, not finished-goods stock. |
| Cut, make, trim | The factory stage where fabric is cut, sewn and finished with buttons, zips and labels. | One named stage in the lead-time build-up. |
| Drayage | The short truck move from the port to your warehouse. | Another lead-time stage and another landed-cost component. |
| 3PL | Third-party logistics: an outside warehouse that stores your stock and packs your orders for a fee. | Fees are per order and per unit, so they belong in cost per order. |
| DTC | Direct-to-consumer: selling on your own website or in your own shop, with no retailer in between. | A channel dimension on every sales and metric row. |
| EDI | Electronic Data Interchange: a set of standard message formats retailers use to exchange orders and data with suppliers automatically. | Message 850 is a purchase order, 856 a shipment notice, 852 sales data. |
| ASN | Advance ship notice (EDI message 856): the electronic packing list you send before a delivery arrives. | Getting it wrong or late is one of the commonest chargeback causes. |
| RTV / RA | Return to vendor and return authorization: goods coming back to you from a retailer, and the number that permits it. | Returns must reverse both stock and revenue, keyed to the original order. |
| Net 30 | Payment terms: the invoice is due 30 days after it is issued. | Drives the due date and every collections report. |
| SKU | Stock keeping unit: the most specific sellable thing, normally one style in one color in one size. | The grain of your inventory ledger. Everything rolls up from here. |
A metric earns its place by changing a decision
Apply one test to every number. For any figure you are about to put on a dashboard, finish this sentence: "If this number goes above X, we will do Y; if it goes below Z, we will do W." If you cannot fill in the blanks with a real action, a real owner and a real deadline, the number is decoration. Delete it.
This sounds obvious and it is routinely ignored. New founders build a dashboard with twenty tiles because dashboards feel like management. Six weeks later nobody opens it, because none of the tiles told anyone to do anything. Meanwhile the one number that mattered, the aging of a specific customer's receivable, was buried on page three.
A metric earns its place by triggering an action. Before you build the report, write the decision rule and name the person who owns it. If no rule and no owner exist, you are building a screensaver.
The practical form of this discipline is a one-page metric contract. For each metric you keep, you record: the exact formula, the data source, the owner, the review cadence, the threshold, and the action. Something like this.
METRIC CONTRACT
---------------------------------------------------------------
Name : Retail sell-through, 6-week, by style/colour
Formula : units sold at retail / units received by retailer
Grain : account x style x colour x week
Source : EDI 852 feed + vendor portal export (weekly, Mon)
Owner : Head of Sales
Cadence : Weekly business review, Monday 09:30
Green : >= 55% at week 6 -> propose reorder or chase
Amber : 35-54% at week 6 -> hold; check size curve first
Red : < 35% at week 6 -> markdown plan within 14 days
Escalation : Red for 2 consecutive weeks -> monthly op review
Version : v3, effective 2026-02-01
---------------------------------------------------------------
How to read the metric contract
Read that block as a contract between a number and a human. The grain line says how finely the number is cut. This one is measured for a single account, a single style, a single color and a single week, so "sell-through" in the abstract never appears.
The source line names exactly where the data comes from, which matters because your own shipment records and the retailer's portal will disagree and you need to have decided in advance which one wins. ("EDI 852" is the standard electronic message a retailer can send you every week carrying what they sold and what they still hold; there is a section on it later in this chapter.)
The green/amber/red lines are the decision rule: they convert a percentage into an instruction. The escalation line stops a red flag from being quietly ignored week after week. The version line exists because in eighteen months somebody will ask why last year's numbers look different, and the honest answer will be "we changed the formula on 1 February 2026." That is fine, as long as it is written down.
The metric reference table
What follows is the working set. It is deliberately short, and a small or mid-sized brand will not need more than this; most will act on fewer.
Read the fourth column carefully, because it is mostly a refusal. Apparel has very few honest cross-industry benchmarks. A brand selling plain black t-shirts all year and a brand selling winter coats have almost nothing in common numerically, and the same is true of a $40 item and a $400 one.
Where a real, published figure exists, it is named and attributed here. Where it does not, the column says the metric varies and tells you what to compare against instead, which is almost always your own history and your own contract with that customer. Anyone who offers you a single industry benchmark covering both of those brands is selling something.
| Metric | Formula | Worked example | Range (varies by segment) | Decision it drives |
|---|---|---|---|---|
| Wholesale sell-through (yours) | units shipped or booked ÷ units received into stock | 900 ÷ 1,200 = 75% | Varies with model. Prebook brands aim near 100% by season end; brands selling from stock they hold plan lower and expect leftovers | How much of the buy is still exposed; whether to open the style to off-price |
| Retail sell-through (theirs) | units sold to consumers ÷ units the retailer received | 132 ÷ 300 = 44% at week 6 | Varies enormously by category, price point and account. Set your own target from your own history rather than a published benchmark | Reorder, chase, mark down or kill |
| Weeks of supply (WOS) | units on hand ÷ average weekly unit sales | 168 ÷ 22 = 7.6 weeks | Varies. Year-round basics carry more; seasonal fashion should trend toward zero at season end | Whether to buy more, hold, or start clearing |
| Inventory turnover | COGS ÷ average inventory at cost | $2,400,000 ÷ $600,000 = 4.0× | Wide. FY2025 filings, as compiled by Retail Dogma: Tapestry 2.04, Nike 3.53, American Eagle 5.26. Roughly 2–6× covers most apparel, but the spread is the point | How much cash the business ties up per dollar of sales |
| GMROI (gross margin return on inventory investment) | gross margin dollars ÷ average inventory at cost | $1,600,000 ÷ $600,000 = 2.67 | Below 1.0, a year of gross margin does not even cover what the stock cost you to hold. FY2025 filings for large listed retailers span 1.01 to 6.28 | Which styles and categories deserve next season's money |
| Gross margin % | (net sales − COGS) ÷ net sales | $1,600,000 ÷ $4,000,000 = 40% | Varies. Margin at list price is usually far higher than the blended figure once off-price sales and retailer allowances are counted | Pricing, sourcing, and whether a customer is worth serving |
| Contribution margin | gross margin − variable selling and fulfillment costs | $1,600,000 − $785,000 = $815,000 (20.4%) | Highly variable and rarely published. Judge it against your own fixed costs, not against peers | Which channels and customers actually pay the rent |
| Fill rate (unit) | units shipped ÷ units ordered | 940 ÷ 1,000 = 94% | Set by each retailer's contract. Target's published bar is 95%, measured against the quantity originally ordered, under the policy it adopted on 4 August 2024 | Production planning, safety stock, chargeback exposure |
| On-time delivery | purchase orders delivered inside the agreed window ÷ purchase orders due | 88 ÷ 100 = 88% | Set by contract. Walmart's supplier guidance, dated March 2024, publishes 90% for suppliers who arrange their own freight; small specialty stores set no formal target but notice anyway | Whether to change factories, freight mode or ship dates |
| OTIF (on time and in full) | purchase orders both on time and complete ÷ purchase orders due | 82 ÷ 100 = 82% | Program-specific. Walmart pairs a 95% in-full bar with its 90% on-time bar for suppliers who arrange their own freight, and 98% on-time for those whose freight Walmart arranges | Chargeback forecasting; whether a big-box account is viable |
| Average selling price (ASP) | net sales ÷ units sold | $4,000,000 ÷ 62,000 = $64.52 | No external benchmark exists. Compare it to your own list price and to last season | Detects silent erosion from discounting and mix shift |
| Discount rate | 1 − (ASP ÷ list wholesale price) | 1 − (64.52 ÷ 84.00) = 23.2% | Varies. What matters is the trend and the split between discount given at order entry and value lost after shipping | Whether the problem is demand or price discipline |
| Order book coverage | booked unshipped orders ÷ planned shipments for the same window | $1,150,000 ÷ $1,400,000 = 82% | Depends entirely on your model. Prebook brands should be high a quarter out; at-once brands run near zero by design | Whether to cut production, chase orders, or raise cash |
| Days sales outstanding (DSO) | (money owed to you ÷ credit sales, meaning sales made on payment terms rather than cash up front) × days in period | ($520,000 ÷ $1,150,000) × 91 = 41.2 days | Structurally higher than your stated terms, because invoicing, approval and payment runs all add days on top of net 30 | Collections effort, credit limits, factoring decisions |
| Aged inventory % | inventory at cost older than N days ÷ total inventory at cost | $138,000 ÷ $600,000 = 23% | No universal threshold. Set one in your own aging policy and hold yourself to it | Markdown, off-price, donation or write-down |
| Return rate | units returned ÷ units shipped, by channel | Wholesale 1,240 ÷ 62,000 = 2.0% | Channel-dependent. NRF and Happy Returns put total US returns at $849.9bn, or 15.8% of sales, in 2025, and online returns at 19.3%; wholesale returns are much lower because retailers cannot send goods back without your authorization | Fit and quality fixes; DTC packaging and sizing content |
| Customer concentration | largest customer net sales ÷ total net sales | $880,000 ÷ $4,000,000 = 22% | No regulated limit for a private brand. Item 101 of the US Securities and Exchange Commission's Regulation S-K makes listed companies disclose dependence on customers, which tells you regulators treat the risk as material | Diversification targets; credit and factoring structure |
| Cost per order | total order-handling cost ÷ number of orders | $310,000 ÷ 1,150 = $270 | Yours alone, and worth measuring. Set your minimum order value at several multiples of it | Minimum order policy; which small accounts to move to a distributor |
The rest of this section walks the ones that are easy to get wrong.
Gross margin and contribution margin
Gross margin is revenue minus the landed cost of what you sold. Contribution margin subtracts everything else that varies with the sale. The gap between the two is where small brands die, because the gap is invisible on a profit-and-loss statement — the standard financial summary of income and expenses over a period, often shortened to P&L — that lumps commissions, freight and penalty deductions into one big "operating expenses" line.
MARGIN WATERFALL - FULL YEAR
$ % net sales
Gross wholesale billings 4,410,000
Less: markdown allowances (210,000)
Less: co-op / returns credits (200,000)
---------------------------------------
Net sales 4,000,000 100.0%
Less: COGS (landed) (2,400,000) 60.0%
---------------------------------------
Gross margin 1,600,000 40.0%
Less: sales commissions (10%) (400,000) 10.0%
Less: outbound freight (45,000) 1.1%
Less: factoring fee (1%) (40,000) 1.0%
Less: 3PL pick and pack (100,000) 2.5%
Less: chargebacks (200,000) 5.0%
---------------------------------------
Contribution margin 815,000 20.4%
---------------------------------------
Walk down that waterfall. Gross wholesale billings is what your invoices added up to before anyone took anything off. Markdown allowances are credits you issued to retailers who discounted your goods on their floor, and they are a real cost of selling even though no money moved. Co-op credits are your agreed contribution to the retailer's advertising, so called because the cost is cooperative. Net sales is the number that belongs at the top of your income statement.
COGS at 60% looks bad for apparel until you notice that at list price this brand runs a 54.8% margin ($84.00 wholesale on a $38.00 landed cost); the blended 40% is what is left after dumping stock at off-price dragged the average down.
Below the gross margin line sit five costs that scale with volume. Sales commission goes to independent sales representatives, who sell your line to shops on a percentage of what they book rather than a salary. The factoring fee is the finance company's charge for advancing you cash against unpaid invoices. The 3PL line is your outside warehouse's fee for picking each order off the shelf and packing it. Chargebacks are the retailer's compliance penalties, covered next.
Contribution margin of 20.4% is what is genuinely available to cover salaries, rent, samples and marketing. If your fixed costs are $700,000, this business makes $115,000 before tax, and one bad season erases it.
Every percentage in that block belongs to this one imaginary brand. Commission rates, factoring fees, warehouse rates and penalty exposure all vary by deal, volume and how long you have been trading. The structure of the waterfall is what transfers; the figures are illustration.
Chargebacks are deductions a retailer takes off your invoice for compliance failures: wrong carton label, late delivery, missing packing slip, a wrong or missing advance ship notice. They arrive months after the shipment. They are netted against payments, so no invoice is ever flagged as unpaid — the money simply never turns up — and they will not appear anywhere in your ERP unless you deliberately build a place for them. Brands routinely discover in year three that a "profitable" account has been running at a loss the whole time.
Two published examples show the scale, both current as of July 2026. Target's fill-rate policy, changed on 4 August 2024 to measure against the quantity originally ordered rather than a revised figure, carries a 5% cost-of-goods chargeback for shipping either short or over. Walmart's on-time-and-in-full program charges 3% of the cost of goods on non-compliant cases. Smaller specialty stores rarely publish anything, but they achieve the same effect by short-paying an invoice and telling you why only if you ask.
Inventory turnover and GMROI
Turnover asks how many times you sold and replaced your stock in a year. GMROI asks how many dollars of gross margin each dollar tied up in stock produced. GMROI is the better metric because it refuses to be gamed: you can raise turns by discounting, but discounting cuts margin, so GMROI stays honest.
GMROI DECOMPOSITION
GMROI = gross margin % x (net sales / avg inventory at cost)
Gross margin % = 1,600,000 / 4,000,000 = 40.0%
Sales-to-stock ratio = 4,000,000 / 600,000 = 6.67
GMROI = 0.400 x 6.67 = 2.67
Reading: every $1.00 of inventory cost returned $2.67 of
gross margin over the year.
Two ways to reach GMROI of 2.67
A: 40% margin, 6.67 sales-to-stock (this brand)
B: 55% margin, 4.85 sales-to-stock (slow, high-margin)
Same GMROI, very different cash cycles.
The decomposition is the useful part. GMROI is margin percentage multiplied by how hard the inventory works. That means a diagnosis is always available: if GMROI falls, you can tell immediately whether margin eroded or stock stopped moving, because you can look at the two factors separately.
Options A and B show why the single number needs the decomposition. A brand at 55% margin turning slowly and a brand at 40% margin turning fast score the same, but they need entirely different fixes and they have entirely different cash needs.
FY2025 figures for large listed retailers give you a feel for the spread: Tapestry 6.28, Abercrombie & Fitch 5.5, Urban Outfitters 3.35, Walmart 3.08, American Eagle 3.03, Nike 2.64, Shoe Carnival 1.01. Read those as a sense of scale. None of them is a target for you. Most of those companies sell largely through their own shops and websites, and several of them make and sell across many categories, so their inventory behaves nothing like a small wholesale brand's.
The useful lesson is the width of the range: a six-fold spread between the top and the bottom of a list of successful public companies should stop anyone telling you there is a correct GMROI.
Fill rate, on-time and OTIF
These three are service metrics, measured from the retailer's point of view, and they are the ones a buyer will quote at you in a meeting. Fill rate is how much of what they ordered you actually shipped. On-time is whether it arrived inside the window on the purchase order. OTIF combines them and is unforgiving, because a purchase order only counts if both conditions hold.
OTIF WORKED EXAMPLE - ONE MONTH, 100 PURCHASE ORDERS
On time (arrived in window) 88 POs
In full (>= 95% of units per line) 91 POs
Both on time AND in full 82 POs
On-time rate = 88 / 100 = 88%
In-full rate = 91 / 100 = 91%
OTIF = 82 / 100 = 82%
Note: 88% x 91% = 80%, but actual OTIF is 82%.
Failures overlap. Never multiply the two rates.
Chargeback exposure, big-box style programme:
Non-compliant cases 2,900
Cost of goods per case $228
Non-compliant COGS $661,200
Penalty at 3% of COGS $19,836
The important line is the warning about multiplying. People assume on-time and in-full are independent events and multiply them, which understates OTIF whenever the same troubled orders fail both tests, which is usually. Compute OTIF directly from the purchase order records.
The chargeback block shows why the number has teeth: at Walmart's published 3% of cost of goods on non-compliant cases, a month with 2,900 problem cases costs almost twenty thousand dollars, and that is deducted from what they pay you rather than invoiced, so it arrives as a mystery shortfall in a bank deposit.
Walmart's thresholds, as set out in supplier guidance dated March 2024 and still the published figures as of July 2026, are 90% on time for prepaid suppliers — suppliers who arrange and pay for the freight themselves — and 98% for collect suppliers, whose freight Walmart arranges and who therefore only have to have the cases ready by the appointment time. Both sit alongside a 95% in-full bar.
Penalties totalling under $1,000 in a month are waived, and charges are calculated monthly but billed quarterly, which is exactly long enough for you to forget which shipments caused them. Check the current figures in the supplier portal before you build any of this into a report: retailers revise these programs, and Walmart has revised this one more than once.
ASP and discount rate
Average selling price is net sales divided by units. It moves for two reasons, and you must separate them. Either you discounted the same goods (price erosion) or you sold a different mix of goods (mix shift). A brand whose ASP dropped from $70 to $64 because it discounted is in trouble. A brand whose ASP dropped because it launched a successful $40 t-shirt program alongside its $120 jackets is fine, and possibly thriving.
ASP BRIDGE, LAST SEASON vs THIS SEASON
Last season ASP $70.10
effect of discounting (same styles) (4.20)
effect of mix shift (more tees, fewer (2.90)
jackets)
effect of price increases on carryover 1.52
------------------------------------------------
This season ASP $64.52
Discount rate = 1 - (64.52 / 84.00) = 23.2%
Of that 23.2%, roughly 5.0 points is trade
discount agreed at order entry and 18.2 points
happens after shipping: markdown allowances,
off-price dumping, credits for returned goods.
This bridge takes the drop from $70.10 to $64.52 and attributes it. Discounting the same styles cost $4.20. Selling proportionally more cheap units cost another $2.90. A price rise on carryover styles gave back $1.52.
Now the conversation is specific: the $4.20 is a sales-discipline problem for the head of sales, the $2.90 is a merchandising decision that may be deliberate, and the $1.52 is evidence the market will bear more price on proven styles.
The final split matters just as much. A 23.2% discount rate sounds like weak selling, but only 5 points of it happened at order entry as a trade discount — a straightforward percentage off the list price, agreed when the order is written. The other 18.2 points happened after the goods shipped, as markdown allowances, off-price dumping and credits for goods returned to you. So the real problem sits in planning rather than in the sales team's pricing nerve: too much product ended up somewhere it had to be cleared.
Order book coverage, DSO and cost per order
Order book coverage is the most valuable forward number a prebook wholesale brand has, and it is nearly free to compute because it comes from your own sales orders. Take the confirmed, unshipped orders with a requested ship date inside the next thirteen weeks, and divide by what your plan says you will ship in those thirteen weeks. If that ratio is 82% and you are eight weeks from the start of the window, you know your quarter with a confidence no statistical model will ever match.
DSO and the cash conversion cycle
DSO measures how long your money sits in someone else's bank account. It has a useful sibling, the cash conversion cycle: the number of days between paying your factory and being paid by your customer. That is the number that decides whether you need a loan.
The Hackett Group's 2025 working capital survey found that textiles, apparel and footwear improved their cash conversion cycle by 10%, driven mainly by a 22% increase in days payable outstanding, which is the average number of days a company takes to pay its own suppliers. Read that carefully: the improvement came from paying suppliers later, and collections stayed where they were.
Across the top 1,000 US companies the same survey put the overall cash conversion cycle at 37 days and days payable at 59, and recorded what it called a second straight year of degradation in days sales outstanding, as customer bargaining power pushed payment terms out.
Two lessons follow, and neither is a benchmark. First, if a large customer is stretching you, they are probably doing it deliberately and to everybody.
Second, do not judge your own DSO against a published average. Judge it against your own stated terms. On net 30, DSO will always land above 30, because the invoice has to be issued, approved and paid in a payment run. If it lands at double your terms, nobody is making collection calls, and the fix is to staff the job rather than to keep watching the number.
Cost per order and the minimum order problem
Cost per order is the metric nobody computes and everybody needs. Add up the genuinely order-driven costs: customer service time, EDI transaction fees, 3PL pick and pack fees, packaging, the labor of chasing a purchase order acknowledgement. Divide by the number of orders.
COST PER ORDER AND THE MINIMUM ORDER PROBLEM
Annual order-handling cost $310,000
Orders shipped 1,150
Cost per order $270
Average order value = 4,000,000 / 1,150 = $3,478
-> cost per order is 7.8% of AOV. Acceptable.
Small boutique order, 8 units @ $84 = $672
cost per order $270 = 40.2% of order value
gross margin on the order (54.8%) = $368
contribution after order cost = $98
... before commission of $67 = $31
Decision rule: minimum opening order $1,500,
minimum reorder $750, or route the account to a
distributor / the B2B self-serve portal.
The arithmetic is brutal and it is why minimum order quantities exist. A $672 boutique order generates $368 of gross margin, but $270 of that is eaten by the cost of processing the order and $67 more by commission, leaving $31. One returns query or one re-ship wipes it out.
Refusing small accounts is the wrong answer, because small accounts are how brands get built. Change how they order instead: give them a self-serve business-to-business ordering website that costs you almost nothing per order, or set a minimum that pushes the order value above the point where the math works.
Sell-through analysis in depth
Sell-through drives the single most consequential recurring decision a brand makes: what to reorder. Get it right and you compound. Get it wrong and you either run out of your best seller in week five or spend the next eighteen months liquidating a colorway nobody wanted.
The three levels: style, color, size
Compute sell-through at three grains, and interpret each differently.
HARBOUR JACKET (JKT-201) - WEEK 6 AT ACCOUNT 1042
STYLE LEVEL
Received 300 Sold 132 ST 44.0% WOS 7.6
(168 left, selling 22 a week, so 168/22 = 7.6)
COLOUR LEVEL
Colour Recd Sold ST% Wk rate WOS
Black 120 74 61.7% 12.3 3.7
Navy 90 41 45.6% 6.8 7.2
Olive 60 14 23.3% 2.3 20.0
Sand 30 3 10.0% 0.5 54.0
SIZE LEVEL (Black only)
Size Recd Sold ST% Status
XS 10 4 40.0% ok
S 20 18 90.0% BROKEN - 2 left
M 35 32 91.4% BROKEN - 3 left
L 30 16 53.3% ok
XL 15 3 20.0% slow
XXL 10 1 10.0% slow
The style-level number, 44%, is the one the buyer will quote and it is nearly useless on its own. One level down, the color split tells the real story: black is selling at 12.3 units a week with only 3.7 weeks of supply left, while sand has sold three units in six weeks and has over a year of supply at its current rate. Those are not the same product and should never share a decision.
One level further down, the size split on black shows the actual emergency. Small and medium are effectively sold out. When the middle sizes go and only the extremes are left, the trade calls the size run "broken": there is stock on the rail, but almost nobody who walks in can wear it.
A broken style shows a collapsing weekly rate the following week, and an inexperienced analyst reads that as demand cooling when it is actually a stockout. Every sell-through review must check size availability before drawing any conclusion about demand.
This leads to a second calculation worth automating: size-adjusted sell-through. When the core sizes are gone, the honest number is sell-through against the units that were actually available to sell. Black jacket: 74 sold against 120 received, but the 25 XL and XXL units barely count as sellable demand. Reporting both the raw 61.7% and a core-size-only figure (S, M and L: 66 sold of 85 received, 77.6%) stops you killing a winner because its tails dragged the average down.
When is the signal trustworthy?
Too early and you are reading noise. Too late and you cannot act. The honest answer depends on three things: how much volume has accumulated, whether the product has been given a fair shot, and whether the sell-through curve is behaving like a normal seasonal curve.
| Point in season | What the data can tell you | What it cannot | Allowed decision |
|---|---|---|---|
| Weeks 1–2 | Whether the goods physically got to the floor; whether the size curve shipped correctly | Anything about demand. Floor set dates vary by store by up to three weeks. | Fix logistics problems only. No merchandising decisions. |
| Weeks 3–4 | Rank order within the style: which color is leading, which is dead last | Absolute rate. Early adopters are not the whole market. | Flag candidates. Start a chase conversation with the mill on long-lead fabric. |
| Weeks 5–8 | A trustworthy rate of sale if the style has moved at least about 30 units at that account and core sizes are still in stock | Whether a late marketing push or a cold snap will change everything | Reorder, chase, or first markdown. This is the decision window. |
| Weeks 9–12 | Whether the season is being made or missed; the shape of the residual | Nothing you can fix with production. Lead times have closed. | Markdown depth, off-price allocation, carryover flag for next season. |
| Post-season | Everything, for the hindsight review | — | Next season's buy quantities and the assortment cull. |
The minimum-volume rule matters more than the week number. Around thirty units sold is a sensible floor before you treat a rate as real at a single account, though the right number depends on how many stores the goods went to and how expensive the item is. Below that, one enthusiastic sales associate distorts everything.
If an account is small, aggregate across accounts of similar type — all independent specialty doors together, all department store doors together, where a "door" is simply one physical shop — rather than deciding on a nine-unit sample. And check that the retailer has not simply mis-merchandised the product. A jacket hanging in the back of a stockroom sells at zero, and the fix for that is a phone call to the buyer rather than a price cut.
The four actions
Every sell-through review ends with one of four verbs. Force yourself to pick one; "keep watching" is how brands drift into liquidation.
- Reorder. Place new production of the same style. Only viable when the remaining season exceeds the lead time by a comfortable margin, or when the style is a carryover — one you intend to keep selling next season rather than retire — so late arrival does not matter.
- Chase. Get more units faster than a normal reorder allows, by paying for speed. You can cut from fabric you already hold, switch a batch already in production to a different colorway (the same style in a different color), send the goods by air instead of by sea, or buy back excess from a slow account and move it to a fast one. Every option costs more per unit and buys weeks.
- Mark down. Accept a lower price to convert stock into cash while there is still season left to sell into. The first markdown is almost always the cheapest one.
- Kill. Stop shipping it, take it off the linesheet (the catalog your reps sell from), and plan its exit. Killing a style early protects the brand from a market flooded with discounted units, which teaches customers to wait for the sale.
One habit is worth building deliberately: give fast sellers more meeting time than slow sellers. Founders spend most of a review arguing about the styles that failed and almost none finding a way to get more units of the style that is flying. The failed style's money is already spent. The winner's money is still available, and only for a few more weeks.
The reorder decision
A reorder is a bet that demand will still exist when the goods arrive. The arithmetic takes five minutes. Holding yourself to what it says is the hard part.
REORDER FEASIBILITY - HARBOUR JACKET, BLACK
Today Week 6 of 22
Season weeks remaining 16
Lead time build-up
PO issue to fabric ready 3 wks
Cut, make, trim 5 wks
Ocean transit + port + drayage 4 wks
Inbound QC, ticketing, putaway 1 wk
Ship to retailer + their DC to floor 2 wks
------------------------------------------------
Total lead time 15 wks
Selling weeks available on arrival = 16 - 15 = 1
Weekly rate at this account 12.3 units
Rate across all accounts 61.0 units
Units sellable in 1 week 61
Factory minimum per colour 400 units
Units at risk if reorder placed 400 - 61 = 339
VERDICT: DO NOT REORDER on ocean freight.
Read the build-up line by line, because founders consistently forget half of it. Lead time covers the whole chain, from the moment you commit money to the moment a consumer can touch the garment. The factory's quoted production time is only one stage of five.
Three of those stages are worth naming properly:
- "Cut, make, trim" is the factory stage: the cloth is cut to the pattern, sewn together, and finished with buttons, zips, labels and hangtags.
- "Drayage" is the short truck leg from the port to your warehouse, which sounds trivial and regularly is not, because it depends on a container being released and an appointment being available.
- And the last stage, the retailer's own transit from their distribution center to the shop floor, is the one nobody counts: your goods can sit in a customer's warehouse for a fortnight before a shopper ever sees them.
Fifteen weeks against sixteen weeks of remaining season leaves one selling week. At 61 units a week across all accounts, you would sell 61 units out of a 400-unit factory minimum, leaving 339 units to carry or liquidate. The verdict is not close. Note that the factory minimum is doing as much damage here as the lead time: even if the goods arrived tomorrow, you are being asked to buy far more than the season can absorb.
Chase options: paying for speed
SAME STYLE, CHASE OPTIONS EVALUATED
Option Extra Lead Sellable Units Verdict
cost/u wks weeks at risk
------------------------------------------------------------
Ocean reorder $0.00 15 1 339 No
Air freight $4.10 11 5 95 Marginal
Cut from held $1.20 7 9 0 YES - 250u
greige fabric
Buy back from $2.60 2 14 0 YES - 60u
slow accounts
Carryover buy $0.00 15 next szn 0 YES if the
for next season style is core
This is the chase table, and it is the one page worth putting in front of everybody in the reorder conversation. Each row trades money for time.
Air freight costs $4.10 a unit and buys four weeks, which turns one sellable week into five and cuts the units at risk from 339 to 95. Cutting from greige fabric you already own (undyed, unfinished cloth held at the mill precisely for this purpose) is cheaper and faster still, because the long-lead step is already done. Buying back sixty units from accounts where the jacket is dead and reallocating them to accounts where it is flying costs almost nothing and takes two weeks; it also makes the slow account happy.
The last row is the quiet winner: if the style is a genuine core item, reorder on ocean freight for next season, where the lead time is irrelevant and the price is lowest.
The classic failure is placing a large late reorder on a style that is peaking. Demand for a fashion item rises, peaks and then falls away; it never settles into a flat line you can keep selling against.
If the style is at week 8 of a 22-week season and the weekly rate has stopped rising, the goods you order today will land into a declining curve, and the retailer who begged you for more in week 8 will refuse them in week 20 because their open-to-buy has moved to spring. Get the reorder commitment in writing before you commit the factory, and put a cancellation date on it.
The five-step reorder decision framework
A simple decision framework you can run in a five-minute meeting:
REORDER DECISION FRAMEWORK
1. Is total lead time <= remaining season weeks minus 4?
No -> go to chase table, or defer to next season.
Yes -> continue.
2. Is the weekly rate still flat or rising over 3 weeks?
Falling -> do not reorder. Falling rate + more
units = markdown.
Flat or rising -> continue.
3. Are the core sizes in stock at retail?
No -> the rate is understated. Reorder is more
attractive than it looks. Recompute on
core sizes only.
4. Does (remaining weeks - lead time) x weekly rate
cover at least 70% of the factory minimum?
No -> chase, do not reorder.
Yes -> continue.
5. Do you have a written commitment (PO or signed
reorder confirmation) for at least 50% of it?
No -> reorder at your own risk. Cap the buy.
Yes -> place the order.
Step 1 subtracts four weeks as a safety buffer, because lead times slip and because arriving with only a couple of selling weeks left is the same as arriving late. Step 2 is the trend check that stops you buying into a peak. Step 3 is the stockout correction from the previous section, and it works in your favor rather than against it.
Step 4 is the exposure test: if you cannot sell 70% of what the factory will make you buy, the reorder converts a winner into aged stock. Step 5 is the discipline that separates brands that survive from brands that do not. A buyer's enthusiasm on a phone call is not a commitment.
Aged inventory and liquidation
Unsold inventory costs you money every month it sits there: warehouse space, insurance, counting, capital that could have funded next season, and the slow loss of value as the garment becomes last year's. Most importantly it costs management attention, because every meeting about old stock is a meeting not about new product.
An aging policy you set in advance
The reason to write an aging policy before you have aged inventory is that you will not be rational once you do. Sunk cost is the strongest force in a founder's mind. Writing the rules while the stock is new means that when the moment arrives, the decision is already made.
| Age since receipt | Status | Permitted channels | Price floor | Who decides |
|---|---|---|---|---|
| 0–90 days | Current | Full-price wholesale, own DTC at full price | List wholesale, no discount above 5% | Sales, no approval needed |
| 91–180 days | Watch | Add: sample sale, friends and family, seasonal promo at own DTC | No lower than 25% off list wholesale | Head of sales |
| 181–270 days | Aged | Add: off-price offer, outlet, international distributor closeout | Cost plus 15% | Founder, logged with reason |
| 271–365 days | Distressed | Add: jobber, bulk lot, marketplace liquidation | Any price above zero; recovery target set per lot | Founder |
| Over 365 days | Dead | Donation, textile recycling, disposal | — | Automatic; finance writes down |
Those day counts are only an example. There is no industry standard, and no rule anywhere says 90 days counts as "current". Pick buckets that match how long your season actually runs and how fast your category dates, write them down, and then hold to them; a brand selling four drops a year will want tighter buckets than one selling two. What must not vary is that the buckets exist and that crossing one triggers something.
The most important column is the last one. Escalating who can approve a discount as stock ages sounds bureaucratic, but it does two useful things: it stops a salesperson solving a personal quota problem by torching your pricing, and it forces the founder to look at the aged report at least once a quarter.
The first markdown is the cheapest markdown. Every week you wait, the price you can get falls and the cost of holding accumulates. The money you paid the factory is gone regardless of what you do next. The only live question is which available option returns the most cash, soonest.
Off-price, jobbers and the brand cost of clearing
Off-price retailers buy excess branded goods at deep discounts and sell them at prices well below the original retail. They are a legitimate, enormous channel and a normal part of how apparel clears. They are also a channel your full-price accounts will notice. If a specialty boutique in the same city sees your jacket at an off-price chain for less than their wholesale cost, you have a very difficult phone call, and you may lose the account.
The practical rules brands use to manage this tension:
- Timing. Do not release to off-price until your full-price accounts have finished their own markdown cycle. Contractually, some retailers require this in writing.
- Geography. Sell to international distributors or export jobbers where your domestic accounts will not encounter the goods.
- Labels. Some brands cut out or overprint the brand label on liquidation lots, or ship them under a secondary label, so the goods are harder to trace back. Be careful here. Removing a brand label is a commercial decision; removing the legally required labels breaks the law. In the United States two Federal Trade Commission rules apply at once. The textile labeling rules require a garment to show its fiber content, the country where it was made, and the identity of the business responsible for it, given either as a company name or as an FTC-issued registered identification number. A separate Care Labeling Rule requires a permanently attached label giving washing or drycleaning instructions, including water temperature and drying method, plus a warning for any treatment that would damage the garment. Both apply to clearance goods exactly as they apply to full-price goods. If you are cutting labels out, get someone to confirm which ones must stay in.
- Volume caps. Decide in advance the maximum percentage of a season's units that may go to off-price, and treat exceeding it as a planning failure to be reviewed at hindsight.
A jobber is a buyer who purchases distressed lots outright, usually for cash, usually with no returns, and resells wherever they can. They pay less than an off-price chain but they take everything immediately, including broken size runs and damaged goods. Recovery rates vary enormously by brand strength, category and lot quality, and any figure quoted as an industry average is marketing. Get three quotes on the actual lot.
Donation and its tax treatment, briefly
Donating unsold goods to a charity feels good and sometimes makes financial sense, but the tax mechanics are narrower than most founders assume, and this is a genuine "ask your accountant" area rather than something to reason out from first principles.
Two words first. Your cost basis is what the goods cost you, which for a garment is its landed cost. Fair market value is what the goods would fetch in an ordinary sale between willing parties. For last season's unsold stock that means a clearance price rather than the price on the ticket.
The ordinary rule is that a business donating inventory deducts its cost basis rather than the retail value. There is an enhanced deduction under section 170(e)(3) of the Internal Revenue Code, but it comes with real conditions.
Per the implementing regulation, the contribution must be made by a corporation other than an S corporation. A C corporation is a company that pays tax in its own right on its own profits, and it qualifies. An S corporation is a company whose profits and losses pass straight through to the owners' personal tax returns, and it does not qualify; nor do partnerships, which many small brands use.
The goods must go to a charity that is tax-exempt under section 501(c)(3) of the tax code and that is not a private foundation, meaning not a charity funded and controlled by a single family or company. The property must be used by the recipient for the care of the ill, the needy or infants, and the charity must give you a written statement saying so, describing the goods and the date it received them.
The deduction is then fair market value reduced by half of the appreciation, capped at twice the cost basis. The regulation's own worked example uses women's coats, which could not be more on point: coats with a $1,000 fair market value and a $200 basis yield a $400 deduction. The gain is $800, half of that is removed to give $600, and $600 is then capped at two times $200.
Note what that means for apparel. The enhanced deduction rewards donating goods that are worth much more than they cost you. Distressed stock is worth less than it cost you, so the enhanced rule has nothing to add.
Disposal options compared
DISPOSAL OPTIONS COMPARED - 1,000 JACKETS, COST $38 EACH
Total cost basis $38,000. C corporation, 21% federal
tax rate, losses usable against other income this year.
Option Cash in Tax saved Total benefit
----------------------------------------------------
Off-price sale
@ $17.00/unit $17,000 $4,410 $21,410
loss of $21,000 x 21%
Jobber lot
@ $9.50/unit $9,500 $5,985 $15,485
loss of $28,500 x 21%
Donation, basis
deduction only $0 $7,980 $7,980
$38,000 x 21%
Donation, using
170(e)(3) $0 $7,980 $7,980
no better: the rule caps at 2 x basis and
starts from market value, which for this
stock is at or below the $38 it cost
Destroy / recycle $0 $7,980 $6,780
$7,980 less a $1,200 disposal fee
----------------------------------------------------
The table makes an uncomfortable point clearly. Selling for cash beats donating, and it is not close. A deduction gives you back only your tax rate on the amount, not the amount.
Donating the whole $38,000 of cost basis saves about $7,980 in tax. A jobber paying $9.50 a unit hands you $9,500 in real money and still leaves you the $28,500 loss to deduct, worth another $5,985, for a total of $15,485. That is nearly double the donation. Selling at $17.00 is better still.
The enhanced deduction under 170(e)(3) adds nothing here, for the reason given above: it is designed for goods worth more than they cost, and distressed apparel is worth less.
Donation still wins in three real situations:
- when there is genuinely no buyer at any price;
- when the cost of continuing to hold the goods is eating more than the recovery would be worth;
- or when putting the goods to good use matters to you independently of the money.
Those are all legitimate. "It's a write-off" is not one of them.
Two caveats on the arithmetic. It assumes a C corporation taxed at the flat 21% federal rate, which is the rate in force as of July 2026, and it ignores state tax. If your brand is a limited liability company or an S corporation, the loss and the deduction pass through to your personal return at whatever rate applies there, and the enhanced deduction is not available to you at all.
It also assumes you have other income for the loss to offset this year. Get your accountant to confirm all three before you plan around the numbers.
Writing the stock down in the accounts
Separately from tax, accounting rules require you to face the loss on your balance sheet. Under US accounting standards (ASC 330, the inventory topic), inventory is carried at the lower of its cost and its net realizable value — that is, the price you realistically expect to get, minus what it will cost you to finish and sell it. If that number is below cost, you write the inventory down and take the hit in the period you discover it, rather than waiting until the goods finally leave the building.
Two details will save you an argument with your accountant. First, the "net realizable value" test applies to inventory costed on a first-in-first-out or average-cost basis, which covers almost every apparel brand. First-in-first-out means you assume the oldest units in stock are the ones you sold; average cost means you blend every receipt into one cost per unit.
Companies using the last-in-first-out method, which assumes the newest units sold first, or the retail inventory method, which works backwards from selling prices, still apply an older and slightly different "lower of cost or market" test. Ask which one you are on.
Second, once you have written inventory down under US rules, you cannot write it back up if the market recovers; the reduced amount becomes the new cost. International standards (IAS 2) do allow that reversal, so if you read guidance written for a non-US audience, check which rulebook it assumes.
This is why an aged inventory report reaches well beyond day-to-day operations. Your auditor will want to see it, your lender will read it, and the numbers in it will change your reported profit.
You will feel that selling a $38 jacket for $9.50 "loses $28.50." It does not. The $38 left the building the day you paid the factory. The only choice in front of you is $9.50 now versus a smaller number later plus twelve more months of storage.
Founders who cannot make this move end up with warehouses full of a museum of their own past decisions and no cash to fund the season that might have saved them. Put the aging policy in the ERP, make the escalation automatic, and let the system be the one that insists.
Retail partner analytics
Your retailers know things about your product that you do not, and most of them will hand the data over if you ask. Using it well is the cheapest competitive advantage available to a small brand, because most of your competitors do not bother.
Where the data comes from
There are three channels, in increasing order of effort and value.
- Emailed spreadsheets. Small specialty accounts will send you a weekly or monthly sell-through export if you ask nicely and make it easy. Formats will be inconsistent and will change without warning. This is why the spreadsheet import machinery from chapter 7 exists.
- Vendor portals. Larger retailers run supplier websites with sales and inventory reporting behind a login. Walmart's is Retail Link, alongside the paid analytics product from Walmart Data Ventures that was launched as Walmart Luminate and has since been renamed Scintilla; Target's is Partners Online; the department stores each run their own. That rename is the point: names and features change, so confirm what your account offers today rather than trusting a book. Access is granted per supplier and per named user, which means somebody has to own the account and hand it over when they leave. Most portals can email or drop a scheduled report as a CSV file, and that is what you want. A scheduled export feeds your ERP. A human logging in weekly to screenshot a chart does not, and stops the week they go on vacation.
- EDI 852 Product Activity Data. The proper machine feed, and the one to push for. EDI stands for Electronic Data Interchange: a family of standard message formats, maintained in the United States by a standards body called X12, that lets two companies' computers exchange business documents without a human retyping anything. Each message type has a number. X12 defines the 852 as the Product Activity Data message. In its own words, it is used "to advise a trading partner of inventory, sales, and other product activity information", so that the recipient can plan shipments and work out replenishment quantities for distribution centers, warehouses and shops. In practice a weekly 852 gives you units sold and units on hand, by item and by location, delivered automatically. If you already exchange 850 messages (purchase orders) and 856 messages (shipment notices) with an account, adding the 852 is a small increment on top of a connection you have already paid for. It is the highest-value EDI document a wholesale brand can ask for, and the one most brands never think to request.
What to compute from it
STORE-LEVEL VIEW - JKT-201 BLACK, ACCOUNT 1042, WEEK 6
Store Recd Sold OH ST% Wk rate WOS Flag
-----------------------------------------------------
0031 24 21 3 87.5% 3.5 0.9 REPLENISH
0047 24 18 6 75.0% 3.0 2.0 REPLENISH
0052 24 16 8 66.7% 2.7 3.0 ok
0068 24 9 15 37.5% 1.5 10.0 ok
0071 24 2 22 8.3% 0.3 73.3 INVESTIGATE
0074 24 8 16 33.3% 1.3 12.3 ok
-----------------------------------------------------
Chain 144 74 70 51.4% 12.3 5.7
Store 0071: 8.3% ST vs 51.4% chain average.
Same receipt, same weeks. Not a demand problem.
Likely: never floored, wrong department, or
sitting in the stockroom. Action = ask the buyer
to check, or send the rep in.
The chain-level number, 51.4%, hides both the opportunity and the problem. Two stores are within a week or two of selling out entirely and need units now; that is a replenishment argument you can make with evidence.
Store 0071 has sold two units in six weeks against a chain average of twelve, from an identical receipt. A store that far below its peers almost never has different customers; it has a merchandising or floor-set failure, and that is worth a specific, polite email to the buyer naming the store number. Buyers respect vendors who bring them problems they can fix, and they remember the ones who only ever ask for bigger orders.
Using their data to argue for a bigger order
A buyer's job is to allocate a fixed open-to-buy across competing vendors. Your job in that meeting is to make the math of giving you more money obvious. Do not argue that your brand is special. Argue in their metrics, using their data.
REORDER CASE - PRESENTED TO BUYER, ACCOUNT 1042
What you gave us 144 units, 6 doors
Weeks on floor 6
Sell-through 51.4% (dept avg 38%)
Weeks of supply now 5.7 (your target 8-10)
Stores at or under 2 WOS 2 of 6
Sizes S/M sold out in 4 of 6 doors
GMROI on this style
at your margin 4.1 (dept avg 2.6)
Markdown taken to date $0 (dept avg 11%)
Ask: 216 units, all 6 doors + 4 new doors,
sizes weighted XS 5 / S 20 / M 30 /
L 25 / XL 15 / XXL 5.
Delivery: 9 Oct, air freight, we absorb the
freight premium.
Risk share: we will take back any unsold units
at 60 days at full credit, capped at 40 units.
Every line in that block is chosen to answer an objection before it is raised. Sell-through beats the department average, so the product is working. Weeks of supply is below the target range, so the stores are about to run out. Sizes sold out proves the shortfall is real rather than a rate slowdown. GMROI translates your product into the number their own performance is measured on, which is the language a merchandise manager actually thinks in.
Zero markdowns taken says you are not costing them margin. The ask is specific in units, doors and size curve, so the buyer can say yes without doing work. Absorbing the air freight premium removes the delivery-risk objection. The risk-share line is the closer: capped, time-boxed, and small enough that you can honor it.
Whatever else you negotiate, ask for store-level data, or at minimum a region-level breakdown. Chain-level sell-through is an average across doors that may differ by a factor of ten, and averaging them away destroys the information you need. Store-level data turns replenishment from a guess into arithmetic, and it lets you argue for expansion into the specific doors most like your best performers instead of asking vaguely for more distribution.
Forecasting for a small brand, honestly
Forecasting in apparel is harder than in almost any other category, because most of what you sell has never been sold before. A grocery brand forecasting tinned tomatoes has ten years of history for the exact product. You are forecasting a jacket that does not exist yet in a color nobody has seen. Be honest about that, and you will make better decisions than a brand with a sophisticated model and false confidence.
What history can and cannot tell you
History is reliable for the stable structure of your business and unreliable for the specific novelty. Useful things history genuinely tells you:
- Size curves. The proportional split across sizes for a given category is remarkably stable. If mediums were 29% of your t-shirt units for three seasons, they will be close to 29% next season.
- Seasonal shape. The weekly shape of your shipping and selling year repeats. Your August is always your biggest shipping month if you are a Fall brand.
- Account behavior. Which accounts reorder, which never do, which cancel, which pay late, and their typical order size relative to last season.
- Category mix. The ratio between tops, bottoms and outerwear moves slowly.
- Attach and cannibalization patterns. Adding a fourth color to a style rarely adds a fourth of incremental volume; it usually splits existing demand.
Things history cannot tell you: whether this particular new print will sell, what the weather will do, whether a competitor will launch something similar at half your price, whether a retailer's new buyer will drop your brand. Do not build a model that pretends otherwise.
Top-down and bottom-up, then reconcile
FALL 2026 PLAN - TWO DIRECTIONS
TOP-DOWN
Last year net sales 4,000,000
Target growth +18%
Plan net sales 4,720,000
Wholesale 78% 3,681,600
DTC 17% 802,400
Off-price 5% 236,000
Wholesale units at $64.50 ASP 57,079
BOTTOM-UP
Account tier Doors Avg buy Total
Key accounts 6 210,000 1,260,000
Mid specialty 41 28,500 1,168,500
Small specialty 118 6,200 731,600
New accounts 35 7,000 245,000
Distributors 3 105,000 315,000
----------------------------------------------
Bottom-up wholesale total 3,720,100
RECONCILIATION
Top-down wholesale 3,681,600
Bottom-up wholesale 3,720,100
Gap (38,500) 1.0%
VERDICT: plans agree. Adopt bottom-up.
Top-down starts from a revenue ambition and divides it. Bottom-up starts from the accounts you actually have and adds them up. They are both guesses, but they fail in opposite directions: top-down is optimistic because a growth number is easy to type, and bottom-up is conservative because it is hard to name accounts you have not yet won.
When they land within a few percent of each other, as here, you have a plan you can defend. When the gap is 30%, the gap itself is the plan: it is a specific list of accounts you must win or orders you must grow, and it belongs on someone's target sheet with a name against it. Never split the difference and move on. The gap is the most informative number on the page.
Measuring how wrong you were
You improve forecasting by scoring it. Two measures matter, and one of them is usually taught wrongly.
FORECAST ERROR, FOUR STYLES
Style Forecast Actual Abs err APE
--------------------------------------------
A 500 620 120 19.4%
B 300 140 160 114.3%
C 900 880 20 2.3%
D 60 5 55 1100.0%
--------------------------------------------
Total 1,760 1,645 355
MAPE = (19.4 + 114.3 + 2.3 + 1100.0) / 4
= 309.0% <- useless
WAPE = 355 / 1,645
= 21.6% <- usable
Bias = (1,760 - 1,645) / 1,645
= +7.0% <- over-forecasting
MAPE, the mean absolute percentage error, averages the percentage error of each item. Style D, where you forecast 60 and sold 5, produces an 1,100% error, and averaging that with the others gives 309%, which tells you nothing except that you had one small disaster. This happens constantly in apparel, where most styles are low-volume.
WAPE, the weighted absolute percentage error, divides total absolute error by total actual volume, so each style contributes in proportion to its size. At 21.6% it is a number you can track and try to improve.
Bias is the one people forget: it is the signed error, and here it is +7.0%, meaning you systematically forecast too high. Bias and accuracy are independent. A forecast that is 5% high every single period and one that is 5% low every period have identical WAPE, and their consequences are opposite: one fills your warehouse, the other loses you sales. Track both, always.
For prebook wholesale, the order book beats any model. A confirmed purchase order from a retailer, with a ship window and a cancel date, is a forecast produced by the person who will actually pay for the goods and who has committed their own open-to-buy to it. No statistical model built on four seasons of history for a business that changes its assortment every season can compete with that. Use models for the at-once and replenishment portion, and for size curves. Use the order book for everything else.
The honest forecasting stack for a small wholesale brand, in priority order:
- confirmed order book first;
- then last season's actuals for carryover styles adjusted for account gains and losses;
- then size curves and category mix from history;
- then judgment for genuinely new product, expressed as a range with a low, mid and high case rather than a single number.
Buy to something between the low and the mid, and hold fabric rather than finished goods for the upside. That last sentence is worth more than any forecasting software you will ever buy.
Planning cadence: the meetings
Metrics without a meeting are wallpaper. The cadence below is deliberately modest: one short weekly, one substantial monthly, one seasonal retrospective, one annual plan. Each has a defined attendee list, a fixed page, and a defined set of decisions it is allowed to make. That last constraint is the one most brands leave out, and it is what stops the weekly meeting from turning into a two-hour strategy debate and the annual plan from getting lost in shipping details.
Larger companies run a formal version of the same idea under the name sales and operations planning, usually shortened to S&OP: a repeating cycle in which the demand side and the supply side of the business each prepare a plan, the gaps between them are worked out in advance, and a single leadership meeting agrees one number everybody then works to.
If you ever outgrow the four meetings described below, that is the literature to read next. Until then, treat them as the same discipline sized for a company of ten people.
| Meeting | Cadence | Length | Attendees | Decisions it may make | Decisions it may not make |
|---|---|---|---|---|---|
| Weekly business review | Every Monday | 45 min, hard stop | Founder, sales, ops/production, finance (or whoever wears those hats) | Chase or hold; expedite a shipment; escalate a collection; approve markdowns within policy; fix a store-level problem | Change the season plan; approve new production above a set dollar threshold; change pricing strategy |
| Monthly operating review | First week of the month | 2 hours | Same, plus bookkeeper/accountant, plus key sales reps by phone | Approve reorders and chase spend; reforecast the season; change credit limits; approve off-price releases; adjust hiring | Change the annual plan; change brand positioning; drop a category |
| Seasonal hindsight | Twice or four times a year, 4–6 weeks after season end | Half day | Everyone, including design and production | Cull styles from next line; change size curves; change the buy methodology; fire or promote an account tier; change factories | Nothing about the current season, which is over |
| Annual plan | Once, 3–4 months before the fiscal year | Two days | Founder, leadership, plus external advisor if you have one | Revenue and margin targets; channel mix; headcount; capital and financing; the metric definitions themselves | Style-level decisions |
The weekly business review
WEEKLY BUSINESS REVIEW - AGENDA (45 MIN, MONDAY 09:30)
1. Shipping and service 8 min
Units shipped last week vs plan
Open orders past their start-ship date
Fill rate last week; any chargeback received
-> DECISION: expedite / split ship / call buyer
2. Sell-through exceptions only 12 min
Styles flagged RED (< 35% at week 6)
Styles flagged GREEN with WOS < 3
Store-level outliers
-> DECISION: chase, markdown plan, buyer call
3. Order book 8 min
Bookings taken last week vs plan
Cancellations and their reasons
13-week coverage %
-> DECISION: sales push target for the week
4. Cash 8 min
Cash on hand and 6-week projection
Invoices over 45 days
Deposits due to factories this week
-> DECISION: collection calls, payment timing
5. Blockers and owners 9 min
Anything stopping someone shipping or selling
-> DECISION: who does what by when
NOT ON THIS AGENDA: strategy, new product ideas,
anything without a decision attached.
Notice the structure. Every block ends with a decision line, and the total is forty-five minutes because a weekly that runs long stops happening. Section 2 says "exceptions only", which is what makes it fit into twelve minutes: nobody reads through every style, they look at the styles the system has already flagged. The last line is the discipline that protects the meeting. Good ideas about new product are welcome, in a different meeting, on a different day.
The monthly operating review
MONTHLY OPERATING REVIEW - AGENDA (2 HOURS)
PART 1 RESULTS (40 min)
1.1 P&L vs plan: net sales, GM%, contribution
1.2 Margin waterfall: where discount leaked
1.3 Units shipped, ASP, discount rate
1.4 Service scorecard: fill rate, on-time, OTIF,
chargebacks by account
1.5 Cash: DSO, AR ageing, inventory value,
inventory turns and GMROI rolling 12
PART 2 INVENTORY (30 min)
2.1 Aged inventory by bucket, vs last month
2.2 Styles crossing an ageing threshold this
month (system-generated, not discretionary)
2.3 Proposed markdowns / off-price lots
-> DECISION: approve or defer, with reason
PART 3 FORWARD (35 min)
3.1 Order book by month and by account tier
3.2 Reforecast: season plan vs latest estimate
3.3 Reorder and chase proposals with the
feasibility table for each
-> DECISION: approve spend, cap exposure
3.4 Production and delivery risks
PART 4 PEOPLE AND ACTIONS (15 min)
4.1 Last month's actions: done / not done / why
4.2 New actions with owner and date
RULE: no number is presented that is not in the
metric register. No slide without a decision.
Three abbreviations in that agenda need expanding. "GM%" is gross margin percentage. "AR" is accounts receivable, the money your customers owe you but have not yet paid. "Rolling 12" means the figure is computed over the most recent twelve months rather than since the start of the year, which stops a seasonal business looking wonderful every December and terrible every February.
The monthly is where the business actually gets steered. Part 1 is backward-looking and should be fast, because the numbers were available on day one and everyone should have read them. Part 2 is the one that will be skipped if you let it, which is exactly why it sits before the exciting forward-looking part.
The phrase "system-generated, not discretionary" in 2.2 matters: the ERP surfaces the styles crossing thresholds automatically, so nobody can quietly leave a problem style off the list. Part 3 spends money, so it demands the feasibility table from the reorder section for each proposal. Part 4.1, reviewing last month's actions, is the mechanism that makes all the others real; a meeting that never checks whether its own decisions were executed will stop being taken seriously within a quarter.
The seasonal hindsight
SEASONAL HINDSIGHT - AGENDA (HALF DAY)
BEFORE THE MEETING (analyst prepares, circulated
48 hours ahead, read in advance)
- Every style: units bought, shipped, retail
sell-through, ASP, discount %, gross margin
dollars, GMROI, unsold units left over, and
where each of those units finally went
- Ranked best to worst by GMROI
- Size curve actual vs planned, by category
- Account league table: bookings, growth,
chargebacks, DSO, and contribution after
cost to serve (what is left once you
subtract everything that account
specifically costs you to look after)
- Forecast scorecard: WAPE and bias by category
IN THE MEETING
1. Top 10 by GMROI: what did they have in
common? Which are carryover candidates?
2. Bottom 10 by GMROI: why did we buy them?
Trace each back to the decision that
created it.
3. Size curve corrections for next buy.
4. Buy methodology: were our quantities
systematically high or low? By how much?
5. Accounts: who to grow, who must now pay
before we ship, who to stop selling to.
6. Three things we will do differently, with
owners. Not ten. Three.
OUTPUT: a one-page hindsight memo, filed, and
read aloud at the start of the next buy meeting.
The hindsight is the highest-value meeting in the calendar and the first one small brands skip. Two design choices make it work. First, all analysis is circulated forty-eight hours ahead and read in advance, so the meeting is spent on judgment rather than on somebody reading numbers off a screen. Second, item 2 traces every failure back to the decision that caused it.
"Sand didn't sell" is not a finding. "We bought 300 units of sand because one buyer at a trade show loved it and we had no other data" is a finding, and it produces a rule. The output is deliberately tiny: three changes, with owners. Ten changes means zero changes. Reading the previous memo aloud at the next buy meeting is the mechanism that stops the same mistake recurring, and it works because it is slightly embarrassing.
The annual plan
ANNUAL PLAN - TWO-DAY AGENDA
DAY 1 WHERE WE ARE
- Three-year trend: revenue, GM%, contribution,
turns, GMROI, headcount, cash
- Channel mix and how it moved
- Customer concentration: top 1, top 5, top 10
as % of net sales, and the trend
- What broke this year that we never fixed
DAY 2 WHERE WE ARE GOING
- Revenue and margin targets by channel
- The buy budget: total open-to-buy by season,
split by category, with a reserve for chase
- Working capital: peak inventory, peak AR,
financing needed and from where
- Headcount and systems investment
- The metric register: review every definition,
retire what nobody used, version the changes
- Three company priorities for the year
OUTPUT: a plan with monthly phasing (the annual
totals split across the twelve months), loaded
into the ERP as the budget the monthly review
compares against. If it is not loaded, it is
not a plan.
The final line is the one that matters. An annual plan that lives in a spreadsheet on the founder's laptop is a wish. An annual plan loaded into the system as a monthly budget, against which every monthly operating review reports variance, is a management tool.
The customer concentration item on day one is there because it is the risk most likely to end the company and the one least likely to come up naturally. Nobody volunteers "our biggest customer is now 40% of us" in a meeting about growth.
There is a precedent for putting it on the agenda. Item 101 of the US Securities and Exchange Commission's Regulation S-K makes listed companies describe their dependence on customers in the business section of their annual report, which tells you regulators regard the risk as material even for businesses far larger than yours. There is no equivalent rule for a private brand, so you have to be the one who asks.
The reserve for chase in the buy budget is the practical expression of everything in the reorder section: if 100% of your open-to-buy is committed before the season starts, you cannot back a winner.
Building a reporting culture
Two competent people will compute sell-through differently and both will be right. One divides units sold by units received. The other divides by units bought, because units still in transit are money already spent. One measures from the retailer's floor set date, the other from your ship date. One counts returns as negative sales, the other excludes them.
Every one of those choices is defensible, and the disagreement itself does no harm. The damage comes from nobody realizing the disagreement is there until two numbers collide in a meeting.
One source of truth means one place where the calculation lives. Storing every spreadsheet in the same folder does not count. If the formula lives in eleven different Excel files, you have eleven sources of truth wearing a trench coat.
Three practices that keep one definition
Three practices fix this. They cost almost nothing to adopt early and are agonizing to retrofit later:
- Write the definitions down, in one register. Every metric gets an entry with its exact formula in words, the tables and columns it reads, its grain, its owner, and any known gotchas. Put the register somewhere a non-programmer can open and read it. A comment buried in a SQL file helps nobody who needs it.
- Version the definitions. When a definition changes it gets a new version number and an effective date, and the old version stays. That is what lets you answer "why does last year look different now?" with a fact instead of a shrug, and re-run historical reports under the old definition when a lender or auditor asks.
- Make the system the only place the number is computed. If the head of sales exports raw data and applies their own formula in Excel, you will eventually have two numbers in one meeting. Give people the report they need inside the ERP, plus a raw export for genuine ad-hoc work, and make clear which one is canonical.
METRIC REGISTER ENTRY
metric_key : retail_sell_through_units
version : 3
effective_from : 2026-02-01
supersedes : v2 (2025-03-01 to 2026-01-31)
display_name : Retail sell-through (units)
definition : Units sold to consumers by the
retailer, divided by units the
retailer received from us, for
the same style/colour and the
same account, measured from the
account's floor-set date.
numerator : fact_partner_sales.units_sold
denominator : fact_partner_receipts.units_recd
grain : account x style x colour x week
basis : units (not dollars)
excludes : consumer returns are netted from
units_sold; damages are not
excluded
gotchas : Accounts without an 852 feed have
receipts from our shipments, not
theirs. Flag = source_quality.
owner : Head of Sales
change_reason : v2 measured from our ship date;
v3 uses floor-set date because
DC dwell varied 4-19 days.
This is the register entry behind the metric contract from the start of the chapter. The supersedes and change_reason fields carry the institutional memory. In this case someone discovered that time spent sitting in a retailer's distribution center ranged from four to nineteen days, which meant measuring from your ship date made a fast-selling style at a slow distribution center look bad.
The fix changed the number, and the register records why, so anyone comparing the two years can see exactly what happened and when. The gotchas field is where honesty lives: accounts without an EDI 852 feed have a weaker denominator, and the report should say so rather than pretending all rows are equally reliable.
What this means for your ERP
Everything above turns into schema, jobs, screens, rules and reports. The concrete translation of all five follows.
Tables and fields you need
-- Partner-supplied retail data. One row per
-- account x location x item x week. Populated from
-- EDI 852, portal CSV exports, or manual upload.
create table fact_partner_activity (
id bigserial primary key,
tenant_id uuid not null,
account_id uuid not null,
location_code text not null, -- store or DC
item_id uuid not null, -- SKU level
week_ending date not null,
units_sold integer not null default 0,
units_on_hand integer not null default 0,
units_on_order integer not null default 0,
units_received integer not null default 0,
gross_retail_amt numeric(14,2),
source text not null, -- 'edi852',
-- 'portal_csv',
-- 'manual'
source_quality smallint not null default 1,
ingested_at timestamptz not null default now(),
constraint uq_partner_activity
unique (tenant_id, account_id, location_code,
item_id, week_ending, source)
);
-- Season/style context so "week 6" means something.
create table style_season (
tenant_id uuid not null,
style_id uuid not null,
season_code text not null, -- 'FW26'
plan_units integer not null,
first_ship_date date not null,
season_end_date date not null,
is_carryover boolean not null default false,
primary key (tenant_id, style_id, season_code)
);
-- Per-account floor set, because it varies.
create table account_floor_set (
tenant_id uuid not null,
account_id uuid not null,
style_id uuid not null,
floor_set_date date not null,
primary key (tenant_id, account_id, style_id)
);
-- Versioned metric definitions. The register lives
-- in the database, not in a wiki nobody updates.
create table metric_definition (
metric_key text not null,
version integer not null,
effective_from date not null,
effective_to date,
display_name text not null,
definition_text text not null,
grain text not null,
basis text not null, -- 'units'|'dollars'
sql_body text not null,
owner_user_id uuid not null,
change_reason text,
primary key (metric_key, version),
constraint chk_basis
check (basis in ('units','dollars'))
);
If you have not read much SQL, the column types above translate like this:
bigserialis a whole number the database fills in for you, counting up, so every row gets a unique identity.uuidis a long random identifier used instead of a counter when you want ids that cannot be guessed or collided across systems.textis a string of characters of any length.dateis a calendar day, andtimestamptzis an exact moment in time that also records the time zone.numeric(14,2)is a decimal number with fourteen digits in total and two after the point, which is the right type for money because it does not round in surprising ways.not nullmeans the database refuses to save a row that leaves the column empty.- A
uniqueconstraint means no two rows may repeat the same combination of those columns. primary keynames the columns that identify a row.
Four things to notice in the design itself:
fact_partner_activityis at SKU and location and week, because every useful analysis in this chapter needed one of those three dimensions; aggregating up is easy, disaggregating is impossible.- The
sourceandsource_qualitycolumns exist because your data will arrive by three different routes with three different reliabilities, and reports must be able to say so. The unique constraint includessourceso that a manual upload and a later EDI feed for the same week do not silently collide; your reporting layer then picks the highest-quality source per key. account_floor_setis a small table that solves a large problem: without it you cannot compute "week 6" correctly for an account whose distribution center held goods for three weeks.- And
metric_definitionputs the register in the database with a version and an effective date, so the definition and the data live in the same place and the same backup.
Derived and snapshot data
Sell-through, weeks of supply and aging are all expensive to compute from scratch across a full history, and they are all asked for constantly. This is the same caching problem as available-to-sell in chapter 8, and it takes the same shape: a nightly snapshot job writing to a fact table, keyed by date, plus an on-demand recompute for a single style when someone needs the live number.
-- Nightly snapshot. Never recomputed retroactively;
-- if a definition changes, write new rows under a
-- new definition_version rather than mutating old.
create table fact_metric_daily (
tenant_id uuid not null,
as_of_date date not null,
metric_key text not null,
definition_version integer not null,
-- dim_key packs the slice, e.g.
-- 'acct:1042|style:JKT-201|col:BLK'
-- NULL dimensions are simply absent from the key,
-- so the roll-up row is dim_key = ''.
dim_key text not null,
dim_account_id uuid,
dim_style_id uuid,
dim_colour_id uuid,
dim_channel text,
value_num numeric(18,4) not null,
denom_num numeric(18,4),
primary key (tenant_id, as_of_date, metric_key,
definition_version, dim_key)
);
-- Inventory ageing reads the append-only ledger from
-- chapter 1: age is measured from the receipt event
-- that put the unit in stock, not from a mutable
-- "created_at" on a product row.
create view v_inventory_ageing as
select
l.tenant_id,
l.item_id,
l.lot_id,
min(l.occurred_at)::date as received_on,
current_date - min(l.occurred_at)::date as age_days,
sum(l.qty_delta) as units_on_hand,
sum(l.qty_delta) * max(l.unit_cost) as value_at_cost,
case
when current_date - min(l.occurred_at)::date <= 90
then 'current'
when current_date - min(l.occurred_at)::date <= 180
then 'watch'
when current_date - min(l.occurred_at)::date <= 270
then 'aged'
when current_date - min(l.occurred_at)::date <= 365
then 'distressed'
else 'dead'
end as age_bucket
from inventory_ledger l
group by l.tenant_id, l.item_id, l.lot_id
having sum(l.qty_delta) > 0;
The snapshot table stores both value_num and denom_num so a percentage can be correctly re-aggregated. This matters more than it sounds: you cannot average sell-through percentages across accounts to get a chain figure, you must sum the numerators and sum the denominators. Storing only the percentage guarantees somebody will average them and be wrong.
dim_key packs the slice into one text column so the primary key stays simple while nullable dimension columns remain available for joins. The definition_version in the key lets you re-run history under a changed definition without destroying the old series.
The second block is a view, which is a saved query you can read from as though it were a table, so the aging buckets are computed fresh every time somebody looks rather than stored and left to go stale.
It reads the append-only inventory ledger from chapter 1 — a table you only ever add rows to, never edit or delete — and derives age from the earliest receipt event for a lot, which is the only trustworthy source. Anything based on a timestamp that can be edited on a product record will drift the first time somebody changes a style.
Rules the software must enforce
- Basis is never implicit. Any API response or report cell carrying a metric must carry its
basis('units' or 'dollars') and itsdefinition_version. Enforce that in the database with a not-null column and a check constraint, so the rule holds even when somebody forgets it. A team convention will not survive the first new hire. - Percentages carry their denominator. Never return a bare percentage from the metrics layer. Return numerator, denominator and the computed value.
- Landed cost, not invoice cost. Margin calculations must read a landed cost that includes freight, duty, brokerage and inbound handling allocated across the units received. Block the margin report if any received lot has a null landed cost, rather than silently reporting a flattering number.
- Duty and freight are recorded per receipt, never configured as a rate. Store what the customs broker actually billed on that entry, against that shipment, alongside the tariff code and country of origin used. Tariffs changed repeatedly through 2025 and 2026, were struck down in part by the Supreme Court in February 2026, and are still being litigated as of July 2026, so a rate in a settings file guarantees that every historical margin recomputes wrongly the day it changes. Recording the real charge per receipt means the history stays true and "what did this style cost us before and after the change?" is a query, not a project.
- Aging thresholds fire automatically. A scheduled job moves lots between age buckets and raises a task assigned to the policy owner. Founders must not be able to make the flag go away without recording a reason; store an
ageing_overriderow with user, date and justification. - Discount approvals follow the aging policy. The order entry screen must refuse a discount that exceeds the floor for that lot's age bucket unless the approving role matches the policy table. This is a straightforward row-level check but it needs the age of the specific lot, which is why the ledger grain from chapter 1 matters.
- Minimum order value. Enforce at order entry with a clear override path, and record the override, so the cost-per-order analysis can later show how much the exceptions cost.
- Loading the same file twice must be harmless. Partner data arrives repeatedly, often restating weeks you already have. The load must be idempotent: running it twice leaves the database in exactly the state running it once would. Achieve that by matching on the natural business key (tenant, account, location, item, week, source) and updating in place, which is the concern from chapter 3. A re-sent 852 for week 24 must overwrite, never double-count.
- Tenant isolation on every fact table. A tenant is one customer of your software, so if your ERP ever serves more than one brand, each brand is a tenant. Metrics tables are the easiest place to accidentally leak one brand's numbers into another's dashboard. Row-level security — rules held inside the database that filter every query down to the rows the current tenant is allowed to see — applies to
fact_partner_activityandfact_metric_dailyexactly as chapter 5 applies it to orders.
Screens and workflows
- Sell-through explorer. Drill from season to style to color to size, and independently from all-accounts to account to store. Must show units and dollars side by side, weeks of supply, and a flag when core sizes are broken. Must default to exceptions.
- Reorder workbench. One screen per candidate style showing the feasibility calculation: remaining season weeks, lead time build-up by stage, weekly rate, factory minimum, units at risk, and the chase options with their costs. Produces an approval record with the assumptions frozen, so the hindsight meeting can check what was believed at the time.
- Aging and disposal board. Lots by age bucket with value at cost, the policy floor price, and buttons for the permitted actions. Recording a disposal writes a ledger event and a reason code; the reason codes feed the seasonal hindsight.
- Partner data health. A boring screen that shows, per account, when the last 852 or portal file arrived, how many weeks are missing, and the source quality. Without it, a silently broken feed will make an account look like it stopped selling.
- Meeting packs. A one-click export producing exactly the weekly, monthly, hindsight or annual page defined above, as a PDF or a shared link, with the definition version stamped on it.
- Metric register UI. Read-only for most users, editable by the owner, with a diff view between versions and a mandatory change reason.
Reports people will demand
Build these, because you will be asked for them within the first year, usually on a Friday afternoon.
- Sell-through by style/color with weeks of supply, filtered to a single account, in the account's own format, because a buyer asked for it.
- Margin waterfall from gross billings to contribution, by month and by account.
- Aged inventory by bucket with value at cost, for your lender or your accountant, at every period end.
- Accounts receivable aging with DSO by account, for collections.
- Service scorecard by account: fill rate, on-time, OTIF, chargebacks, so you can argue a chargeback and know whether the argument is honest.
- Order book by ship month and account tier, with cancellations, for production planning.
- Account league table with contribution after cost to serve, which is the report that tells you which customers to keep.
- Forecast scorecard: WAPE and bias by category and season, for the hindsight.
Where this connects
- The append-only inventory ledger from chapter 1 is the only trustworthy basis for aging, cost and turns, because every metric here depends on knowing exactly when a unit entered stock and at what cost.
- Chapter 2's Postgres material gives you the indexing and partitioning you will need once
fact_partner_activitypasses a few tens of millions of rows. - Chapter 3's idempotency work is what makes repeated partner data loads safe.
- Chapter 4's integration mechanics deliver the EDI 852 feed and the Shopify and QuickBooks data that fill the numerator and denominator of most of these formulas.
- Chapter 5's row-level security keeps the metrics tables tenant-safe.
- Chapter 7's spreadsheet import machinery is how the small accounts' emailed sell-through files get in.
- Chapter 8's caching and reporting patterns are exactly the pattern
fact_metric_dailyfollows. - Chapter 9's testing discipline is what stops a refactor from silently changing a metric definition, which is the most damaging bug in this entire domain, because nobody notices for a quarter.
- And chapter 12's glossary should carry the same definitions as your metric register, ideally generated from it.
If you do one thing from this chapter, create the metric_definition table and fill in five entries before you build a single chart. It takes an afternoon. It will save you a dozen arguments and at least one bad decision made from a number two people understood differently.
Field notes & further reading
- NRF: consumers expected to return nearly $850 billion in merchandise in 2025 — the National Retail Federation and Happy Returns figures for total US returns ($849.9bn, 15.8% of sales, 19.3% for online orders, against $890bn and 16.9% the year before). Read it for the gap between channels rather than for a target to hit.
- SPS Commerce: Target compliance policy update — explains Target's move on 4 August 2024 to the "Fill Rate Original" policy, the 95% requirement measured against the units originally ordered, and the 5% cost-of-goods chargeback for shipping either short or over. A good example of how much a single wording change in a retailer's policy can cost a supplier.
- 8th & Walton: Walmart on-time in-full explained — the thresholds (90% on time for prepaid suppliers, 98% for collect, 95% in full) together with the penalty mechanics: 3% of the cost of goods on non-compliant cases, waived if the month totals under $1,000, calculated monthly but billed quarterly. Confirm against your own supplier portal before relying on it, because Walmart revises this program.
- X12 transaction set 852, Product Activity Data — the official description of the EDI message that carries a retailer's sales and inventory back to you. Read it before you ask an account for a sell-through feed, so you ask for the right thing by its right name.
- Retail Dogma: GMROI — a plain definition plus FY2025 figures for named public retailers, from Shoe Carnival at about 1.01 to Tapestry at about 6.28. The quickest way to see how wide "normal" actually is.
- Retail Dogma: inventory turnover — the companion page, with the FY2025 turn figures quoted in this chapter (Tapestry 2.04, Nike 3.53, American Eagle 5.26) and the formula they use. Compare the two pages side by side to see why turnover alone can flatter a business that is discounting.
- 26 CFR § 1.170A-4A — the regulation implementing the enhanced charitable deduction for donated inventory under section 170(e)(3): the restriction to corporations other than S corporations, the requirement that the goods be used for the care of the ill, the needy or infants, the written certification from the charity, and the worked example that reduces fair market value by half the appreciation and then caps the result at twice basis. Dense, but short, and it settles most arguments.
- Textile World on the Hackett Group 2025 working capital survey — textiles, apparel and footwear improved their cash conversion cycle by 10%, driven by a 22% rise in days payable rather than by better collections, with the top 1,000 US companies at a 37-day cycle and 59 days payable, and a second straight year of decline in days sales outstanding. Useful context for why your large customers pay slowly and for judging your own cash cycle.
- Harmonized Tariff Schedule of the United States — the searchable official schedule, published by the US International Trade Commission. Look up heading 6110.30 to see the point made early in this chapter: one heading, four ordinary rates from 6% to 32%, decided entirely by fiber content. Check it yourself rather than copying a rate out of any document, including this one.
- 16 CFR § 303.15 and 16 CFR § 423.6 — the two US labeling rules a liquidation lot still has to satisfy. The first sets out fiber content, country of origin and the manufacturer's name or registered identification number; the second is the Care Labeling Rule, covering washing or drycleaning instructions and warnings. Read both before anyone takes a seam ripper to a label.
- 17 CFR § 229.101 (Regulation S-K, Item 101) — the rule that makes a US listed company describe its dependence on particular customers in the business section of its annual report. No such rule binds a private brand, which is exactly why the customer-concentration line has to be on your own annual plan agenda.
1. Write five metric contracts and one register entry. Pick the five numbers you would actually act on in your business this month. For each, write the metric contract block from the start of this chapter: exact formula, grain, source, owner, cadence, green/amber/red thresholds with the action each triggers, and the escalation. Then take the one you argue about most and write its full register entry, including the gotchas and basis fields. Ask one other person to compute the same metric from raw data without seeing your definition, and compare answers. The gap between your two numbers is the value of the register.
2. Run a reorder feasibility on a real style. Take one style you currently sell. Build its lead time from the stages in this chapter, all of them, including the retailer's distribution-center-to-floor time, which you will have to phone someone to find out. Compute remaining season weeks, current weekly rate, factory minimum and units at risk. Then build the chase table with at least three options priced per unit. Run the five-step decision framework and write down the verdict with a date.
When you are done you should have a one-page metric register you can paste into a metric_definition table, a documented lead time for at least one product that you previously only guessed at, and a written reorder decision you can grade yourself against at the end of the season.