๐ŸŽš๏ธ Growth Target: 28.5%
10%15%
โ–ฒV1 cap
20%25%
Bear
30%
Bull
35%40%45%50%
Grand Target (units) 30,538
Actual Production Plan 32,735
V1 CT Overflow 631 units
CT V2 Headroom 2,197 units
Scenario Base

Grow Fragrance Forecasting Engine

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 Slider

What This Engine Does

Each 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.

1

Historical Demand

Pull actual sales from DuckDB for prior seasons

โ†’
2

Decay Model

Estimate how each fragrance grows or shrinks by age

โ†’
3

โ˜… Reconciliation

Scale to hit the growth target (slider controls this)

โ†’
4

Overflow

Redirect excess from capped fragrances

โ†’
5

Format Allocation

Split into spray, candle, car freshener, packs

Summer 2026 Example Lineup

๐ŸŒด
Coconut Soleil
Year 1 โ€” NEW
Raw forecast: 7,845 units
Elasticity weight: 1.5ร—
โ˜€๏ธ
Cabana
Year 2 โ€” Returning
2025 actual: 9,895 units
Elasticity weight: 1.2ร—
๐Ÿ
Coconut Pineapple
Year 3 โ€” Returning
2025 actual: 4,823 units
Elasticity weight: 0.8ร—
๐ŸŒŠ
Coastal Tide
Year 5 โ€” SUNSET
All formats production-committed
Elasticity weight: 0.5ร—

Layer 1 โ€” Historical Demand (fixed โ€” not affected by slider)

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.

V1 Manual extraction from Shopify + Amazon exports in Excel. Amazon multi-packs decomposed by hand.
V2 Single parameterized SQL query against DuckDB. Auto-detects available years. Amazon already decomposed at ETL level.
Future State MCP integration expands to 4+ seasons automatically, tightening pooled decay estimates in Layer 2.

Historical Summer Demand โ€” Actual Units Sold in DuckDB

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.

FragranceSummer 2024Summer 2025YoY ChangeRole in 2026
๐ŸŒด Coconut Soleilโ€”โ€”โ€”New launch
โ˜€๏ธ Cabanaโ€”9,895NewY2 returning
๐Ÿ Coconut Pineapple8,4444,823โˆ’42.9%Y3 returning
๐ŸŒŠ Coastal Tide6,4195,327โˆ’17.0%Y5 sunset
Pomelo3,264939โˆ’71.2% โ†’ bounded โˆ’50%Retired
Sea Salt Neroli4,1261,777โˆ’56.9% โ†’ bounded โˆ’50%Retired
Discovery Packs1,6601,004โˆ’39.5%Fixed allocation
Grand Total23,91323,765โˆ’0.6%Grand Base for 2026

Layer 2 โ€” Fragrance Age Decay Model (fixed โ€” not affected by slider)

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.

V1 Each fragrance uses a single comparable proxy's observed YoY rate (e.g., Cabana's Y1โ†’Y2 uses Coconut Pineapple's own Y1โ†’Y2 transition of โˆ’24.8%).
V2 Pooled decay curves built from all fragrances in the database. The pooled median (n=20 transitions) is used as the base rate, then individual overrides are applied. Standard deviation of pooled curve drives prediction intervals in Layer 5.
Future State Cannibalization model: when Coconut Soleil launches, it will pull demand from existing fragrances. A "cannibalization rate" parameter would apply a downward adjustment to returning frags proportional to the new launch's market share.

The Core Intuition: Fragrances Have Lifecycles

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.

How Fragrance Demand Typically Decays with Age

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.

Pooled Decay Curves: Category-Wide Distribution by Age Transition

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.

The Spread at Y1โ†’Y2: Why Pooling Matters

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).

The โˆ’50% Decay Bound

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.

Estimating New Fragrances (Year 1)

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.

