Can You Sell Bundles on the Thank You Page? Post-Purchase Bundle Expansion

TLDR

  • Upsells on the post-purchase and thank you pages are added to the order by an order edit, so the Cart Transform that normally expands a bundle never runs
  • Without expansion the order contains only the parent SKU, with no components for fulfillment to pick
  • Flex Bundles can now detect the unexpanded parent after the order completes, add the components, remove the parent, and commit the edit
  • Component prices are set so they sum to exactly what the customer paid, including re-applied discount codes and per-line tax rounding
  • It is a per-bundle setting on fixed bundles, off by default, and it also covers TikTok Shop, Amazon, the Shop app, and any other channel where the transform did not run

A merchant came to us with a question that sounds simple: can we sell a bundle from the upsell widget on the thank you page?

They had a fixed bundle that sold well on the product page and they wanted to offer it as a one-click add after checkout. The widget worked. The order showed the bundle. But when the order reached the warehouse, there was nothing to pick. Just one parent SKU with no components.

Why the thank you page is different

On a normal storefront purchase, a bundle goes through checkout as a single parent line item. Shopify's Cart Transform function runs during checkout and expands that line into its component products, so the order that fulfillment sees has real SKUs and real quantities. This is the mechanism every native bundle app on Shopify relies on.

Post-purchase and thank you page upsells skip checkout. The order already exists, so the upsell app adds the product through an order edit. The Cart Transform only runs on carts, never on order edits, so the bundle parent is added to the order as-is and never expands.

The merchant's options were not good. Leave it and let fulfillment work out what a parent SKU means on every one of those orders, or drop the upsell and leave the revenue on the table.

The same thing happens on other channels where the transform does not run. Orders from TikTok Shop, Amazon, and the Shop app are created outside Shopify checkout, and a fixed bundle sold there arrives as a parent SKU too.

What Flex Bundles does about it

Fixed bundles have a setting in the bundle editor called Expand bundle on order edits. Turn it on, and Flex Bundles watches every order for that bundle's parent variant arriving without its components. When it finds one, it expands the bundle after the fact using Shopify's Order Editing API:

  1. Add the components. Each component variant is added to the order at the quantity defined in the bundle.
  2. Remove the parent. The parent line is set to zero and restocked, since that variant was never physically sold.
  3. Price the components. Per-line discounts are applied so the component prices sum to exactly what the customer paid for the parent line.
  4. Commit the edit. The order now looks the same as one that went through checkout normally.

This runs in the background within seconds of the order being updated, and the customer is not charged or refunded anything. The order they see in their account has the bundle's contents listed as separate items, which is also what their shipping notification shows.

The hard part was the pricing

Adding and removing line items is the easy half. Getting the order total to land exactly where it started is where the work went.

The customer paid a specific amount for the parent line. Once the parent is gone, the components have to carry that amount between them, and Shopify has opinions about how that happens.

Discount codes get re-applied. If the order had a 10% code, Shopify applies that code to every line added in the edit. Set the component prices to what the customer paid and Shopify takes another 10% off, and the order now shows an amount owed or a refund due. Flex Bundles reads the re-applied discount on each added line before committing and sizes the prices to compensate, so the net matches what was paid. This covers percentage codes, fixed-amount codes, and the discount from the post-purchase offer itself.

Tax rounds per line. A single line at 23.80 with 8.5% tax carries 2.02 of tax. Split that into four lines at 5.95 and each line's tax rounds to the cent independently: 0.51 each, or 2.04 in total. Shopify then reports the order as two cents underpaid, and the same split can go the other way on a different rate. Flex Bundles models the tax on each component and shifts a cent or two of the bundle discount between lines so the per-line rounding sums back to the original tax. If Shopify's rounding disagrees with the model, it falls back to a small adjustment on one line and re-checks the balance until the order is square.

Then it verifies. After the edit commits, Flex Bundles re-reads the order's balance and compares it with the balance before the edit. If they match, which is the normal case, the order is tagged flex-bundles-expanded and that is the end of it. If they differ, the order also gets flex-bundles-expanded-unbalanced so you can find it in the orders list and correct it, rather than discovering it when a customer asks about a two-cent balance.

What fulfillment and analytics see

After expansion, the order contains ordinary line items for each component with correct SKUs and quantities. Your 3PL, warehouse management system, or Shopify Fulfillment sees products it can pick. There is no bundle-specific handling to set up on that side.

The order is also tagged flex-bundles-has-bundle and carries the $app:bundle_breakdown metafield that every bundle order gets, listing the bundle, its revenue, and the exact components. Bundle analytics count the order under the bundle it was, so a bundle sold on the thank you page shows up in the same reports as one sold on the product page. The Exporting Your Data guide covers the metafield shape.

Turning it on

Open the fixed bundle in Flex Bundles, scroll to the settings below the components list, and check Expand bundle on order edits. Save. It is off by default and per bundle, so you can enable it for the bundles you offer post-purchase and leave the rest alone.

If you already run your own expansion through a custom integration, leave the setting off so the two do not compete. The Bundle Types doc has the full reference for the setting and the order tags.

The result

The merchant who asked the question is now selling that bundle from the thank you page. Every order comes through fulfillment-ready, the totals match what the customer paid to the cent, and the warehouse does not know or care which page the bundle was sold on.

If you have a bundle you want to sell post-purchase, on TikTok Shop or Amazon, or through any channel that skips the cart, install Flex Bundles or book a demo and we will walk you through it.

Frequently Asked Questions

Which bundle types does this work with?

Fixed bundles. A fixed bundle has a set list of components stored on the parent variant, so there is something definite to expand it into. Flex bundles are built by the customer at add-to-cart, and a post-purchase widget has no way to pass that selection, so there is nothing to expand.

Which upsell apps does it work with?

Any app that adds a product to a completed order, whether through Shopify's post-purchase checkout extension or an order edit from a thank you page widget. Flex Bundles does not integrate with the app; it watches the order. If the parent variant of an opted-in fixed bundle lands on an order without its components, it gets expanded.

What happens to inventory?

The parent variant is restocked when it is removed from the order, because it was never physically sold. The component variants are added as ordinary line items, so Shopify deducts their inventory the same way it would for any order edit.

What if the customer used a discount code?

Shopify re-applies order-level codes to any line added in an order edit. Flex Bundles measures the re-applied discount before committing and sizes the component prices so the order total stays exactly what the customer paid. Percentage codes, fixed-amount codes, and post-purchase offer discounts are all handled.

How do I know an order was expanded?

Expanded orders are tagged flex-bundles-expanded. An order that could not be expanded, for example because a component was out of stock or the order is a subscription, is tagged flex-bundles-expanded-skipped for review. In the rare case that the committed order's balance differs from what the customer paid, the order also gets flex-bundles-expanded-unbalanced so you can correct it in admin.

Does it work with multi-currency orders?

Not yet. Orders placed in a currency other than your store's currency are left untouched, because the price adjustments happen in the store currency and Shopify's conversion could leave the customer charged the wrong amount. Those orders arrive with the parent SKU exactly as they do today.