TL;DR
- WooCommerce variations work for small, fixed sets (3 sizes × 2 colours = 6 rows). They fall apart when pricing is combinatorial (size × material × length) or continuous (any quantity, any dimension).
- You end up entering — and maintaining — hundreds of rows by hand, and a customer who wants 137 units still can’t be priced, because variations can’t interpolate between your presets.
- CraftForms replaces the grid with a price formula plus a price matrix (a lookup table). One rule prices every combination, including the ones you never typed in.
- Two ready-made starter forms ship with it — WC: Pipe (formula pricing) and WC: Stickers (quantity × size tiers) — and you can edit the pricing table as a CSV in a spreadsheet.
- The price updates live in the browser as the customer configures, and is recalculated on the server at submit, so the amount charged is always the server’s number.
The features and starters in this guide are part of CraftForms Pro.
The problem: variations don’t scale with complexity
WooCommerce’s attribute-and-variation system is one of the best things about it — for the job it was designed to do. A T-shirt in three sizes and two colours is six variations. You set a price for each, attach an image, track stock, done. Clean.
The trouble starts when your pricing has more than one or two dimensions, or when one of those dimensions is a number rather than a short list.
Consider a sticker shop. You offer four sizes and let customers buy in tiers: 50, 100, 200, 300, 500, 1,000, 2,000, 3,000, 5,000, or 10,000 stickers. That’s already 4 × 10 = 40 variations for a single product — forty rows to create, price, and keep up to date. And it gets worse:
- You can’t price the in-between. A customer wants 137 stickers. There’s no variation for 137. They either can’t order it, or you force them into a tier that doesn’t reflect what they’re buying.
- Add a third dimension and it explodes. Offer two materials as well and you’re at 80 rows. A fourth finish option and you’re past 300. This is the “I have to manually add 640 price options for one product” situation people describe on the WooCommerce forums — and they’re not exaggerating.
- Every price change is a chore. Raise prices 5% and you’re editing dozens of variation rows by hand, hoping you didn’t fat-finger one.
The root issue is that variations store a finished answer for every possible question. If the questions are few and fixed, that’s fine. If they’re many, or open-ended, storing every answer is the wrong model. You want to store the rule instead.
The fix: a formula and a lookup table
CraftForms takes a different approach. Instead of attaching pricing to pre-built variations, you build the product as a small form on the product page and define how the price is calculated. There are three building blocks, all managed from the Smart Variables panel in the form editor:
- Expression — a pricing formula written from the form’s field values, e.g.
base * quantityorarea * rate. - Price matrix — a lookup table keyed by one or two field values, with a choice of lookup strategies: Exact match, Closest up (largest ≤ value), or Closest (nearest).
- Conditional variable — picks a value or another table depending on what the customer selected.
The form’s final price comes from a Price Formula that ties these together. Let’s see it on the two real products that ship as starters.
Tip: Both examples below are included as starter forms (one-click install) — WC: Pipe and WC: Stickers — so you can load one and inspect every formula rather than building from scratch.
Walkthrough 1 — Pipe pricing from one formula (the “WC: Pipe” starter)
A pipe’s price depends on three things: its diameter, its material, and its length in feet. Length is the giveaway that variations can’t handle this — length is continuous. Someone might order 2.3 feet, or 5.8.

Here’s the entire pricing setup:
- Diameter is a dropdown. A price matrix maps each diameter to a base price — 3″ → 45.50, 4″ → 77.05, 5″ → 108.60, and so on. The result is a Smart Variable,
diameter_price. - Material is a set of radio buttons that resolves to a multiplier,
material_coef— for example galvanised steel at ×1.0 and 304 stainless at ×1.7. - Length is a number input the customer types directly (with a min, max, and step).
The Price Formula is just:
diameter_price * material_coef * length
That single line prices every combination of diameter, material, and length — including the 2.3-foot order that no variation table would ever contain. There is nothing to maintain combinatorially: change a diameter’s base price in one table cell, or a material’s multiplier, and every order reprices instantly.
As WooCommerce variations, this product is impossible to model properly. As a CraftForms form, it’s one table, one multiplier, and one line of arithmetic.
Walkthrough 2 — Quantity-tier pricing done right (the “WC: Stickers” starter)
This is the example that maps directly onto the “40-to-640 variations” pain, so it’s worth seeing in full.

