Oakhammer Software

How to price assembled products in WooCommerce

October 13, 2026 · 7 min read

If you sell things you put together from parts (bike builds, electronics kits, lift kits, custom PCs, furniture, anything with a parts list) you've probably priced them the same way everyone does: a spreadsheet with the parts down the left, a cost column, a markup at the bottom, and a number you typed into WooCommerce six months ago.

That number is almost certainly wrong by now. This guide covers how to price assembled products so they stay right: what goes into the cost, which pricing rule to use, how to round, and how to keep prices moving when part costs move.

Why spreadsheets leak margin

A spreadsheet price is a snapshot. The parts it was built from keep changing underneath it. A frame supplier raises prices 8%. A freight surcharge appears. You switch to a better saddle that costs $5 more. Each change is small, none of them triggers a repricing, and a year later a kit you thought ran at 40% markup is running at 26%.

The problem compounds with shared parts. One wheelset might go into six different builds. When its cost changes, six prices need to change, and the spreadsheet doesn't know which six. So nobody updates them.

The fix isn't a better spreadsheet. It's keeping the cost of each part in one place, building each product from those parts, and letting a rule turn cost into price automatically.

Step 1: Know the full cost of a build

The cost of an assembled product is more than its parts. A complete bill of materials (BOM) for a kit usually has four kinds of line:

LineCost
Frame · Large · Blue$2,300.00
Wheelset$420.00
Saddle$65.00
Assembly & tuning labor$75.00
Box and packing$40.00
Rolled-up cost$2,900.00

If a product is itself made of other assembled products (a two-bike pack built from two bikes), its cost should roll up from theirs. That's what makes a part cost change propagate all the way to the top.

Step 2: Pick a pricing rule

There are three rules that cover almost every store. They look similar and give different numbers, so it's worth being clear about which one you mean.

Markup on cost

Price = cost × (1 + markup). A 40% markup on $2,900 is $4,060. This is what most people mean when they say "I mark things up 40%". It's simple and it's how most spreadsheets are built.

Target margin

Price = cost ÷ (1 − margin). A 40% margin on $2,900 is $4,833, because margin is measured against the selling price, not the cost. A 40% markup is only a 28.6% margin. If your accountant talks in margin and you price in markup, your numbers are quietly lower than you think.

Rule at 40%Price on $2,900 costActual margin
Markup on cost$4,060.0028.6%
Target margin$4,833.3340.0%

Cost plus a fixed amount

Price = cost + $X. Useful for labor-heavy or low-cost builds where a percentage would be too small to cover the work, and for products where your competitors' prices put a ceiling on markup.

Which one? Markup if you think in "what do I add on top". Margin if you manage the business by gross margin. Fixed amount for anything where the work, not the parts, is what you're selling. Pick one per product category and stick to it, so a cost change produces a predictable price change.

Step 3: Round like a retailer

A computed price of $4,060.00 is fine; $4,061.37 is not. Rounding rules keep prices looking intentional after a recalculation:

Always round up, never to nearest. Rounding down is giving away margin you already decided you needed.

Step 4: Decide what happens when a cost changes

This is the part the spreadsheet never did. When a part cost changes, there are three sensible responses, and the right one depends on the product:

  1. Reprice automatically. The new cost runs through the rule and the price updates. Right for most products most of the time.
  2. Flag for review. The new price is computed and shown next to the old one, and a person decides. Right for your best sellers, anything with a price you've advertised, or any change bigger than a threshold (say 5%).
  3. Hold. Some prices are fixed by a catalog, a contract or a competitor. The system should tell you the margin shrank, but not touch the price.

Whatever you choose, the thing that matters is that the change is visible: "Saddle cost changed $60.00 → $65.00; 6 products affected; margin on the Trail Build fell from 40% to 38.6%." That one line is what the spreadsheet could never give you.

Step 5: Wholesale prices follow the same cost

If you also sell to dealers or trade customers, their prices should come from the same cost with a different rule (cost + 20% instead of cost + 40%, say) and a margin floor that stops a quantity discount or a % off retail from ever selling under a minimum margin. When the cost changes, the dealer price moves with it, and you never find out three months later that a dealer has been buying under cost.

Doing this in WooCommerce

WooCommerce has a cost of goods field, but it has no idea that one product is made of others. To price assembled products properly you need a bill of materials on each product, costs on each part, a pricing rule, and recalculation when a cost changes.

That's what we built BOM Pricing for WooCommerce to do. It started as the internal tool of our own store, which builds and sells assembled products, and was rebuilt for WooCommerce so other stores could use it. The free version does the BOM, the roll-up, the three pricing rules above with rounding, and a review screen that shows every kit's cost, price, margin and why it changed; Pro adds automatic repricing with a safety limit, bulk apply, cost history and CSV import; Business adds buildable-kit stock and part reorder from kit sales. Oakhammer B2B handles the wholesale side from the same costs.

If you'd rather keep your spreadsheet, at least do two things: put a "last repriced" date on every product, and set a monthly reminder to re-run the whole sheet. It's the manual version of what the plugin does every time a cost changes.

Questions about pricing your own builds? Email hello@oakhammer.app. We answer these ourselves.