The operation
A single fulfilment centre serving two banners inside a six-node network that also ships from a second FC and four stores. Twenty-four months, August 2024 to July 2026.
Unit fill exploratory
94.3%
What Operations reads. Units shipped over units ordered.
Line fill exploratory
91.6%
What the merchant team reads. Lines shipped complete.
Order fill certified
87.2%
What Finance reads, and the one the business now runs on.
Split rate certified
11.6%
Orders shipped from more than one node. Counted by node, not parcel.
Orders
379,979
621,942 order lines · 6,320 shipped nothing at all
Shipped sales
$79,315,719
At retail, over 24 months
Split premium
$248,933
8.6% of all parcel spend — the leak
Cost per shipped order
$14.49
Parcel plus labor at real BLS Seattle wages
The thesis
A distribution centre reports 94.3% fill to Operations, 91.6% to the merchant team and 87.2% to Finance. Three numbers, three teams, all arithmetically correct, none reconciled — because order fill, line fill and unit fill are different metrics and nobody ever wrote down which one the business runs on.
Meanwhile the thing actually costing money is invisible in all three. An order split across two nodes still counts as filled. It is 100% filled, on time, in full — and it costs $5.64 more to ship in the off-price banner and $5.18 more in the premium one.
The definitional gap and the economic leak are the same phenomenon. Fill rate looks healthiest exactly where splitting is worst, because splitting is how the network achieves fill. The metric meant to measure service is concealing the cost of delivering it.
The supply-chain discipline has not settled this. Fill rate resolves at least three ways, and published guidance states plainly that there is no agreed OTIF formula because the calculation depends on which point of view you are measuring and the level at which the data is stored. This module is not inventing a strawman; it is naming a documented condition of the field and then resolving it for one operation.
The certified metric register
Generated from the meta blocks on the dbt models
that compute these metrics — the same file that defines their tests. Nothing here is
typed twice, and build_metric_register.py --check fails the build if a
definition drifts from the model behind it.
Certification is not a ranking. An exploratory metric is not a bad metric; it is one the business has agreed not to run on. Retaining the other two definitions and labelling them is the governance act — deleting them would move the disagreement rather than resolve it.
| Metric | Tier | Grain | Owner | Why this tier |
|---|---|---|---|---|
| Cost per order | certified | Order | Fulfillment finance | An order with no parcel has no parcel cost. Including it would divide real cost across unreal volume and quietly flatter the figure. |
| Dock-to-stock | certified | Receipt | Inbound operations | Stock that has arrived but is not put away cannot fill an order, so this sits upstream of every fill rate on the register. |
| Inventory / sales ratio | certified | Month, whole network | Inventory planning | The only metric here checked directly against a real published series. It sits below the Census sector band by design, because this is a fulfillment network and the sector figure includes store selling floors. |
| On-time ship | certified | Order line | DC operations | An unshipped line is a fill failure, not a lateness failure. Counting it in both would charge one miss to two metrics, which is exactly the double-counting this module exists to surface. |
| Order fill | certified | Order | Fulfillment governance | A customer whose three-line order arrives missing a line did not receive 67% of an order; they received an incomplete order. Order fill is the only definition that says so. |
| Split premium | certified | Order | Fulfillment finance | Split orders are systematically larger baskets. Comparing the average cost of split orders against the average cost of single-node orders compares two different populations and flatters the split. |
| Split rate | certified | Order | Network planning | Node count responds to the allocation decision under review. Parcel count also responds to carton sizing and packaging rules, which are a different problem with a different owner. |
| Units per labor hour | certified | Month x warehouse function | DC operations | Costed at BLS Occupational Employment and Wage Statistics medians for the Seattle-Tacoma-Bellevue metro, May 2025, so cost per order is a real regional number rather than an invented rate. |
| Counterfactual unit fill | exploratory | Unit | Fulfillment governance | A modelled alternative history, not a measurement. It prices the governance decision and must never be reported as achieved service. |
| Line fill | exploratory | Order line | Merchandising analytics | Useful as an assortment-coverage diagnostic, and it is what the merchant team has always read. Retaining it and labelling it is the governance act; quietly deleting it would move the disagreement rather than resolve it. |
| Unit fill | exploratory | Unit | Operations | The most forgiving of the three and therefore the one most often quoted upward. Retained as a depth-of-stock diagnostic, explicitly not as the service number. |
The pathology this replaced
Before certification there were three fill rates in circulation and no statement of which one the business ran on. Each was defensible to the team that built it: Operations measured what physically moved, merchandising measured assortment coverage, Finance measured whether the customer got what they asked for.
The cost was not licences or dashboards. It was that the three teams could not have the same conversation about the same week. Operations reported service improving while Finance reported it flat, both were arithmetically correct, the meeting resolved nothing — and the split rate, which none of the three measured, went unexamined for the entire period.
What the data shows
Descriptive, then diagnostic, then prescriptive. Every chart carries its own data table and its own provenance.
Descriptive — the three rates never meet
Line chart. Three series over 24 months, 2024-08 to 2026-07. Vertical axis is percent, 70 to 100. Unit fill ranges 89.1 to 96.7 percent, line fill 84.9 to 95.1, order fill 77.9 to 92.2. The three series do not cross at any point.
Show the data behind this chart
| Month | Orders | Unit fill | Line fill | Order fill |
|---|---|---|---|---|
| 2024-08 | 14,838 | 96.2% | 94.4% | 91.2% |
| 2024-09 | 14,363 | 95.8% | 93.6% | 90.1% |
| 2024-10 | 16,717 | 94.7% | 92.1% | 87.7% |
| 2024-11 | 24,260 | 89.1% | 84.9% | 77.9% |
| 2024-12 | 23,312 | 90.3% | 86.1% | 79.5% |
| 2025-01 | 13,597 | 95.5% | 93.3% | 89.8% |
| 2025-02 | 11,678 | 96.6% | 95.1% | 92.2% |
| 2025-03 | 13,679 | 96.1% | 94.2% | 90.7% |
| 2025-04 | 13,779 | 96.2% | 94.5% | 91.3% |
| 2025-05 | 15,026 | 95.5% | 93.0% | 89.3% |
| 2025-06 | 13,869 | 96.0% | 93.9% | 90.4% |
| 2025-07 | 15,152 | 95.9% | 93.7% | 90.1% |
| 2025-08 | 14,951 | 95.2% | 92.8% | 88.7% |
| 2025-09 | 14,584 | 95.6% | 93.4% | 89.6% |
| 2025-10 | 16,393 | 94.7% | 92.0% | 87.7% |
| 2025-11 | 24,138 | 89.6% | 85.6% | 79.0% |
| 2025-12 | 22,903 | 91.0% | 87.2% | 81.1% |
| 2026-01 | 13,553 | 95.3% | 93.0% | 89.2% |
| 2026-02 | 11,269 | 96.7% | 95.0% | 92.1% |
| 2026-03 | 14,122 | 96.4% | 94.4% | 91.2% |
| 2026-04 | 14,160 | 95.3% | 93.0% | 89.1% |
| 2026-05 | 14,522 | 95.3% | 92.8% | 88.8% |
| 2026-06 | 14,095 | 95.8% | 93.6% | 90.0% |
| 2026-07 | 15,019 | 95.4% | 93.0% | 89.0% |
The gap is 7.0 points between the most forgiving definition and the strictest. It is not measurement error and it is not a reconciliation problem: each rate is a different question asked of the same shipped quantities. Order fill is arithmetically the lowest of the three in every period, because an order counts as filled only if every line in it is.
Diagnostic — splitting is how the network achieves fill
Line chart. Two series over 24 months. Vertical axis is percent, 80 to 100. Unit fill as achieved ranges 89.1 to 96.7 percent and runs above unit fill under a single-node-only rule in every month; that series ranges 85.0 to 94.8. The vertical distance between them ranges 1.80 to 4.12 percentage points.
Show the data behind this chart
| Month | Unit fill | Single-node only | Points bought by splitting |
|---|---|---|---|
| 2024-08 | 96.2% | 94.2% | 2.00 |
| 2024-09 | 95.8% | 93.6% | 2.23 |
| 2024-10 | 94.7% | 92.1% | 2.56 |
| 2024-11 | 89.1% | 85.0% | 4.12 |
| 2024-12 | 90.3% | 86.5% | 3.75 |
| 2025-01 | 95.5% | 93.0% | 2.48 |
| 2025-02 | 96.6% | 94.8% | 1.86 |
| 2025-03 | 96.1% | 94.0% | 2.14 |
| 2025-04 | 96.2% | 94.4% | 1.80 |
| 2025-05 | 95.5% | 92.9% | 2.57 |
| 2025-06 | 96.0% | 93.9% | 2.14 |
| 2025-07 | 95.9% | 93.6% | 2.30 |
| 2025-08 | 95.2% | 92.8% | 2.38 |
| 2025-09 | 95.6% | 93.6% | 1.98 |
| 2025-10 | 94.7% | 92.1% | 2.61 |
| 2025-11 | 89.6% | 85.5% | 4.08 |
| 2025-12 | 91.0% | 87.2% | 3.76 |
| 2026-01 | 95.3% | 93.1% | 2.22 |
| 2026-02 | 96.7% | 94.8% | 1.93 |
| 2026-03 | 96.4% | 94.2% | 2.15 |
| 2026-04 | 95.3% | 93.1% | 2.19 |
| 2026-05 | 95.3% | 92.8% | 2.50 |
| 2026-06 | 95.8% | 93.8% | 1.96 |
| 2026-07 | 95.4% | 93.1% | 2.25 |
For every order, the simulation also records what the same order against the same inventory position would have shipped if splitting were forbidden — the best any single node could have done alone, evaluated before the real allocation was committed. Splitting buys 2.65 points of unit fill. Without that counterfactual, “splitting is how the network achieves fill” is an assertion; with it, the governance decision has a price.
Grouped bar chart. Three SKU velocity bands on the horizontal axis, two bars each. Vertical axis is percent of order lines, 0 to 25. Lines shipping short: 4.44 percent for band A, 8.37 for B, 9.47 for C. Lines using more than one node: 4.15, 10.15, 17.07. Both series increase from A to C.
Show the data behind this chart
| Velocity band | Lines | Ships partial | Ships zero | Uses >1 node | Unit fill |
|---|---|---|---|---|---|
| A · fast | 433,516 | 4.44% | 1.98% | 4.15% | 95.9% |
| B · mid | 138,070 | 8.37% | 4.49% | 10.15% | 90.8% |
| C · slow | 50,356 | 9.47% | 3.66% | 17.07% | 89.8% |
Shortfall and splitting are not two problems. They are two symptoms of one condition: inventory fragmented relative to what customers actually put in a basket. Slow-moving styles are ranged at two nodes rather than six, so a basket containing one either reaches for a second node or goes short — and which of those happens is a matter of luck, not of policy.
The second finding — the same rule, two different economics
Bar chart. Two banners on the horizontal axis. Vertical axis is the split premium as a percent of gross margin on split orders, 0 to 20. Off-Main 12.09 percent, Alder & Vance 3.55 percent.
Show the data behind this chart
| Banner | Fulfilment | Orders | Avg order value | Avg parcel cost | Avg split premium | Avg gross margin | Premium as % of margin |
|---|---|---|---|---|---|---|---|
| Off-Main | single node | 190,142 | $115.55 | $7.00 | $0.03 | $34.90 | 0.2% |
| Off-Main | split | 26,757 | $237.51 | $15.23 | $5.64 | $71.73 | 12.1% |
| Alder & Vance | single node | 139,393 | $285.12 | $6.60 | $0.02 | $109.77 | 0.1% |
| Alder & Vance | split | 17,367 | $647.57 | $14.01 | $5.18 | $249.31 | 3.6% |
The dollar cost of a split barely differs between the banners. Its consequence differs by more than three times, because it is charged against a margin that differs by more than three times. A split that is a rounding error on a premium order is a material loss on an off-price one.
There is therefore no single correct split threshold. That is a governance finding, not a modelling inconvenience: any single network-wide rule is simultaneously too aggressive for one banner and too permissive for the other.
Prescriptive — priced, with the residual reported as a residual
Line chart. Cost thresholds from $5 to $20 on the horizontal axis. Vertical axis is the percent of that banner's split orders whose premium exceeds the threshold, 0 to 30. Both series fall as the threshold rises, the off-price series above the premium series throughout.
Show the data behind this chart
| Threshold | Off-Main orders | % of Off-Main splits | Alder & Vance orders | % of A&V splits | Units at risk |
|---|---|---|---|---|---|
| $4 | 26,757 | 100.0% | 17,367 | 100.0% | 49,487 |
| $5 | 5,464 | 20.4% | 2,426 | 14.0% | 14,944 |
| $6 | 5,464 | 20.4% | 2,426 | 14.0% | 14,944 |
| $7 | 3,444 | 12.9% | 1,497 | 8.6% | 11,709 |
| $8 | 3,444 | 12.9% | 1,497 | 8.6% | 11,709 |
| $10 | 3,227 | 12.1% | 1,322 | 7.6% | 11,317 |
| $12 | 1,834 | 6.9% | 782 | 4.5% | 7,361 |
| $15 | 963 | 3.6% | 360 | 2.1% | 4,683 |
| $20 | 247 | 0.9% | 90 | 0.5% | 1,533 |
The recommendation: set the threshold per banner, not per network. Holding Off-Main splits above $6 as exceptions would catch 5,464 orders carrying $58,218 of split premium. Applying the same rule to Alder & Vance would catch 2,426 orders and save $25,048, while risking margin that comfortably absorbs the cost.
The saving is not free and the page will not pretend otherwise. Those orders shipped complete because they were split. Holding them puts 14,944 units at risk of shipping short, which would move the certified metric — order fill — in the wrong direction. The decision is a trade between a measured cost and a measured service loss, and the register now shows both next to each other, which it could not do before.
The residual, stated as a residual. A per-banner threshold at $6 addresses $83,266 of the $248,933 total split premium. $165,667 remains, in splits too small individually to hold but numerous enough to matter in aggregate. Nothing in this analysis explains that portion away, and no allocation rule tested here removes it. It is reported rather than absorbed into the recommendation.
Where the cost actually lands
Bar chart. 6 fulfilment nodes on the horizontal axis, ordered most to least expensive. Vertical axis is parcel cost per unit in dollars, 0 to 6.00. Values run from $4.12 at Store 104 to $1.65 at Cascade Ridge FC.
Show the data behind this chart
| Node | Type | Shipments | Units | Parcel cost | Cost per unit |
|---|---|---|---|---|---|
| Cascade Ridge FC | FC | 344,371 | 1,460,609 | $2,403,591 | $1.65 |
| Fernhill FC | FC | 63,403 | 166,876 | $379,266 | $2.27 |
| Store 101 | STORE | 6,408 | 13,117 | $47,862 | $3.65 |
| Store 102 | STORE | 4,044 | 7,484 | $29,713 | $3.97 |
| Store 103 | STORE | 3,190 | 5,653 | $23,283 | $4.12 |
| Store 104 | STORE | 2,573 | 4,559 | $18,779 | $4.12 |
Is this world plausible?
The operational data is invented, so the question a sceptical reader should ask is whether the generator produced a world a real department store would recognise. Three audits check it against real published data, and each one is written so that it can fail.
Line chart with two series and a shaded horizontal reference band. Vertical axis is months of sales held in inventory, 0 to 4.0. The network series ranges 0.53 to 1.28 months and runs below the shaded band, which spans 2.03 to 3.64 and is the seasonally adjusted sector range, in every month. A dashed second series is the unadjusted sector average by month of year, ranging 1.39 to 3.75. Both the network series and the unadjusted sector series fall in November and December.
Show the data behind this chart
| Month | Inventory at cost | Sales at retail | Inventory / sales |
|---|---|---|---|
| 2024-08 | $2,959,250 | $3,151,995 | 0.939 |
| 2024-09 | $3,326,054 | $3,058,557 | 1.087 |
| 2024-10 | $2,882,052 | $3,542,385 | 0.814 |
| 2024-11 | $2,541,245 | $4,774,339 | 0.532 |
| 2024-12 | $2,908,922 | $4,698,237 | 0.619 |
| 2025-01 | $3,098,022 | $2,901,946 | 1.068 |
| 2025-02 | $3,142,482 | $2,461,376 | 1.277 |
| 2025-03 | $3,358,448 | $2,843,665 | 1.181 |
| 2025-04 | $3,106,254 | $2,859,208 | 1.086 |
| 2025-05 | $2,959,598 | $3,151,228 | 0.939 |
| 2025-06 | $3,294,041 | $3,016,941 | 1.092 |
| 2025-07 | $3,001,143 | $3,222,359 | 0.931 |
| 2025-08 | $3,313,510 | $3,146,041 | 1.053 |
| 2025-09 | $3,150,426 | $3,099,916 | 1.016 |
| 2025-10 | $2,990,229 | $3,427,025 | 0.873 |
| 2025-11 | $3,011,537 | $4,786,916 | 0.629 |
| 2025-12 | $2,791,483 | $4,536,824 | 0.615 |
| 2026-01 | $3,016,614 | $2,898,750 | 1.041 |
| 2026-02 | $3,075,516 | $2,420,431 | 1.271 |
| 2026-03 | $3,206,888 | $3,002,621 | 1.068 |
| 2026-04 | $3,012,419 | $3,050,647 | 0.987 |
| 2026-05 | $3,322,861 | $3,069,347 | 1.083 |
| 2026-06 | $3,180,000 | $3,001,132 | 1.060 |
| 2026-07 | $3,026,301 | $3,193,833 | 0.948 |
The modelled network runs at 0.97 months of stock against a real department-store band of 2.03–3.64. Sitting below the band is the correct answer, not a miss. The Census series covers entire department stores, most of whose inventory sits on selling floors serving walk-in customers this module never simulates. So the audit asks for the relationship rather than the level: the series must sit strictly inside the sector figure, clear a floor below which the modelled service level would be unattainable, and move with the real series seasonally. It correlates at +0.62 and dips every November and December, exactly as department stores do when peak-season sales outrun the inventory behind them.
The second audit bounds this DC’s operating cost at 6.83% of shipped sales against the 23.7%–39.0% SG&A range Macy’s, Kohl’s and Dillard’s actually report. The third requires splitting to be concentrated and directional rather than uniform noise — which is the pattern shown above, and which a generator producing random splits would fail.
An audit that cannot fail is not an audit. Each one is a pure function of measured numbers, so the validation suite hands each deliberately wrong values and confirms it trips: inventory inflated past the sector band, seasonality flattened, cost inflated past peer SG&A, cost cut to a rounding error, splits made uniform, and concentration reversed. All six trip, and that result is recorded next to the real one in the validation report.
Data & method
Whose decision this serves
- The decision. Whether to certify one fill definition, and where to set the split-cost threshold for each banner.
- The reader. A fulfilment leader and a finance partner, both analytics-literate, on a tactical-to-strategic horizon.
- The benchmark. Real peer filings and a real federal inventory series for plausibility; an internal counterfactual for the service trade.
- The action. Certify order fill; set two thresholds instead of one; put split rate on the same register as fill rate.
- Refresh. None. This is a frozen snapshot and says so.
The synthetic spine
- A seeded Python generator, seed
20260808. The same seed produces the same content hash,6592611ba17db74bc0201f297742f9fa562ef1304dbdb70e43136d59940aec17, which the validation suite re-checks on every run. - Inventory is held per style and size. That is what lets the three fill rates differ at all: a line for three units spreads across the size run, so it commonly ships two of three rather than all or nothing. Size brokenness is the commonest reason a real retail line ships incomplete.
- No order is ever labelled “split.” An order splits
when the allocator cannot satisfy every line from one node and reaches for a second.
The classification is an observed consequence of the documented allocation rule, and
validate.pyre-derives it from the shipments alone.
The three real anchors
- Labor · BLS Occupational Employment and Wage Statistics,
May 2025, Seattle-Tacoma-Bellevue metro (area 42660). Every labor dollar on this
page is costed at a real published wage across the percentile spread, not a median
alone:
53-7062Laborers and Freight, Stock, and Material Movers, Hand — median $22.95/hr, p10 $18.87, p90 $30.00 (anchor)53-7065Stockers and Order Fillers — median $22.52/hr, p10 $18.52, p90 $27.80 (supporting)43-5071Shipping, Receiving, and Inventory Clerks — median $27.10/hr, p10 $19.43, p90 $48.45 (supporting)53-1047First-Line Supervisors of Transportation and Material Moving Workers, Except Aircraft Cargo Handling Supervisors — median $36.73/hr, p10 $25.81, p90 $51.24 (supporting)
- Inventory · US Census Monthly Retail Trade Survey, department stores, end-of-month inventories and inventories/sales ratios, 1992–2026. The modelled network runs at 0.97 months against a sector band of 2.03–3.64.
- P&L plausibility · SEC EDGAR XBRL for Macy’s, Kohl’s and Dillard’s. Their SG&A runs 23.7%–39.0% of revenue; this DC runs at 6.83% of shipped sales.
Pull once, freeze, commit
- All three anchors are frozen in the repository with a SHA-256 per file. No build step and no part of this page makes a network call. ECharts and the chart theme are vendored; the dataset is inlined at build time.
- XBRL tags drift in two directions and both are handled. Dillard’s reports
inventory as
RetailRelatedInventoryMerchandisewhere the others useInventoryNet, and all three moved revenue and cost of sales onto different tags mid-history. Every winning tag is recorded ingovernance/tag_mapping.csv.
The stack, described accurately
- Python generator → DuckDB star schema → dbt Core (6 staging views, 9 marts, 69 data tests) → this static page, with Apache ECharts vendored.
- The warehouse layer shipped as DuckDB. BigQuery and Looker Studio are a named, gated Phase 2 awaiting a cloud project; when it exists, BigQuery becomes a second output in the dbt profile and the models do not change. Nothing on this page was produced by BigQuery or by Looker Studio, and where that phase is discussed it means Looker Studio, not Looker or LookML.
- The static page is the durable artifact and survives the warehouse being switched off. That is the reason it exists.
Honest limits
- The operational data is invented, and the generator is not evidence about the world. It demonstrates a design. Every fill rate, split rate and dollar on this page describes a simulation.
- Two of the three realism audits bound the model rather than matching it, and the reason is scope. Census inventories cover entire department stores, most of whose stock sits on selling floors serving walk-in customers this module never simulates — so the network holding 0.97 months against a sector band of 2.03–3.64 is correct, not a miss. Audit A requires the series to sit strictly inside the sector figure, clear a floor, and move with it seasonally. It does all three, and that is a weaker claim than a match.
- Fulfilment cost is not separately disclosed by any public department store. It sits inside SG&A alongside stores, marketing, occupancy and corporate. Audit B therefore bounds the modelled DC cost by the peer SG&A band rather than matching a reported figure. No amount of care makes an undisclosed number checkable.
- The counterfactual is modelled, not measured. It is the best any single node could have done against the same inventory position — a defensible alternative history, but an alternative history. It is registered as exploratory and must never be reported as achieved service.
- The calibration source is not named, and that costs reproducibility. Scale and mix parameters draw on one real department-store operator’s published filings. That filer is never named here, so this one input is attested rather than reproducible. The three realism audits deliberately do not depend on it — they run against the Census series and the three named peers, which are frozen and committed in full.
- Returns and reverse logistics are excluded on purpose. They are the largest documented cost in the research — industry sources put US retail returns around $850 billion, roughly 16% of sales, with apparel return rates of 30–46% and reverse-logistics handling at $20–30 per return. Including them would double the build. They are the natural Phase 2, named rather than quietly omitted.
- Also excluded: labor scheduling optimisation and network design, which are optimisation problems rather than governance problems; and store-level and merchandising analytics, which would take the module off the DC.
- A target was missed and is reported missed. The generator aimed for a three-point gap between unit fill and line fill and produced 2.65 points. Reaching three would have required roughly one line in ten to ship partially, which is high for an operation with working replenishment. Forcing it would have meant choosing an implausible world to make a headline land, which is the failure this module exists to criticise.
- Definition-of-done item 6 is unmet. There is no live BigQuery or Looker Studio view, because there is no cloud project yet. Said plainly rather than implied by omission.