Conversion Optimization

Free Shipping Thresholds: Replay Existing Orders Before Forecasting Growth

Measure the subsidy hidden in a lower shipping threshold, calculate a defensible recovery hurdle, and test the customer promise without mistaking higher order value for higher contribution.

Lowering a free-shipping threshold can feel like an obvious conversion improvement. The benefit is visible to shoppers; the cost is less visible in a growth dashboard. Some customers who would already have purchased now pay less shipping, while genuinely additional demand remains a hypothesis. Before predicting uplift, calculate what the policy does to the orders you already have.

This guide is for D2C founders, ecommerce growth teams and consumer startups. It builds a fixed-order replay: apply two shipping policies to one unchanged historical population, calculate the contribution difference, then express the behavioral response needed to recover any loss. It is a screening method, not a causal estimator or an optimizer.

Four useful takeaways

  • Separate the subsidy on existing orders from genuinely additional demand.
  • Use basket-level eligibility, not an average order value that hides the threshold boundary.
  • Include customer shipping revenue and carrier expense separately; free shipping removes a charge, not the delivery cost.
  • Evaluate contribution per eligible visitor and customer-experience guardrails in a subsequent controlled test.

The working set includes a policy review worksheet, interactive replay calculator and evidence-review prompt. Each addresses a different job: agree the contract, do the arithmetic and challenge the decision memo.

Why revisit the economics now

Shopify published updated free-shipping guidance on September 26, 2026, covering thresholds, cost coverage and communication. That is a current industry signal, not measured keyword demand or a guarantee that a particular store should change its offer. Source: Shopify's guide.

As teams prepare seasonal campaigns, an offer can spread across a banner, product page, cart drawer and checkout before anyone has written one shared eligibility rule. The practical risk is not just overspending on shipping. It is evaluating a different promise from the one customers actually experience. This article proposes an explicit policy and cost contract before a launch.

Baymard's product-page research warns against relying only on a site-wide banner to communicate free shipping and discusses the importance of qualifying conditions. Source: Baymard research. That supports a communication check; it does not supply your store's expected conversion uplift. No abandonment statistic is used here as a forecast input.

Write a policy that can be executed

Choose one currency, delivery service and eligible shipping zone. Define the subtotal that qualifies: this example uses merchandise value after discounts, excluding tax and shipping. Equality qualifies, so a basket of exactly 50 receives free shipping at a threshold of 50. If the store uses a different basis, change the contract and implementation together.

List exceptions such as bulky products, remote destinations, subscription benefits, express delivery and separate shipping profiles. A flat-fee model should not silently combine them. Split the analysis into compatible populations or use a richer rate engine. The simplicity of a calculator is useful only when its assumptions match the decision.

Freeze the period and eligible order population before comparing policies. Retain low-value orders, negative-contribution orders and unknown classifications until they are resolved. Removing inconvenient records can make the proposal look attractive without changing any customer economics. Record the extraction version and reconcile the included count to the source.

Shipping rules can be configured in more than one way. Shopify's March 26 update describes setting minimum order value on a shipping option. Source: shipping-options update. This article does not change configuration or assume that every merchant's rules follow the simplified model.

Separate the charge from the expense

For each eligible order, capture merchandise revenue, variable costs excluding carrier expense, carrier expense and the shipping charge paid by the customer. Keep all values on the same tax-exclusive basis. Variable costs may include product cost, packaging, payment fees and other marginal fulfillment costs, but define coverage precisely so the carrier bill is not subtracted twice.

The contribution model is merchandise revenue minus variable costs minus carrier expense plus customer shipping revenue. This is contribution under the declared cost boundary, not accounting net profit. Fixed overhead is not automatically incremental to a shipping-policy test. If the proposal requires a new fixed operating commitment, evaluate that separately and label it.

The fixed replay deliberately holds costs constant. In reality, payment-processing cost might fall slightly when the customer pays a lower total; a larger basket might require a heavier parcel; or an extra unit might trigger another package. If those effects matter, extend the replay with explicit evidence. Do not insert an unexplained adjustment to make the result positive.

Replay the same orders under both policies

