Ops playbookPricingBundlesBetter Bundles17 min read

Shopify packs after a component list-price change

When a component’s Shopify list price changes, a live Functions pack’s discount, save-copy, and contribution can drift without anyone opening the pack. The 10-minute check and the keep / reprice / pause rule.

Jeshua Leger

Founder, Leger Studio ·

Tuesday, merchandising raises the hero serum from $48 to $56. The Morning Routine Kit is still $79 on its tile, still wearing “Save $25,” still the second card in Best Sellers. Nobody opened the pack. By Thursday finance asks why the kit’s implied discount jumped from 24% to 29% while kit units held flat, and support has two tickets that the serum “is cheaper in the kit than last week.” Nothing in checkout was misconfigured. The catalog moved. The pack did not.

This post does one job: when a component’s Shopify list price changes while a Functions pack is already selling, detect that the pack’s discount, shelf copy, and contribution have silently drifted — then decide whether to re-save, reprice, switch pricing mode, or pause. It is not the post that decides whether the offer deserved to exist (pack margin before you publish). It is not a dated-pack calendar takedown (publish, end date, archive). It is not what happens when a sitewide sale hits a live pack (discount stacking), and it is not how savings land on component lines (Functions allocation). Those assume the pack’s own price is still the one you published. This one is for the week someone changed a component and left the pack alone.

Note: Context: Better Bundles sells a pack as a real Shopify product and expands it at checkout with Shopify Functions. Four pricing modes set the savings — fixed price, percentage off, amount off, or item-based where the free items define the discount — and the editor’s Price summary previews how the discount lands on each component. Free-item and spread allocation are the two ways those savings sit on the lines; Growth and Pro can also apply the discount at the order level. Inventory recalculates automatically when component stock changes. Pricing does not have that pipeline. Basic is free forever with up to 3 active bundles and limited AI; Starter, Growth, and Pro are $17 / $37 / $77 a month with a 15-day trial. Docs: pricing methods, discount modes, re-save after edits.

The pack does not watch the catalog for you

A checkout-native pack has two price objects that look like one offer. The components have Shopify list prices — the numbers on their own product pages, in price lists, and on any solo sale. The pack has a saved pricing rule in the app: a fixed total, a percent, a dollar-off, or an item-based gift. The editor computes a natural sum from the components you attached, a pack price from the rule, and an allocation preview. That computation happens when you have the bundle open. It is not a live formula attached to every component price change in the admin.

Stock is the contrast that makes this easy to miss. When a component sells, restocks, or is adjusted, Shopify notifies the app and pack availability recalculates — the minimum of each component’s available ÷ units required, minus any reserve buffer (inventory sync). Merchants learn, correctly, that they do not type a second pack quantity. They then assume price works the same way. It does not. A list-price change on the serum updates the serum. It does not reopen the kit, rewrite “Save $25,” or push a new configuration to checkout. The troubleshooting docs say the quiet part: after an edit, you re-save so the latest configuration is what checkout runs (troubleshooting).

Important: Decision rule: treat every component list-price change as an unreviewed change to every live pack that contains that variant. If you cannot name those packs from the component, you do not own the price change yet. Shared parts are the usual miss — one serum in three kits is three offers, not one.

Four pricing modes, four different drifts

Open the pack after the serum moved and the Price summary will show a new natural sum. What that does to the offer depends on the mode you saved, and the four modes do not drift the same way.

Fixed price — the pack stays, the discount percent moves

You typed $79. The kit was cleanser $36 + serum $48 + bag $20 = $104, so d was 24% and the tile’s “Save $25” was true. Serum to $56 makes the natural sum $112. The pack is still $79. Discount is now $33, d is 29%. You did not deepen the offer; the catalog did. The next time someone reruns the margin row, spread’s line test uses the new d, and a thin component that cleared 24% can fail at 29% without anyone touching COGS.