CS โ‰ˆ avg(Cabana Y1, Coconut Pineapple Y1) ร— Market Growth Factor (1.066)
โ‰ˆ avg(9,895 + 8,444) / 2 ร— 1.066 โ‰ˆ 9,775
Engine output from forecast_output.json: 7,845 units
๐Ÿ“ Formula note The conceptual formula above yields ~9,775, but the engine's actual output is 7,845. The forecast script applies additional calibration steps (seasonality adjustments, growth factor sequencing) that produce the final figure. All interactive charts use the engine's actual output of 7,845.

New Launch Estimation: Coconut Soleil โ€” Inputs and Engine Output

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.

Future State โ€” Cannibalization Adjustment The current decay model treats each fragrance independently. In reality, when Coconut Soleil launches alongside Cabana, a portion of its demand comes from buyers who would otherwise have purchased Cabana โ€” this is cannibalization. A future enhancement would add a "cannibalization rate" parameter and apply a corresponding downward adjustment to returning fragrance forecasts. This requires 2โ€“3 more years of new-launch cycles to calibrate reliably.

Cannibalization Effect: Summer 2025 Evidence

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.

Cannibalization Effect: Summer 2024 vs. Summer 2025

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.

Future State โ€” Intra-Season Demand Shaping Currently the engine produces a single seasonal total per fragrance (e.g., "produce 7,845 Coconut Soleil units"). A future layer would distribute this total across weeks within the season โ€” capturing the typical launch spike in weeks 1โ€“3, followed by a gradual plateau and late-season decline. This is especially valuable for production scheduling: knowing that ~60% of demand concentrates in the first five weeks allows inventory to be staged at launch rather than building throughout the season. This enhancement requires 3+ seasons of weekly sell-through data to build reliable shape curves.

Decay Rates Applied โ€” Layer 2 Raw Forecasts

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.

Fragrance2025 BaseRate AppliedSourceRaw 2026 Forecast
๐ŸŒด Coconut Soleilโ€”โ€”Avg(Cabana Y1, CP Y1) ร— 1.0667,845
โ˜€๏ธ Cabana9,895โˆ’24.8%Override (config)7,441
๐Ÿ Coconut Pineapple4,823โˆ’50.0%Override (bounded max)2,412
๐ŸŒŠ Coastal Tide5,327โˆ’21.5%Override (config)4,182
Raw Total (no packs)โ€”โ€”โ€”21,880
๐Ÿ“Š Pooled Decay Curve โ€” n=20 transitions observed The database only has 2 years of seasonal data (2024 + 2025), providing transitions for the Y1โ†’Y2 age bucket only. Median decay at Y1โ†’Y2 = โˆ’24.3%, standard deviation = 70.3pp (very wide โ€” confirming why using a single proxy is risky). As more seasons accumulate, the pooled curve will cover Y2โ†’Y3, Y3โ†’Y4, etc.

5-Year Forward Decay Projections (non-dynamic)

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.