Let B be the qualifying basket, V variable cost excluding carrier, S carrier cost, F the flat fee and T the free-shipping threshold. Per-order contribution is B − V − S + F × indicator(B < T). For repeated identical orders, multiply by their count. Sum under the current threshold and the proposed threshold.

The merchandise and cost terms cancel when comparing the same frozen orders. Therefore the change equals F multiplied by the number of orders losing free-shipping eligibility minus the number newly qualifying. This independent identity is a useful reconciliation check. A mismatch signals inconsistent populations, changed costs or an implementation error.

When lowering the threshold, the affected baskets lie at or above the new threshold but below the old one. Baskets below both still pay the fee, and baskets above both were already free. When raising it, the affected interval reverses eligibility. The model may then show a static gain, but it does not know how many shoppers will reject the more expensive delivery promise.

Do not use broad basket bands that cross either threshold. A band with average value 60 could hide orders at 45 and 75, whose eligibility differs from an order exactly at 60. Individual anonymous order rows are safest; aggregate only rows that share the relevant values. The interactive tool accepts up to 200 exact bands for a compact review.

A synthetic example in euros

The current threshold is EUR75, the proposed threshold EUR50 and the shipping fee EUR5. The population contains 100 orders with basket EUR40, variable cost EUR24 and carrier expense EUR6; 80 orders with values 60, 36 and 6; and 40 orders with values 90, 54 and 7.

Current contribution is 100 × (40−24−6+5) + 80 × (60−36−6+5) + 40 × (90−54−7), or EUR4,500. Under the lower threshold, the middle group no longer pays EUR5. Proposed contribution is EUR4,100. Eighty orders newly qualify, reconciling the EUR400 loss to 80 × EUR5.

The free-shipping share rises from 40/220 to 120/220, while frozen merchandise revenue is unchanged. That is an important distinction: a more generous policy can look better on an offer-adoption dashboard without creating any additional order. This replay has deliberately assumed no behavior so the existing-order cost remains visible.

Calculate the recovery hurdle without pretending to forecast

Suppose a genuinely additional order contributes EUR12 under the proposed policy after every applicable marginal cost. Recovering EUR400 requires ceiling(400/12), or 34 additional orders. Thirty-three contribute EUR396 and fall short; 34 contribute EUR408. The hurdle is 15.45% of the 220 historical orders.

That is not 15.45 percentage points of conversion-rate improvement. A conversion calculation requires a consistent eligible-visitor denominator, and historical purchasers do not provide it. It is also not a forecast that 34 people will buy. The number states what would be needed under an assumed additional-order contribution.

If the additional-order contribution is zero, no finite number of those orders recovers a positive loss. If it is negative, more such orders make the economics worse. The companion calculator rejects negative input for this recovery model and clearly labels the zero-contribution case. A zero static loss needs no recovery, but it still does not establish that the policy is commercially safe.

Existing buyers adding an item are not additional orders. Model the contribution of their added merchandise, any extra carrier or fulfillment cost and the lost shipping charge separately. Also consider split orders, purchases brought forward from the future and acquired orders that incur incremental media cost. Counting all of these as new demand overstates recovery.

Implement an independent integer-cent replay

The example below uses integer cents and positive whole order counts. It runs offline in JavaScript and neither reads customer records nor changes a store. The production calculator parses decimal strings into cents before performing the same arithmetic. Integer minor units avoid inconsistent rounding at the threshold boundary.

function replay(rows, threshold, fee) {
  if (!Array.isArray(rows) || !rows.length || rows.length > 200)
    throw new Error('Supply 1 to 200 exact bands');
  for (const n of [threshold, fee])
    if (!Number.isSafeInteger(n) || n < 0 || n > 100000000)
      throw new Error('Invalid policy amount');
  let orders = 0, free = 0, contribution = 0;
  for (const row of rows) {
    if (!row) throw new Error('Missing row');
    for (const k of ['basket','variable','carrier'])
      if (!Number.isSafeInteger(row[k]) || row[k] < 0 || row[k] > 100000000)
        throw new Error('Invalid cent amount');
    if (!Number.isSafeInteger(row.count) || row.count < 1)
      throw new Error('Invalid count');
    orders += row.count;
    if (orders > 1000000) throw new Error('Too many orders');
    const qualifies = row.basket >= threshold;
    free += qualifies ? row.count : 0;
    contribution += row.count * (row.basket - row.variable - row.carrier + (qualifies ? 0 : fee));
  }
  return { orders, free, contribution };
}
const rows = [
  {basket:4000, variable:2400, carrier:600, count:100},
  {basket:6000, variable:3600, carrier:600, count:80},
  {basket:9000, variable:5400, carrier:700, count:40}
];
console.log(replay(rows, 7500, 500));
// {orders:220, free:40, contribution:450000}
console.log(replay(rows, 5000, 500));
// {orders:220, free:120, contribution:410000}

