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 chapter12 sections · about 80 min
  1. What you need to know first
  2. The product hierarchy in practice
  3. Line architecture: carryover, core and seasonal
  4. The line plan
  5. Size curves, ratios and packs
  6. Colorways and the color adoption problem
  7. The development and sampling calendar
  8. Assortment planning by channel and account
  9. Forecasting and demand planning for a small brand
  10. Line review, adoption rates and killing styles
  11. Costing feedback loops
  12. 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.

Core principle

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.

LevelWhat it answersExampleTypical count
DepartmentWho is the customer?Men's, Women's, Kids, Accessories2–5
ClassWhat part of the body / what job?Tops, Bottoms, Outerwear, Knitwear4–10 per dept
CategoryWhat kind of thing exactly?Woven Shirts, Tees, Sweatshirts, Chinos2–8 per class
StyleWhich design?NB-2210 Foulard Shirt60–300 per season
ColorwayWhich color/print of that design?001 Black, 420 Indigo1–8 per style
SizeWhich body measurement?XS S M L XL XXL1–12 per option
SKUWhich exact sellable unit?NB-2210-001-MStyle × 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.

Practical tip

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.

TypeDefinitionJob in the lineHow it is planned
CarryoverThe identical style and colorway offered again next season, unchangedFree revenue. Pattern, samples, photography and grading are already paid forForecast from its own sales history; reorder against a replenishment model
CoreA permanent style in permanent colors, refreshed but never dropped — the white tee, the five-pocket, the field jacketAnchors the brand identity and the price ladder; the thing a buyer restocks all yearPlanned as continuity: rolling forecast, safety stock, at-once availability
Seasonal / fashionStyles designed for one season only — this year's print, this year's silhouetteNewness. Gets the buyer into the showroom and gets the brand photographedPlanned to prebook only; built to order, with little or no speculative buy
Novelty / statementA handful of extreme pieces with no volume expectationEditorial and social content; sets the story for the commercial stylesTiny 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.

CategoryStylesOptionsCarry­overNewNew­nessAvg WSAvg MSRPUnitsWholesale $% of lineTarget GM%
Knits2662283455%$32$7022,500$720,00030.0%58%
Woven Shirts2044182659%$54$1209,775$527,85022.0%54%
Outerwear102281464%$125$2753,840$480,00020.0%52%
Bottoms1638182053%$72$1586,000$432,00018.0%55%
Accessories1848202858%$30$668,000$240,00010.0%62%
TOTAL902149212257%$47.89$10550,115$2,399,850100%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.

GateRoughly whenQuestion askedWhat can still change
Plan openT−11 monthsWhat are the financial targets and option budget?Everything
Concept reviewT−10 monthsDo the concepts cover the plan's categories and price tiers?Styles, categories, price tiers
Line review 1 (proto)T−8 monthsWhich prototypes are worth fitting? Costing v1 against target marginStyles killed, costs engineered
Line review 2 (adoption)T−6 monthsWhat is actually in the line? Final option count and colorsColorways, price, option count
Sales meetingT−5 monthsCan the reps sell this? Any gaps by account type?Rarely styles; usually only pricing and delivery
Post-market reviewT−3 monthsWhat 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.

Core principle

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.

ModelWhat it meansWho it suitsRisk it creates
Open sizing (open stock)The buyer orders any quantity of any size independently: 12 M, 9 L, 3 XSSpecialty boutiques, brands with strong ATS, at-once businessAll the size risk sits with the brand: you cut bulk on a curve and get ordered off a different one
Prepack / assortment / ratio packSizes 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 doorsSize risk moves to the retailer, who is stuck with whatever the ratio over-delivered
Solid packA carton contains one style, one color, one size — e.g. 24 pieces of MediumWarehouse efficiency, replenishment, retailers who allocate centrally by sizeRequires 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.

Watch out

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.

Core principle

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 roleTypical share of unitsExamplesBehavior
Core neutrals50–70%Black, Navy, White, Gray, OatmealPredictable, reorderable, carry over, rarely marked down
Seasonal supporting20–35%Olive, Burgundy, Rust, SlateSell through in season, do not carry over well
Fashion / statement5–15%This season's brights, prints, novelty washesHigh 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.

SampleWhat it isMade inWho needs itDecision it enables
Proto (prototype, 1st sample)First physical version — does this design actually assemble?Often substitute fabric; appearance secondaryDesign, merchandisingKeep or kill at line review 1; first costing
Fit sampleEstablishes correct measurements on a real body in the real fabricIntended fabric, base size onlyTechnical design, fit modelLocks measurements and grading rules
Size setOne garment per size, to prove the grade scalesIntended fabric, full runTechnical designConfirms 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 colorwaySales reps, showroom, trade show, key accountsPrebook orders — literally the order quantities
Photo sampleSample reserved for the lookbook and e-commerce shootProduction-quality, model sizeMarketing, e-comm, PRLinesheets, lookbook, product pages
PP (pre-production)Final dress rehearsal in exact bulk fabric and methodsBulk fabric, industrial methodsProduction, QAApproval to cut bulk; becomes the reference "golden sample"
TOP (top of production)Pulled from the live production runActual bulkQA, productionApproval 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

ChannelWhat it wantsAssortment implication
DTC (your own site/stores)The full story — everything, including the statement pieces100% of the line; extended sizes; you own all the size risk
Specialty / boutiqueDifferentiation from the chains; open sizing; small quantitiesCurated subset, often 40–60% of options; open stock; low minimums
Majors / department storesDepth, reliable delivery, EDI compliance, prepacksNarrow, deep subset of proven bodies; prepack ratios; door-level allocation
Off-priceValue; will take broken runs and past-season goods. These are the discount chains that buy leftover branded stock cheaplyNever the current line. Excess only, or a purpose-made value program
International / distributorLocally relevant sizes and colors, different seasonalityDifferent 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.
Watch out

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.

Core principle

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:

Core principle

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 enum is 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.
  • style carries the season, meaning a carryover style gets a new row each season linked back through prior_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.
  • colorway carries its own stage and its own kill timestamp, because colors are killed independently of styles and constantly.
  • The unique constraint on sku across style, colorway and size is the one that prevents the duplicate-SKU disaster; the global unique on gtin enforces the GS1 rule that no two sellable variants share a barcode (nulls are allowed and do not collide, so unassigned SKUs are fine).
  • And status on SKU is a soft state, never a delete: your append-only inventory ledger from Chapter 1 references sku_id forever, 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

RuleWhere it livesFailure if you skip it
One GTIN per SKU, globally uniqueunique (gtin)Retailer receives wrong goods; chargebacks; EDI rejections
SKUs are never deleted, only deactivatedStatus column + no delete grantOrphaned rows in the append-only ledger (Ch 1)
Size curve points sum to exactly 100%Deferred constraint triggerBuys that silently under- or over-order
Packs explode to component SKUs before ledger writesService layer + ledger check constraint on sku_idATS wrong in two units of measure; unrecoverable
Option count per category cannot exceed the active line plan budgetTrigger or service check on colorway adoptionSKU proliferation with no gate
Style stage transitions follow the state machineCheck constraint / transition tableFabric committed for styles nobody adopted
Exclusive and channel restrictions block order linesOrder-entry validationExclusivity breach; account loss
Requested delivery window must be satisfiable by projected ATSOrder-entry validation against Ch 8 ATSOrders canceled at cancel date; OTB lost
Adopted colorway must have an approved cost sheet clearing target GMAdoption workflow gateWhole 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.

Exercise

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.