The sticker product has two inputs: size (50×50, 75×75, 100×100, 125×125 mm) and quantity (the ten tiers above, plus a “Custom qty” option). Here’s how the pricing is built without a single variation:
- A unit-price matrix per size. Each size has a price matrix keyed on quantity, using the Closest up (largest ≤ value) strategy. For the 50×50 sticker, the unit price steps down as volume rises: 1.08 at 50 pieces, 0.65 at 100, 0.425 at 200, all the way down to 0.108 at 10,000.
- The “Closest up” strategy is what makes custom quantities work. Because the lookup picks the largest tier at or below the entered number, a customer who types 137 automatically lands on the 100-piece unit price — the correct tier — with no variation for 137 anywhere in sight. This is precisely the thing variations cannot do.
- A conditional variable picks the right table.
unit_price_for_sizeselects the 50×50, 75×75, 100×100, or 125×125 matrix based on the chosen size. - The final price is one expression:
unit_price_for_size * quantity.
That’s the whole engine. But the starter goes further to show what becomes easy once pricing is rule-based rather than row-based:
- Live per-tier prices on the buttons. Each quantity option shows its total price and the volume discount versus the 50-piece rate — e.g. “1,000 · Discount 62%”. Those discounts are computed by Smart Variables, not typed in.
- A running total in an Info block that updates the instant the customer changes size or quantity.
- A custom-quantity branch. Choosing “Custom qty” reveals a number field (min 10, step 10) via conditional logic, and the total — plus a “you save X%” message — recalculates for whatever they enter.
- An Add to Cart button that drops the configured sticker, at its calculated price, straight into the WooCommerce cart.
To build the equivalent in stock WooCommerce you’d need 40 variations just for the fixed tiers, custom quantities would be impossible, and the per-tier discount labels wouldn’t exist at all.
Editing prices stays sane: CSV import and export
A fair objection: “Isn’t a big lookup table just as annoying to edit as a big variations list?”
No — because the table isn’t a wall of WordPress UI rows. Every price matrix has Import CSV and Export CSV buttons. Export the table, open it in Excel or Google Sheets, edit prices the way you’d edit any spreadsheet, and re-import. Updating an entire price list becomes one paste instead of dozens of individual row edits.
It also solves onboarding: if you already keep your pricing in a spreadsheet — and most businesses with this kind of pricing do — you can bring it straight in rather than retyping it into variation rows.
It stays honest: server-side recalculation
Live, in-browser pricing raises an obvious security question: if the price is calculated in JavaScript, can a customer tamper with it?
They can’t change what they’re charged. The number shown as they configure is calculated in the browser for responsiveness, but when the form is submitted, CraftForms re-evaluates the formula on the server and uses that result for the cart and the order. Whatever the browser displayed, the server has the final say. Client-side price manipulation doesn’t reach checkout.
When WooCommerce variations are still the right tool
This isn’t an argument against variations — it’s about using each tool for the job it fits.
Stick with native variations when:
- You have a small, fixed set of combinations.
- Each combination genuinely needs its own SKU, its own product image, and its own independently managed stock.
Reach for a CraftForms formula when:
- Pricing is formula-driven (per-unit, per-area, base + modifiers).
- Pricing is tiered (volume discounts, quantity breaks).
- A dimension is continuous (length, area, weight, custom quantity).
- The variation count is heading into the dozens or hundreds.
And if your worry about leaving variations is stock control, that’s covered too: CraftForms can track inventory per option-combination using a Dynamic SKU and a custom stock table — so you don’t have to choose between flexible pricing and real inventory.
Getting started
- Install CraftForms Pro and enable the WooCommerce integration.
- Create a new form and load the WC: Stickers (or WC: Pipe) starter to see a complete, working setup.
- Open the Smart Variables panel to inspect the price matrices and the Price Formula.
- Swap in your own prices — by hand, or via Export CSV / Import CSV (available for smart variables type “table”).
- Connect the form to your WooCommerce product and let customers configure, price, and add to cart in one step.
You’ll have replaced a sprawling variations grid — and everything it couldn’t do — with a handful of rules that price every combination, including the ones you never typed in.





