An interactive walkthrough of the 5-layer demand forecasting pipeline. Use the slider above to change the growth rate target and watch every downstream layer react in real time.
โฌ V1 โ Original ๐ข V2 โ Improvements ๐ฃ Future State โ Interactive SliderEach season, Grow Fragrance must answer one question: how many units of each fragrance ร format should we produce? The forecasting engine answers this systematically through five sequential layers โ each one refining the estimate from the one before.
The slider at the top of the page controls the growth rate target for Layer 3. Every layer below it โ the scale factors, overflow logic, and final SKU allocations โ reacts instantly to your input.
Pull actual sales from DuckDB for prior seasons
Estimate how each fragrance grows or shrinks by age
Scale to hit the growth target (slider controls this)
Redirect excess from capped fragrances
Split into spray, candle, car freshener, packs
Layer 1 is fully automatic: the engine queries DuckDB for actual units sold during the summer window (May 7โAug 22) in all available years. This creates the foundation that everything else builds on. The slider does not affect this layer โ historical sales are facts, not assumptions.
YoY % change labeled. Cabana had zero history in 2024 (it launched summer 2025). Pomelo and Sea Salt Neroli's sharp declines are bounded to โ50% in Layer 2. Discovery packs tracked separately.
| Fragrance | Summer 2024 | Summer 2025 | YoY Change | Role in 2026 |
|---|---|---|---|---|
| ๐ด Coconut Soleil | โ | โ | โ | New launch |
| โ๏ธ Cabana | โ | 9,895 | New | Y2 returning |
| ๐ Coconut Pineapple | 8,444 | 4,823 | โ42.9% | Y3 returning |
| ๐ Coastal Tide | 6,419 | 5,327 | โ17.0% | Y5 sunset |
| Pomelo | 3,264 | 939 | โ71.2% โ bounded โ50% | Retired |
| Sea Salt Neroli | 4,126 | 1,777 | โ56.9% โ bounded โ50% | Retired |
| Discovery Packs | 1,660 | 1,004 | โ39.5% | Fixed allocation |
| Grand Total | 23,913 | 23,765 | โ0.6% | Grand Base for 2026 |
Each fragrance ages like a product in a lifecycle. New scents benefit from novelty and marketing; older ones gradually lose share to newer offerings. Layer 2 applies a year-over-year decay (or in Year 1, an estimate from prior launches) to produce a raw bottom-up forecast. The slider does not change these raw numbers โ they are derived from data, not from the growth target.
Think of a fragrance like a new movie. It opens big, with strong marketing and novelty in Year 1. By Year 3 or 4, fewer customers are discovering it for the first time. The pattern isn't perfectly regular โ some scents stick around, some collapse quickly โ but on average there is a predictable lifecycle arc.
Illustrative decay trajectories for three fragrance archetypes, all indexed to 10,000 units at launch. Most fragrances fall somewhere between the "slow" and "rapid" curves. The key insight: even slow-decaying fragrances rarely grow in later years without fresh marketing reinvestment. The dashed red line (โ50%/yr) represents the model's hard floor โ the worst case the engine will ever forecast.
Waterfall chart showing cumulative volume decay from a 10,000-unit launch, applying pooled median rates at each age transition. The teal bar is the Year 1 starting point; orange bars show volume lost at each subsequent transition. โ Y1โY2 is the only real Grow data (n=20 transitions, median โ24.3%); all other age buckets show illustrative future-architecture rates representing what the pooled curve will look like as seasons accumulate. At these median rates, a launch fragrance retains only ~4% of its Year 1 volume by Year 8. *Year 6 data not yet available in the current dataset.
Representative distribution of Y1โY2 transitions from the database (n=20 observations). Orange bars = year-over-year decline; green bars = growth. The pooled median of โ24.3% is a far more defensible anchor than any single-fragrance proxy โ it captures the full range of plausible outcomes and correctly quantifies how uncertain this transition really is (stdev = 70.3 percentage points).
One guard rail is applied to all decay rates: no fragrance is forecast to lose more than 50% of its units year-over-year, regardless of what the raw data suggests. Pomelo lost 71.2% of its summer volume from 2024 to 2025 โ but applying โ71.2% to Coconut Pineapple would produce an implausibly low forecast, because Pomelo's collapse may have been driven by very specific factors (heavy cannibalization from Cabana, reduced marketing support) that do not generalize.
The โ50% bound is a deliberate safety net: in the worst realistic case, assume we lose half our volume. Coconut Pineapple hit this bound exactly at its observed rate. Sea Salt Neroli (observed โ56.9%) and Pomelo (observed โ71.2%) were both bounded upward before retirement.
A brand-new fragrance โ Coconut Soleil in Summer 2026 โ has zero prior sales history. The engine can't apply a decay rate to nothing. Instead, it uses an average of recent Y1 launches as a benchmark, adjusted upward by a market growth factor reflecting Grow's expanding customer base.
Cabana's first summer (2025) = 9,895 units. Coconut Pineapple's first summer (2024) = 8,444 units. Their simple average (9,170) is the conceptual formula midpoint. The engine outputs 7,845 for Coconut Soleil after its internal calibration โ this is the number used throughout all interactive model calculations.
The 2025 data provides a clear signal. Cabana launched in 2025 and added 9,895 units to the lineup โ yet total summer demand fell from 23,913 to 23,765 (โ0.6%). Cabana captured nearly all its volume from existing fragrances rather than expanding the overall category. The returning fragrances collectively dropped by ~10,043 units, essentially absorbing Cabana's entire launch volume.
Despite Cabana adding ~9,895 new units, total summer demand declined by 148 units โ from 23,913 to 23,765. The stacked chart shows how Cabana's volume was almost entirely offset by declines in returning fragrances. True incremental category growth from the new launch was approximately zero, confirming that Cabana largely cannibalized existing demand rather than bringing in new spending.
2025 base vs. 2026 raw forecast after applying decay rates. Coconut Soleil uses the average of prior Y1 launches ร market growth factor (1.066). All rates are overrides in the current config; the pooled curve (Y1โY2 median = โ24.3%) serves as the default when no override is set.
| Fragrance | 2025 Base | Rate Applied | Source | Raw 2026 Forecast |
|---|---|---|---|---|
| ๐ด Coconut Soleil | โ | โ | Avg(Cabana Y1, CP Y1) ร 1.066 | 7,845 |
| โ๏ธ Cabana | 9,895 | โ24.8% | Override (config) | 7,441 |
| ๐ Coconut Pineapple | 4,823 | โ50.0% | Override (bounded max) | 2,412 |
| ๐ Coastal Tide | 5,327 | โ21.5% | Override (config) | 4,182 |
| Raw Total (no packs) | โ | โ | โ | 21,880 |
Starting from the 2026 engine forecast, these charts project how each fragrance's demand would evolve through 2030. Solid lines = historical actuals or engine-calculated. Dashed lines = pooled median projection (โ24.3%/yr). Note: Coastal Tide retires after 2026.
Raw 2026 estimate = 7,845 (avg of prior Y1 launches ร 1.066). All years from 2027 onward use the pooled median of โ24.3%/yr โ the only available pooled rate.
2025 base = 9,895 (known). 2026 raw forecast = 7,441 (โ24.8% config override). 2027+ projects forward at the pooled median of โ24.3%/yr.
2025 base = 4,823 (known). 2026 raw forecast = 2,412 (โ50% override, at the decay bound). Note the steep drop; 2027+ reverts to pooled โ24.3%/yr.
Model raw forecast = 4,182 (โ21.5%). CT is being retired โ no production beyond Summer 2026. The red triangle marks the retirement point at 0 units.
The raw bottom-up forecasts from Layer 2 sum to 21,880 units (+ 4,000 fixed packs = 25,880 total). The business has a growth target above that. Layer 3 applies a scale factor to bridge the gap โ but how that scale factor is distributed across fragrances is where V1 and V2 differ dramatically.
The raw bottom-up decay forecast (21,880 fragrance units + 4,000 packs = 25,880) never changes โ it's driven by data. The orange stack on the "Growth Target" bar shows the gap that must be distributed by Layer 3. Move the slider to watch it grow.
scaleFactor = fragTarget / rawTotal. Coconut Soleil (new, lots of growth potential) and Coastal Tide (sunsetting, all capped) get identical multipliers. This is simple but ignores the business reality that different fragrances have different growth elasticity.
Bars show post-scaling fragrance allocation (non-pack units). V1 distributes growth equally; V2 front-loads growth to new/young fragrances. White labels inside V2 bars show the effective multiplier (relative to uniform). The orange dashed line marks Coastal Tide's non-pack format cap (4,442). When V1 bars exceed this line, overflow triggers.
The effective V2 scale multiplier for each fragrance = (fragTarget / rawTotal) ร (weight / avgWeight). The base scale (gray dashed) is what V1 applies uniformly to all. V2 amplifies it for young fragrances and dampens it for old ones. When V1 overflows (above ~14.6% growth), the Coastal Tide label turns red.
When any fully-capped fragrance's scaled allocation exceeds the sum of all its format caps, the excess can't go there. It must be redistributed proportionally to fragrances with at least one uncapped format. This ensures the grand total still hits the growth target.
Left group: Coastal Tide's scaled allocation vs. its 4,442 non-pack format cap. Right group: the resulting overflow under V1 and V2. V1 overflow grows linearly with growth rate (it appears immediately above ~14.6%). V2 overflow remains at zero throughout realistic ranges.
In V1, Coastal Tide's overflow is redistributed proportionally to the three uncapped fragrances. As growth rate increases, the overflow grows โ and so do the redistribution arrows. V2 (right panel) shows zero overflow because CT's 0.5ร elasticity weight keeps it well below its cap. The progress bar at the bottom shows CT's V1 allocation as a % of its cap.
The final layer splits each fragrance's total unit count across its product formats. The engine follows a strict priority order: (1) fill capped formats first, (2) split remaining units to uncapped formats using prior-year format shares, (3) new launches use a proxy fragrance's shares.
Sankey flows from each fragrance (left) to its formats (right). Band thickness is proportional to unit volume. Orange-bordered formats are production-capped; green formats are demand-driven. CT's flows are fixed width โ they don't respond to the slider. All other bands scale with growth rate.
| Fragrance | Format | Units | Type |
|---|
Icon key: โ Demand-driven โ scaled by the growth slider. | ๐ Capped โ demand ceiling reached; format is at its hard cap. | ๐ Fixed production commitment โ Coastal Tide's targets are production floors set by the business, not demand ceilings. The model allocates CT fewer units, but production stays fixed. | ๐ฆ Fixed pack allocation โ 1,000 packs per fragrance regardless of slider.
The orange segment in "Actual Production" represents Coastal Tide's production floor effect: CT's format commitments mandate 5,442 units, while the demand model only allocates CT ~3,245. The surplus (~2,197 units) means actual production consistently exceeds the model's growth target. This is expected behavior โ CT's commitments are a business decision that overrides the model output.
Box-plot style: the colored horizontal tick is the point forecast; the blue box is the 70% CI; the thin whisker with end caps is the 90% CI. Intervals scale proportionally as the slider moves. Coastal Tide's intervals are hidden โ CT production is a fixed commitment at 5,442 regardless of demand, so uncertainty intervals from the demand model do not apply. Red end caps mean the interval's lower bound has hit zero, indicating the CI is too wide to be a useful planning constraint at that growth rate.
The five-layer pipeline transforms a business growth target into a SKU-level production plan in a fully auditable, reproducible way. Each layer has a specific responsibility and a clear V1โV2 improvement story. The slider at the top of this page lets you stress-test the entire chain in real time โ move it to see how a single growth target decision propagates through every downstream calculation.
| Layer | V1 Approach | V2 Improvement | Future State | Slider Effect |
|---|---|---|---|---|
| 1. Historical Demand | Manual extraction from spreadsheets; error-prone, not reproducible across scenarios | Automated DuckDB SQL against fact_orders; parameterized summer window (May 7โAug 22); includes retired fragrances for pool building |
MCP integration for real-time sell-through signals; automatic season boundary detection from shipment patterns | None โ historical facts do not change with the growth target |
| 2. Decay Model | Single comparable proxy per fragrance; risk of capturing a statistically extreme one-off event as the "typical" rate | Pooled decay curves (n=20 Y1โY2 transitions, median โ24.3%); โ50% hard floor; config overrides applied only where data justifies | Multi-year pooling across all age buckets as data accumulates; Bayesian shrinkage toward category mean; cannibalization-aware decay adjustment | None โ decay rates are derived from data, not from the business growth target |
| 3. Reconciliation โ | Uniform proportional scale factor applied to all fragrances equally โ same multiplier for a new launch and a sunsetting fragrance | Elasticity-weighted scaling (CS 1.5ร, Cab 1.2ร, CP 0.8ร, CT 0.5ร); normalized to hit the exact grand target; distributes growth where it's realistic | Cannibalization-aware category allocation; reframes from fragrance-level scaling to category-share distribution; accounts for new-launch demand displacement | Primary driver โ moving the slider changes the scale factor and all downstream layers react instantly |
| 4. Overflow | Manual identification of cap violations and redistribution in the spreadsheet; easy to lose track across multiple scenarios | Automatic proportional redistribution to uncapped fragrances; V2 nearly eliminates overflow by design โ CT's 0.5ร weight keeps allocation well below cap in all realistic ranges | Dynamic cap treatment based on sell-through signals; production targets as planning ranges rather than hard ceilings; overflow threshold updated seasonally | V1 overflow grows linearly above ~14.6% growth; V2 overflow stays at zero throughout the realistic growth range |
| 5. Format Allocation | Manual percentage splits applied in a spreadsheet; shares not updated between seasons without analyst intervention | Rule-based automatic allocation using DuckDB 2025 format shares; fill capped formats first, then split remainder by prior-year share; CT treated as production commitments, not demand ceilings | Weekly intra-season demand shaping; format shares updated dynamically from MCP sell-through; new launch format shares derived from confirmed sell-through rather than proxy | CS, Cabana, CP formats all scale proportionally with slider; CT always produces exactly 5,442 regardless of growth target |