The other direction is the one the editor will eventually refuse. Serum drops to $32 on a clearance, natural sum $88, pack still $79. The kit is now a $9 courtesy. If the serum keeps falling, or a second component is marked down, the fixed price can exceed the combined component total. That is a go-live checklist failure — “a price that exceeds the combined component total” — and you may only see it when you next open the bundle or try to set it Active (create your first bundle). A pack that was fine in March can be unlistable in October for a reason that never appeared on the pack product.

Percentage off — the sentence stays, the dollars move

You saved 20% off the combined component prices. The kit’s pack price follows the catalog: $104 became $83.20; $112 becomes $89.60. “Save 20%” on the tile is still true. The dollar save, the contribution, and the free-shipping threshold the pack used to clear are not. A shopper who bookmarked $83 now sees $90. A paid ad that promised a $79 kit is now a lie even though the rule never changed. Percentage-off is the mode that keeps d honest and still requires a merchandising pass, because most of your public copy is a dollar figure.

Amount off — the dollars stay, the percent moves

You saved $25 off the combined prices. Pack price was $79 against $104; after the serum rise the editor prices it at $87 against $112. “Save $25” is still true. The percent-off a spread line test reads is not: d fell from 24% to 22%. Contribution usually improves when components go up and the dollar-off is fixed — you are giving the same dollars against a more expensive box. The failure is the opposite of fixed: the tile still says $79, emails still say $79, and the Price summary now says $87. Until you re-save and match the copy, those can be three different offers. Amount-off is the mode that makes the pack product’s merchandised price stale the moment a component moves.

Item-based — the gift’s new price is the new discount

You marked the bag free. The pack price is the sum of the paid items, with an optional extra discount on top. Raise the serum and the pack price rises with it; the bag’s $0.00 line is unchanged. Raise the bag from $20 to $28 and the discount just became $28. That is the general result: under item-based pricing the gift’s current list price is the cost of the offer in discount dollars, and a gift reprice is a pack reprice whether anyone intended it. If you also stacked a dollar-off on top, the editor’s spill warning can appear for the first time — discount larger than the free items — and free-item mode will zero the gift and spread the remainder onto paid lines (discount modes). The copy still says “bag free.” The order now also markdowns the serum.

Tip: Order-level application (Growth and Pro) does not change any of this. It only changes where the saving prints — on the lines, or once against the order. The pack price, d, and contribution move with the catalog the same way. Fix the rule, not the application mode.

The copy and the checkout can tell two stories

Three surfaces can disagree after a component reprice, and only one of them is the editor.

  • The pack product’s merchandising. Title, description, compare-at, collection tile, and any “complete the set — save $25” sentence you typed onto the hero PDP are Shopify product copy. They do not subscribe to component prices. A fixed pack whose d grew still says $79 / save $25 until a person edits those fields.
  • The editor’s Price summary. Open the bundle and you see today’s natural sum, today’s discount, and today’s allocation. That preview is the truth of the rule against the current catalog. It is not, by itself, what checkout is running.
  • Checkout. Functions use the configuration you last saved. The troubleshooting step exists because an unsaved or unre-published edit is a known way for the preview and the order to diverge. After a component reprice you did not initiate in the app, the only way to know they still match is to open the pack, read the preview, re-save if the numbers are the ones you want, and place a test checkout.

Ads and shopping campaigns inherit the merchandising surface. A product-price update on the pack SKU does not fire because you never edited the pack SKU. The dated-pack post already owns the zombie that stays in a Google feed after takedown. This is the live cousin: a still-published pack whose feed price and “save” claim are last month’s arithmetic. Do not wait for the campaign to end to notice.

Important: Do not “fix” the mismatch by typing a new price onto the pack product in the Shopify admin and leaving the bundle alone. The pack product’s price field is not the Functions rule. You will get a PDP that says $87 and a checkout that still expands to last week’s $79 — or the reverse — and support will spend the week refunding the difference. Change the rule in the app, save, then make the copy match what the Price summary now shows.