The amount and population caps bound arithmetic well inside safe-integer limits. They are implementation guardrails, not commercial recommendations. Adapt minor-unit parsing for currencies that do not use two decimals. Never infer currency from a symbol alone, and never combine raw values from different currencies into one total.

Test boundaries and invariants

Verify the known example, exact equality at a threshold, zero thresholds, zero shipping fees and identical policies. Include a case where valid costs exceed revenue: negative contribution should remain visible rather than being clipped to zero. Empty data is an error, while a nonempty population with no affected orders is a valid zero-change result.

Reject missing amounts, extra decimal precision, fractional counts, negative values, non-finite numbers, extra columns and excessive totals. For generated fixtures, compare the aggregate calculator with the independent article replay. Swapping the thresholds must reverse the contribution delta. Reordering rows must not change the result. Multiplying counts by a whole factor should multiply contributions while preserving free-shipping proportions.

Check the whole-order hurdle by confirming that k additional orders cover the loss and k−1 do not. Run this check on integer cents rather than rounded displayed currency. The published examples and these invariants are executed locally; that validates the implementation on fixtures, not the completeness of a merchant's cost export.

Make the shopper promise match the rule

A shipping progress message should use the same qualifying subtotal as checkout. If a discount reduces the subtotal below the threshold, update the remaining amount and explain why. If a destination is excluded, do not keep showing an unconditional free-shipping promise. Check the experience after quantity changes, coupon application, sign-in and delivery-service selection.

On mobile, the eligibility condition needs to remain readable near the offer, not hidden in truncated text. A progress bar should not imply guaranteed delivery speed or suggest an extra item costs nothing. Show the actual additional spend and the delivery charge it removes. Test with a basket exactly at the threshold and one minor unit below it.

These checks make the offer understandable. They do not prove persuasion or revenue impact. The growth team still needs a behavioral evaluation with a stable audience and a defensible counterfactual.

Evaluate the policy with a separate test

Define a stable assignment unit appropriate to the store, and prevent shoppers switching policy merely by refreshing. Log eligibility and exposure, including non-purchasers. Choose the primary outcome before inspecting results: contribution per eligible visitor can capture both purchasing behavior and the shipping subsidy, provided cost coverage and observation windows are consistent.

Monitor conversion, basket distribution, return-related costs, delivery performance and customer complaints as guardrails. A rise in average order value can coexist with fewer orders or lower contribution. Align return observation windows so a newer treatment cohort does not appear more profitable simply because its refunds have not arrived.

The original replay remains useful after a test: it explains the cost mechanism and flags implausible results. But it must not be relabelled as an incremental lift study. Randomization, exposure integrity, interference and statistical analysis are separate responsibilities. A small store without enough evidence can use a bounded operational pilot while explicitly avoiding a causal success claim.

Turn the result into a decision packet

Use the framework to record scope and owners, the calculator to export the frozen replay and the prompt to challenge unsupported assumptions. A strong packet states what the policy costs, what response would be needed and what evidence is still missing.

For a wider consumer-growth question, explore B2C growth consulting or discuss the constraint with Akshay. Share anonymous examples and the decision you need to make, not customer details or store credentials.

Growthcraft Editorial, AI-assisted. Examples and amounts are synthetic; no client results or personal implementation experience are claimed. Sources checked October 3, 2026. The replay and worksheet are original methods, not vendor-endorsed recommendations.

View all growth marketing articles