For WooCommerce stores selling configurable products, dynamic pricing by attributes replaces the variation-per-combination model with something leaner: each attribute value carries a pricing rule, and the final price is assembled from those rules the moment a customer makes their selections.
This article covers how the system works — the data model, how rules get evaluated, how price updates reach the customer — and where it outperforms the standard variation approach for complex configurable catalogs.
What Is Dynamic Pricing by Attributes?
It's a pricing model where the final price of a configurable product is calculated on demand from a set of rules, rather than looked up from a pre-generated combination record. In standard WooCommerce, a variable product stores one record per combination — three attributes of four values each means 4 × 4 × 4 = 64 variation records, each with its own stored price. In an attribute pricing model, the same product stores 12 rules, one per attribute value, and calculates the price at runtime by summing modifiers for whatever the customer picks.
Each attribute value maps to a modifier: a fixed addition (+$50 for a Large size), a fixed subtraction, a percentage of the running price, or a price override that sets the total outright. The engine evaluates each selected attribute in turn and applies its modifier to the running total.
Why Variations Don't Scale Here
The variation model works fine for a handful of simple options, but it breaks down structurally as configurable dimensions grow. Counts multiply, not add: four attributes of five values each is 625 variation records; a fifth attribute of five values pushes that to 3,125. Each is a product_variation post plus eight to twelve wp_postmeta rows, so the postmeta table becomes the bottleneck at scale. Prices are also stored per variation, so a material surcharge across twenty products with three material options means editing sixty individual records by hand — where attribute pricing collapses that to one rule update. WooCommerce itself warns at 50 variations per product and paginates the admin past 150; beyond a few hundred, the product page ships a large serialised JSON payload to the browser that measurably hurts Core Web Vitals.
How the Pricing Engine Works
Every product starts with a base price. When a customer makes selections, the engine looks up the rule for each selected value and applies it to the running total — a fixed addition, a percentage, or a subtraction — until all attributes are evaluated. The number of operations equals the number of attributes, not the number of possible combinations, so a six-attribute product performs six rule lookups whether it theoretically supports sixty configurations or sixty thousand. Recalculation happens over a lightweight AJAX request each time a selection changes, so the price updates without a page reload.
Example: Custom Office Desk Configurator
A custom desk at a $299 base price, configured by frame material, desktop size, and surface finish:
| Attribute | Option | Price Modifier |
|---|---|---|
| Frame Material | Bamboo / Solid Walnut / Powder-Coated Steel | +$0 (base) / +$180 / +$95 |
| Desktop Size | Medium (120×60) / Large (160×80) / XL (200×90) | +$0 (base) / +$60 / +$90 |
| Surface Finish | Natural / Oiled / Lacquered | +$0 (base) / +$35 / +$55 |
Solid Walnut, XL, Lacquered comes to $299 + $180 + $90 + $55 = $624. Bamboo, Medium, Natural stays at the $299 base. The same 9 rules cover all 27 possible configurations — the variation model would need 27 separate records, each priced and maintained individually.
Cart, Checkout, and Orders
The configured price and selections are stored as cart item metadata when the product is added to the cart, and WooCommerce's standard cart, checkout, tax, and shipping infrastructure uses that stored price without modification. At checkout, no variation ID is referenced — the order records the attribute selections and the agreed price directly. Admin order views, order confirmation emails, and the Thank You page all display the configured selections alongside the price, so fulfillment and reporting work against the same data they always have.

Why the Database Stays Flat
A product with 100 possible attribute combinations needs 100 product_variation posts and roughly 800–1,000 wp_postmeta rows under the variation model — across fifty similar products, that's 5,000 posts and up to 50,000 metadata rows, all queried together. The same catalog under attribute pricing stores one shared rule set of 12–20 rules, because rule sets are assigned to products rather than duplicated per product. Update one rule — say, a material tier's modifier — and every product referencing it reflects the change with no further editing. Evaluation itself is a handful of indexed lookups per request, completing in milliseconds, and the product page ships no variation payload at all: pricing data is fetched only for the specific configuration a customer is actually building.
Where This Fits
Configurable furniture — sofas, tables, shelving, lighting — priced by material, size, colour, and finish is the clearest fit, since most combinations carry no real stock distinction. The same logic applies to commercial print (paper grade, print method, format size, quantity tier — a shop with fifteen paper grades, six methods, and twelve sizes needs 1,080 variation records per product versus 33 rules), made-to-order manufacturing priced by material grade or dimensional spec, and service packages priced by deliverable count, revision rounds, or turnaround tier.
Why This Beats Variations at Scale
Record count grows with the number of unique attribute values, not their combinations — adding a new product on an existing rule set adds zero pricing records. A rule change propagates to every product referencing it instantly, with no bulk editing or risk of inconsistency. New products need only a base price and a rule set assignment. Product pages carry no variation payload, so page weight stays constant regardless of how many configurations a product theoretically supports. And pricing logic lives in one place instead of scattered across paginated variation lists on dozens of products.
Conclusion
WooCommerce dynamic pricing by attributes is a structural alternative to the variation model: one rule per attribute value instead of one record per combination, assembled into a final price at runtime. Database records grow with genuine pricing complexity rather than the Cartesian product of attribute counts, rule sets are shared across unlimited products, and frontend performance stays independent of how deep the configuration options go.