What the margin row does after the catalog moves

The margin post is the sheet you run before a pack exists. After a component list-price change you do not invent a second sheet. You rerun the same row with two substitutions: today’s natural prices, and the pack price the current mode actually produces. Three results show up often enough to write down:

  • You raised the hero to take more margin, and the pack is fixed. The extra $8 on the serum is $8 more discount inside the kit. Solo contribution went up; pack contribution did not. The breakeven incremental share s moved against you. A pack that published on s ≤ 25% can sit in the reprice band after a hero increase you were proud of.
  • You raised a thin spread component. d may have moved (fixed and amount-off), and that component’s own margin percent 1 − COGS ÷ price moved too. The line test is “margin percent must exceed d.” Either side of that comparison can flip without a COGS change.
  • You marked down a gift. Item-based discount shrinks with the gift’s list price, which can make a GWP look weaker on the order (a $8 “free” line instead of $20) while contribution improves. Fixed and amount-off GWP can spill: the configured discount no longer fits inside the cheaper gift, and paid lines start absorbing it.

Allocation still does not change contribution totals. It changes which line carries the new discount — and therefore what a partial refund costs next week (returns and partial refunds). If the drift only looks ugly on per-SKU reports, check whether you are in product-level application before you rebuild the offer.

A 10-minute drift check after any component price change

Run this the same day the component price ships — not in the next monthly pack review. A list-price change is a pack event. One component can sit in several packs; do every pack that lists that variant, including Draft packs you plan to reopen.

  1. From the component’s product in Shopify, write down the old price (inventory history or the last PO/price-change note) and the new list price. If you cannot find the old number, stop and get it; “it went up a bit” is not an input.
  2. List every live and Draft bundle that includes the variant. Shared parts first. On Basic, that list is at most three Active seats — which is why a drifted pack occupying one of those seats is expensive (pricing).
  3. Open each bundle. Read the Price summary: natural sum, pack price, discount, d, and the per-component allocation. Compare those four numbers to the last test checkout you filed on the pack’s card. If you never filed one, this is the first-offer test you skipped.
  4. Check the go-live checklist. A missing component or a fixed price above the combined total is a hard stop: do not leave the pack Active hoping checkout will be kind. Set it Draft until the rule is legal.
  5. Rerun the margin row with today’s prices. Publish/reprice/kill on that row is the same rule as launch — you are not negotiating because the pack already has reviews.
  6. If the row and the checklist pass and the public copy still matches the Price summary, re-save the bundle so checkout is running the configuration you just approved, then place one paid test order and read the lines.
  7. If they do not pass, use the decision rules below before you re-save. Re-saving a drifted rule you have not accepted just publishes the drift.
Tip: Put the component’s SKU and the pack titles it belongs to on the price-change ticket, the same way you already list locations for a transfer. A merchandising change that cannot name its packs is not finished.

Keep, reprice, switch mode, or pause

This is a live-ops rule, not the launch sheet. The pack is already on a URL, in collections, and in someone’s cart. The first line that fires is the decision:

  1. Checklist fails (fixed price ≥ natural sum, missing component) → pause. Set the bundle to Draft in the app. Leave the Shopify product published only if you can stand a Sold out / unavailable tile for a few hours; otherwise unpublish the Online Store channel until the rule is legal. Do not archive — you are not ending the offer (dated packs owns archive).
  2. Public copy is now a lie (tile still says $79 / save $25, editor says otherwise) and you have not decided the new price → pause the same way, or take the tile out of the collection, until copy and rule match. A live lie trains refunds.
  3. Row still publishes, copy can be updated to the new numbers in the same hour → keep. Re-save, edit the pack product and the hero’s “complete the set” sentence, update any ad that quoted the old pack price, run the test checkout.
  4. Row falls into the margin post’s reprice band, or d crossed a spread component’s margin → reprice the pack, do not “see how it does.” Raise a fixed pack price, shrink a percent or amount-off, swap the gift, or take the thin component out. Then re-save and fix copy. The reprice moves that keep an unpublished row alive are the same moves; the difference is you also owe every surface that already quoted the old number.
  5. The catalog will keep moving (seasonal list prices, frequent MAP changes, Markets price lists you edit monthly) and you are tired of d drifting on a fixed kit → switch mode. Percentage-off holds d still. Amount-off holds the dollar save still. Item-based holds the gift-is-free sentence still. Fixed holds the menu price still. Pick the sentence you are willing to defend next month, not the one that was convenient at launch.
  6. Row kills → Draft the bundle, then decide whether the product stays as a quiet URL or comes down. Killing a live pack is a takedown; use the dated-pack sequence for the switches, even if there was no end date on the card.

