Dynamic Pricing Recipe

Buy 2, Get 1 Free

The whole setup, on one screen, with the numbers from a real cart. About two minutes.

Read this first: the customer needs 3 in the cart

"Buy 2, get 1 free" is a block of three items—two paid, one free. At a quantity of 2 there is no discount, and that is correct behaviour rather than a broken rule. It is also the single most common reason someone thinks this feature is not working.

What you need

Configure the rule

  1. Edit the product, and open the Dynamic Pricing tab in the Product data panel.
  2. Click Add Pricing Group.
  3. Leave Applies To on Everyone, and Quantities based on on Product Quantity.
  4. Set Rule Processing Mode to Special Offer. This is the step people miss—the default, Bulk, builds quantity-break tables instead, and will never produce a free item.
  5. Fill the row: Purchase 2, Receive 1, type Percentage, amount 100, Repeating: Yes.
  6. Update the product.
The Dynamic Pricing tab with Rule Processing Mode set to Special Offer, and a row reading Purchase 2, Receive 1, Percentage, 100, Repeating Yes
The finished rule. Percentage 100 is what makes the received item free—there is no separate “free” type.

What each field does

FieldMeaning
PurchaseHow many they pay for
ReceiveHow many are discounted on top of that
Type & AmountPercentage 100 makes the received items free. Percentage 50 would make them half price
RepeatingYes applies the offer again for every further block of 3. No gives one free item per order however many they buy

What the customer is charged

Measured on a $20.00 product with the rule above, repeating set to Yes:

In cartFull priceChargedFree items
1$20.00$20.00
2$40.00$40.00not yet a full block
3$60.00$40.001
4$80.00$60.001
6$120.00$80.002
9$180.00$120.003

What it looks like in the cart

A WooCommerce cart with three t-shirts, unit price struck through from $20.00 to $13.33, and a total of $40.00
Three items, $40.00 charged.

Note the unit price: WooCommerce shows $13.33 rather than two at $20.00 and one at zero. The discount is spread across the line rather than applied to one unit, because a cart line holds a single price per item. The line total and the order total are exact—only the per-unit display is averaged, and the saving badge rounds to match it.

Variations on the same rule

You wantChange
One free item per order, not per blockRepeating: No
Buy 3, get 1 half pricePurchase 3, Receive 1, Percentage 50
Buy 1, get 1 freePurchase 1, Receive 1 — the customer needs 2 in the cart
Wholesale customers onlyApplies ToSpecific Roles, then pick the role
A weekend promotionFill the Dates fields. The rule switches itself on and off
Any 3 from a category, not one productQuantities based onQuantity of Category