How to Add Product Variations in WooCommerce: Sizes, Prices, and Stock (2026)

A customer chooses a large pizza, the price changes, and the kitchen receives an order that actually says “Large, Stuffed Crust.” That’s the job of a properly configured WooCommerce variable product. The same setup handles T-shirts in different sizes, coffee bags in different weights, and anything else sold in distinct versions. The tricky part isn’t...

September 10, 2026 WPSlash

A customer chooses a large pizza, the price changes, and the kitchen receives an order that actually says “Large, Stuffed Crust.” That’s the job of a properly configured WooCommerce variable product. The same setup handles T-shirts in different sizes, coffee bags in different weights, and anything else sold in distinct versions.

The tricky part isn’t creating the dropdowns. It’s making sure every choice has the right price, availability, and order details. This 2026 guide walks through the setup using a pizza example, with checks that work just as well for a clothing shop or general ecommerce store.

What Are WooCommerce Product Variations?

A variable product is one product listing with multiple purchasable versions. Instead of creating separate pages for a small, medium, and large T-shirt, you create one T-shirt product and let shoppers select their size.

WooCommerce separates this into three pieces: the parent product, its attributes, and its variations. The parent holds shared information, such as the product title and main description. Attributes describe the choices available. Variations are the actual versions customers can buy.

For a shirt, “Size” is an attribute, “Medium” is an attribute term, and the medium shirt is a variation. If you also offer colors, a medium blue shirt becomes one variation, while a medium black shirt becomes another.

A restaurant menu follows the same logic. “Margherita Pizza” is the parent product. Size and Crust are attributes. “Large / Thin” is a variation that can have its own price, image, SKU, and stock settings.

Variations versus optional paid extras

Variations work best for choices that define the item being purchased. A pizza must have a size, and a shirt must have a size. Optional mushrooms or a side of garlic dip are usually better handled as add-ons.

Here’s why: three sizes and two crusts produce six possible variations. Add eight toppings as separate yes-or-no attributes, and you have 1,536 theoretical combinations. That’s a lot of administration for one pizza.

A compatible product add-ons extension is usually the more sensible approach for independently selectable extras. Check that it supports your required pricing rules, selection limits, and order display before committing. An ordinary attribute labeled “Extra Cheese” doesn’t automatically add a surcharge.

For restaurant stores, FoodMaster is our go-to WooCommerce restaurant ordering plugin for the wider ordering workflow, including delivery, pickup, and dine-in orders. Plan the underlying product options first, then verify any modifier requirements against your installed setup. A good ordering interface still needs a sensible menu structure underneath it.

Plan Your Options and Create Product Attributes

Before touching the product editor, write down what you actually sell. Our worked example is a Margherita pizza with three sizes—Small, Medium, and Large—and two crusts: Thin and Stuffed.

There’s one restriction: the kitchen doesn’t make small stuffed-crust pizzas. That means we need five variations, not six. This small planning step prevents a very awkward conversation after someone pays for the sixth.

Use this example price list as your configuration reference. These are illustrative prices, not market averages:

  • Small / Thin: $10
  • Medium / Thin: $13
  • Large / Thin: $16
  • Medium / Stuffed: $15
  • Large / Stuffed: $19

Create reusable global attributes

In the WordPress dashboard, open Products > Attributes. Add an attribute named “Size.” You can normally leave the slug blank for automatic generation, or enter a simple value such as “size.”

Choose custom ordering if you want Small, Medium, and Large displayed in that sequence rather than alphabetically. Add the attribute, then select “Configure terms” beside it. Create each size as a separate term and arrange the terms in your preferred order when custom ordering is enabled.

Repeat the process for “Crust,” adding Thin and Stuffed. There’s no need to enable attribute archives merely to create selectable variations; archives serve a separate browsing purpose.

Global attributes are reusable across products. That makes them a good fit for a pizza menu where several pizzas share the same size and crust labels. They also provide a consistent taxonomy for compatible product-filtering tools.

When product-specific attributes make sense

A custom, product-specific attribute lives on one product rather than in the global attribute list. It’s useful for a genuinely one-off choice that doesn’t need to be reused or included in global attribute filtering.

You can create it inside the product’s Attributes panel. In the standard editor, multiple custom values are separated with a vertical bar, for example “Small | Medium | Large.” For our reusable pizza sizes, though, global attributes are the cleaner choice.

Keep labels clear and consistent. “Large (14-inch)” is more useful than “L” when customers don’t already know your portions. Confirm the dimensions with the kitchen before publishing them.

[IMAGE: WooCommerce Products Attributes screen showing Size terms ordered Small, Medium, Large and a separate Crust attribute with Thin and Stuffed terms]