What does not count as a fix: adding a second gift “to restore the value,” which adds COGS to a row that just failed on discount; typing a compare-at on the pack to recreate a save you no longer earn; or leaving the pack Active on Basic while you think about it. That seat is one of three.

Who owns the price change so the pack is in the room

The failure at the top of this post is an ownership gap, not a Functions gap. Merchandising owns the serum. Marketing owns the kit tile. Nobody owns the join. Write the join down:

  • Every component variant that sits in a live pack gets a “packs:” line on its price-change ticket. No line, no publish.
  • The person who can set a component to $56 is the person who opens those packs the same day, or the ticket stays open. Do not hand it to “the bundle person” next week.
  • Shared components are reviewed as a set. If the serum is in a GWP, a spread kit, and a multipack, you will make three different decisions — item-based gift cost, kit d, and N× unit price — not one “serum went up.”
  • If you maintain more than one price list, do not assume the editor used the list you just edited. Open the pack and read the natural sum it shows; if that number is not the catalog you changed, the pack has not followed you yet.
  • A bulk price import is a pack event for every bundle. Same day, same checklist. Inventory already has a “recalculate after bulk import” action; pricing’s equivalent is opening the editor.
Tip: If you change component prices often, prefer percentage-off or amount-off on evergreen packs and reserve fixed prices for menu-priced kits you are willing to revisit. The fixed-price packs guide is how to build those kits; this post is why a $79 you never reopen becomes a different offer.

The short version for the price-change ticket

  • A component list-price change is a pack event. Name every live and Draft pack that contains the variant before the price ships.
  • Inventory recalculates on stock changes. Pricing does not. Open the editor; do not assume checkout followed the catalog.
  • Fixed: pack price holds, d moves, and the checklist can fail if the pack exceeds the new natural sum. Percent: d holds, dollars move. Amount-off: dollars hold, pack price moves. Item-based: the gift’s new list price is the new discount.
  • Never type a new price onto the pack product in Shopify and skip the bundle. Change the rule, save, then match the copy.
  • Rerun the margin row on today’s numbers. Keep, reprice, switch mode, or pause — do not archive unless you are ending the offer.
  • Re-save only after you accept the numbers, then run one paid test checkout and update every tile, hero sentence, and ad that quoted the old pack price.

Better Bundles keeps the pack as one product and the savings as a rule you can reopen: pick fixed, percentage, amount-off, or item-based pricing, choose free-item or spread allocation, and read the live preview against the catalog in front of you before you save. Basic is free forever with up to 3 active bundles and limited AI usage — enough that a drifted pack occupying a seat is a reason to open it today; Starter, Growth, and Pro are $17 / $37 / $77 a month with a 15-day trial when you need more bundles or the sales reports. Start from create your first bundle, keep discount modes next to the Price summary, and re-save after the check so checkout is running the offer you just accepted. Install from the Shopify App Store and start free on Basic.

Newsletter

Want the next one in your inbox?

Subscribe for new posts, app releases, and Better Bundles updates.

Product updates, release notes, and new posts. Unsubscribe anytime. Privacy

Ready to grow your average order value?

Create your first native-style bundle and see the discount at checkout. Start free on Basic — paid plans include a 15-day trial.