Shopify fixed-price product packs: set an exact kit price without theme scripts or fake SKUs
How to sell Shopify fixed-price product packs and kits with an exact checkout price, real component SKUs, honest inventory, and Shopify Functions — without storefront scripts or duplicate stock pools.
Jeshua Leger
Founder, Leger Studio ·
Fixed-price packs are the offer customers understand fastest: “Routine kit — $79.” Not “15% off if you remember the code.” Not “add three products and hope the cart drawer redraws.” One product page, one price, one add-to-cart. The hard part is making that price survive checkout while the order still expands into real components for fulfillment, returns, and inventory.
This guide is for merchants who want exact pack pricing on Shopify — starter kits, “complete the set” bundles, multipacks with a clean shelf price — without theme scripts, fake kit SKUs that double-count stock, or discount codes that leak outside the offer. It sits next to the money-math deep dive in Shopify Functions bundle discount allocation and the stock playbook in Shopify kit inventory sync.
What a fixed-price pack actually is
Commercially, a fixed-price pack has three contracts that must stay aligned:
- Customer contract — one advertised price on the product page (and in ads, email, and Shop).
- Checkout contract — that same total after taxes/shipping rules, with discounts applied by Shopify Functions rather than a cart script.
- Ops contract — the paid order lists real component SKUs and quantities so warehouse, 3PL, and returns workflows do not invent a mystery “Kit” line.
If any contract drifts, you get support tickets (“cart said $79, checkout said $84”), finance noise (unit costs that do not sum), or inventory ghosts (a kit SKU with its own stock pool that disagrees with components). Fixed price is a merchandising choice; native expansion + Functions is the system that keeps the three contracts honest.
Why merchants choose fixed price over percent or amount off
Percent-off and dollar-off packs are fine for promos. Fixed price wins when the shelf price *is* the brand:
- Retail-like kits — “Starter set $49” matches how wholesale and Amazon competitors price sets.
- Gift and holiday drops — a round number photographs and converts better in creative than “save 18.7%.”
- Subscription and LTV framing — entry kits priced to a known CAC payback target, not a floating percent of volatile component MSRP.
- Menu pricing psychology — customers compare $79 vs $99 faster than they compute 20% off $98.75; see bundle pricing psychology.
Operationally, fixed price also forces a clear savings number: natural component sum minus pack price. That number is what allocation must place on lines (spread or free-item) so the order document matches the ad. Percent-off can hide rounding surprises; fixed price makes the savings explicit up front.
The broken patterns (and what they cost)
Theme scripts and cart drawers
A script that rewrites the cart UI to show $79 does not guarantee checkout, Shop Pay, draft orders, or later edits. Theme updates and race conditions are why scripted “bundles” still surprise merchants under promo load. We covered that failure mode in Why storefront scripts are the wrong way to sell Shopify bundles. For fixed-price packs the symptom is specific: PDP and cart agree, then Functions-or-code-less checkout shows component list prices and the customer feels bait-and-switched.
Fake kit SKUs with a second inventory pool
Creating a “Kit” product with its own on-hand count looks simple until the kit sells while a component is already committed elsewhere — or the reverse. You either oversell the set or leave money on the shelf because the kit SKU hit zero while components still could assemble packs. Fixed-price packs need availability derived from components, not a parallel stock number. That is the core of Shopify kit inventory sync.
Discount codes as the only price lever
Codes work for flash sales. They are a weak permanent shelf price: customers share them, bots scrape them, and support spends cycles explaining why the kit “normally” needs KIT79. Checkout-native Functions apply the pack math only when the pack product is in cart — no code, no leakage, no “did you apply the code?” friction.
A clean architecture for fixed-price packs on Shopify
- Represent the pack as a real Shopify product (own PDP, collections, search, and analytics).
- Define components and quantities in the app — not as a one-off metafield only engineering understands.
- Set pricing mode to fixed: pack price = exact customer-facing total before tax/shipping.
- Choose allocation (usually spread for paid kits; free-item when a gift is part of the story) so line discounts sum to natural sum − pack price.
- Let Shopify Functions apply the discount at checkout — no storefront pricing scripts.
- Derive pack sellable quantity from component inventory (and reserve buffers if you need safety stock).
- QA a paid order: line discounts sum exactly; SKUs match pick lists; pack goes unavailable when a component does.
That stack is what Better Bundles ships: native-style products, fixed/percent/amount/free-item pricing, Functions at checkout, and automatic inventory sync. Docs for the click-path: Getting started and Discount allocation & application modes.
Worked example: $79 routine kit
Natural prices: Cleanser $28 + Serum $42 + Moisturizer $30 = $100. Pack price: $79. Savings to allocate: $21.
- Customer sees one product at $79 on the PDP and in cart.
- At checkout, Functions expand to three component lines.
- Spread allocation targets roughly $5.88 / $8.82 / $6.30 of discount by price share; integer-cent rounding reconciles so the three discounts sum to exactly $21.
- Order confirmation and packing slip show the three SKUs — warehouse picks what you stocked.
- If moisturizer on-hand can only cover two kits, pack availability should show two (not an independent kit count of fifty).
If finance prefers full list on every line, use order-level application (where available): lines stay at $28 / $42 / $30 and a single order discount of $21 carries the pack savings. Allocation policy and application mode are independent axes — document both so support is not reverse-engineering screenshots. Detail: discount modes docs.
Fixed price vs free-item packs
Not every “one price” offer should use spread allocation:
- All components are paid heroes in a set → fixed pack price + spread mode.
- Buy the kit, get a stand/sample free → free-item mode so the gift reads $0 and paid lines stay intact when gift value covers savings (GWP guide).
- Temporary promo on an existing fixed kit → prefer changing the pack price or running a dated second pack product over stacking a sitewide code that also hits solo SKUs.
Fixed price answers *what the customer pays for the pack*. Allocation answers *which lines absorb the savings*. Mixing those decisions without a written default is how ops tickets multiply.
Margin, ads, and when not to force a round number
Round prices convert; they also tempt merchants to eat margin. Before you lock $49 / $79 / $99:
- Contribution margin after payment fees and expected returns on the pack — not just on solo SKUs.
- Component cost volatility — if one ingredient spikes, a rigid pack price needs a review cadence.
- Ad landing consistency — if Meta creative says $79, the PDP and checkout total (pre-tax) must match; Functions make that enforceable.
- Cannibalization — if the pack is only $5 under buying separately, you may train customers to wait for sets without lifting AOV enough; see How product bundles increase AOV.
Inventory rules that keep fixed packs honest
Price integrity without stock integrity is still a bad customer experience. Minimum bar:
- Pack sellable qty = floor of component_on_hand / qty_per_pack across all components (minus reserve if you use buffers).
- Recalculate when component stock changes from sales, receiving, or manual adjustments.
- Do not maintain a second on-hand for the pack product as a source of truth.
- Shared components across multiple packs: the shortest component across *all* packs that use it is the real constraint — plan merchandising accordingly.
Better Bundles’ inventory behavior and admin recalculation are documented in Inventory sync & stock management. Multi-location brands should also track where components actually sit — packs that look available company-wide can still fail at the shipping location. FlowOps (in development) targets that imbalance problem; until launch, use native Shopify transfers and the playbooks in multi-location inventory transfers.
Launch checklist for your first fixed-price pack
- Pick one constrained kit (2–4 components) with clear margin at the target price.
- Create the pack product and set fixed pricing; preview allocated line discounts in cents.
- Choose spread vs free-item and product vs order application; write the default in your merchandising brief.
- Confirm pack availability matches the shortest component before you publish.
- Place a real test order: discounts sum to natural − pack; SKUs and quantities match pick expectations.
- Test quantity 2× and a cart that also contains a solo component of the same SKU (pack discount must not leak).
- Refund one component in staging/support playbook so returns match how you explain the offer.
- Wire PDP/collection merchandising and ad URLs only after checkout QA passes.
- Review Reports & sales analytics after the first week — units, discount given, AOV.
For the in-app path, follow How to create your first Better Bundles offer in under 15 minutes and Create your first bundle.
When to graduate beyond a single fixed kit
Once one pack is clean:
- Variant trees — size/color matrices inside a pack when Growth+ variant support matches your catalog (avoid exploding combinations you cannot stock).
- Seasonal fixed prices — duplicate dated pack products rather than silently editing a hero kit mid-campaign.
- AI-assisted ideas — use co-purchase signals to propose the *next* fixed kit, then apply the same pricing and inventory bar before publish.
- Parallel GWP — keep free-item offers as separate products so reporting stays readable.
Do not scale SKU count faster than your ability to QA allocation and cover. Fixed-price catalogs fail when the twentieth kit was cloned without checking the shortest component.
Where Better Bundles fits
Better Bundles is live for merchants who want fixed-price (and other) packs as real Shopify products: Functions-based checkout discounts, free-item or spread allocation, product- or order-level application on higher plans, and inventory that follows components. Every plan includes a 15-day free trial billed through Shopify.
Install from apps.shopify.com/better-bundles, read Discount allocation & application modes and Inventory sync & stock management, then ship one fixed-price kit with the checklist above. If warehouse imbalance — not pack pricing — is the bottleneck, follow FlowOps for launch updates while you keep using native transfers.