Bundles & multi-buy deals
A bundle is any deal where the customer pays less than sticker for buying more, or for buying a combination. fiveanddime supports five different shapes. Pick the one that matches how you'd describe your deal out loud, fill in the numbers, and the cart applies it automatically. Skip this step entirely if you don't run any deals.
The five shapes
Most vendors only ever use one or two of these. Read the one-liners, find your deal, then jump to that section.
- Buy X for one price (flat). "4 coasters for $25." Extras stay at sticker — buy 5, the 5th rings up at the regular price.
- Buy more, save more — smooth (marginal). "4 coasters for $25, then $5 each after." Smooth curve, no awkward jumps.
- Volume tiers (tiered). "5 stickers for $4, 10 for $7, 20 for $12, 50 for $25." Cross a tier, every eligible item gets that tier's per-unit rate.
- Buy from one group, get something from another (BOGO). "Buy a small sign, get an ornament free." Or "buy 3 of these, get 1 free from any of those." Trigger group + reward group.
- Curated set (set). "One bookmark + one coaster + one magnet for $30." Required item from each group, set price for the whole thing.
In the app, go to Settings → expand Edit bundle. Tap + Add new for a blank one, or type a bundle ID/name to search and edit an existing one. The form swaps fields based on which deal type you pick.
frontend/tutorials/images/bundle_wizard_picker.jpg
Common moves (apply to all five types)
Bundle ID and Name
Two fields, always required:
- Bundle ID. Short, unique, stable. Examples:
B-CST-4,B-STK-VOL,B-GIFT-SET. Don't change it after creating — it's how the system identifies the deal. - Bundle name. What the customer sees in the cart when the deal fires. Be friendly:
Coasters, 4 for $25orVolume sticker deal.
Which items count (eligibility)
Pick one — usually a category is enough. The other fields are alternatives or fine-tuning; you don't have to fill them all out.
- Category. The most common choice. Pick from the dropdown; every item in that category counts toward the deal. For "any 4 coasters for $25," you just pick the Coasters category. Done.
- Parent product (optional alternative). Use only when you want the deal to apply to a single product and all its variants (e.g. all colors of "Seasonal Door Sign"). Skip this otherwise.
- Specific items (optional alternative). Use only when neither a category nor a parent captures the right set — say, three specific SKUs handpicked from different categories. The search-and-chip picker lets you build the list.
- Exclude specific items (rare). Tucked behind a small disclosure since most deals don't need it. Use it when you'd say "all of category X except this one set I sell as a unit." For example, all coasters, but not the boxed card-suit set.
You only need to fill one. If you fill two (say, Category + Specific items), an item counts if it matches either.
Advanced: Priority and Active
Below the deal fields, there's a small Advanced disclosure with two optional knobs:
- Active. Checked by default. Uncheck to turn a deal off without deleting it — useful for seasonal deals you want to bring back later.
- Priority. Default is 100. Only matters if two deals could compete for the same items. Lower number = applied first. Most vendors leave this alone.
Watch the live preview as you type
At the bottom of the form, the What customers will pay panel runs the real cart-math engine against your actual products. As you change numbers above, it updates with a small table showing what a customer pays at different quantities. If something looks wrong in the preview, the deal is wrong — fix the numbers above until the preview matches what you intend.
frontend/tutorials/images/bundle_preview_panel.jpg
Type 1: Buy X for one price (flat)
When to use: "Any 4 of these for $25." Customer must buy the full batch to get the deal. Extras stay at sticker.
Fields:
- Buy this many — how many items trigger the deal (e.g. 4).
- For this total — the bundle price (e.g. 25.00).
Worked example: Coasters at $7 each sticker. You want "any 4 coasters for $25." Set Buy this many = 4, For this total = 25.00, Category = Coasters.
| Customer buys | Sticker total | Customer pays | Why |
|---|---|---|---|
| 1 | $7 | $7 | Not enough for the deal yet |
| 3 | $21 | $21 | Still under threshold |
| 4 | $28 | $25 | Deal fires — saves $3 |
| 5 | $35 | $32 | 4 bundled + 1 at sticker |
| 8 | $56 | $50 | Deal fires twice — saves $6 |
Gotcha: The 5th coaster does not get the deal price. The deal applies in full batches only. If you want every extra to get a discount too, use Buy more, save more instead.
frontend/tutorials/images/bundle_flat_example.jpg
Type 2: Buy more, save more — smooth (marginal)
When to use: "4 for $25, $5 each after that." You want a smooth pricing curve — every additional item past the threshold gets the same discounted price, no awkward jumps.
Fields:
- Buy at least this many — the threshold quantity (e.g. 4).
- For this total — the price for the first batch at the threshold (e.g. 25.00).
- Then this much per extra — what each item above the threshold adds (e.g. 5.00).
Worked example: Same coasters at $7 sticker. You want "4 for $25, then $5 each after." Set Buy at least = 4, For this total = 25, Then this much per extra = 5.00.
| Customer buys | Sticker total | Customer pays | Why |
|---|---|---|---|
| 3 | $21 | $21 | Under threshold — sticker pricing |
| 4 | $28 | $25 | Hits threshold |
| 5 | $35 | $30 | $25 + ($5 × 1) |
| 6 | $42 | $35 | $25 + ($5 × 2) |
| 8 | $56 | $45 | $25 + ($5 × 4) |
| 10 | $70 | $55 | $25 + ($5 × 6) |
Set the marginal price so that "for this total ÷ buy this many" equals "then this much per extra." For example, threshold 4 / total $20 / marginal $5 means everyone above 4 pays $5/each, and the threshold itself is $5/each too ($20÷4). Customer buys 5 → $25. Customer buys 10 → $50. Nice round numbers.
frontend/tutorials/images/bundle_marginal_example.jpg
Type 3: Volume tiers (tiered)
When to use: "5 for $4, 10 for $7, 20 for $12, 50 for $25." Different price breaks at specific quantities. Common for inexpensive volume products like stickers, magnets, or cards.
Fields: Up to 5 tier rows. Each row is a quantity threshold + a total at that quantity. Leave the rows you don't need blank. Tiers don't have to be evenly spaced.
How it works: The cart counts all eligible items the customer has. It finds the highest tier they've qualified for and applies that tier's per-unit rate to every eligible item — not just the items above the threshold.
Worked example: Stickers at $1 each sticker. You want bulk-buy pricing: 5 for $4, 10 for $7, 20 for $12, 50 for $25.
| Customer buys | Sticker total | Tier hit | Customer pays |
|---|---|---|---|
| 4 | $4 | (none) | $4 |
| 5 | $5 | Tier 1 (5 for $4) | $4 |
| 7 | $7 | Tier 1 (still) | $5.60 (7 × $0.80) |
| 10 | $10 | Tier 2 (10 for $7) | $7 |
| 15 | $15 | Tier 2 (still) | $10.50 (15 × $0.70) |
| 25 | $25 | Tier 3 (20 for $12) | $15 (25 × $0.60) |
| 50 | $50 | Tier 4 (50 for $25) | $25 |
| 100 | $100 | Tier 4 (still) | $50 |
Notice that at 7 stickers, the customer pays $5.60 — the tier 1 per-unit ($0.80) applied to all 7. The customer is incentivized to buy 3 more to unlock tier 2 (10 for $7, saving them another $1.40 over what they'd pay sticking with tier 1 pricing).
frontend/tutorials/images/bundle_tiered_example.jpg
Type 4: Buy from one group, get something from another (BOGO)
When to use: "Buy a small sign, get an ornament free." Or "buy 3 stickers, get 1 free from these designs." Two groups: a trigger group (what the customer has to buy) and a reward group (what they get the deal on).
Fields:
- Eligibility (trigger group, at the top): what the customer must buy. Same Pick-one rules as the other types — usually a category.
- Customer must buy this many — 1 for classic "buy one, get one," 3 for "buy 3, get 1 free," etc.
- What does the customer get? (reward group): the items they get the deal on. Same Pick-one rules.
- How many reward items per trigger — usually 1.
- Reward pricing — pick from Free, $ each (specific reward price like $2 each), or % off sticker (like 50% off).
Worked example 1: classic 1-for-1. "Buy a Holiday Door Sign (any variant), get a Glass Ornament free." Trigger = category HDC-SPT, trigger qty = 1. Reward = category DSN-SM, reward qty = 1, reward pricing = Free.
| Cart | Sticker | Customer pays | Saves |
|---|---|---|---|
| 1 sign only | $45 | $45 | — |
| 1 ornament only | $8 | $8 | — |
| 1 sign + 1 ornament | $53 | $45 | $8 (ornament free) |
| 2 signs + 2 ornaments | $106 | $90 | $16 (deal fires twice) |
Worked example 2: "buy 3, get 1 free." "Buy 3 stickers, pick any one free from this small selection." Trigger = category STK, trigger qty = 3. Reward = specific items list (your chosen "free choices"), reward qty = 1, reward pricing = Free.
| Cart | Sticker | Customer pays | Saves |
|---|---|---|---|
| 2 stickers (any) + 1 free-list sticker | $3 | $3 | — (only 2 trigger items) |
| 3 stickers (any) + 1 free-list sticker | $4 | $3 | $1 (deal fires) |
| 6 stickers (any) + 2 free-list stickers | $8 | $6 | $2 (deal fires twice) |
If the customer picks any one of, say, three specific ornaments as the reward, use Specific reward items and add those three SKUs. If the customer can pick any item in a whole category as the reward, use Reward category. The cart applies the deal to whichever qualifying item the customer drops in.
frontend/tutorials/images/bundle_bogo_example.jpg
Type 5: Curated set
When to use: "One bookmark + one coaster + one magnet for $30." A gift-set or starter-pack price that requires a specific item from each of several groups.
Fields:
- Set price (total) — what the complete set costs (e.g. 30.00).
- One group per required item. Each group has its own Required qty + Category/Parent/SKUs. Tap + Add another group to add a third, fourth, etc. Start with two; most sets are 2–4 groups.
For each group, fill at least one of: Category, Parent product, or Specific item SKUs (comma-separated for sets — the wizard uses simple text inputs here to keep it tight).
Worked example: "Make-your-own-gift-set: 1 bookmark + 1 coaster + 1 magnet for $30." Stickers at $8, $7, $6 separately = $21, but you want to encourage the bundle, so you price it at... actually, $30 only makes sense if you're upselling above the individual prices. More realistic: each individual is more expensive, set price is lower than the sum. Let's say bookmark $12, coaster $10, magnet $10 → sum $32, set price $30.
Set up: Group 1 = Category Bookmarks, Required qty 1. Group 2 = Category Coasters, Required qty 1. Group 3 = Category Magnets, Required qty 1. Set price = 30.00.
| Cart | Sticker total | Customer pays | Saves |
|---|---|---|---|
| 1 bookmark + 1 coaster (missing magnet) | $22 | $22 | — (incomplete set) |
| 1 bookmark + 1 coaster + 1 magnet | $32 | $30 | $2 (set fires) |
| 2 bookmarks + 2 coasters + 2 magnets | $64 | $60 | $4 (set fires twice) |
Gotcha: if a customer's cart is missing any one required group, the deal does not fire — they pay full sticker. The cart will not warn them; if you want to nudge customers toward completing the set, that's a conversation in the booth.
frontend/tutorials/images/bundle_set_example.jpg
Testing it in the app
Open the Sale tab. Add eligible items to a cart. Watch the prices update once you hit the thresholds. The cart shows each bundled line with a small "📦 in bundle" badge and a green border; the totals area names the deal and how much was saved. The receipt shows the same.
When deals overlap (priority)
Most vendors only have one deal that could apply to any given item, so this section is rarely relevant. If you do have two deals that could compete for the same items — say, both a flat bundle and a tiered bundle on the same category — the lower priority number wins. Default priority is 100. To make a particular deal win, set its priority to 50 (or any lower number).
Once a cart line is absorbed by one deal, no other deal touches it. So priority is decisive: pick the deal that's best for the customer (usually the cheaper one), or use Active to turn off the deal you don't want.
Disable, don't delete
Running a seasonal deal? Uncheck Active when the season's over. The row stays in the sheet; reactivate next year by checking the box again. Way easier than recreating the deal from scratch.
Or edit the Bundles sheet directly
The wizard is just a friendlier UI over the same Bundles sheet. If you'd rather work in the sheet — bulk-add deals, copy a deal to a new bundle ID and tweak — every wizard field maps to a column. The full column list is documented in the Help tab, but here's the lay of the land:
BundleId,Name,BundleType(one offlat,marginal,tiered,bogo,set),Active,Priority- Trigger eligibility:
EligibleCategory,EligibleParent,EligibleSkus,ExcludeSkus - Flat / marginal / tiered tier 1:
MinQty,BundlePrice - Marginal only:
MarginalPrice - Tiered only:
Tier2Qty,Tier2Price,Tier3Qty,Tier3Price,Tier4Qty,Tier4Price,Tier5Qty,Tier5Price - BOGO only:
RewardCategory,RewardParent,RewardSkus,RewardQty,RewardKind(free/dollars/percent),RewardValue - Set only: the
BundlePricecolumn carries the set total, and one row per required group lives in theBundleSetGroupssub-sheet withBundleId,GroupIndex,RequiredQty,MatchCategory,MatchParent,MatchSkus,ExcludeSkus.
After editing the sheet, open the app → Settings → Pull from Backend Now. Changes appear in the cart immediately after the pull.
bundles_sheet.jpg shows only flat-bundle columns; a refreshed shot with the new columns is on the to-do list.)frontend/tutorials/images/bundles_sheet.jpg