Part 1 — The Business of Fashion Wholesale
E Merchandising, Line Planning and Assortment
Merchandising is the business function that decides what the brand will make, how much of it, at what price, in what colors and sizes, and for which customers. Every row in your products table, every size ratio in an order, every "why do we have 400 units of extra-small in navy" conversation traces back to a merchandising decision made nine to eighteen months earlier. This chapter teaches that decision process from zero, then translates it into the tables, constraints and screens your ERP has to support.
In this chapter
- What you need to know first
- The product hierarchy in practice
- Line architecture: carryover, core and seasonal
- The line plan
- Size curves, ratios and packs
- Colorways and the color adoption problem
- The development and sampling calendar
- Assortment planning by channel and account
- Forecasting and demand planning for a small brand
- Line review, adoption rates and killing styles
- Costing feedback loops
- What this means for your ERP
What you need to know first
Start with the shape of the business. A wholesale apparel brand designs clothing, has it manufactured by factories it does not own, and sells it in bulk to retailers — department stores, specialty boutiques, online retailers — who then resell it to consumers. The brand may also sell directly to consumers through its own website or stores; that channel is called DTC (direct-to-consumer). Most small brands do both, and the two channels want different things, which is a recurring source of pain.
The person on the retailer's side who decides what to buy is a buyer. The person on your side who decides what to make is a merchandiser. Designers draw; merchandisers decide. In a two-person company the same human does both, but the two jobs conflict, and it helps enormously to know which hat you have on. Designers want more ideas. Merchandisers want fewer, better-sold ideas.
Seasons, sell-in and prebook
Everything runs on a season. A season is a named block of product with its own design cycle, its own selling period and its own delivery window. The two big ones are Spring/Summer (often written SS or S/S) and Fall/Winter (FW or F/W or Autumn/Winter, AW). Many brands split these further into Spring 1, Spring 2, Summer, Pre-Fall, Fall 1, Fall 2, Holiday and Resort.
Seasons run far ahead of the calendar: a Fall 2026 line is designed in late 2025, sold to buyers in early 2026, produced in spring 2026, and arrives in stores around July and August 2026.
Two words for the selling period itself. Sell-in means selling to the retailer — you persuading a buyer to write an order. Sell-through means the retailer selling to the shopper, measured as the percentage of received units that actually sold in a period. They are different events, months apart, and confusing them is how brands convince themselves a bad season was a good one.
Market is the trade name for the sell-in window itself: the few weeks each season when buyers tour showrooms and trade shows writing orders. People say "at market" the way other industries say "at the conference."
Selling happens through prebook orders. A prebook is an order a buyer writes before the goods exist, months in advance, based on seeing samples. It carries a start ship date (the earliest the brand may ship) and a cancel date (after which the buyer can refuse the shipment under the terms of the order). Prebook is the backbone: it tells you what to manufacture.
The opposite is an at-once or immediate order — a buyer orders from stock you already own, and it ships this week. At-once orders require you to have guessed right.
Style, colorway, size and SKU
Now the vocabulary of the product itself, which is the load-bearing part of this chapter:
- A style is a design: one pattern, one construction, one name and number. "NB-2210 Foulard Shirt" is a style.
- A colorway is that style executed in one specific color or print. The same shirt in Black and in Indigo is one style and two colorways.
- A size is a physical size within a defined size run (the ordered list of sizes offered — say XS, S, M, L, XL, XXL).
- A SKU — Stock Keeping Unit — is the intersection of all three: one style, one colorway, one size. NB-2210 in Black in size Medium is one SKU.
That is the thing you count, pick, pack, ship and own. Chapter B introduced this vocabulary; here we make it structural.
An option (also called a "style-color") is one style in one colorway, ignoring size. Merchandisers count options, not SKUs, when they talk about the size of a line, because a colorway is a real commercial decision and a size is mostly a mechanical consequence. A line (or collection, or range) is the whole set of options offered for a season.
Price, margin, doors and ATS
Money vocabulary. The wholesale price is what the retailer pays you per unit. The MSRP (manufacturer's suggested retail price), also called the retail price or "the ticket," is what the consumer pays. COGS — cost of goods sold — is what the unit costs you, all in.
Gross margin is (price − cost) ÷ price, expressed as a percent. If a shirt costs you $26 and you sell it wholesale for $58, your wholesale gross margin is 55.2%. A markdown is a price reduction taken to move stock that is not selling; markdowns come straight out of margin.
Two more terms you will hear constantly. A door is one physical store location of a retail account. A chain with 40 stores that buys from you for 12 of them is one account, twelve doors. And ATS — available-to-sell — is the quantity of a SKU you can promise to a customer right now, defined in Chapter B and computed in Chapter 8. Merchandising decisions determine what ATS ever exists; ATS reporting determines whether merchandising is working.
Style, colorway and size are three separate levels. Collapsing them into one flat product list too early causes almost every expensive mistake in an apparel system: bad reporting, impossible size ratios, colors you cannot kill, packs you cannot explode.
The product hierarchy in practice
Above style sits a classification tree. Its job is to let people aggregate: to ask "how did Men's Tops do this season" without listing 400 styles. Retail calls this the merchandise hierarchy or product hierarchy. Large retailers commonly run five or six levels, with names like division, group, department, class and subclass, and skip any level they do not need. A fashion-only brand does not need a Division level, because everything it sells is fashion.
For a small wholesale apparel brand, three levels above style is normally right, and four is the maximum before people stop maintaining it.
| Level | What it answers | Example | Typical count |
|---|---|---|---|
| Department | Who is the customer? | Men's, Women's, Kids, Accessories | 2–5 |
| Class | What part of the body / what job? | Tops, Bottoms, Outerwear, Knitwear | 4–10 per dept |
| Category | What kind of thing exactly? | Woven Shirts, Tees, Sweatshirts, Chinos | 2–8 per class |
| Style | Which design? | NB-2210 Foulard Shirt | 60–300 per season |
| Colorway | Which color/print of that design? | 001 Black, 420 Indigo | 1–8 per style |
| Size | Which body measurement? | XS S M L XL XXL | 1–12 per option |
| SKU | Which exact sellable unit? | NB-2210-001-M | Style × color × size |
Read that table top-down and it is a funnel from "who are we selling to" to "what exactly is in this box." Read it bottom-up and it is your reporting rollup. Every number your ERP produces — sales, margin, inventory, sell-through — must be reportable at every one of those levels. That requires a real chain of database links between the levels. If the levels are just words somebody types into a text field, the rollup breaks the first time two people spell a category differently.
Why the style/colorway/size split is load-bearing
Here is the same product drawn as a tree.
DEPARTMENT Men's
└ CLASS Tops
└ CATEGORY Woven Shirts
└ STYLE NB-2210 Foulard Shirt
├ COLORWAY 001 Black (PANTONE 19-0303 TCX)
│ ├ SKU NB-2210-001-S GTIN 00810123450015
│ ├ SKU NB-2210-001-M GTIN 00810123450022
│ └ SKU NB-2210-001-L GTIN 00810123450039
└ COLORWAY 420 Indigo (PANTONE 19-3928 TCX)
├ SKU NB-2210-420-S GTIN 00810123450046
├ SKU NB-2210-420-M GTIN 00810123450053
└ SKU NB-2210-420-L GTIN 00810123450060
Attributes that live at each level:
STYLE pattern, fit block, construction, size scale,
tech pack, base cost drivers, MSRP, target margin
COLORWAY fabric color + dye lot, print artwork, photography,
adoption/kill decision, color-specific fabric cost
SIZE graded measurements, consumption (fabric per unit),
size-specific cost uplift (e.g. 2XL surcharge)
SKU GTIN/UPC, physical inventory, price exceptions
Walk through what that diagram is telling you. Several of those words need defining first:
- A fit block is the brand's base pattern shape, its house silhouette, that new styles are drafted from.
- A tech pack is the spec document you send the factory: measurements, materials, stitch types, labels, everything needed to build the garment without phoning you.
- Grading is the set of rules that scales that pattern up and down the size run, so "graded measurements" are the finished dimensions at every size.
- A size scale is the named, reusable list of sizes itself, "ALPHA_6" meaning XS/S/M/L/XL/XXL, which many styles share.
- A dye lot is one batch of fabric dyed at one time; two lots of the same color rarely match perfectly, which is why the lot is tracked.
Now the structure. The pattern and the fit belong to the style — change them and you have changed every colorway and every size at once. The dye lot and the photography belong to the colorway — you can kill Indigo without touching Black. The graded measurements and the fabric consumption belong to the size — a 2XL uses more fabric than an XS and therefore genuinely costs more to make. And only the SKU has a barcode and a physical unit count.
If you flatten this into one products table, you will end up storing the pattern number 36 times and you will eventually have 36 slightly different versions of it.
Pantone codes and specifying color
A word on the Pantone codes in that tree. Pantone is a company that sells physical color standards: printed or dyed swatches, each with a number. Quoting a Pantone number to a dye house is how you and they agree on one exact shade without arguing about words like "navy." The codes shown here are real ones, 19-0303 TCX is Pantone's Jet Black and 19-3928 TCX is its Blue Indigo, but they illustrate the format rather than recommending a palette.
Always take the exact code from a physical swatch book under controlled light, never from a screen. Screens cannot render textile color reliably, and "close enough on my monitor" is how brands end up rejecting a whole dye lot.
One barcode per SKU
Treat the barcode rule as absolute. GS1 US, the body that issues UPC barcodes in the United States, is explicit: "each variation of each product you sell requires a unique barcode." It gives the apparel example directly — "3 sizes x 3 colors = 9 barcodes", and "If they also come in 3 styles, you'll need 27 barcodes." Every SKU gets its own GTIN (Global Trade Item Number; a UPC is the 12-digit US form of a GTIN). No exceptions, no shared barcodes across sizes.
One detail about the numbers themselves, because it trips up every first attempt. The last digit of a GTIN is a check digit: a value computed from the digits before it, so a scanner can tell instantly whether it read the barcode correctly. The rule is to multiply the digits alternately by 3 and 1, starting with 3 at the left of a 14-digit GTIN, add the results, and choose the digit that brings the total up to the next multiple of ten.
The six GTINs in the tree above are valid under that rule. Never invent barcode numbers by hand; take them from your GS1 company prefix and let your ERP compute the check digit.
Standard color and size codes
There is also a standard vocabulary for the color and size values themselves. The GS1 US Color and Size Codes — formerly known as the NRF Standard Color and Size Codes, after the National Retail Federation — give trading partners a common language for color and size.
As of 2026, GS1 US states that "The GS1 US Color Codes, formerly the NRF Standard Color Codes, include thirteen colors": Beige, Black, Blue, Brown, Green, Grey, Orange, Pink, Purple, Red, White, Yellow and Miscellaneous Assortment. It also states that "The GS1 US Size Codes include seven category types," covering adult male and unisex, boys and unisex student, juniors/misses/women's, infants through children's, footwear, linens and domestics, and home furnishings plus miscellaneous measurements.
Large retailers ask for these codes in the product data you send them, including EDI catalog messages — EDI is electronic data interchange, a fixed-format machine-to-machine message standard big retailers use instead of email, so that your "Indigo" and someone else's "Dark Denim" both roll up to the Blue family in their reporting.
Store four things, not one: your marketing color name ("Harbor Indigo"), your internal color code ("420"), the standard GS1/NRF color family code, and where you have it the Pantone reference. They serve four different audiences — your customer, your warehouse, your retail partner's data team, and your dye house. Trying to make one field do all four jobs fails within one season.
How fast SKUs multiply
SKU arithmetic for one season (Fall 2026, worked)
Category Styles Avg colors Options Sizes SKUs
--------------- ------ ---------- ------- ----- -----
Knits 26 2.4 62 6 372
Woven Shirts 20 2.2 44 6 264
Outerwear 10 2.2 22 5 110
Bottoms 16 2.4 38 8 304
Accessories 18 2.7 48 1 48
--------------- ------ ---------- ------- ----- -----
TOTAL 90 2.4 214 5.1 1,098
Add ONE color to every knit style: +26 options
+156 SKUs
Add ONE size (3XL) to tops+bottoms: +144 SKUs
0 new options
Add a second delivery per season: roughly x2 on
everything above
The point of that block is how fast the numbers multiply. Ninety design decisions became 214 commercial decisions became 1,098 physical things to count, photograph, barcode, forecast, store and eventually mark down.
Notice the two "add one" lines. A single casual decision in a design meeting ("let's do the crew in one more color") creates 26 extra options across the 26 knit styles, and at six sizes each that is 156 new SKUs — 156 new barcodes, 156 new rows in every inventory report, 156 new opportunities to be left with one unit.
A single decision to extend the size range adds one size to the 144 options in knits, wovens and bottoms: 144 SKUs and zero new options. That is why size extension is usually a better use of the same complexity budget than color extension. It widens your addressable customer without diluting your color bets.
Line architecture: carryover, core and seasonal
A line has an architecture, and good ideas on their own never produce one. The first axis of that architecture is how long the style is meant to live.
| Type | Definition | Job in the line | How it is planned |
|---|---|---|---|
| Carryover | The identical style and colorway offered again next season, unchanged | Free revenue. Pattern, samples, photography and grading are already paid for | Forecast from its own sales history; reorder against a replenishment model |
| Core | A permanent style in permanent colors, refreshed but never dropped — the white tee, the five-pocket, the field jacket | Anchors the brand identity and the price ladder; the thing a buyer restocks all year | Planned as continuity: rolling forecast, safety stock, at-once availability |
| Seasonal / fashion | Styles designed for one season only — this year's print, this year's silhouette | Newness. Gets the buyer into the showroom and gets the brand photographed | Planned to prebook only; built to order, with little or no speculative buy |
| Novelty / statement | A handful of extreme pieces with no volume expectation | Editorial and social content; sets the story for the commercial styles | Tiny minimums, often made in one color, sometimes not sold at all |
Carryover and core overlap and people use the words loosely; the useful distinction is that carryover is a decision about a specific style-color you already made and are repeating, while core is a strategic commitment to a product concept that outlives any individual season. In your data model that is the difference between a per-season flag and a per-style attribute, and you need both.
Balancing stability against newness
Proportions vary enormously by brand, and anyone who quotes you one number is selling something. What is real is the direction: brands that are mostly seasonal carry high markdown risk and high development cost; brands that are mostly carryover get stale and lose showroom appointments. The job is to balance stability against newness, and the balance point is a property of your customer, not of the industry.
A workable rule of thumb for a small wholesale brand, stated as ranges because that is the honest form: roughly a quarter to a half of options carryover or core, most of the remainder seasonal, and a handful of novelty. Treat those as starting brackets to argue with, not targets to hit.
Your own right answer comes from one number you can actually measure: what percentage of last season's revenue came from styles that existed the season before? If that number is very low, you are re-developing your entire business every six months and paying for it in sampling costs. If it is very high, ask whether buyers still have a reason to take an appointment.
One number falls out of this architecture and gets quoted more than any other in a line review: newness percentage, meaning new options divided by total options. Your ERP has to compute it instantly at every level of the hierarchy, which means "was this option offered in a prior season" must be a queryable fact rather than something a merchandiser remembers.
Good / better / best and the price ladder
The second axis of line architecture is price. A price ladder is the deliberate sequence of price points that lets a customer compare products inside a category. Good / better / best is the standard three-rung form: an accessible entry tier, a mainstream core tier, and a premium tier whose extra cost is visibly justified.
Two things make a ladder work. First, the rungs must be far enough apart to be legible. There is no universal gap, and the right distance varies by category and by customer: in some categories a small step reads as a real difference, in others shoppers need a much bigger jump before they perceive separate tiers at all. Test it on your own sell-through rather than adopting someone else's number.
Second, each rung needs a reason — a better fabric, a heavier weight, a more complex construction, a finished detail — that a salesperson can say out loud in eight seconds.
Price ladder, Men's Woven Shirts, Fall 2026
Tier Fabric / story WS MSRP Options % units
------ -------------------------- ------ ----- ------- -------
GOOD Cotton poplin, basic $44 $ 98 12 52%
BETTER Brushed twill, chest yoke $58 $128 22 36%
BEST Japanese selvedge, horn $86 $195 10 12%
Gap good->better MSRP +31% (legible)
Gap better->best MSRP +52% (legible)
Weighted average MSRP
= (.52 x 98) + (.36 x 128) + (.12 x 195)
= 50.96 + 46.08 + 23.40
= $120.44
Weighted average WHOLESALE
= (.52 x 44) + (.36 x 58) + (.12 x 86)
= 22.88 + 20.88 + 10.32
= $54.08 <-- this is the number the line plan uses
Reading that: the ladder has three clearly separated rungs, each with a one-line reason. Two of those reasons are trade words. A yoke is the panel across the shoulders, and putting one there is an extra piece to cut and sew. Selvedge is fabric woven on a narrow old-style loom so it has a finished, non-fraying edge; it costs far more per yard and is used as a visible quality signal.
The unit mix is deliberately bottom-heavy, over half the units come from the opening price point, because entry price drives traffic and the top rung mostly exists to make the middle look reasonable.
The last two calculations are the ones merchandisers actually use: the weighted average price for the category, at retail and at wholesale. "Weighted" means each price is multiplied by its share of units before the prices are added together, so the sizes of the bets count.
The weighted average wholesale price comes out at $54.08 rather than the $58 of the middle rung, because the fifty-two percent of units sitting on the bottom rung pull the average down. That $54 is what the line plan below has to use. Using the middle rung instead is a classic way to plan revenue you will never book.
If that number drifts down between seasons while your costs go up, your margin is quietly collapsing even though no individual price changed. Your ERP should compute weighted average price by category on planned units and again on actual booked units, and show the two side by side.
SKU proliferation, and how disciplined brands cap it
SKU proliferation is what happens when nobody is allowed to say no. Each individual addition is defensible — a sales rep says an account wants it, a designer loves it, a factory offers a good price, and the aggregate is a business with 1,400 SKUs where 300 would sell the same money at a better margin.
There is no reliable public benchmark for how fast this happens, and the vendor figures that circulate are marketing, not research, so ignore them and measure your own: count options per category per season for the last four seasons and plot the line. In almost every young brand it slopes up, and nobody in the building has ever seen the chart.
The costs of a marginal SKU are mostly invisible on a per-unit basis and brutal in aggregate:
- Development cost. A prototype sample, a fit sample, a size set and a run of selling samples for one style easily runs into four figures before a single unit sells.
- Minimums. Fabric mills impose minimum dye quantities. Factories impose minimum cut quantities per style and often per color. A colorway you did not need still forces you to buy the mill's minimum.
- Photography and content. Every option needs shots. Every shot needs a sample, a model, retouching and a product page.
- Warehouse and pick complexity. Every SKU is a bin location, a cycle count, and a chance to mis-pick.
- Attention. A buyer's appointment might run 45 minutes. Showing 214 options in that time gives each one about 12 seconds.
Disciplined brands cap SKUs with an explicit, pre-committed budget. Before design starts, merchandising publishes an option count per category for the season — "Fall 2026: Knits 62 options, Wovens 44, Outerwear 22, Bottoms 38, Accessories 48", and the rule is that the budget is a hard ceiling. Adding an option after the budget is set requires removing one. This "one in, one out" rule is boring, unpopular, and the single most effective merchandising discipline that exists.
The most common way an option budget gets broken is the "sample only" or "just for the show" style that nobody planned to sell. It gets a style number, gets photographed, gets shown, gets ordered by two accounts, and now it is a real style with real fabric minimums and no plan behind it. The defense is structural: make "will be shown" and "will be sold" two separate flags in your system, and require an explicit promotion step between them.
The line plan
The line plan is the document that turns a financial target into a product plan. It is a table. One row per category (sometimes per class), and columns for option count, newness, average price, unit target, revenue target and margin target. It is owned by merchandising, built with finance and design, and reviewed at fixed gates through the development calendar.
It is built by working from two directions at once and forcing them to meet. Top-down: the founder or finance says "Fall 2026 needs to book $2.4 million wholesale at a 55% blended gross margin." Bottom-up: merchandising says "here is what each category can realistically produce given last year's sell-through, the accounts we have, and what we can develop in the time available." The line plan is the reconciliation. It is normal for the first pass to be 20% apart and to take three rounds to close.
A worked line plan for Fall 2026
Here is a complete worked line plan for a fictional but realistic brand.
| Category | Styles | Options | Carryover | New | Newness | Avg WS | Avg MSRP | Units | Wholesale $ | % of line | Target GM% |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Knits | 26 | 62 | 28 | 34 | 55% | $32 | $70 | 22,500 | $720,000 | 30.0% | 58% |
| Woven Shirts | 20 | 44 | 18 | 26 | 59% | $54 | $120 | 9,775 | $527,850 | 22.0% | 54% |
| Outerwear | 10 | 22 | 8 | 14 | 64% | $125 | $275 | 3,840 | $480,000 | 20.0% | 52% |
| Bottoms | 16 | 38 | 18 | 20 | 53% | $72 | $158 | 6,000 | $432,000 | 18.0% | 55% |
| Accessories | 18 | 48 | 20 | 28 | 58% | $30 | $66 | 8,000 | $240,000 | 10.0% | 62% |
| TOTAL | 90 | 214 | 92 | 122 | 57% | $47.89 | $105 | 50,115 | $2,399,850 | 100% | 55.8% |
Every column in that table is a decision someone argued about. Read it as a set of claims: Knits are the volume engine at 30% of revenue on the lowest average price; Outerwear is 20% of revenue from only 22 options, meaning each outerwear option carries about four times the revenue of an accessories option ($21,800 against $5,000) and is therefore about four times as dangerous if it misses; newness is 57%, which is aggressive but defensible; and the blended target margin of 55.8% clears the 55% mandate with a little room.
Nobody picks the $47.89 average wholesale price. It falls out of the mix, and the Woven Shirts row uses the price ladder's $54.08 weighted average, rounded to $54, rather than the $58 middle rung.
Line plan reconciliation, Fall 2026
TOP-DOWN TARGET $2,400,000 wholesale @ 55.0% blended GM
BOTTOM-UP CHECK 1 -- does the revenue tie?
720,000 + 527,850 + 480,000 + 432,000 + 240,000
= $2,399,850 (0.006% under target -- accept)
BOTTOM-UP CHECK 2 -- does the margin tie?
Knits 720,000 x 0.58 = 417,600
Wovens 527,850 x 0.54 = 285,039
Outerwear 480,000 x 0.52 = 249,600
Bottoms 432,000 x 0.55 = 237,600
Accessories 240,000 x 0.62 = 148,800
---------------------------
Gross margin $ 1,338,639
Blended GM% 1,338,639 / 2,399,850 = 55.78% PASS
BOTTOM-UP CHECK 3 -- units per option (the sourcing test)
Knits 22,500 / 62 = 363 u/option OK
Wovens 9,775 / 44 = 222 u/option <-- PROBLEM
Outerwear 3,840 / 22 = 175 u/option <-- PROBLEM
Bottoms 6,000 / 38 = 158 u/option <-- PROBLEM
Accessories 8,000 / 48 = 167 u/option OK (see below)
Factory minimum cut = 300 units per style/color.
Mill minimum dye = 500 m per color
(~250 outerwear units at 2.0 m each)
Accessories are cut from stock (already-dyed) fabric
with a 100-unit minimum, so 167 clears.
Three of five categories are BELOW the cut minimum.
Checks one and two are the easy ones: the revenue adds up and the weighted margin clears the target. Check three is the one that kills line plans, and it is the check most spreadsheets do not contain.
Two supplier limits drive it. A minimum cut quantity is the smallest run a sewing factory will make of one style in one color. A minimum dye quantity is the smallest amount of fabric a mill will dye in one color.
Dividing planned units by planned options gives the average depth per colorway, and that number has to survive contact with both minimums. Here it does not. Outerwear is planned at 175 units per colorway against a 300-unit factory minimum, so either the brand buys 300 and eats 125 units of speculative inventory per colorway, or it cuts the option count.
Line plan v2 -- after the sourcing review
Category Options v1 Options v2 Units u/option v2
------------ ---------- ---------- ------ -----------
Knits 62 62 22,500 363
Woven Shirts 44 32 9,775 305
Outerwear 22 12 3,840 320
Bottoms 38 20 6,000 300
Accessories 48 48 8,000 167
------------ ---------- ---------- ------ -----------
TOTAL 214 174 50,115 288
Wovens now 305 u/option -> clears 300 cut minimum
Outerwear now 320 u/option -> clears 300 cut minimum
Bottoms now 300 u/option -> exactly at minimum
Knits unchanged at 363 -> already cleared
Accessories still 167 -- ACCEPTED: stock fabric,
100-unit minimum, no dyeing
Revenue and margin unchanged. Option count down 19%
(40 fewer options), so sampling and photography spend
falls roughly in proportion.
Version two solves the problem the only way it can be solved without more money: fewer, deeper bets. Revenue and margin targets are untouched, but forty options were removed, which concentrates the same units into fewer colorways so each one clears its minimums.
This is the central trade-off of merchandising — breadth versus depth. Stated as arithmetic: with a fixed budget you can buy two styles at 5,000 units each or ten styles at 1,000 units each. Broad and shallow gives the customer variety and gives you a hundred small residual piles. Narrow and deep gives you better costs, better sell-through and a worse day if one style misses.
How the line plan is reviewed
The line plan gets rewritten several times before it is final. It is versioned against fixed gates, and each gate has a different question. In the table below, T is the start of the delivery window — the day the goods are due to reach stores.
| Gate | Roughly when | Question asked | What can still change |
|---|---|---|---|
| Plan open | T−11 months | What are the financial targets and option budget? | Everything |
| Concept review | T−10 months | Do the concepts cover the plan's categories and price tiers? | Styles, categories, price tiers |
| Line review 1 (proto) | T−8 months | Which prototypes are worth fitting? Costing v1 against target margin | Styles killed, costs engineered |
| Line review 2 (adoption) | T−6 months | What is actually in the line? Final option count and colors | Colorways, price, option count |
| Sales meeting | T−5 months | Can the reps sell this? Any gaps by account type? | Rarely styles; usually only pricing and delivery |
| Post-market review | T−3 months | What did prebook actually book against plan? What do we cut? | Cut styles that did not book; adjust bulk buy |
The important structural fact is that decision freedom collapses over time while cost commitment rises. At concept review you can change anything and it costs nothing. At post-market review you can only cancel, and canceling after fabric is committed means eating the fabric. Your ERP should make this visible: every style should carry a lifecycle stage, and the system should refuse or warn on changes that are illegal for the current stage.
Size curves, ratios and packs
A size run is the ordered list of sizes a style is offered in — XS through XXL, or waist 28 through 40, or 6 through 13 in footwear. A size curve is the distribution of demand across that run. It is normally written either as percentages (XS 6%, S 18%, M 28%, L 26%, XL 15%, XXL 7%) or as a whole-number ratio (1:2:3:3:2:1).
The first curve has to come from somewhere. Before you have data you assume a bell shape, because middle sizes almost always outsell extremes. Retail Dogma gives the standard starting ratios plainly: "if you're carrying 4 sizes, this could be 1:2:2:1 or if you're carrying 5 sizes it could be 1:2:3:2:1."
Once you have trading history you plot your own curve, which may skew smaller or larger than the bell depending on who actually buys from you. The curve varies by category, by channel, by account and by region. Footwear is the least forgiving case, because shoe demand concentrates in a handful of middle sizes and a run that is short of them is effectively unsellable.
The size curve is a property of a specific product in a specific channel for a specific customer base. A crop top and a 3XL-extended hoodie do not share a curve. Model size curves as first-class rows with a scope, never as one company-wide constant.
Deriving a curve from history
Deriving the FA26 knits curve from FA25 actuals
(comparable styles only; the season ran 18 weeks)
Size Units sold Wks in stock Weekly rate Norm. demand %
----- ---------- ------------ ----------- ------------ ----
XS 984 18 54.7 984 6.0
S 2,952 18 164.0 2,952 18.0
M 3,572 14 255.1 4,593 28.0 *
L 3,553 15 236.9 4,264 26.0 *
XL 2,460 18 136.7 2,460 15.0
XXL 1,148 18 63.8 1,148 7.0
----- ---------- ------------ ----------- ------------ ----
TOTAL 14,669 16,401 100.0
* M and L SOLD OUT before the 18-week season ended.
Raw units understate real demand. Normalizing to a
full 18-week rate: M 255.1 x 18 = 4,593
L 236.9 x 18 = 4,264
Raw (naive) curve: 6.7 / 20.1 / 24.4 / 24.2 / 16.8 / 7.8
Corrected curve: 6.0 / 18.0 / 28.0 / 26.0 / 15.0 / 7.0
As a 12-unit ratio: 1 : 2 : 3 : 3 : 2 : 1
As a 24-unit ratio: 1 : 4 : 7 : 6 : 4 : 2
The step that matters here is the stockout correction. If you compute a size curve from raw units sold, every size that sold out gets systematically underweighted — you literally cannot sell what you did not have. So you divide units by the weeks the size was actually in stock, get a weekly rate, and re-project it across the full season.
In this example M sold out at week 14 and L at week 15, and the naive curve understates M by 3.7 percentage points and L by 1.8. That sounds trivial. Applied to a 22,500-unit knits buy it is about 820 units of Medium and 400 of Large that you would not have ordered, and those are the two sizes that convert.
Notice too that the corrected percentages round cleanly onto a 12-unit ratio of 1:2:3:3:2:1 but slightly less cleanly onto a 24-unit ratio. Ratios are always a lossy compression of the curve, and the coarser the pack the more information you throw away.
Solid packs, prepacks and open sizing
How a brand actually ships sizes to an account comes in three forms.
| Model | What it means | Who it suits | Risk it creates |
|---|---|---|---|
| Open sizing (open stock) | The buyer orders any quantity of any size independently: 12 M, 9 L, 3 XS | Specialty boutiques, brands with strong ATS, at-once business | All the size risk sits with the brand: you cut bulk on a curve and get ordered off a different one |
| Prepack / assortment / ratio pack | Sizes are pre-bundled in a fixed ratio; the buyer orders packs, not units. "Order 40 packs of 12" | Volume accounts, chains, off-price, anyone allocating to many doors | Size risk moves to the retailer, who is stuck with whatever the ratio over-delivered |
| Solid pack | A carton contains one style, one color, one size — e.g. 24 pieces of Medium | Warehouse efficiency, replenishment, retailers who allocate centrally by size | Requires the retailer to know its own curve; large carton quantities push up minimum buys |
The words get used loosely in the trade. "Prepack" and "assortment" almost always mean a fixed multi-size bundle. "Solid pack" almost always means one SKU per carton. Some retailers use "prepack" to mean any pre-built carton including a solid one, so when a vendor manual uses the term, read its definition instead of assuming.
The prepack residual problem, worked
Prepacks are efficient and they are lossy. Here is exactly how the loss happens.
Style NB-4102 Harbor Crew, color 001 Black
WS $32 MSRP $70 size run XS-S-M-L-XL-XXL
True demand for this style/color at this account this
season = 500 units, distributed on the true curve:
XS 30 S 90 M 140 L 130 XL 75 XXL 35 = 500
The buyer orders 40 packs of 12 = 480 units.
Three possible pack ratios:
A. FLAT PACK 2:2:2:2:2:2 (the factory's default)
Received: XS 80 S 80 M 80 L 80 XL 80 XXL 80
Sold = min(stock, demand):
XS 30 S 80 M 80 L 80 XL 75 XXL 35 = 380
Residual: XS 50 S 0 M 0 L 0 XL 5 XXL 45 = 100
Lost sale: XS 0 S 10 M 60 L 50 XL 0 XXL 0 = 120
B. STANDARD PREPACK 1:2:3:3:2:1
Received: XS 40 S 80 M 120 L 120 XL 80 XXL 40
Sold: XS 30 S 80 M 120 L 120 XL 75 XXL 35 = 460
Residual: XS 10 S 0 M 0 L 0 XL 5 XXL 5 = 20
Lost sale: XS 0 S 10 M 20 L 10 XL 0 XXL 0 = 40
C. TRUE CURVE, OPEN SIZING 6/18/28/26/15/7
Received: XS 29 S 86 M 134 L 125 XL 72 XXL 34
Sold: XS 29 S 86 M 134 L 125 XL 72 XXL 34 = 480
Residual: 0 everywhere = 0
Lost sale: XS 1 S 4 M 6 L 5 XL 3 XXL 1 = 20
RETAILER MARGIN CONSEQUENCE (cost to retailer = 480 x $32
= $15,360 in every scenario)
Full-price Markdown Total Gross
sales @$70 @50% $35 revenue margin
---------- ----------- --------- -------- -------
A Flat 380 = 26,600 100=3,500 30,100 49.0%
B Prepack 460 = 32,200 20= 700 32,900 53.3%
C Curve 480 = 33,600 0= 0 33,600 54.3%
A vs C: 100 units sold at $35 instead of $70.
Total revenue $3,500 lower on identical
inventory dollars, and 5.3 margin points
destroyed.
Read the three scenarios as the same money spent three ways. In all three the retailer spends exactly $15,360 and receives exactly 480 units. The only difference is which 480 units.
Scenario A — the factory's lazy flat pack, two of every size — delivers 80 Mediums into a door that wanted 140 and 80 Extra-Smalls into a door that wanted 30. The Mediums evaporate in six weeks and the Extra-Smalls sit until they are marked down 50%.
Scenario B, a proper prepack shaped like the curve, gets most of the way there. Scenario C, open sizing on the true curve, is perfect, but only because we assumed we knew the curve, which is the whole difficulty.
Now the part that matters for a wholesale brand: in scenario A the margin damage happens on the retailer's P&L — its profit and loss statement — not yours, and then it comes back to you.
It comes back as a smaller reorder, as a request for markdown money (a credit you pay to fund the retailer's markdowns), as a chargeback (a deduction the retailer takes off your invoice when you break one of the rules in their vendor handbook), or as being dropped. A brand that ships badly-shaped prepacks is training its accounts to shrink.
Broken sizes is the term for a style-color whose size run is no longer complete — the Mediums and Larges are gone and only XS and XXL remain. A broken size run is commercially close to worthless: a buyer will not reorder into it, a store cannot merchandise it, and DTC conversion craters because the visitor's size is missing. Your ATS reporting must flag broken runs explicitly rather than reporting only the total unit count, because "we have 340 units of NB-4102" and "we have 340 units of NB-4102 and 300 of them are XXL" are completely different facts.
The residual problem on the brand's own books
Brand-side residual, NB-4102/001
(the 5,472-unit buy is worked later in this chapter)
Bulk cut on the 1:2:3:3:2:1 prebook curve, 5,472 units:
XS 456 S 912 M 1,368 L 1,368 XL 912 XXL 456
Prebook ships 4,200 units on that same ratio:
XS 350 S 700 M 1,050 L 1,050 XL 700 XXL 350
Left in the warehouse, still in curve proportion:
XS 106 S 212 M 318 L 318 XL 212 XXL 106 = 1,272
That 1,272 has to serve BOTH the brand's own website and
wholesale reorders for the rest of the season.
Reorder demand does NOT follow the prebook curve. It is
replenishment demand -- stores chase the sizes that sold.
Observed reorder mix: XS 2% S 14% M 36% L 32%
XL 12% XXL 4%
Season reorder + own-site demand: 1,400 units
XS 28 S 196 M 504 L 448 XL 168 XXL 56
What actually happens, size by size:
XS 28 wanted, 106 on hand -> 78 left
S 196 wanted, 212 on hand -> 16 left
M 504 wanted, 318 on hand -> SOLD OUT, 186 lost
L 448 wanted, 318 on hand -> SOLD OUT, 130 lost
XL 168 wanted, 212 on hand -> 44 left
XXL 56 wanted, 106 on hand -> 50 left
End state: 0 M, 0 L, 188 units left in XS/S/XL/XXL.
That is a BROKEN RUN.
Lost sales 316 units x $32 wholesale = $10,112
Residual 188 units, COGS $13.44 each = $2,527 spent
closeout at about $8 each = $1,504 back
cash destroyed = $1,023
This is the mirror image of the retailer's problem and it is where most small brands actually lose money. Prebook demand and reorder demand have different size curves — prebook is a buyer filling a size run, reorder is a store chasing what sold. Reorder demand is always more concentrated in the middle sizes.
If you cut bulk on the prebook curve and then serve reorders from the leftovers, the middle sizes disappear first and you are left holding a broken run. Closeout — selling the leftovers in bulk to a liquidator at a deep discount — recovers about $8 a unit against a $13.44 cost, so the residual destroys cash outright, and that is the small number: the big one is the $10,112 of orders you could not fill.
Software does not fix this. The fix is to cut a modest overage skewed toward M and L specifically to serve reorders, and to treat your reorder curve as a separate, tracked curve.
Colorways and the color adoption problem
Color is where dead stock is born, and the reason is structural. A style either works or it does not, and you find out fairly quickly, but a style that works can still leave you with 400 units of the wrong color, and unlike a size, a color has no substitute. Somebody who wants a Medium will not take a Large. Somebody who wants Black will absolutely not take Chartreuse.
A colorway is one execution of a style in one color, print or wash. Color adoption is the decision, at line review, of which colorways make it into the line. Brands develop far more colors than they adopt: a design team might present a knit style in nine lab dips — small swatches of your actual fabric dyed to a target color and sent for approval, and adopt three. The print equivalent is a strike-off: a short test print of your artwork on your fabric, approved before bulk printing starts.
A seasonal color palette is the constrained set of colors the whole season is built from, split into core colors that repeat every season (black, navy, white, gray, oatmeal) and seasonal colors that are specific to this delivery. How many colors that is depends entirely on the size of the line; for a small brand it is a short list, and keeping it short is the point.
Pantone publishes fashion color trend reports keyed to fashion weeks, and its TCX codes — the cotton-swatch library in Pantone's Fashion, Home + Interiors system — are the industry's standard way to specify a color to a dye house unambiguously.
Whether you follow trend palettes or invent your own, the discipline is the same: constrain the palette first, then design into it, because every additional color has a hard cost floor.
Why color costs more than it looks
The cost floor is the minimum color quantity — MCQ — imposed by the dye house, and it is distinct from the factory's MOQ (minimum order quantity, the fewest units a factory will cut).
Industrial dyeing minimums commonly run 500 to 1,000 meters per color, set by the mill rather than by your cut-and-sew factory, because dye vats need volume to produce consistent shade. Colors cannot be pooled: as one manufacturer puts it, each color must meet its own MCQ, because "Dye baths must stay separate for shade control."
Below-minimum runs attract surcharges, get lower scheduling priority, and risk shade variation. The one escape is stock fabric that is already dyed, which is why the accessories row in the line plan above could live at 167 units per option.
The true cost of adopting one extra color
Style NB-4102 Harbor Crew, fabric use 1.6 m/unit
Fabric $3.20/m. Landed cost today $13.44/unit,
so gross margin at $32 wholesale = 58%.
Mill MCQ = 500 m per color.
(Mills quote in meters or yards depending on region;
1 yard = 0.9144 m exactly. Pick one unit per cost
sheet and never mix them.)
Minimum viable units per color = 500 / 1.6 = 313 units
(before cutting waste; with 8% waste, 500/1.73 = 289)
You planned 180 units of "Moss" for prebook.
Options:
(a) Buy the 500 m minimum anyway
-> 313 units cut, 180 sold on prebook,
133 units speculative, COGS $13.44 ea = $1,788
of cash tied up in a color nobody asked for.
(b) Pay the mill's small-lot surcharge on the
per-meter price (this brand was quoted +25%)
-> fabric $3.20 -> $4.00/m, unit cost +$1.28,
landed cost $13.44 -> $14.72, gross margin on
that color drops 58% -> 54.0% at the same $32
wholesale -- BELOW the 58% knits target.
(c) Kill Moss, move its 180 units into Black and Navy.
-> zero extra cost, zero residual, one fewer photo
shoot, one fewer set of 6 SKUs.
ADDITIONAL FIXED COSTS PER ADOPTED COLOR
(this brand's own quotes -- get your own)
Lab dips + strike-offs $50-250
Selling sample set $80-400
E-commerce photography $150-600
6 new GTINs, 6 new bin locs admin
Option (c) is almost always right and almost never chosen, because killing a color feels like killing creativity. The arithmetic is what makes the case: a color planned at 180 units against a 313-unit minimum amounts to a 133-unit donation to next year's sample sale.
Note the second-order effect in option (b) too. Accepting a small-lot surcharge costs money, and it also silently drops that colorway four points below the category's target gross margin. Unless your costing system tracks cost per colorway rather than per style, nobody will ever see it.
Cost belongs to the colorway, not to the style. Two colorways of the same style routinely have different fabric prices, different dye surcharges and therefore different margins. A costing table keyed only to style_id will hide your worst-performing products forever.
The color mix rule of thumb
| Color role | Typical share of units | Examples | Behavior |
|---|---|---|---|
| Core neutrals | 50–70% | Black, Navy, White, Gray, Oatmeal | Predictable, reorderable, carry over, rarely marked down |
| Seasonal supporting | 20–35% | Olive, Burgundy, Rust, Slate | Sell through in season, do not carry over well |
| Fashion / statement | 5–15% | This season's brights, prints, novelty washes | High markdown risk; earns its place through photography, not units |
Those ranges are directional, and they are brackets rather than a formula, so your own three numbers still have to add up to 100%. They also vary hard by category — outerwear tends to be even more neutral-heavy, and a print-led resort line will invert them entirely.
The test to apply to your own business is measurable: pull the last four seasons, group units by color role, and compute markdown rate and sell-through per group. Most brands find that the fashion group sells through materially worse and marks down materially harder than the core group, and that it is nonetheless quietly growing as a share of units every season, because it is the fun part of the job.
Measure it before you argue about it.
The development and sampling calendar
Samples are how a garment becomes real, and the calendar of samples is the spine of the whole season. Merchandising cares about samples because you cannot sell what you cannot show, and a late sample turns straight into lost revenue.
| Sample | What it is | Made in | Who needs it | Decision it enables |
|---|---|---|---|---|
| Proto (prototype, 1st sample) | First physical version — does this design actually assemble? | Often substitute fabric; appearance secondary | Design, merchandising | Keep or kill at line review 1; first costing |
| Fit sample | Establishes correct measurements on a real body in the real fabric | Intended fabric, base size only | Technical design, fit model | Locks measurements and grading rules |
| Size set | One garment per size, to prove the grade scales | Intended fabric, full run | Technical design | Confirms the size run is producible and consistent |
| SMS (sales/selling sample) | The selling sample — actual fabric, trims and labels. Sometimes still called a "salesman sample" | Production-quality, one per selling colorway | Sales reps, showroom, trade show, key accounts | Prebook orders — literally the order quantities |
| Photo sample | Sample reserved for the lookbook and e-commerce shoot | Production-quality, model size | Marketing, e-comm, PR | Linesheets, lookbook, product pages |
| PP (pre-production) | Final dress rehearsal in exact bulk fabric and methods | Bulk fabric, industrial methods | Production, QA | Approval to cut bulk; becomes the reference "golden sample" |
| TOP (top of production) | Pulled from the live production run | Actual bulk | QA, production | Approval to ship |
Two documents in that table need defining. A linesheet is the working order form: every option with its image, wholesale price, MSRP, size run, minimums and delivery window, laid out so a buyer can write quantities against it. A lookbook is the styled photo book that sells the story rather than the specification. Buyers order off the linesheet and get excited by the lookbook, and you need both.
How long the sample cycle takes varies enormously by factory, fabric and how clean your tech pack is, so do not plan against someone else's number — measure your own factories and hold them to it. Two rules hold everywhere: fabric availability, not sewing capacity, is almost always the binding constraint, and multiple rounds at proto and fit are normal and healthy. Bulk is never cut until the PP sample is approved.
Two of those samples are merchandising's problem specifically. The SMS is the one that generates revenue, because the response to selling samples is what sets the order quantities you then commit to bulk. The photo sample is the one that generates demand: no photo, no linesheet, no e-commerce page, no PR placement.
Fall 2026 season, one brand's calendar
(T = start of the retail delivery window, 15 Jul 2026)
MONTH DEVELOPMENT SELLING SHIPPING
------ ----------------------- --------------- ----------
Aug 25 FA26 targets + option
budget set
Sep 25 Concept, fabric select
Oct 25 Proto round 1 out
Nov 25 LINE REVIEW 1:
138 protos -> 96
Costing v1 vs target
Dec 25 Fit round 1; cost
engineering
Jan 26 LINE REVIEW 2: adopt 90
styles / 214 options
SMS cut; photo samples;
size sets
Feb 26 SMS ship to reps MARKET OPENS
Lookbook + linesheets (showroom + shows)
Mar 26 PP samples Prebook writing
Apr 26 PP approvals ORDER CUTOFF 15 Apr
May 26 Bulk cut; TOP samples At-once opens
Jun 26 Inbound freight
Jul 26 START SHIP
15 Jul
Aug 26 SP27 development Reorders Peak ship
Sep 26 CANCEL 30 Sep
Everything left of "SMS ship to reps" is cost.
Everything right of it is revenue.
Running three seasons at once
Two things to notice. First, the brand is running three seasons at once — shipping Fall 2026 in July while developing Spring 2027 in August and still collecting on Spring 2026. This is normal, and it is why season has to be a real dimension on every table in your system rather than something inferred from a date.
Second, the whole calendar hinges on one date: SMS shipping to reps in February. Everything before it is cash going out; everything after it is cash coming in.
That calendar is one brand's, and it runs a few weeks later than the industry norm. The published wholesale calendar for Fall/Winter has linesheets dropping in January with orders closing around mid-March for June-to-August delivery; this brand opens market in February and closes orders on 15 April for a 15 July start ship. Both work. What matters is that your own dates are written down, because every downstream deadline is measured from them.
The cost of a late selling sample
Late samples are catastrophic in a specific, quantifiable way.
Cost of a late SMS -- NB-2210 Foulard Shirt
Planned prebook for this style: 850 units @ $58 = $49,300
SMS arrives 3 weeks late (28 Feb instead of 7 Feb).
Market window is 8 weeks; the first 2 weeks carry the
largest appointments (key accounts book early because
their own open-to-buy is allocated early).
Missed: 4 key-account appointments (weeks 1-3)
= roughly 45% of this style's planned volume
Recovered by follow-up: about half of the missed volume
-> net loss ~22% of plan = 187 units = $10,846
Second-order damage:
- style falls below the 300-unit factory minimum for
two of its three colorways -> forced to cut the
minimum anyway (speculative units) or kill colors
- no photo sample -> style missing from the lookbook
-> reps cannot sell it even by follow-up
- if the SMS slips past order cutoff entirely, the
style is dead: zero revenue on roughly $1,400 of
sunk development cost
That is the arithmetic that justifies building sample tracking into your ERP rather than managing it on a whiteboard. A late sample deletes revenue outright. The buyer's open-to-buy for that delivery window — their fixed budget for merchandise arriving in that period, worked through in detail later in this chapter — gets spent on somebody else's product, so the money does not reappear next month.
And the damage compounds: less prebook means fewer units, fewer units means missing factory minimums, missing minimums means either speculative inventory or killed colorways. One missed courier deadline in February can knock a style out of the line.
There is a second, duller sample problem worth naming. Selling samples are physical objects that travel — to reps, to trade shows, to key accounts for their own internal review, back to the showroom, then eventually to the sample sale. Brands routinely cannot say where any given piece is, and a sample sitting in a rep's car in Denver is a sample your Chicago rep cannot show.
Sample check-in and check-out, with a named holder and a due-back date, is the least glamorous merchandising feature in any ERP and one of the highest-return.
Assortment planning by channel and account
Assortment planning is the step after line planning: given the line, decide which options go to which customers, in what depth. Not every account gets every style. Where line planning works in dollar budgets at category level, assortment planning works in specific products, specific attributes and specific quantities per customer.
For a wholesale brand there are three nested layers of segmentation.
Layer 1: channel
| Channel | What it wants | Assortment implication |
|---|---|---|
| DTC (your own site/stores) | The full story — everything, including the statement pieces | 100% of the line; extended sizes; you own all the size risk |
| Specialty / boutique | Differentiation from the chains; open sizing; small quantities | Curated subset, often 40–60% of options; open stock; low minimums |
| Majors / department stores | Depth, reliable delivery, EDI compliance, prepacks | Narrow, deep subset of proven bodies; prepack ratios; door-level allocation |
| Off-price | Value; will take broken runs and past-season goods. These are the discount chains that buy leftover branded stock cheaply | Never the current line. Excess only, or a purpose-made value program |
| International / distributor | Locally relevant sizes and colors, different seasonality | Different size curve, sometimes different size scale entirely (EU/UK/JP) |
The single most common assortment mistake a young brand makes is showing the same 174 options to all five of those channels. The boutique buyer feels the line is generic; the department-store buyer feels it lacks depth; and the brand ends up with a line that satisfies neither.
Layer 2: account tiering and door counts
Retail planners cluster stores instead of treating each one individually. The standard approach uses four or five groupings by volume — an "A" cluster of flagship, highest-selling stores down through a "D" cluster of low-volume locations.
The more sophisticated version clusters at the product class level rather than the store level, because the same store can be an A door for outerwear and a C door for accessories. A Brooklyn location might sell outerwear like a flagship and accessories like a bottom-tier store.
For a wholesale brand the same logic applies to accounts. You have no stores of your own to cluster, so what you plan instead is which of your options you offer, and at what depth, to accounts of different sizes.
Fall 2026 account tiering (174 options in the final line)
All figures at wholesale value, so DTC is shown at its
wholesale equivalent and the table ties to the line plan.
Tier Accounts Doors Options Depth/ Season $ % of
offered option each total
---- -------- ----- -------- -------- --------- -----
A 4 62 174 high $180,000 30%
B 11 44 120 medium $ 52,000 24%
C 38 41 72 low $ 12,600 20%
D 94 94 40 minimum $ 3,375 13%
DTC 1 2 174 n/a $312,000 13%
---- -------- ----- -------- -------- --------- -----
TOTAL 148 243 $2,400,050 100%
(ties to the line plan's $2,399,850 within rounding)
Reading the A row: 4 accounts x $180,000 = $720,000 = 30%
of the season. Those four accounts see the whole line
and get first pick of exclusives.
Reading the D row: 94 accounts x $3,375 = $317,250 = 13%.
These are single-door boutiques writing $3,375 orders.
They see a 40-option "opening" assortment because
showing them 174 options wastes everyone's time and
produces one-unit-per-SKU orders that cannot be picked
profitably.
CONCENTRATION CHECK
Top 4 accounts = 30% of revenue
Top 15 accounts = 54% of revenue
Largest single acct = 11% of revenue
-> Acceptable. Above roughly 20% from one account,
that account effectively controls your line plan.
The tier table is doing two jobs. First, it allocates attention: 174 options for the four accounts that produce 30% of revenue, 40 options for the 94 accounts that produce 13%.
Second, it exposes concentration risk. The bottom block is a number every wholesale brand should compute every season, because once one account passes roughly a fifth of your revenue, their buyer is effectively your head of merchandising — they will ask for exclusives, they will ask for markdown money, and if they change buyers you can lose a large slice of your business in one appointment.
Layer 3: exclusives, drops and segmentation
Accounts that compete with each other in the same city will ask you to make sure they are not selling the identical assortment. The tools are:
- Exclusives. One account is the only one who gets a specific style, colorway or capsule — a capsule being a small themed group of styles sold together. Small brands should grant colorway exclusives (cheap, reversible) far more readily than style exclusives (expensive, locks up a pattern).
- Confined colorways. The same style in a color only that account carries. This is the workhorse: it satisfies the differentiation demand at the cost of one dye lot.
- Territory / radius protection. No other account within N miles. Common with specialty retail; needs to be written into the terms and enforced by your order-entry system, not by memory.
- Drops. Instead of one seasonal delivery, the line is broken into several timed releases through the season. Drops raise full-price sell-through and create urgency, but multiply the number of delivery windows your system has to track and make ATS considerably harder to explain.
- Channel-restricted styles. Options flagged DTC-only or wholesale-only. Every brand eventually needs this and every brand builds it late, after a rep sells a DTC-exclusive style to an account.
Exclusivity must be enforced in software at order entry, or it will be violated. The failure mode is banal: a rep writes an order at a trade show for a style that is confined to another account, the order flows through, the goods ship, and the exclusive account finds out from an Instagram post. Model it as a rule — style_channel_restriction and exclusive_assignment rows with account, scope, start and end dates, and block the order line, do not warn.
Forecasting and demand planning for a small brand
Forecasting in apparel is genuinely hard for structural reasons: product lifecycles are short, most of the line is new every season so there is no history for the specific item, and the forecast is needed at SKU level where the numbers are smallest and noisiest.
Ignore any accuracy percentage a planning vendor quotes you — those figures are marketing, they are measured at portfolio level, and they say nothing about your business. The shape of the problem is what to hold on to: whatever accuracy you achieve across a whole category, accuracy for one SKU in one door is far worse and always will be. Plan for error, do not plan to eliminate it.
There are three honest methods available to a small brand, and you use all three.
1. History-based forecasting
For carryover and core styles, this actually works. You have the same product, the same customers and multiple seasons of data. The method is: take last year's sales for the same style in the same season, correct for stockouts (as in the size-curve example above), adjust for changes in distribution (did you add or lose doors?), and apply a growth factor from the top-down plan.
History-based forecast, NB-1050 Everyday Tee (core)
FA25 actual units 6,420
Stockout correction (M and L sold out wk 13) + 640
Adjusted FA25 demand 7,060
Distribution change:
FA25 doors carrying this style 168
FA26 doors committed 196 +16.7%
Adjusted for distribution 8,237
Price change: WS $28 -> $32 (+14.3%)
Assumed price elasticity -0.4, meaning a 1%
price rise costs 0.4% of unit volume
-> -5.7% units 7,766
Top-down category growth applied to core +3%
FORECAST FA26 7,999
(call it 8,000)
Confidence: HIGH. Same product, same customers,
4 seasons of history. Plan the buy at 8,000 with
a 15% reorder overage skewed to M/L.
Each line in that calculation is a separate, defensible adjustment instead of one gut number, which is what makes it reviewable. Someone can disagree with the elasticity assumption without discarding the whole forecast. Price elasticity is how much volume moves when price moves; −0.4 means a 1% price rise costs you 0.4% of units. The value here is a guess, and a documented guess is far better than an undocumented one. After two seasons of doing this you will have your own elasticity estimates.
2. Judgment-based forecasting
For new fashion styles you have no history, so you use analogues: "this is like NB-2140 from last fall, which did 620 units, but it is $10 more expensive and in a harder color, so call it 400." This is a legitimate technique with a real track record. It is improved by three disciplines:
- Force the analogue to be named explicitly.
- Force the adjustment to be a stated multiplier with a reason.
- Record the forecast so you can score yourself later.
Almost nobody scores their forecasts, which is why almost nobody's judgment improves.
3. Prebook is the forecast
This is the most important idea in this section and the one that makes wholesale structurally easier than DTC.
In wholesale, you do not have to forecast demand — customers tell you. The prebook order book is the forecast, and it is a forecast backed by a written commitment. Your job is to sell in, close the order book, and cut bulk against confirmed demand plus a controlled overage.
This is why the order cutoff date is sacred and why "prebook coverage", the percentage of your bulk buy already covered by written orders, is the number a wholesale brand should watch above almost any other.
Buy plan for one option, NB-4102/001 Harbor Crew Black
Prebook booked at cutoff 4,200 units
Expected cancellations/chargebacks (-4%) -168
Net prebook 4,032
Reorder allowance:
prior-season reorders ran 22% of prebook
on core knits; this is core -> 22% 924
skewed to M/L (see reorder curve)
DTC allocation (own site, 18 wks) 480
Sample/marketing/replacement 40
BUY 5,476
Round to factory pack multiples (12s) 5,472
PREBOOK COVERAGE = 4,032 / 5,472 = 73.7%
SPECULATIVE UNITS = 1,440 (26.3%)
SPECULATIVE $ AT COST = 1,440 x $13.44 = $19,354
("speculative" = units you are making on your own
judgement, with no order behind them)
Rule of thumb by line type:
Carryover / core coverage 60-75% acceptable
Seasonal / fashion coverage 90%+ required
Novelty coverage 100% (build to order)
The buy plan is where merchandising becomes a cash decision. Every unit above net prebook is speculation — you are betting your own money that someone will want it later.
The coverage percentage tells you how big the bet is, and the last block is the rule that keeps brands solvent: you may speculate on core products, because if they do not sell this season they will sell next season at full price. You may not speculate on fashion, because an unsold fashion unit is worth a fraction of its face value six months later — the closeout example earlier recovered about $8 on a $32 wholesale item.
Brands die by cutting fashion styles at 60% coverage.
Open-to-buy from the retailer's side, and why your ATS must line up
Open-to-buy (OTB) is the retailer's budget for how much new merchandise they may receive in a given period. It is the constraint on the other side of every conversation you have with a buyer. Retalon states the core version as "The open to buy formula = (Planned Ending Inventory + Planned Sales) – (Beginning Inventory + On Order Inventory)" and says explicitly that this version excludes the impact of price reductions. Retailers who plan markdowns separately add them to the requirement side, which is the version worked below.
OTB (at retail) =
(planned ending inventory + planned sales + planned
markdowns) - (beginning inventory + merchandise on
order)
WORKED -- Harbor Goods, 6 doors, Men's Wovens, Aug-Dec 2026
Planned sales Aug-Dec (retail) $180,000
Planned markdowns $22,000
Planned ending inventory 31 Dec (retail) $95,000
--------
Total requirement $297,000
Beginning inventory 1 Aug (retail) $110,000
Already on order (retail value) $40,000
--------
Already committed $150,000
OPEN TO BUY (retail) $147,000
That $147,000 is priced at RETAIL. To turn it into
purchase orders you convert to cost. If the retailer
marks goods up so that 54% of the retail price is
margin ("54% initial markup"), then cost is the other
46% -- the "cost complement".
OPEN TO BUY (cost) = $147,000 x 0.46 = $67,620
Our brand is ~18% of their wovens business
-> our slice $67,620 x 0.18 = $12,172
-> at our $58 WS 210 units
Ask which version of the formula a given buyer uses
before arguing about a number.
Three consequences follow from that calculation and they are the whole reason a wholesale brand should understand OTB.
First, the buyer's budget is fixed before you walk in the room, so "sell more" mostly means "take share from another vendor," not "expand the buyer's spend." Second, OTB is allocated by period — that $147,000 is for goods received August through December, and a shipment that arrives in January hits a different budget. Third, and most importantly for your software:
ATS must be expressed as "available on date X," never just "available." A buyer with October open-to-buy cannot use inventory that lands in November — the order will be canceled, not delayed. Your available-to-sell calculation (Chapter 8) has to be keyed to delivery windows, and your order entry has to validate the requested start-ship and cancel dates against the projected availability of every line.
Line review, adoption rates and killing styles
A line review is the meeting where styles die. It is held two or three times a season, and its purpose is to reduce a large pile of ideas into a line that fits the plan. Everyone is present: design, merchandising, production, sales, and usually the founder.
The metric is the adoption rate — the share of designs presented that get selected to move forward. There is no correct number, and the trade-off is easy to state: a small brand with a tight sampling budget should adopt a high share of what it develops, because every rejected prototype is money it cannot get back, which means it must do the killing earlier, on paper.
A brand with a large development budget can afford to over-develop and cut hard, because cutting hard from a bigger pool produces a stronger line. Pick the strategy your bank balance supports, then measure the rate so you know which one you are actually running.
Fall 2026 line funnel
STAGE STYLES SURVIVAL CUM.
-------------------------------- ------ -------- ----
Concepts sketched 212 -- 100%
Prototyped (round 1) 138 65% 65%
Survive LINE REVIEW 1 96 70% 45%
Survive costing gate 92 96% 43%
ADOPTED at LINE REVIEW 2 90 98% 42%
Booked >= 1 unit in market 84 93% 40%
Survive post-market cut 75 89% 35%
Overall survival, concept -> shipped: 35%
Where cuts happen and what each one has already cost
THIS BRAND by the time you make it (cumulative per
style; price your own):
Sketch stage $0 -- free, do more here
Proto stage ~$250 -- cheap
Fit stage ~$600 -- moderate
SMS stage ~$1,400 -- expensive
Post-market $1,400 + committed fabric
+ lost showroom time
SPEND ON STYLES THAT NEVER SHIPPED
Cut at proto (138-96) = 42 x $250 = $10,500
Cut at fit/cost ( 96-90) = 6 x $600 = $3,600
Cut in market ( 90-84) = 6 x $1,400 = $8,400
Cut post-market ( 84-75) = 9 x $1,400 = $12,600
-----------
Total sunk on the 63 prototyped styles
that never shipped $35,100
= 1.5% of season revenue, before any
committed fabric on the post-market cuts.
The bottom two blocks are the operating lesson. Cutting at sketch stage is free; cutting after selling samples costs real money and, worse, costs showroom minutes you cannot get back.
Compare the last two lines: nine styles cut after market burned $12,600, while forty-two styles cut at proto burned only $10,500. A fifth as many styles, a fifth more money. So the biggest single merchandising improvement available to a small brand is to move rejection earlier: do more concept work on paper, present more digitally, and cut harder at line review 1 rather than letting marginal styles drift through to proto.
The post-market cut
The post-market cut is the hardest conversation of the season and the one your software should support directly. After the order book closes, some styles have not booked enough to reach the factory minimum. The choices are:
- Kill the style and cancel the orders that did come in (damages accounts and rep credibility).
- Cut the minimum anyway and carry the excess (ties up cash).
- Combine colorways to reach the fabric minimum (works when the shortfall is per-color, not per-style).
- Negotiate the minimum with the factory (works occasionally, at a per-unit surcharge).
Post-market cut decision, Fall 2026
(factory minimum 300 units per style/color)
Style Color Booked Fac.min Gap Decision
------- ------ ------ ------- ---- ------------------
NB-2210 001 412 300 OK CUT AS PLANNED
NB-2210 420 188 300 -112 CUT 300 ANYWAY,
112 spec units
(core color, ok)
NB-2210 733 64 300 -236 KILL COLORWAY,
offer 001 instead
NB-3320 001 290 300 -10 CUT 300 (10 spec)
NB-3320 515 77 300 -223 KILL COLORWAY
NB-5590 all 118 300 -182 KILL STYLE.
6 accounts booked
it -> substitute
NB-5580, notify
reps within 48h
RULE APPLIED
gap <= 15% of minimum -> cut anyway
core color, gap <= 40% -> cut anyway (it will
sell as a reorder)
fashion color, any gap -> kill
whole style below minimum -> kill, offer substitute
That decision table is exactly the kind of thing that should live in software instead of a spreadsheet someone rebuilds every season. It needs three inputs your ERP already has or should have — booked units by style-colorway, the factory minimum per style-colorway, and the line type (core versus fashion), and it produces a work list with a deadline.
Notice that the three NB-2210 colorways book 664 units in total against the 850 that were planned — a 186-unit shortfall, which is the loss the late selling sample caused earlier in this chapter.
The 48-hour notification requirement in the last row is the part people forget: killing a style triggers order amendments, customer emails and rep communications, and every one of those is a workflow.
Costing feedback loops
Merchandising sets a target price and a target margin before the product exists. Production comes back with what it actually costs. When those two numbers disagree, merchandising has to change something, and this loop runs two or three times per style per season.
Multipliers, keystone and realized margin
Standard apparel pricing works multiplicatively. The common structure quoted across the industry is cost × roughly 2.0–2.5 to reach wholesale, and wholesale × roughly 2.0–2.5 to reach retail, giving an overall 4× to 6× from production cost to consumer price depending on the segment. The word you will hear for the 2× version is keystone, which means doubling: take the cost and double it to get the next price. Multipliers run lower in mass and streetwear and higher in premium and accessories.
Those multipliers imply a wholesale gross margin of 50–60% before anything goes wrong, and the line plan above targets 55.8%. Realized margins land lower. The planning benchmarks published by Retail Plan put a healthy wholesale-channel gross margin at 38–48% as of 2026, with under 38% weak and above 48% strong; the site describes its figures as "directional planning references, not universal targets."
The gap between your 55% target and their 38–48% healthy band is the cost of doing business, and it has names: markdown money, chargebacks, returns, closeouts, freight you ate to hit a delivery date, and units you cut speculatively and never sold.
Plan at target margin; measure at realized margin; expect several points of difference and find out where they went.
Chargebacks are the quietest part of that leak, and compliance failures cause most of them rather than faulty product. Retail Plan lists a healthy wholesale fill rate — the share of ordered units you actually ship — at 95–98%, and notes that "Major accounts often enforce 97%+; chargebacks below."
Late shipments, wrong labels, wrong carton counts and short-ships all get deducted from your invoice automatically. Record every chargeback against the order and the account that issued it, so you can see which customer relationship is quietly unprofitable instead of discovering it two years later.
Here is what the costing loop actually looks like.
COST SHEET v1 -- NB-2210 Foulard Shirt
Target WS $58, target category GM 54%
=> maximum allowable landed cost = 58 x (1 - 0.54) = $26.68
FOB FACTORY QUOTE
(FOB = "free on board": the factory's price for the
goods loaded at their port, before shipping, duty,
insurance or anything else on your side)
Fabric 2.10 yd @ $6.20 $13.02
Trims (buttons, labels, interlining) $1.85
Cut, make, trim (CMT = the factory's
labor charge to actually sew it) $6.40
Factory overhead + margin $1.13
--------
FOB $22.40
LANDING THE GOODS
(landed cost = what the unit costs sitting in YOUR
warehouse, with every step of getting it there added)
Ocean freight, per unit $0.85
Duty (see note) 30% x 22.40 $6.72
Broker / clearance $0.15
Inbound drayage to 3PL $0.30
(drayage = the short truck move from the port
to the warehouse; a 3PL is a third-party
logistics provider -- an outside warehouse
that stores and ships your goods for you)
--------
LANDED COST $30.42
RESULT
GM at $58 WS = (58 - 30.42) / 58 = 47.6%
TARGET 54.0%
MISS -6.4 pts
Cost overage $3.74/unit
On 850 planned units $3,179 of margin
NOTE ON DUTY: 30% is a working placeholder chosen in
mid-2026, NOT a rate to apply to your own goods. Real
apparel duty depends on the HTS code (Harmonized Tariff
Schedule -- the number that tells customs exactly what
a garment is), plus fiber content and country of
origin. Look yours up every season and store the rate
as data on the cost sheet, never buried in a formula.
Read the structure first: the target is set by working backwards from price and margin, giving a maximum allowable cost of $26.68. Then the actual cost is built up from the factory's FOB quote plus everything it takes to get the goods into your warehouse. The gap is $3.74 per unit, which sounds small and is $3,179 of gross margin on one style.
Note where the biggest single non-fabric line sits: duty, at $6.72, is larger than the factory's entire sewing charge.
Duty is now a first-order cost line
Duty is that large because rates on US apparel imports moved sharply through 2025. Analysis by Sheng Lu at the University of Delaware, built on OTEXA and USITC trade data and updated in March 2026, states that "The average tariff rate for U.S. apparel imports (HS Chapters 61 and 62) reached 35.1% in December 2025, hitting a new high in decades," against 14.7% in January 2025.
The same piece also cites 31.5% for December 2025 measured against a December 2024 baseline, which tells you how much care these averages need. It further notes that since February 2026, apparel from many Asian suppliers has been subject to Section 122 tariffs, an emergency US trade measure, while qualifying CAFTA-DR and USMCA goods remain exempt.
Two practical consequences follow. Treat any duty figure, including that one, as a snapshot with a date attached, and re-check your own HTS lines before every costing round. And make duty a first-class field on the cost sheet so that when a rate changes you can re-cost the whole line in one query instead of reopening forty spreadsheets.
Four levers when cost misses target
Merchandising now has four levers, in rough order of preference.
COST ENGINEERING -- NB-2210 v2
LEVER 1: RAISE PRICE
$58 -> $66 WS, MSRP $128 -> $145
Problem: the BETTER rung of the woven ladder tops out
at $128; $145 collides with the BEST rung at $195 but
without selvedge fabric to justify it. REJECTED.
LEVER 2: CHANGE THE PRODUCT (cost engineering)
Re-mark the pattern: 2.10 yd -> 1.90 yd -$1.24
Substitute fabric $6.20 -> $5.60 /yd -$1.14
(combined fabric: 1.90 x 5.60 = $10.64
vs 2.10 x 6.20 = $13.02) total fabric -$2.38
Remove chest pocket + single-needle the yoke
-> CMT $6.40 -> $5.50 -$0.90
Horn-look button -> matte poly -$0.35
-------
New FOB 22.40 - 3.63 = $18.77
Duty 30% $5.63
Freight + broker + drayage $1.30
NEW LANDED COST $25.70
GM at $58 = (58 - 25.70) / 58 = 55.7%
TARGET 54.0% PASS
LEVER 3: VOLUME / CONSOLIDATION
Combine this fabric with NB-2240 to clear a higher
price break: -$0.30/yd. Only works if BOTH styles
are adopted -- creates a dependency between two
style decisions.
LEVER 4: KILL IT
If the product cannot be re-engineered without
becoming a different product, kill it and reallocate
its 850 units to a style that clears target.
Lever 2 is the one that gets used, and it is the reason merchandising and design fight. "Re-marking the pattern" means re-laying the pattern pieces on the fabric to waste less of it. "Single-needle" is a cheaper seam finish than the twin-needle version.
Every change on that list makes the garment slightly worse: less fabric means a slimmer cut, a cheaper fabric means a different feel in the hand, no chest pocket means one less detail, and a plastic button means it looks less expensive on the rack. The merchandiser's job is to find the changes the customer will not notice and refuse the ones they will.
This loop has to close before line review 2. Once the style is adopted, samples are cut and a cost problem becomes a margin problem you carry all season.
One habit makes this whole loop measurable: version your cost sheets and never overwrite them. At the end of the season you want to answer "what did we think this cost when we adopted it, and what did it actually cost when we cut bulk?" Run that comparison across the whole line and you learn systematically whether your costing is optimistic and by how much, which is worth more than any individual cost negotiation.
What this means for your ERP
Everything above turns into schema, rules, screens and reports. This section is the translation.
The tables you cannot avoid
-- Order matters: parents before children, so this script
-- runs top to bottom on an empty database.
create table department (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
code text not null, -- 'MENS'
name text not null,
unique (tenant_id, code)
);
create table product_class (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
department_id uuid not null references department(id),
code text not null, -- 'TOPS'
name text not null,
unique (tenant_id, department_id, code)
);
create table category (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
product_class_id uuid not null references product_class(id),
code text not null, -- 'WOVEN_SHIRT'
name text not null,
unique (tenant_id, product_class_id, code)
);
create table season (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
code text not null, -- 'FA26'
name text not null, -- 'Fall 2026'
ship_start date not null, -- earliest ship
ship_end date not null, -- cancel date
unique (tenant_id, code)
);
create table size_scale (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
code text not null, -- 'ALPHA_6'
name text not null,
unique (tenant_id, code)
);
create table size_scale_size (
id uuid primary key default gen_random_uuid(),
size_scale_id uuid not null references size_scale(id),
position int not null, -- ordering matters
size_code text not null, -- 'M'
std_size_code text, -- GS1/NRF code
unique (size_scale_id, position),
unique (size_scale_id, size_code)
);
create type line_type as enum
('carryover','core','seasonal','novelty');
create type price_tier as enum ('good','better','best');
create type style_stage as enum
('concept','proto','fit','adopted','in_line',
'dropped','discontinued');
create table style (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
style_number text not null, -- 'NB-2210'
name text not null,
category_id uuid not null references category(id),
season_id uuid not null references season(id),
size_scale_id uuid not null references size_scale(id),
line_type line_type not null,
price_tier price_tier not null,
stage style_stage not null default 'concept',
target_wholesale numeric(12,2) not null,
target_msrp numeric(12,2) not null,
target_gm_pct numeric(5,4) not null, -- 0.5400
prior_season_style_id uuid references style(id), -- carryover
channel_restriction text, -- null | 'DTC'
-- | 'WHOLESALE'
unique (tenant_id, style_number, season_id)
);
create table colorway (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
style_id uuid not null references style(id),
color_code text not null, -- '001'
color_name text not null, -- 'Black'
std_color_code text, -- GS1/NRF family
pantone_tcx text, -- '19-0303 TCX'
color_role text not null, -- core | seasonal
-- | fashion
stage style_stage not null default 'concept',
adopted_at timestamptz,
killed_at timestamptz,
unique (tenant_id, style_id, color_code)
);
-- The SKU. One row per style x colorway x size. Forever.
create table sku (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
style_id uuid not null references style(id),
colorway_id uuid not null references colorway(id),
size_scale_size_id uuid not null
references size_scale_size(id),
sku_code text not null, -- 'NB-2210-001-M'
gtin text, -- 14-digit, zero-padded
status text not null default 'active',
unique (tenant_id, style_id, colorway_id,
size_scale_size_id),
unique (tenant_id, sku_code),
unique (gtin)
);
Several things in that schema are deliberate and worth stating plainly:
- Every table carries a
tenant_id, the column that says which customer's data a row belongs to; Chapter 5 explains why. - An
enumis a database type whose value must be one of a fixed list of words, so the database itself refuses a typo like'carry over'. - The three-level hierarchy uses foreign keys, a foreign key is a column that must point at a real row in another table, so that every report can roll up without string matching.
stylecarries the season, meaning a carryover style gets a new row each season linked back throughprior_season_style_id; this is what makes newness percentage computable, and it is what lets you change price or target margin next season without rewriting history.colorwaycarries its own stage and its own kill timestamp, because colors are killed independently of styles and constantly.- The unique constraint on
skuacross style, colorway and size is the one that prevents the duplicate-SKU disaster; the global unique ongtinenforces the GS1 rule that no two sellable variants share a barcode (nulls are allowed and do not collide, so unassigned SKUs are fine). - And
statuson SKU is a soft state, never a delete: your append-only inventory ledger from Chapter 1 referencessku_idforever, so a deleted SKU is a corrupted ledger.
Size curves and packs
-- A curve is scoped. There is no global size curve.
create table size_curve (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
name text not null,
size_scale_id uuid not null references size_scale(id),
scope_type text not null, -- 'category' | 'style'
-- | 'account' | 'channel'
scope_id uuid, -- null = default for scale
demand_type text not null, -- 'prebook' | 'reorder'
-- | 'dtc'
derived_from text, -- 'history' | 'manual'
derived_at timestamptz,
unique nulls not distinct
(tenant_id, size_scale_id, scope_type,
scope_id, demand_type)
);
create table size_curve_point (
size_curve_id uuid not null references size_curve(id)
on delete cascade,
size_scale_size_id uuid not null
references size_scale_size(id),
share_bp int not null, -- basis points: 1 bp =
-- 0.01%, so 2800 = 28%
primary key (size_curve_id, size_scale_size_id),
check (share_bp >= 0 and share_bp <= 10000)
);
-- Enforce that a curve sums to exactly 100%.
create or replace function assert_curve_sums()
returns trigger language plpgsql as $$
declare
curve_id uuid;
total int;
begin
-- OLD is null on insert; NEW is null on delete. Pick
-- the one that exists rather than reading both.
if tg_op = 'DELETE' then
curve_id := old.size_curve_id;
else
curve_id := new.size_curve_id;
end if;
-- If the parent curve itself was deleted, its points
-- went with it and there is nothing left to check.
if not exists (select 1 from size_curve
where id = curve_id) then
return null;
end if;
select coalesce(sum(share_bp), 0) into total
from size_curve_point
where size_curve_id = curve_id;
if total <> 10000 then
raise exception
'size curve % sums to % bp, must be 10000',
curve_id, total;
end if;
return null;
end $$;
create constraint trigger size_curve_sums
after insert or update or delete on size_curve_point
deferrable initially deferred
for each row execute function assert_curve_sums();
-- A pack is a sellable thing made of other sellable things.
create table pack (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
pack_code text not null, -- 'NB-4102-001-PP12'
style_id uuid not null references style(id),
colorway_id uuid references colorway(id), -- null = mixed
pack_gtin text, -- packs need their OWN GTIN
total_units int not null,
unique (tenant_id, pack_code),
unique (pack_gtin)
);
create table pack_component (
pack_id uuid not null references pack(id) on delete cascade,
sku_id uuid not null references sku(id),
qty int not null check (qty > 0),
primary key (pack_id, sku_id)
);
The two ideas here are scoping and explosion. A size curve is scoped to a category, style, account or channel and to a demand type, because prebook and reorder demand genuinely have different curves and conflating them is what produces the broken-run problem worked above.
Shares are stored in basis points — hundredths of a percent, so 28% is 2800 — as whole numbers rather than decimals, because whole numbers add up to exactly 10,000 every time and the constraint trigger can prove it. A curve stored as decimals will drift by a fraction of a percent and you will spend an afternoon debugging a buy that is three units off.
The trigger function is worth reading line by line, because two details in it are easy to get wrong. In a PostgreSQL trigger, new holds the row after the change and old holds it before, and PostgreSQL sets new to null on a delete and old to null on an insert. So the function checks tg_op — the operation that fired it, and reads whichever one exists.
It then checks that the parent curve still exists: when you delete a whole size_curve, the on delete cascade removes its points too, and without that guard the trigger would complain that the now-empty curve sums to 0 and make the curve impossible to delete.
Finally, the trigger is declared deferrable initially deferred, which means the check runs once when the transaction commits rather than after each row, so you can rewrite a whole curve inside one transaction without it failing halfway through.
Packs must explode before the ledger
Packs are the harder concept. A pack has its own GTIN because it is scanned as a unit at the retailer's dock, but it is not itself an inventory item. The rule your ERP must enforce absolutely: packs explode into component SKUs before anything touches the inventory ledger.
An order line may reference a pack; a ledger row may never. Otherwise your ATS is wrong in a way that is nearly impossible to unwind, because you have inventory that exists in two units of measure at once.
This connects directly to Chapter 1's append-only ledger design and Chapter 3's idempotency rules — idempotent means running the same operation twice leaves the same result as running it once, and pack explosion has to behave that way, because a retried request must not double-count.
Line plan, samples and costing
create table line_plan (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
season_id uuid not null references season(id),
version int not null, -- never overwrite
status text not null, -- draft|active|closed
created_at timestamptz not null default now(),
unique (tenant_id, season_id, version)
);
create table line_plan_row (
id uuid primary key default gen_random_uuid(),
line_plan_id uuid not null references line_plan(id),
category_id uuid not null references category(id),
planned_styles int not null,
planned_options int not null, -- the OPTION BUDGET
planned_carryover int not null,
planned_units int not null,
avg_wholesale numeric(12,2) not null,
avg_msrp numeric(12,2) not null,
target_gm_pct numeric(5,4) not null,
planned_wholesale numeric(14,2)
generated always as
(planned_units * avg_wholesale) stored,
unique (line_plan_id, category_id)
);
create type sample_kind as enum
('proto','fit','size_set','sms','photo','pp','top');
create table sample (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
style_id uuid not null references style(id),
colorway_id uuid references colorway(id),
kind sample_kind not null,
round int not null default 1,
requested_at date not null,
due_at date not null, -- the gate date
received_at date,
approved_at date,
rejected_at date,
holder_type text, -- 'rep'|'account'|'studio'
holder_id uuid,
checked_out_at date,
due_back_at date
);
create table cost_sheet (
id uuid primary key default gen_random_uuid(),
tenant_id uuid not null,
style_id uuid not null references style(id),
colorway_id uuid references colorway(id), -- COLOR LEVEL
version int not null,
effective_from date not null,
fob numeric(12,4) not null,
freight_unit numeric(12,4) not null default 0,
duty_pct numeric(6,4) not null default 0,
broker_unit numeric(12,4) not null default 0,
inbound_unit numeric(12,4) not null default 0,
landed_cost numeric(12,4)
generated always as (
fob + freight_unit + (fob * duty_pct)
+ broker_unit + inbound_unit
) stored,
unique nulls not distinct
(tenant_id, style_id, colorway_id, version)
);
The versioning is the point in all three of these. Line plans are versioned so you can answer "what did version 1 say before the sourcing review cut forty options?" Samples are versioned by round because fit rounds two and three are normal and you need the history to spot the factory that always needs four. Cost sheets are versioned and keyed to colorway, which is the single most commonly missed design decision in small-brand ERPs — the dye surcharge on your one difficult color will otherwise be invisible.
Two pieces of PostgreSQL syntax there deserve a note. nulls not distinct on a unique constraint arrived in PostgreSQL 15; the release notes describe it as allowing "unique constraints and indexes to treat NULL values as not distinct." Without it, a style-level cost sheet with a null colorway_id could be inserted twice, because by default the database treats two nulls as different values and so never sees a duplicate.
And a generated column is one the database computes for you from the other columns in the same row and stores; landed_cost being generated means margin is always computed from the same formula everywhere, rather than being re-derived slightly differently in three reports.
Rules the software must enforce
| Rule | Where it lives | Failure if you skip it |
|---|---|---|
| One GTIN per SKU, globally unique | unique (gtin) | Retailer receives wrong goods; chargebacks; EDI rejections |
| SKUs are never deleted, only deactivated | Status column + no delete grant | Orphaned rows in the append-only ledger (Ch 1) |
| Size curve points sum to exactly 100% | Deferred constraint trigger | Buys that silently under- or over-order |
| Packs explode to component SKUs before ledger writes | Service layer + ledger check constraint on sku_id | ATS wrong in two units of measure; unrecoverable |
| Option count per category cannot exceed the active line plan budget | Trigger or service check on colorway adoption | SKU proliferation with no gate |
| Style stage transitions follow the state machine | Check constraint / transition table | Fabric committed for styles nobody adopted |
| Exclusive and channel restrictions block order lines | Order-entry validation | Exclusivity breach; account loss |
| Requested delivery window must be satisfiable by projected ATS | Order-entry validation against Ch 8 ATS | Orders canceled at cancel date; OTB lost |
| Adopted colorway must have an approved cost sheet clearing target GM | Adoption workflow gate | Whole season ships below plan margin |
Screens and workflows people will actually use
- Line plan grid. Editable by category, with option budget, newness %, units, average price, revenue and margin, and a live reconciliation strip against top-down targets. Must show planned units per option next to factory and mill minimums, because that is the check nobody does.
- Line board. A visual grid of every style-colorway for a season with image, price tier, line type and stage — the digital version of the corkboard. Filterable by category and stage; this is the screen a line review is run from.
- Adoption workflow. Per style and per colorway: stage transitions with who, when and why. Killing a colorway must be a one-click action with a reason code, and it must cascade to its SKUs' status.
- Size curve editor. Enter as ratio or percentages, see both; a "derive from history" action that runs the stockout-corrected calculation shown earlier and shows its working.
- Pack builder. Choose a style-colorway and a curve, pick a pack size, see the rounded ratio and the resulting variance from the true curve in percentage points per size. Refuse to save a pack whose components span more than one style unless explicitly flagged as a mixed pack.
- Sample board. Rows are style-colorway, columns are sample kinds, cells are color-coded by due/received/approved. Plus a check-out register with holder and due-back date.
- Assortment builder. Per account or per tier, select the option subset offered and the depth model; produce a linesheet. Reps live in this screen at market.
- Buy plan. Per style-colorway: net prebook, reorder allowance, DTC allocation, samples, rounded buy, and the prebook coverage percentage against the line-type rule.
- Post-market cut worklist. Every style-colorway below its minimum with the recommended decision and a one-click action that fires order amendments.
Reports people will demand within the first year
- Line plan against actual booked — by category: planned options, units, dollars and margin against what the order book actually contains, refreshed daily during market.
- Newness and option count — by department, class and category, with prior-season comparison.
- Size curve variance — planned curve against realized sold-through curve, per style and per account, with the stockout correction applied. This is how next season's curve gets built.
- Broken size run alert — any style-colorway where fewer than N of its size run have ATS above a threshold. Should be a scheduled alert, not a report someone remembers to run.
- Color performance — sell-through and markdown rate grouped by color role (core / seasonal / fashion) and by standard color family, across seasons.
- Adoption funnel — concepts, protos, adopted, booked, shipped, with development cost attributed to the styles that never shipped.
- Costed margin against target — every adopted colorway, target GM against costed GM at the current cost sheet version, sorted by dollar variance.
- Prebook coverage — buy against net prebook by line type, flagging any fashion style below 90%.
- Realized margin bridge — planned gross margin down to actual, with a named line for markdown money, chargebacks, returns, closeouts and expedited freight. This is the report that explains the gap between your 55% plan and a 45% outcome.
- Account concentration — revenue share by account and by tier, with a threshold alert.
- Sample status by gate — everything due in the next 30 days that has not been received, ranked by the planned revenue at risk behind it.
How this connects to the engineering chapters
- Chapter 1 (append-only inventory ledger). Every ledger row is keyed to a
sku_id. That is why SKUs can never be deleted and why packs must explode before any ledger write. Size-level granularity in the ledger is non-negotiable — a ledger keyed to style would make every report in this chapter impossible. - Chapter 2 (Postgres). Enums for line type, price tier and sample kind; generated columns for landed cost and planned wholesale; deferred constraint triggers for curve sums; and materialized views — stored, pre-computed query results that you refresh on a schedule — for the hierarchy rollups that every report above depends on.
- Chapter 3 (concurrency and idempotency). Market week is the concurrency stress test: several reps writing orders against the same scarce SKUs at the same time, plus pack explosion that must happen exactly once. Allocating a limited buy across accounts is a classic contended-update problem.
- Chapter 4 (integrations). Style/colorway/size maps directly onto Shopify's product-and-variant model, and onto EDI catalog messages where trading partners expect GS1/NRF standard color and size codes. Pack GTINs appear on EDI purchase orders and shipping notices. Your color and size code fields exist mostly to serve this chapter.
- Chapter 5 (multi-tenancy and row-level security). Every table above carries
tenant_id. Row-level security is the database feature that filters rows by who is asking. Beyond tenancy, sales reps should see assortments and pricing only for their own accounts — the assortment and exclusivity tables are the natural place to hang those policies. - Chapter 6 (offline sync). Trade shows happen in convention-center basements with unusable wifi. Order writing against a line board and an assortment must work offline and reconcile later, which makes the option-budget and exclusivity checks a server-side re-validation problem as well as a client-side one.
- Chapter 7 (spreadsheet imports). Line plans, size curves, cost sheets and prebook orders all arrive as spreadsheets, in whatever shape the sender felt like. The importer needs to map free-text color names onto colorway records and free-text sizes onto size-scale positions, and to fail loudly rather than creating a duplicate colorway called "black " with a trailing space.
- Chapter 8 (ATS caching and reporting). ATS must be computed per SKU per delivery window, because open-to-buy is allocated by period. The broken-run alert and the size-curve variance report are both ATS-derived and both need to be fast.
- Chapter 9 (testing and ops). Size curve derivation, pack explosion, prepack rounding and margin calculation are pure functions with exact expected outputs. Test them with the worked examples in this chapter — a pack of 12 on a 1:2:3:3:2:1 ratio produces exactly 40/80/120/120/80/40 at 40 packs, and nothing else.
- Chapter 11 (reference schema). The tables sketched here are the merchandising slice of that schema; go there for the complete, reconciled version including the order and inventory tables they join to.
If you build only one thing from this chapter, build the style / colorway / size / SKU split with real foreign keys, a globally unique GTIN, and no deletes. Every other feature described above can be added a season later without much pain. That structure cannot: once two seasons of inventory history sit on top of a flat product table, moving to the split means rewriting the system, and the migration you skipped becomes a project you cannot schedule.
Field notes & further reading
- GS1 US — Color and Size Codes (formerly the NRF standard). The authoritative source for the thirteen standard color families and the seven size-code category types that retailers expect in product data feeds and EDI catalogs, purchasable as a downloadable file. Read this before you design your color and size fields.
- GS1 US — How to get a UPC barcode. States the rule that every product variation needs its own barcode, with the exact apparel example (3 sizes × 3 colors = 9 barcodes; add 3 styles and it is 27; add 3 packaging options and it is 81). Also the practical path to buying a company prefix.
- Retail Dogma — Size curve. How size-curve ratios are derived, including the standard bell-shaped starting ratios (1:2:2:1 for four sizes, 1:2:3:2:1 for five) to use before you have any history of your own. The same site has short, clear entries on merchandise hierarchy and assortment planning.
- Retalon — Open to Buy. The OTB formula with a worked dollar example, and an explicit statement that the simple version excludes the impact of price reductions. This is the constraint on the buyer's side of every conversation you have; understanding it changes how you plan delivery windows.
- Linesheet — The wholesale fashion calendar. Sell-in windows, delivery windows and the month-by-month reality of running three seasons at once: Fall/Winter linesheets drop in January with orders closing mid-March for June–August delivery, Spring/Summer drops in August closing mid-October for December–February delivery, plus Resort and Pre-Fall.
- Sheng Lu (University of Delaware) — Tariffs impact US apparel sourcing and trade. OTEXA- and USITC-derived analysis putting the average tariff rate on US apparel imports at 35.1% in December 2025 against 14.7% in January 2025, and covering the Section 122 tariffs applied from February 2026. Figures are as of the March 2026 update. Duty is now a first-order line on your cost sheet; this is where to track how it moves.
- Ninghow Apparel — MOQ vs MCQ: minimum color quantities. A manufacturer's explanation of why dye houses impose 500–1,000 meter minimums per color, why each color must meet its own MCQ because "Dye baths must stay separate for shade control," and what happens when you go below minimum. This is the arithmetic behind killing colorways.
- Retail Plan — Apparel planning benchmarks by channel. Directional healthy ranges split by DTC / wholesale / luxury / mid-market, as published in 2026. The wholesale column is the one to memorize: sell-through 60–80%, gross margin 38–48%, markdowns 12–22%, fill rate 95–98% with majors often enforcing 97%+. Useful for sanity-checking your own targets; the site itself calls these "directional planning references, not universal targets."
Two notes on sources. Every statistic in this chapter is either arithmetic you can re-derive from the worked examples or is attributed above; where a widely-repeated industry figure could not be traced to a primary source, it has been left out instead of dressed up.
And be skeptical of planning-software vendors quoting SKU-reduction or forecast-accuracy percentages in case studies — they are marketing artifacts, measured on somebody else's business, and your own four-season option-count chart is worth more than all of them.
1. Build your own line plan and run the sourcing check. Take your next season. In a spreadsheet, list every category you will offer. For each, fill in: planned styles, planned options, how many of those options are carryover, target units, target average wholesale price, target MSRP and target gross margin percent. Get the average wholesale price from your actual price ladder weighted by units, rather than from the middle rung. In this chapter's example that single error would have inflated planned Woven Shirts revenue by about $39,000, 7% of that category's plan, on revenue that could never book. Compute planned wholesale dollars per category and the blended margin, and check both against your top-down revenue and margin targets. Then do the check almost nobody does: divide planned units by planned options for each category and compare it to your factory's minimum cut quantity per style-colorway and your mill's minimum dye quantity converted to units. Every category that comes out below either minimum must lose options until it clears.
2. Derive one real size curve and price the cost of getting it wrong. Pull last season's unit sales by size for one high-volume style, plus the date each size went out of stock. Compute the naive curve from raw units, then compute the stockout-corrected curve by converting to a weekly rate and re-projecting across the full season length. Write both as percentages and as a 12-unit ratio. Then run the three-scenario comparison from this chapter on your own numbers: what would a flat pack, a curve-shaped prepack, and true open sizing each have produced in full-price sales, residual units and gross margin on the same inventory dollars?
When you are done you should have two artifacts: a line plan whose option counts survive your actual factory and mill minimums, and a documented size curve for at least one category with a dollar figure attached to the cost of the pack ratio you are currently using. Those two documents are the input to every schema decision in the ERP section above, and the second one usually pays for the exercise several times over.