Methodology
Subscription Box Unit Economics methodology
Educational only: Business decision support, not accounting, tax or legal advice.
Privacy: Calculations run locally; Margin101 does not receive your commercial inputs.
Update policy: Reviewed when formulas or official dependencies change.
Scope: Market-neutral small-business planning using your own assumptions.
1. Formulas and units
totalBoxesShipped = sum(active subscribers * (1 - failed payment rate))Where
- failedPaymentRate
- Failed payment rate (decimal fraction of active subscribers failing payment per cycle)Source: Business record
- totalBoxesShipped
- Boxes shipped (units)Source: Calculated output
totalNetPaidBoxes = sum(boxes shipped * (1 - refund rate))Where
- refundRate
- Refund rate (decimal fraction of shipped boxes refunded)Source: Business record
- totalBoxesShipped
- Boxes shipped (units)Source: Calculated output
- totalNetPaidBoxes
- Net paid boxes (units)Source: Calculated output
totalRevenueExTax = sum(net paid boxes * box price)Where
- boxPriceExTax
- Subscription box price (currency units/net paid box, ex tax)Source: Business record
- totalNetPaidBoxes
- Net paid boxes (units)Source: Calculated output
- totalRevenueExTax
- Subscription revenue (currency units, ex tax)Source: Calculated output
totalVariableCostExTax = contents + fulfilment + shipping + payment cost across shipped boxesWhere
- totalBoxesShipped
- Boxes shipped (units)Source: Calculated output
- totalVariableCostExTax
- Variable box cost (currency units, ex tax)Source: Calculated output
acquisitionCostExTax = new subscribers per cycle * cycles * acquisition costWhere
- newSubscribersPerCycle
- New subscribers per cycle (whole new subscribers/billing cycle)Source: Business record
- acquisitionCostExTax
- Subscriber acquisition cost (currency units, ex tax)Source: Calculated output
totalContributionExTax = revenue - variable box cost - acquisition costWhere
- totalRevenueExTax
- Subscription revenue (currency units, ex tax)Source: Calculated output
- totalVariableCostExTax
- Variable box cost (currency units, ex tax)Source: Calculated output
- acquisitionCostExTax
- Subscriber acquisition cost (currency units, ex tax)Source: Calculated output
- totalContributionExTax
- Subscription-box contribution (currency units, ex tax)Source: Calculated output
- contributionPerBoxExTax
- Contribution per box (currency units, ex tax)Source: Calculated output
contributionPerBoxExTax = expected paid revenue per box - product, fulfilment, shipping and payment costWhere
- productCostPerBoxExTax
- Product cost per box (currency units/shipped box, ex tax)Source: Business record
- shippingPerBoxExTax
- Shipping cost per box (currency units/shipped box, ex tax)Source: Business record
- totalRevenueExTax
- Subscription revenue (currency units, ex tax)Source: Calculated output
- totalContributionExTax
- Subscription-box contribution (currency units, ex tax)Source: Calculated output
- contributionPerBoxExTax
- Contribution per box (currency units, ex tax)Source: Calculated output
monthlyContributionExTax = contribution per box * opening subscribersWhere
- openingSubscribers
- Opening subscribers (whole active subscribers before first billing cycle)Source: Business record
- totalContributionExTax
- Subscription-box contribution (currency units, ex tax)Source: Calculated output
- contributionPerBoxExTax
- Contribution per box (currency units, ex tax)Source: Calculated output
- monthlyContributionExTax
- Opening cohort contribution (currency units, ex tax)Source: Calculated output
expectedLifetimeBoxes = 1 / churn rateWhere
- churnRate
- Subscriber churn per cycle (decimal fraction of active subscribers lost per billing cycle)Source: Business record
- expectedLifetimeBoxes
- Expected lifetime boxes (units)Source: Calculated output
contributionLtvExTax = contribution per box * expected lifetime boxesWhere
- totalContributionExTax
- Subscription-box contribution (currency units, ex tax)Source: Calculated output
- contributionPerBoxExTax
- Contribution per box (currency units, ex tax)Source: Calculated output
- expectedLifetimeBoxes
- Expected lifetime boxes (units)Source: Calculated output
- contributionLtvExTax
- Contribution lifetime value (currency units, ex tax)Source: Calculated output
acquisitionPaybackCycles = acquisition cost / positive contribution per boxWhere
- acquisitionCostExTax
- Subscriber acquisition cost (currency units, ex tax)Source: Calculated output
- totalContributionExTax
- Subscription-box contribution (currency units, ex tax)Source: Calculated output
- contributionPerBoxExTax
- Contribution per box (currency units, ex tax)Source: Calculated output
- acquisitionPaybackCycles
- Acquisition payback cycles (units)Source: Calculated output
netContributionLtvExTax = contribution lifetime value - acquisition costWhere
- acquisitionCostExTax
- Subscriber acquisition cost (currency units, ex tax)Source: Calculated output
- totalContributionExTax
- Subscription-box contribution (currency units, ex tax)Source: Calculated output
- contributionLtvExTax
- Contribution lifetime value (currency units, ex tax)Source: Calculated output
- netContributionLtvExTax
- Net contribution lifetime value (currency units, ex tax)Source: Calculated output
contributionMargin = contribution / revenueWhere
- totalRevenueExTax
- Subscription revenue (currency units, ex tax)Source: Calculated output
- totalContributionExTax
- Subscription-box contribution (currency units, ex tax)Source: Calculated output
- contributionMargin
- Subscription-box margin (decimal rate)Source: Calculated output
endingSubscribers = active subscribers after cycle-by-cycle churnWhere
- endingSubscribers
- Ending subscribers (units)Source: Calculated output
Money inputs and outputs use the currency selected in the scenario without changing the canonical methodology. Rates, margins, utilisation and buffers are entered as percentages and converted to decimal values for calculation.
2. Worked example
Input assumptions
The worked rows below are evaluated at render time by the same shared engine and visible default fixture as the interactive workflow.
- Opening subscribers
- 100 whole active subscribers before first billing cycle
- New subscribers per cycle
- 10 whole new subscribers/billing cycle
- Billing cycles projected
- 6 whole billing cycles/projection
- Subscription box price
- 50 currency units/net paid box, ex tax
- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Payment fee rate
- 0.02 decimal fraction of box revenue
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Failed payment rate
- 0.1 decimal fraction of active subscribers failing payment per cycle
- Refund rate
- 0.05 decimal fraction of shipped boxes refunded
- Subscriber churn per cycle
- 0.1 decimal fraction of active subscribers lost per billing cycle
- Acquisition cost per new subscriber
- 20 currency units/new subscriber, ex tax
Calculation and outputs
Boxes shipped
totalBoxesShipped = sum(active subscribers * (1 - failed payment rate))- Opening subscribers
- 100 whole active subscribers before first billing cycle
- New subscribers per cycle
- 10 whole new subscribers/billing cycle
- Payment fee rate
- 0.02 decimal fraction of box revenue
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Failed payment rate
- 0.1 decimal fraction of active subscribers failing payment per cycle
- Refund rate
- 0.05 decimal fraction of shipped boxes refunded
- Subscriber churn per cycle
- 0.1 decimal fraction of active subscribers lost per billing cycle
- Ending subscribers
- 95.31441 units
Engine result: 582.17031 units
Net paid boxes
totalNetPaidBoxes = sum(boxes shipped * (1 - refund rate))- Payment fee rate
- 0.02 decimal fraction of box revenue
- Failed payment rate
- 0.1 decimal fraction of active subscribers failing payment per cycle
- Refund rate
- 0.05 decimal fraction of shipped boxes refunded
- Subscriber churn per cycle
- 0.1 decimal fraction of active subscribers lost per billing cycle
- Boxes shipped
- 582.17031 units
- Expected lifetime boxes
- 10 units
Engine result: 553.061795 units
Subscription revenue
totalRevenueExTax = sum(net paid boxes * box price)- Subscription box price
- 50 currency units/net paid box, ex tax
- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Boxes shipped
- 582.17031 units
- Net paid boxes
- 553.061795 units
- Variable box cost
- 15,427.513215 money
- Subscription-box contribution
- 11,025.57651 money
- Contribution per box
- 21 money
- Expected lifetime boxes
- 10 units
- Net contribution lifetime value
- 190 money
- Subscription-box margin
- 0.39871 percent
Engine result: 27,653.089725 money
Variable box cost
totalVariableCostExTax = contents + fulfilment + shipping + payment cost across shipped boxes- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Payment fee rate
- 0.02 decimal fraction of box revenue
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Failed payment rate
- 0.1 decimal fraction of active subscribers failing payment per cycle
- Acquisition cost per new subscriber
- 20 currency units/new subscriber, ex tax
- Boxes shipped
- 582.17031 units
- Net paid boxes
- 553.061795 units
- Subscriber acquisition cost
- 1,200 money
- Expected lifetime boxes
- 10 units
Engine result: 15,427.513215 money
Subscriber acquisition cost
acquisitionCostExTax = new subscribers per cycle * cycles * acquisition cost- Opening subscribers
- 100 whole active subscribers before first billing cycle
- New subscribers per cycle
- 10 whole new subscribers/billing cycle
- Billing cycles projected
- 6 whole billing cycles/projection
- Product cost per box
- 15 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Subscriber churn per cycle
- 0.1 decimal fraction of active subscribers lost per billing cycle
- Acquisition cost per new subscriber
- 20 currency units/new subscriber, ex tax
- Variable box cost
- 15,427.513215 money
- Acquisition payback cycles
- 0.952381 units
- Ending subscribers
- 95.31441 units
Engine result: 1,200 money
Subscription-box contribution
totalContributionExTax = revenue - variable box cost - acquisition cost- Subscription box price
- 50 currency units/net paid box, ex tax
- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Acquisition cost per new subscriber
- 20 currency units/new subscriber, ex tax
- Subscription revenue
- 27,653.089725 money
- Variable box cost
- 15,427.513215 money
- Subscriber acquisition cost
- 1,200 money
- Contribution per box
- 21 money
- Acquisition payback cycles
- 0.952381 units
- Subscription-box margin
- 0.39871 percent
Engine result: 11,025.57651 money
Contribution per box
contributionPerBoxExTax = expected paid revenue per box - product, fulfilment, shipping and payment cost- Subscription box price
- 50 currency units/net paid box, ex tax
- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Payment fee rate
- 0.02 decimal fraction of box revenue
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Failed payment rate
- 0.1 decimal fraction of active subscribers failing payment per cycle
- Acquisition cost per new subscriber
- 20 currency units/new subscriber, ex tax
- Net paid boxes
- 553.061795 units
- Subscription revenue
- 27,653.089725 money
- Variable box cost
- 15,427.513215 money
- Subscriber acquisition cost
- 1,200 money
- Subscription-box contribution
- 11,025.57651 money
- Expected lifetime boxes
- 10 units
- Subscription-box margin
- 0.39871 percent
Engine result: 21 money
Opening cohort contribution
monthlyContributionExTax = contribution per box * opening subscribers- Opening subscribers
- 100 whole active subscribers before first billing cycle
- New subscribers per cycle
- 10 whole new subscribers/billing cycle
- Subscription box price
- 50 currency units/net paid box, ex tax
- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Variable box cost
- 15,427.513215 money
- Subscription-box contribution
- 11,025.57651 money
- Contribution per box
- 21 money
- Contribution lifetime value
- 210 money
- Net contribution lifetime value
- 190 money
- Subscription-box margin
- 0.39871 percent
- Ending subscribers
- 95.31441 units
Engine result: 2,100 money
Expected lifetime boxes
expectedLifetimeBoxes = 1 / churn rate- Payment fee rate
- 0.02 decimal fraction of box revenue
- Failed payment rate
- 0.1 decimal fraction of active subscribers failing payment per cycle
- Refund rate
- 0.05 decimal fraction of shipped boxes refunded
- Subscriber churn per cycle
- 0.1 decimal fraction of active subscribers lost per billing cycle
Engine result: 10 units
Contribution lifetime value
contributionLtvExTax = contribution per box * expected lifetime boxes- Subscription box price
- 50 currency units/net paid box, ex tax
- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Boxes shipped
- 582.17031 units
- Net paid boxes
- 553.061795 units
- Variable box cost
- 15,427.513215 money
- Subscription-box contribution
- 11,025.57651 money
- Contribution per box
- 21 money
- Opening cohort contribution
- 2,100 money
- Expected lifetime boxes
- 10 units
- Net contribution lifetime value
- 190 money
- Subscription-box margin
- 0.39871 percent
Engine result: 210 money
Acquisition payback cycles
acquisitionPaybackCycles = acquisition cost / positive contribution per box- Subscription box price
- 50 currency units/net paid box, ex tax
- Product cost per box
- 15 currency units/shipped box, ex tax
- Packaging and fulfilment per box
- 5 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Fixed payment fee per box
- 0.5 currency units/shipped box, ex tax
- Acquisition cost per new subscriber
- 20 currency units/new subscriber, ex tax
- Variable box cost
- 15,427.513215 money
- Subscriber acquisition cost
- 1,200 money
- Subscription-box contribution
- 11,025.57651 money
- Contribution per box
- 21 money
- Opening cohort contribution
- 2,100 money
- Contribution lifetime value
- 210 money
- Net contribution lifetime value
- 190 money
- Subscription-box margin
- 0.39871 percent
Engine result: 0.952381 units
Net contribution lifetime value
netContributionLtvExTax = contribution lifetime value - acquisition cost- Product cost per box
- 15 currency units/shipped box, ex tax
- Shipping cost per box
- 5 currency units/shipped box, ex tax
- Acquisition cost per new subscriber
- 20 currency units/new subscriber, ex tax
- Variable box cost
- 15,427.513215 money
- Subscriber acquisition cost
- 1,200 money
- Subscription-box contribution
- 11,025.57651 money
- Contribution per box
- 21 money
- Opening cohort contribution
- 2,100 money
- Expected lifetime boxes
- 10 units
- Contribution lifetime value
- 210 money
- Acquisition payback cycles
- 0.952381 units
- Subscription-box margin
- 0.39871 percent
Engine result: 190 money
Subscription-box margin
contributionMargin = contribution / revenue- Subscription revenue
- 27,653.089725 money
- Subscription-box contribution
- 11,025.57651 money
- Contribution per box
- 21 money
- Opening cohort contribution
- 2,100 money
- Contribution lifetime value
- 210 money
- Net contribution lifetime value
- 190 money
Engine result: 0.39871 percent
Ending subscribers
endingSubscribers = active subscribers after cycle-by-cycle churn- Opening subscribers
- 100 whole active subscribers before first billing cycle
- New subscribers per cycle
- 10 whole new subscribers/billing cycle
- Subscriber churn per cycle
- 0.1 decimal fraction of active subscribers lost per billing cycle
Engine result: 95.31441 units
Example
The worked rows below are evaluated at render time by the same shared engine and visible default fixture as the interactive workflow.
- Boxes shipped
- 582.17
- Net paid boxes
- 553.06
- Subscription revenue
- 27,653.09 currency units
- Variable box cost
- 15,427.51 currency units
- Subscriber acquisition cost
- 1,200 currency units
- Subscription-box contribution
- 11,025.58 currency units
- Contribution per box
- 21 currency units
- Opening cohort contribution
- 2,100 currency units
- Expected lifetime boxes
- 10
- Contribution lifetime value
- 210 currency units
- Acquisition payback cycles
- 0.95
- Net contribution lifetime value
- 190 currency units
- Subscription-box margin
- 39.9%
- Ending subscribers
- 95.31
The exact engine-derived outputs are shown in the labelled rows below.
Interpretation
Box contribution should be reviewed with churn and acquisition recovery, not shipment margin alone.
3. Validation and boundary checks
- All inputs must be finite and inside the visible validation boundaries.
- Rates are retained as decimal values and shown as percentages only at the presentation boundary.
- The worked fixture must expose every declared result: totalBoxesShipped, totalNetPaidBoxes, totalRevenueExTax, totalVariableCostExTax, acquisitionCostExTax, totalContributionExTax, contributionPerBoxExTax, monthlyContributionExTax, expectedLifetimeBoxes, contributionLtvExTax, acquisitionPaybackCycles, netContributionLtvExTax, contributionMargin, endingSubscribers.
- Scenario comparison changes one declared driver while holding the remaining industry records constant.
- Opening subscribers minimum
openingSubscribers โฅ 0 whole active subscribers before first billing cycleโ A lower value is rejected before calculation.- Opening subscribers maximum
openingSubscribers โค 100,000,000 whole active subscribers before first billing cycleโ A higher value is rejected before calculation.- New subscribers per cycle minimum
newSubscribersPerCycle โฅ 0 whole new subscribers/billing cycleโ A lower value is rejected before calculation.- New subscribers per cycle maximum
newSubscribersPerCycle โค 100,000,000 whole new subscribers/billing cycleโ A higher value is rejected before calculation.- Billing cycles projected minimum
billingCycles โฅ 0 whole billing cycles/projectionโ A lower value is rejected before calculation.- Billing cycles projected maximum
billingCycles โค 120 whole billing cycles/projectionโ A higher value is rejected before calculation.- Subscription box price minimum
boxPriceExTax โฅ 0 currency units/net paid box, ex taxโ A lower value is rejected before calculation.- Subscription box price maximum
boxPriceExTax โค 10,000,000 currency units/net paid box, ex taxโ A higher value is rejected before calculation.- Product cost per box minimum
productCostPerBoxExTax โฅ 0 currency units/shipped box, ex taxโ A lower value is rejected before calculation.- Product cost per box maximum
productCostPerBoxExTax โค 10,000,000 currency units/shipped box, ex taxโ A higher value is rejected before calculation.- Packaging and fulfilment per box minimum
packagingFulfilmentPerBoxExTax โฅ 0 currency units/shipped box, ex taxโ A lower value is rejected before calculation.- Packaging and fulfilment per box maximum
packagingFulfilmentPerBoxExTax โค 10,000,000 currency units/shipped box, ex taxโ A higher value is rejected before calculation.- Shipping cost per box minimum
shippingPerBoxExTax โฅ 0 currency units/shipped box, ex taxโ A lower value is rejected before calculation.- Shipping cost per box maximum
shippingPerBoxExTax โค 10,000,000 currency units/shipped box, ex taxโ A higher value is rejected before calculation.- Payment fee rate minimum
paymentFeeRate โฅ 0 decimal fraction of box revenueโ A lower value is rejected before calculation.- Payment fee rate maximum
paymentFeeRate โค 1 decimal fraction of box revenueโ A higher value is rejected before calculation.- Fixed payment fee per box minimum
paymentFeeFixedExTax โฅ 0 currency units/shipped box, ex taxโ A lower value is rejected before calculation.- Fixed payment fee per box maximum
paymentFeeFixedExTax โค 10,000,000 currency units/shipped box, ex taxโ A higher value is rejected before calculation.- Failed payment rate minimum
failedPaymentRate โฅ 0 decimal fraction of active subscribers failing payment per cycleโ A lower value is rejected before calculation.- Failed payment rate maximum
failedPaymentRate โค 1 decimal fraction of active subscribers failing payment per cycleโ A higher value is rejected before calculation.- Refund rate minimum
refundRate โฅ 0 decimal fraction of shipped boxes refundedโ A lower value is rejected before calculation.- Refund rate maximum
refundRate โค 1 decimal fraction of shipped boxes refundedโ A higher value is rejected before calculation.- Subscriber churn per cycle minimum
churnRate โฅ 0 decimal fraction of active subscribers lost per billing cycleโ A lower value is rejected before calculation.- Subscriber churn per cycle maximum
churnRate โค 1 decimal fraction of active subscribers lost per billing cycleโ A higher value is rejected before calculation.- Acquisition cost per new subscriber minimum
acquisitionCostPerNewSubscriberExTax โฅ 0 currency units/new subscriber, ex taxโ A lower value is rejected before calculation.- Acquisition cost per new subscriber maximum
acquisitionCostPerNewSubscriberExTax โค 10,000,000 currency units/new subscriber, ex taxโ A higher value is rejected before calculation.
4. Assumptions and source classification
- Costs, capacity, contract terms, tax rates and targets are supplied by the user.
- No provider default, jurisdictional rule or industry benchmark is embedded.
- The shared engine retains full precision and display formatting never feeds calculation.
This planner has no current policy-data dependency. Its commercial assumptions are user supplied. Registered family-level regression suites exercise the shared business-logic engine and worked-result reconciliation.
5. Limitations
- Results are only as reliable as the timing, scope and basis of the entered records.
- The workflow does not predict demand or establish accounting, tax, contractual or legal treatment.
This is educational decision support, not tax, accounting, legal or financial advice. Check the treatment of your actual transactions under the rules that apply to your business and seek qualified advice where appropriate.
6. Update and evidence policy
Registered family-level suites test formula invariants and example reconciliation; the release ledger records that coverage without claiming a separate oracle for every line of public copy. There is no official threshold or benchmark to refresh for this planner. Commercial inputs remain user-supplied because they vary by business and contract.
Change history
- : Initial public release of the planner and methodology after pre-launch calculation, content, source and interaction review.
Related reading
Guides to interpret the decision and its assumptions.
- Subscription Box Churn and Inventory Commitment
Translate finite subscriber scenarios into inventory commitments without treating churn or demand as known.
Read guide