Create a Variable Product and Generate Its Variations

Go to Products > Add New, or edit an existing product. Enter the title, description, main image, and category. In the standard WooCommerce Product data panel, change the product type from Simple product to Variable product.

Editor layouts and button wording can differ between WooCommerce versions. The underlying sequence stays the same: assign attributes, enable them for variations, then create the purchasable combinations.

Assign the attributes to this product

  1. Open the Attributes tab in the product data area.
  2. Add the existing Size attribute and select Small, Medium, and Large.
  3. Enable “Used for variations” for Size.
  4. Add Crust, select Thin and Stuffed, and enable “Used for variations” for it too.
  5. Save the attributes before opening the Variations tab.

Creating a global attribute doesn’t automatically attach it to every product. Likewise, selecting an attribute name isn’t enough—you need to assign the relevant terms to this particular pizza.

The “Visible on the product page” setting has a different purpose. It controls whether an attribute appears in the product’s additional information display, depending on the template. It does not turn that attribute into a purchase selector.

That distinction catches plenty of beginners. You can display “Size: Small, Medium, Large” as product information without having created a single purchasable variation.

Generate combinations or add them individually

Open the Variations tab and use the action for generating variations from all attributes. Older interfaces may describe this as creating variations from all attributes. With three sizes and two crusts, WooCommerce generates six combinations.

Remove the Small / Stuffed variation because it isn’t part of the menu. Alternatively, add variations individually and choose the exact size and crust for each of the five valid combinations. Individual creation takes longer here, but it’s useful when most theoretical combinations aren’t sold.

For this example, assign explicit terms to every variation rather than leaving “Any Size” or “Any Crust.” Wildcard variations have legitimate uses, but overlapping wildcard and specific variations make beginner setups harder to understand.

Save the variation changes. They won’t become useful purchase options until their required pricing and availability settings are complete, so don’t judge the storefront just yet.

Choose defaults deliberately

The Variations area also lets you set default form values. Medium / Thin is a valid default for our pizza. Small / Stuffed is not.

Leaving defaults blank makes customers actively select their options. Preselecting a valid combination reduces taps, but the selected size and resulting price need to be obvious. My preference for restaurant menus is to avoid a quiet default to the largest, most expensive option. Convenience shouldn’t feel like a trick.

Set Variation Prices, Images, SKUs, and Inventory

Expand each variation and enter its regular price from your planning list. A variation needs a price to be purchasable; leaving the field empty is not the same as making the item free. Only enter zero when a zero-priced variation is intentional.

For a temporary offer, enter a lower sale price and use the scheduling controls if needed. Review your WooCommerce tax settings too: whether you enter prices inclusive or exclusive of tax affects what shoppers see.

Images, SKUs, and bulk editing

A variation image is optional. It’s especially useful when the selection changes appearance, such as a shirt color or a noticeably different crust. Without a variation-specific image, the standard product display generally uses the parent product image.

Variation SKUs are optional in core WooCommerce, but useful for stock tools and kitchen integrations. You might use MARG-S-THIN and MARG-M-STUFFED. If you assign SKUs, make each one unique across the catalog.

The Variations bulk-actions menu can apply changes such as regular prices, sale prices, or stock settings across variations, depending on your version. A shared starting price can save typing, but don’t apply one price across our example and forget the size differences.

Core variation prices are complete prices, not automatic attribute surcharges. Medium / Stuffed needs a price of $15; WooCommerce doesn’t infer “add $2 for stuffed crust” from the attribute name.

Choose what your stock number represents

Product-level stock management provides a shared quantity for variations that inherit the parent’s inventory. If you have 30 identical blank shirts that can be customized after ordering, a shared pool may make sense.

Variation-level stock management gives each version its own quantity. For clothing that’s already manufactured, this usually fits better: eight medium shirts and three large shirts are distinct inventory pools.

WooCommerce can support variations with their own stock alongside variations that inherit parent stock. That flexibility is useful, but an accidental mixture makes availability confusing. Decide which model you need before entering quantities.

For pizza, neither approach automatically equals ingredient tracking. Selling one large pizza doesn’t natively deduct a calculated weight of dough, cheese, and tomatoes shared with other menu items. Even parent-level stock only pools inventory within that product; it doesn’t create a shared ingredient pool across the menu.

If you need recipe-based deductions, use a compatible ingredient-inventory integration or a managed operational process. Don’t label a stock field “cheese portions” and expect WooCommerce to understand the recipe.

Backorders allow purchases beyond available tracked stock. For food needed tonight, disable them unless there’s a deliberate fulfillment plan. Also review WooCommerce’s global out-of-stock visibility setting: sold-out options may be hidden or become unavailable depending on configuration and storefront behavior.

