Oakhammer Software

WooCommerce product bundles vs composite products (and where cost fits)

October 28, 2026 · 6 min read

"Bundle" means three different things in a WooCommerce store, and the tools for each are easy to mix up:

The first is what the Product Bundles extension is for and the second is Composite Products. The third is a different problem: what the thing costs you and what you should charge. This guide covers what each one does, how each one sets the price, and which one you need.

The short version

Product BundlesComposite ProductsBill of materials
SolvesSelling items togetherLetting the shopper build itKnowing cost and setting price
Who picks the contentsYou (with optional extras)The shopper, step by stepYou
Price comes fromA base price, plus item selling prices if you chooseComponent selling prices, with discountsPart costs + labor, through your markup or margin rule
Knows your cost and marginNoNoYes

Product Bundles

Product Bundles is Woo's own extension ($79 a year as of October 2026). You create a bundle product and add the items in it. Each item keeps its own stock, so a bundle shows as out of stock when one of its items is.

Pricing works one of two ways, according to Woo's setup guide:

Either way, the price is built from selling prices. That's fine for a "buy these three, save 10%" offer. It's the wrong starting point when you need to know whether the bundle still makes money.

Composite Products

Composite Products ($149 a year as of October 2026) is for build-your-own products. The shopper goes through steps and picks one option at each, and a choice in one step can show or hide options in the next. Each option is a real product with its own stock, and you can discount components.

It's the right tool when the customer designs the build. Like Product Bundles, its prices come from what each component sells for, not from what it costs you.

The gap: neither tool knows what a kit costs you

Here's where it bites. Say you sell a Trail Build bundle priced as the sum of its parts less 10%:

PartSelling priceYour cost
Frame · Large · Blue$3,200.00$2,300.00
Wheelset$590.00$420.00
Saddle$90.00$65.00
Assembly labor and boxnone$115.00
Bundle (sum less 10%)$3,492.00$2,900.00

That's a 17.0% margin, which is already thinner than most people guess, because the labor and packing never appear in a selling-price bundle. Now the frame supplier raises prices 8%. Your frame cost goes to $2,484, but you haven't touched the frame's retail price, so the bundle price doesn't move. Margin drops to 11.7%, and nothing in WooCommerce tells you.

Multiply that by every bundle that uses the frame, and by every supplier increase in a year, and it adds up.

The bill of materials approach

A bill of materials (BOM) starts from the other end. Each kit lists its parts, labor and packaging. Each part has a cost. The kit's cost of goods (COGS) is the sum, and a pricing rule turns that cost into a price:

When the frame cost goes up, the kit's cost goes up with it, the rule produces a new price, and you see exactly which kits changed and why. The guide to pricing assembled products covers the rules and rounding in more detail.

Which one do you need?

Plenty of stores need more than one. The question to ask for each product is whether its price should come from what the parts sell for or from what they cost.

Doing it in WooCommerce

We built BOM Pricing for WooCommerce for the third case. It started as the internal tool of our own store, which builds what it sells. The free version adds a bill of materials to any product or variation (parts, labor, packaging and sub-assemblies), rolls up the cost, applies a markup, margin or cost-plus rule with rounding, and flags every kit when a part's cost changes. Pro reprices automatically within a limit you set and imports costs from a supplier CSV. Business tells you how many of each kit you can still build and which parts to reorder first.

Download the free plugin or read the docs.

Not sure which approach fits your products? Email hello@oakhammer.app with what you sell. We answer these ourselves.