๐ŸŒด Coconut Soleil โ€” New Launch (Year 1 in 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.

โ˜€๏ธ Cabana โ€” Year 2 (Y1โ†’Y2 override: โˆ’24.8%)

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.

๐Ÿ Coconut Pineapple โ€” Year 3 (bounded at โˆ’50%)

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.

๐ŸŒŠ Coastal Tide โ€” Year 5 (Sunset after 2026)

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.

Layer 3 โ€” Top-Down Reconciliation โ˜… Use the slider to explore!

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.

โ˜… Interactive: move the slider to change the growth target. The charts below, the overflow in Layer 4, the Sankey in Layer 5, and the SKU table all react instantly.

The Gap: Bottom-Up vs. Growth Target ๐Ÿ“Š Base 28.5%

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.

V1 โ€” Uniform Proportional Scaling
Every fragrance receives the same scale factor: 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.

Key consequence: At growth rates above ~14.6%, V1 allocates more to Coastal Tide than its format caps can absorb, generating overflow that must be redistributed in Layer 4.
V2 โ€” Elasticity-Weighted Scaling
Each fragrance receives a weight based on its age, reflecting real growth potential. New launches (Y1=1.5ร—) have novelty, marketing support, and a fresh audience. Sunsetting fragrances (Y5=0.5ร—) are being wound down. Weights are normalized so the total still hits the exact target.

Key consequence: Within any realistic growth range, CT never hits its production cap under V2 โ€” the 0.5ร— weight allocates it far below the cap. This nearly eliminates the overflow problem before it starts.

V1 vs V2 โ€” How Scaling Is Distributed Across Fragrances (live โ€” move slider)

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.

โš ๏ธ V1 Overflow Active Coastal Tide's V1 allocation (โ€”) exceeds its total non-pack production cap of 4,442. The โ€” overflow units will be redistributed proportionally to Coconut Soleil, Cabana, and Coconut Pineapple in Layer 4.
V2 elasticity-weighted scaling prevents this entirely โ€” CT's V2 allocation is โ€”, well under the cap.

Elasticity Weights & Scale Factors by Fragrance (CT label turns red when V1 cap is hit)

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.

Layer 4 โ€” Overflow Redistribution (reactive)

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.

V1 At growth rates above ~14.6%, V1 allocates Coastal Tide above its 4,442 non-pack cap. The overflow is redistributed to the other three fragrances proportionally. Move the slider to see this grow.
V2 With CT's elasticity weight at 0.5ร—, the engine naturally allocates CT far below its cap at all realistic growth rates. Overflow is effectively zero โ€” no redistribution needed. The model has already "decided" that CT deserves less than its production minimum.
Future State Overflow logic unchanged โ€” already robust. The bigger question (when MCP data arrives) is whether CT's format caps should be treated as planning targets rather than hard ceilings, and whether they should be dynamically adjusted based on sell-through rate signals.

Overflow Behavior: V1 vs V2 (live)

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.

Overflow Flow: Where Coastal Tide's Excess Goes (V1) (live)

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.

Layer 5 โ€” Format Allocation (fully reactive)

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.

V2 Format allocation uses actual 2025 format share data from DuckDB. Coconut Soleil borrows Cabana's 2025 format shares as proxy (89.27% spray / 10.73% 3-wick for the uncapped portion). Coastal Tide's format allocations are all production commitments โ€” fixed regardless of modeled demand.
Key observation: Coastal Tide always produces exactly 5,442 units โ€” regardless of the slider CT's format targets (spray=4,000, 6.5oz candle=98, 3-wick=344, packs=1,000) are production commitments, not demand ceilings. Even as the model allocates CT fewer units at lower growth rates, the production floor stays fixed at 5,442. Only Coconut Soleil, Cabana, and Coconut Pineapple scale with the slider.

Format Allocation Flow โ€” 32,735 total units (live โ€” move slider)

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.

Final SKU-Level Forecast (updates with slider)

FragranceFormatUnitsType

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.

Scenario Summary

Pipeline Summary: From 2025 Actuals to Final Production Plan (live)

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.

Prediction Intervals โ€” 70% and 90% Confidence (point forecasts scale with slider)

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.

Putting It All Together

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.

The Complete Pipeline โ€” V1 vs. V2 vs. Future State

LayerV1 ApproachV2 ImprovementFuture StateSlider 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
๐ŸŽฏ Key design principle: separation of concerns Each layer has one job. Layer 2 estimates what would happen if we let fragrances age naturally. Layer 3 imposes what the business wants to happen. Layers 4 and 5 resolve the practical constraints that prevent that clean allocation from flowing directly to the SKU plan. The slider only touches Layer 3's growth target โ€” but because every downstream layer depends on Layer 3's output, everything reacts. This separation means you can audit each layer independently and improve them one at a time.
๐Ÿ“Š Summer 2026 Base Scenario (28.5% growth target) Grand target: 30,538 units  ยท  Raw bottom-up: 25,880  ยท  Gap closed by Layer 3: 4,658 units  ยท  V1 overflow at 28.5%: 0 (just above ~14.6% threshold)  ยท  CT production floor surplus: ~2,197 units  ยท  Actual production plan: ~32,735 units
Grow Fragrance โ€” Forecasting Engine Interactive Explainer ยท Summer 2026 ยท v2 Engine