[IMAGE: Expanded WooCommerce Medium Stuffed pizza variation showing a $15 regular price, unique SKU, variation image selector, and highlighted inventory controls]

Test the Buying Experience on Mobile and at Checkout

Preview the product on a real phone, not just a narrowed desktop window. Long option labels, sticky purchase bars, and quantity controls can behave differently on touchscreens. Test as a logged-out shopper as well as an administrator.

The parent product may initially show a price range. After a valid selection, the standard variation form should show the applicable variation price. Taxes and sale formatting can affect the presentation, so compare it with your intended customer-facing total.

Use this checklist before publishing:

  • Select every valid size-and-crust pair and confirm its price.
  • Try Small / Stuffed and confirm it cannot be purchased.
  • Clear selections, change them repeatedly, and check that availability updates correctly.
  • Test quantity changes and stock limits, including an intentionally sold-out variation.
  • Add two different variations to the cart and confirm their options and quantities remain distinct.
  • Check cart and checkout totals, including tax, delivery charges, and any discounts.
  • Complete a test purchase through your existing gateway’s supported test mode, preferably on staging, and check the resulting order and emails.

Don’t enable payment test mode on a busy live store without planning the interruption. For online payments, verify the gateway result and expected WooCommerce order status rather than assuming that reaching an order-received page proves settlement.

Check what reaches the kitchen

Variation attributes should be recorded with the order line item. Confirm that “Medium / Stuffed” appears in the order record and that any connected printer, POS, or kitchen screen displays it clearly. Integration templates can omit details even when WooCommerce stores them correctly.

FoodMaster brings POS, kitchen display, QR table ordering, and automatic printing into its restaurant ordering system built on WooCommerce. Still, run an end-to-end test with your actual connected devices. “Margherita × 2” isn’t enough information to cook the right order.

If you prefer size buttons or swatches to dropdowns, you’ll generally need compatible theme or extension functionality. Check keyboard access, visible selection states, and clear unavailable-option labels. Attractive buttons aren’t an improvement if customers can’t tell which one they selected.

Fix Common WooCommerce Variation Problems

Start with the product configuration, not a new plugin. Most variation problems are easier to isolate when you inspect one affected combination at a time.

No option dropdowns appear

Confirm the product type is Variable product, the attributes contain assigned terms, and “Used for variations” is enabled. Then check that variations were actually created and saved. Displaying attributes in additional information doesn’t create purchase options.

A variation can’t be purchased

Open that variation and check that it’s enabled, has a price, and is available under its stock settings. Make sure the selected pair exists. An unsupported Small / Stuffed combination should fail; Medium / Thin should not.

The price is missing or incorrect

Inspect the price on the individual variation, including sale scheduling. Check tax display settings and any active pricing extensions. Remember that setting defaults or naming a crust “Stuffed +$2” doesn’t calculate a variation’s price.

An option unexpectedly shows out of stock

Check both parent and variation inventory settings to identify which level controls availability. Review quantities, stock status, backorder settings, and pending orders that may be holding stock. Also check whether the global hide-out-of-stock setting explains a missing choice.

The image doesn’t change

Confirm you assigned an image to that variation and selected a complete, valid combination. If no variation image exists, retaining the parent image is normal. If the image is assigned but still won’t update, investigate the gallery and variation-form scripts.

After configuration checks, clear relevant caches and reproduce the issue on staging. Temporarily test with a standard WooCommerce-compatible theme and deactivate nonessential extensions there, one at a time. Optimization tools that delay or combine JavaScript are worth checking when selectors stop responding.

Before publishing, confirm five things: valid combinations only, correct prices, intentional stock settings, a successful mobile checkout, and readable order details. Save the product and retest the public page after any cache refresh.

That’s the real finish line—not a product editor full of variations, but an order that arrives with the right size, the right price, and no reason for the kitchen to call back asking which crust the customer wanted.

Commission-free ordering

Run restaurant orders on your own WordPress site

FoodMaster adds delivery, pickup, dine-in, POS, and kitchen tools — with zero per-order fees.

Get FoodMaster

Leave a Comment

Your email address will not be published. Required fields are marked *

×

🔥 ONE DAY ONLY OFFER 🔥

Upgrade FoodMaster Today

Normally your license is limited to 1 Website.

Today only, get a LIFETIME Unlimited Websites License for just:
$499

✔ Unlimited Client Websites
✔ Unlimited Personal Projects
✔ Future Updates Included
✔ Save Hundreds on Additional Licenses

Offer Ends In: