Sell options as real bundle components
By the end you'll have an option set where every choice the customer makes becomes a real product in the cart, with its own price and its own inventory that Shopify manages natively. Pick "Oak frame" and an Oak frame variant is sold. Your stock drops by one, automatically, no background bookkeeping.
This is what Appears as: Bundle items does. It's a setting on each individual option, not a switch for the whole product, so one product can sell a frame picker as real components while a gift note on the same product rides along as plain text. You choose it while you're creating the option. There's no separate box to tick afterwards. The main thing it asks of you is that every choice points at a real product. If you'd rather have options show up as text on the order instead, that's the product options guide.
Build the option set
- Open Optionfier from your Shopify admin and click New option set.
- Fill in Name (yours, not the customer's).
- In the Product card, click the Select a product field, choose Select, and pick the product customers actually buy. This is the parent of the bundle.
- In the Options card, click Add option. In the "What kind of option is this?" picker, open Choice lists and pick Selectable options, then click Continue. Choice-based types are the ones that make sense here, since each choice needs a product behind it.
- That was step 1 of 2. Next you get "How do you want to add choices?" with two tiles. Pick Pick products…, the one that reads "Each choice is a real product included in the bundle. Its price is added to the order, and Shopify tracks its inventory." Shopify's picker opens and every variant you select becomes a choice with its product already linked. (The other tile, Type choices…, is the text-on-order path. And ignore Skip these steps next time while you're building bundles, it makes future options default to text.)
- Fill in Label. That's the name on the cart and the order.
- Look at the choice rows. Each linked choice shows a small three-column table: Product, Qty, Price. The variant's own Shopify price sits under its name. Qty is how many units of that variant go in per bundle unit, so 2 for a pair of shoelaces, 4 for a set of coasters, 1 for everything else. Price starts empty with the variant's price as its placeholder, which means leave it blank and the component charges what the variant charges. Need more choices later? Add products under the list reopens the picker.

- Check the option's header. Picking Pick products… back in step 5 already set it to "Appears as: Bundle items", and that's what you want. The Appears as dropdown sits there if you ever need to change your mind, and About this mode next to it explains the choice: "Each choice is a real product sold as part of a bundle. Its price is added to the bundle total, and Shopify tracks its inventory automatically."
- In the Charge for this product card, the toggle is on by default. Leave it on when the product itself is sold and should be charged. Turn it off when the parent product is just a container for the components.

- Toggle Published in the Status card and hit Save in the title bar.
Pricing
Two settings do most of the work once the choices are linked.
Price on the choice row is your override. Blank means the component is charged the variant's own Shopify price (the placeholder tells you what that is). Type a number and that's what the customer pays for the component inside this bundle, whatever the variant sells for on its own. That's how you charge one price for a part standing alone and a different one as part of a kit. The column only exists when the option is set to Bundle items, because a text-on-order choice has no component price to set.
Show component pricing lives in the option's Option settings panel, and it puts each component's price next to the choice on the product page so customers see what an upgrade costs before they pick it. It only appears when the option is set to Bundle items, and it vanishes if you flip that option to Text on order, which makes sense: a text option never moves the price, so there'd be nothing to show. On the typed inputs (text, number, date, time, file upload, checkbox, dynamic color) a second checkbox appears under it, Always show component pricing, which shows the price even before the customer has entered anything.
One option in the set doesn't have to become a bundle component. A note or a special instruction can stay text while everything else is a real component. The control is the Appears as select in that option's header, flipping between "Appears as: Bundle items" and "Appears as: Text on order". It's per option, so mixing the two inside one option set is normal, not a workaround.
Where the text answers land
When an option is set to text, its answers need somewhere to live on the order, and the Where option answers appear on orders card lets you choose. Two options:
- Order's bundle grouping (no separate line). The answers attach to the bundle as a whole. Nothing extra appears in the cart. The card notes the trade-off: "Answers appear on the order, but not on packing slips or Order Printer."
- This product's own line. The parent product keeps its own line in the cart and the answers ride on it, which is what you want if your packers work from printed slips.
Both stay available whichever way Charge for this product is set, so pick on where you need the answers to show up rather than on how the bundle is put together.
What the customer sees
They pick their options on the product page the normal way and add to cart. In the cart, the product shows with its selected components indented beneath it, each with its own name and price, the same way Shopify's own bundled products look. Checkout shows the same shape, and Shopify decrements each component's inventory when the order goes through.
Free-input options still work. If a customer types engraving text on an option with a linked variant, the variant is added as a component for inventory and the text rides along as an attribute on that component's line in the order. You get both.

Two caveats before you commit. Your theme has to support Shopify's bundle format for the indented display; if it doesn't, everything still lands in the cart and the pricing is still correct, it just renders flat. And bundle items aren't compatible with Shopify subscriptions yet, so on a subscription product set those options to Text on order for now.
Refunds are the easy part. Every component is a real Shopify line item, so you refund and restock components individually in Shopify's own refund screen. Optionfier doesn't need to step in.