Allocating Bundle CM In Subscription Boxes With Rotating Contents

In subscription boxes where the SKU mix rotates monthly, fixed CM allocation hides which components are actually dragging margin. Here's how to run rolling-window allocation.
Quick answer
Use a 3-month rolling window with unit-weighted CM allocation, refreshed at each box drop. Fixed allocations (say, an even split across the 6 items in the box) hide the fact that a low-cost filler SKU may now represent 40% of shipped units and is quietly dragging blended CM down 3-5 points.
Rotating-Contents Subscription Box CM Allocation
Allocating contribution margin across subscription-box components when the SKU mix changes every cycle, using a rolling window instead of a fixed split.
In a subscription box, the shipped bundle changes monthly: a beauty box swaps in three new SKUs, a snack box rotates seasonal flavours, a pet box cycles chew toys. If you allocate contribution margin using a fixed rule (equal split, revenue-weighted from launch, or a frozen cost basis), the numbers stop reflecting reality after the first rotation. Rolling-window allocation recalculates each SKU's share of blended CM using the last N drops of actual shipped units and unit cost, so a filler SKU whose share crept from 10% to 40% of units is visible in the P&L before it shows up in the churn curve.
This is the subscription-box variant of the broader problem of attributing bundle margin back to component SKUs. The difference: your bundle isn't stable, so any allocation that treats it as stable will lie to you within one or two cycles.
The reader question this page resolves: how do I set up allocation so that when the mix rotates, my per-SKU CM contribution moves with it — without rebuilding the model every month?
Why fixed allocation breaks with rotating contents
A typical beauty box ships 5-7 SKUs per cycle at a fixed retail price of €25-€35. Ops picks the mix quarterly, negotiates supplier costs at the SKU level, and then finance allocates blended CM back to components using whatever rule was set at launch — usually a revenue-weighted or equal-cost split.
Two things quietly go wrong. First, high-margin "hero" SKUs get rotated out after 2-3 cycles because subscribers expect novelty. Second, a low-cost sample SKU from a supplier deal starts appearing in every box as a filler, so its share of shipped units climbs from 10% to 40% without anyone approving that shift explicitly.
The filler-SKU trap
A filler SKU with €0.80 landed cost looks cheap in isolation. But if it's now in 40% of shipped units, it's displacing a €4 hero SKU whose CM contribution was carrying the box. Blended CM per box drops 3-5 points before churn signals it.
How to detect it in your data
The signal is a widening gap between the CM you booked at bundle launch and the CM your actual shipments produce three cycles in. If your monthly bundle P&L still uses launch-time SKU weights, you'll only see the gap when someone reconciles COGS at quarter-end.
Practical detection: pull shipped-unit counts by SKU by cycle for the last 6 drops. Compute each SKU's share of shipped units per cycle. Any SKU whose share moved more than 15 percentage points between cycles is a candidate for re-weighting.
Then compute cycle-level blended CM = sum(SKU_units × SKU_unit_CM) / boxes_shipped. Compare it against the CM you're reporting internally. If those diverge by more than 2 points, your allocation rule is stale.
The rolling-window mechanic
Rolling 3-cycle CM allocation for a €29 beauty box (illustrative)
| SKU role | Unit share cycle 1 | Unit share cycle 3 | Unit CM (€) | CM contribution cycle 3 |
|---|---|---|---|---|
| Hero serum (rotating) | 20% | 8% | 6.20 | €0.50 |
| Full-size lipstick | 15% | 12% | 5.40 | €0.65 |
| Sample mask (filler) | 10% | 40% | 0.80 | €0.32 |
| Trial cream | 25% | 20% | 2.10 | €0.42 |
| Fragrance sachet | 15% | 12% | 1.30 | €0.16 |
| Accessory (rotating) | 15% | 8% | 3.40 | €0.27 |
The mechanic: at each drop, recompute allocation weights using shipped-unit shares from the last 3 cycles (the rolling window). A 3-cycle window is the sweet spot for monthly boxes — long enough to smooth one-off supplier deals, short enough to catch a filler creeping in. Quarterly boxes usually use a 2-cycle window; weekly boxes use 4-6.
UX and ops recommendations
Show cycle-over-cycle CM contribution per SKU in your ops dashboard, not just the current cycle. A single-cycle view lets a filler SKU hide; a trailing 3-cycle strip makes the drift visible to the merchandiser choosing next month's mix.
Set a hard rule at the merchandising step: no single SKU exceeds 25% of shipped units in any rolling 3-cycle window, unless it clears a minimum unit CM threshold. This converts allocation insight into a merchandising guardrail rather than a retrospective finance note.
Experiment ideas
Test 1: swap the highest-share filler SKU for a mid-cost SKU (€2-€3 unit cost) in one cohort's next box. Measure churn at day 30 and blended CM. If CM improves by ≥1.5 points with no churn delta, that filler was pure margin drag.
Test 2: A/B two window lengths (3-cycle vs 6-cycle) on the merchandiser's dashboard for a quarter. See which window length correlates with better cycle-over-cycle CM stability. Shorter windows react faster; longer windows produce calmer decisions.
Rotating-box CM allocation, answered
Because the mix rotates. A revenue-weighted split from month 1 stops describing what's actually in the box by month 3. You end up reporting CM against a bundle composition that no longer exists on the shipping line.
For monthly boxes, 3 cycles. For quarterly boxes, 2. For weekly boxes, 4-6. Shorter windows react faster to filler-SKU creep; longer windows smooth out one-off supplier deals. Pick based on how much cycle-to-cycle noise your merchandising already has.
Standard bundle attribution assumes a stable bundle composition — one Shopify bundle SKU, a fixed set of components. Rotating-box allocation adds the time dimension: composition changes every cycle, so weights have to move with it.
Yes, but you allocate at the cohort level, not the individual level. Group subscribers by preference cluster (e.g. "skincare-only", "mixed"), compute rolling CM per cluster, then blend up to a top-line box CM.
Give it its own line in the cycle's CM breakdown but don't let it distort the rolling window. Use a "hero-adjusted" blended CM alongside the raw blended CM so ops can see the effect of one-off inclusions.
It's not free — it displaces units of a paid SKU that would have contributed CM. Model the opportunity cost by assigning the filler a shadow unit CM equal to the SKU it displaced, and track blended CM both ways.
Rebalance at every drop for merchandising decisions, but only revise your allocation rule (the window length, the guardrail threshold) once a quarter. Frequent rule changes make cycle-over-cycle comparisons unreadable.
Shipping is a box-level cost, not a SKU-level one. Allocate it as an even share across units in the box, or use a weight-proportional split if you ship heavy items (e.g. pet-food boxes). Don't try to attribute shipping to individual component SKUs — the noise swamps the signal.
A spreadsheet works for the first 4-6 cycles. Once you have 10+ SKUs per box and 12+ cycles of history, the pivot logic gets fragile. At that point, pipe shipped-unit data and SKU cost into an analytics layer that computes rolling weights automatically.
Filler-heavy boxes typically show up as "perceived value drop" in exit surveys 2-3 cycles later. Rolling-window CM allocation gives you the leading indicator — you see the mix drift before subscribers rate the box lower and cancel.
Get an AI expert review of your site
Paste your URL — Metricuno's AI runs the same heuristic checks a senior CRO consultant would, scoring your page and prioritising the fixes that'll move conversion fastest.