A bundle looks like a free win: two products, one price, a bigger basket. Then the invoice arrives and you realise the discount came out of a margin that was already paying for shipping, packaging and a payment gateway. Whether a bundle helps depends on arithmetic, and arithmetic is the one thing you shouldn't leave to a chatbot's mental maths.
Here's the plan. For bundle pricing, compute contribution per order for every option, find how many extra buyers each discount needs, then use AI for the parts it's good at: writing the script, naming the bundle and drafting the offer copy. Below is a script I ran on 2026-10-09 with example numbers, its real output, and the prompts around it. The single-product sale version of this calculation is in our festive campaign planner post; this post covers bundles, tiers and cannibalisation.
What numbers go into a bundle price?
Per order, you need:
- Selling price including GST, and the GST rate for your product category (it varies; check your HSN code and ask your accountant).
- Product cost for each item.
- Outbound shipping and packaging, including any extra packaging per additional item.
- The payment gateway fee. The example uses 2% plus 18% GST on the fee, which matches Razorpay's pricing page as summarised by a fetch tool on 2026-10-09 (a flat platform fee on domestic instruments, GST extra); your plan may differ, so read the page yourself. See our Shopify India payments post.
Everything here is an example, not a benchmark: three products (a serum at Rs. 799, a moisturiser at Rs. 899, a sunscreen at Rs. 599), GST at 18%, shipping Rs. 70, packaging Rs. 25 for the first item and Rs. 5 for each extra. The script assumes prepaid orders. Cash on delivery adds return-to-origin losses, which our COD vs prepaid messaging post covers.
The script and its output
GST = 18.0
GW_PCT = 2.0
GW_GST = 18.0
SHIP = 70.0
PACK_BASE = 25.0
PACK_EXTRA = 5.0
SKUS = {
"serum": {"price": 799.0, "cogs": 180.0},
"moisturiser": {"price": 899.0, "cogs": 210.0},
"sunscreen": {"price": 599.0, "cogs": 130.0},
}
def contribution(items, discount_pct=0.0):
list_total = sum(SKUS[i]["price"] for i in items)
cogs = sum(SKUS[i]["cogs"] for i in items)
sell = list_total * (1 - discount_pct / 100)
net = sell / (1 + GST / 100)
gw = sell * GW_PCT / 100 * (1 + GW_GST / 100)
pack = PACK_BASE + PACK_EXTRA * (len(items) - 1)
return sell, net - cogs - SHIP - pack - gw
I ran the full script (the loops below are in my scratch copy, deterministic, no random numbers). Single items first:
serum sell 799.00 contribution 383.26 (48.0% of sell)
moisturiser sell 899.00 contribution 435.65 (48.5% of sell)
sunscreen sell 599.00 contribution 268.49 (44.8% of sell)
Now the serum plus moisturiser pair at different bundle discounts:
disc% sell contrib vs full price pair
0 1698.00 908.91 +0.00
5 1613.10 838.96 -69.95
10 1528.20 769.02 -139.89
15 1443.30 699.07 -209.84
20 1358.40 629.13 -279.78
25 1273.50 559.18 -349.73
30 1188.60 489.24 -419.67
Every 5 points of discount costs about Rs. 70 per pair here. That's the price of the offer. Whether it pays depends on who takes it.
Does the bundle beat selling one product?
Two kinds of customer take a bundle. An upgrader would have bought only the serum and now buys the pair. A cannibal would have paid full price for both and now pays less. Upgraders add contribution; cannibals subtract it.
From the same script, at a 15% bundle discount:
serum alone: 383.26; pair at full price: 908.91; bundle at 15%: 699.07
gain per upgrader (serum-only -> bundle): +315.81
loss per cannibalised full-price pair buyer: 209.84
Per 100 orders, cannibalised pair buyers vs upgraders needed to break even:
0 full-price pair buyers switch -> need 0.0 serum-only buyers to upgrade
5 full-price pair buyers switch -> need 3.3 serum-only buyers to upgrade
10 full-price pair buyers switch -> need 6.6 serum-only buyers to upgrade
20 full-price pair buyers switch -> need 13.3 serum-only buyers to upgrade
30 full-price pair buyers switch -> need 19.9 serum-only buyers to upgrade
Read it like this: with these made-up inputs, each upgrader earns about Rs. 316 more than a serum-only sale, and each cannibal costs about Rs. 210. If 10 of every 100 orders would have been full-price pairs and now switch, you need roughly 7 serum-only buyers per 100 to upgrade just to stand still. That's the bar. It isn't a forecast, and I'm not claiming bundles lift anything. Your own store's mix of single and pair orders sets the real numbers, which you can read from your order history.
A practical consequence: if most of your orders are already pairs, a pair discount mostly gives away margin. If most are single items, a bundle has more room to work.
What about "buy 2 get 10%, buy 3 get 15%" tiers?
Same-product tiers behave differently, because the extra units are the same item. Output for the serum:
qty 1 at 0% off: sell 799.00 contribution 383.26 per unit 383.26
qty 2 at 10% off: sell 1438.20 contribution 724.87 per unit 362.44
qty 2 at 15% off: sell 1358.30 contribution 659.05 per unit 329.52
qty 3 at 15% off: sell 2037.45 contribution 1033.57 per unit 344.52
qty 3 at 20% off: sell 1917.60 contribution 934.83 per unit 311.61
qty 3 at 25% off: sell 1797.75 contribution 836.09 per unit 278.70
Shipping and packaging are spread over more units, so the per-unit contribution drops slower than the discount rises. A 3-pack at 15% off earns Rs. 345 per unit versus Rs. 383 for a single. The catch is the same as before: a customer who would have bought three at full price now costs you the discount. Tiers suit consumables people reorder; they suit one-off purchases less.
What's the deepest discount you can afford?
The last block of the script finds the maximum bundle discount that keeps contribution above a floor, as a share of the selling price:
floor 20% of sell -> max bundle discount 53.5%
floor 30% of sell -> max bundle discount 44.5%
floor 40% of sell -> max bundle discount 31.5%
Those are ceilings, not recommendations. They ignore ad spend, returns beyond the simple case, discount-code stacking and the cost of tied-up stock. Pick a floor you can defend, then stay well under the ceiling.
Which prompts should you give an AI?
Use the model where it's strong. Three prompts, all untested templates unless noted.
1. Make the model write the calculator, not the answer.
Write a Python function contribution(items, discount_pct) for an Indian
ecommerce store. Inputs per SKU: price_incl_gst, cogs. Global inputs:
gst_rate, shipping, packaging_first, packaging_extra, gateway_pct,
gateway_gst_pct. Return selling price and contribution per prepaid order.
Do not invent any numbers: use only the values I give. Then write a loop
that prints contribution for discounts 0 to 30 in steps of 5.
MY VALUES: [PASTE]
Run the code yourself. Check one row by hand in a spreadsheet before you trust the rest.
2. Ask for the break-even in plain words.
Here is the output of my bundle calculator:
[PASTE OUTPUT]
Explain in five sentences how many extra buyers I need for each discount
to break even. Quote only numbers that appear in the output. If you need a
number that is not there, ask me for it.
3. Name and sell the bundle, with the offer fixed.
Write 5 names and one-line product-page descriptions for a bundle of
[PRODUCT A] and [PRODUCT B]. The offer is exactly: [OFFER, e.g. 15% off
when both are in the cart]. Do not mention any other discount, saving
amount or claim that is not in the facts below. Facts: [FACT SHEET]
For naming ideas beyond a bundle, see AI product naming and brand voice for D2C. The third prompt follows the "only the offer I give you" rule from our email and SMS prompts post. Models like to invent a saving amount, which then has to match your checkout.
How do you test a bundle without fooling yourself?
- Write down the break-even before launch: how many upgraders per 100 orders you need given your expected cannibals.
- Run it for a fixed window against a comparable window without it. Festive weeks distort everything, so avoid comparing a sale week with a normal one.
- Compare contribution per visitor or per 100 orders, not revenue. Revenue rises with any discount.
- Look at returns and COD refusals for bundle orders separately. A bigger parcel can mean a bigger loss.
- Check stock. A bundle pulls two SKUs down together, so the scarcer item sets the limit.
Failure cases
- The model quotes a margin it didn't compute. Treat any percentage without a visible formula as invented.
- Prices without GST treatment. Mixing GST-inclusive prices with GST-exclusive costs is the commonest spreadsheet error. The script divides by the GST factor before subtracting costs.
- Ignoring gateway fees on the discounted price. Fees fall as the price falls, which the script handles, but a fixed per-transaction fee on your plan would not scale this way.
- Anchoring on a fake "original price". Check the rules for price claims in your market with a professional before showing struck-through prices.
When to skip bundles
If your margin is already thin on single items, a bundle discount may leave you with nothing after shipping. If stock is tight, a discount only brings forward a stockout. Try a free-gift or sample instead and cost it in the same script. And if you have fewer than a few dozen orders a month, you can't read a test result; set the price from the break-even table and review quarterly.



