WooCommerce BOGO Promotions: Why They’re Harder to Set Up Than They Look (And How to Do It Right)
WooCommerce Technical Guide
WooCommerce Has No BOGO. Here’s What That Means for You.
Why the plugin landscape for Buy One Get One deals is more fragile than it looks β and how to set one up that actually works.
You decide to run a Buy One Get One promotion. Reasonable choice β BOGO deals are among the most effective promotions for moving inventory and increasing order size. You open WooCommerce, look for the BOGO option, and find nothing. No toggle, no rule builder, no “Buy X Get Y” field anywhere in the product settings or discount area. You search the docs and discover that WooCommerce simply doesn’t have this feature.
So you search for a plugin. There are several. One has a 2.3-star rating. Another has a recent review that reads: “you can only create a title for your BOGO rule.” Another installs fine, works in testing, then silently breaks when you activate the newer block-based checkout. You pick one, spend an hour on configuration, and end up with a promotion that kind of works β until it doesn’t.
This is one of the more frustrating gaps in the WooCommerce ecosystem. BOGO is a standard retail promotion that most store platforms handle natively. WooCommerce doesn’t. And because it doesn’t, the third-party plugin space has filled the void with solutions of wildly varying quality. Knowing what separates a reliable setup from a fragile one will save you a support ticket at the worst possible moment β mid-promotion.
Why WooCommerce can’t do BOGO natively
WooCommerce’s pricing model is built around product-level sale prices and coupon codes. A sale price is a number stored on a product or variation. A coupon can offer a percentage off, a fixed cart discount, or free shipping. Neither of those primitives can express “when the customer has N units of product X in their cart, make Y units free or discounted.”
BOGO is a cart-level conditional. It depends on quantity, not just on which product is in the cart. WooCommerce’s architecture doesn’t have a native hook for “evaluate the cart contents and modify prices based on what’s there and how much of it there is.” That logic has to be built on top.
This isn’t a minor oversight β it’s a genuine architectural gap. WooCommerce is designed around individual product pricing. Cart-level conditional pricing requires a different layer: something that watches the cart, evaluates rules, and injects modified prices. That’s non-trivial to build correctly, which explains why the plugin quality varies so much.
What WooCommerce coupons can (almost) do
A coupon with a “Buy X get Y free” structure isn’t something WooCommerce supports natively. The closest thing is a fixed-cart or percentage coupon with a minimum quantity requirement β but that doesn’t actually add a free product to the cart or discount a specific item based on cart contents. It’s a blunt instrument where BOGO requires surgical precision.
The two technical approaches plugins use (and why one fails)
When a plugin implements BOGO on top of WooCommerce, it has two ways to make the “free” or discounted item appear in the cart. Understanding the difference matters because one approach is solid and one causes problems.
Approach 1: Auto-add a free product to the cart
The plugin detects that the qualifying condition is met (customer has 2 of product X), then automatically adds another unit of product X to the cart at a modified price (free, or 50% off, or whatever the rule specifies). This is the most literal interpretation of “Buy One Get One” β the free item actually appears as a separate cart line with a modified price.
The problem with this approach is that it creates friction. Customers who deliberately remove a product from their cart find it being added back. Customers who don’t want the free item β or don’t qualify anymore because they changed quantities β see the cart behave unexpectedly. Edge cases multiply fast: what happens if the free item is out of stock? What if the customer has a coupon that applies to it? What if they remove the qualifying product after the free one was added?
Approach 2: Price modification at the cart level
The plugin evaluates the cart on the fly and modifies the price of the qualifying item directly. If you buy 2 units and the deal is “Buy 1 Get 1 Free,” the plugin sets the effective price of one unit to zero and charges regular price for the other. The cart still shows 2 items, but the second one has a price of Β£0 (or 50% off, or whatever the rule specifies).
This approach is cleaner from a cart experience perspective. There are no phantom items being added and removed. The customer sees their chosen quantity with a modified price that reflects the deal. It also handles edge cases more gracefully β remove a unit, the discount recalculates.
Most well-built BOGO plugins use price modification. The auto-add approach tends to appear in older or lower-quality plugins where the developer took the literal interpretation without thinking through the edge cases.
Where BOGO plugins fall short in practice
Even among plugins that use the correct technical approach, there are common failure points worth knowing about before you commit to one.
The “title only” problem
Some plugins let you configure a BOGO rule name, set the products, and save β but the implementation beneath it is incomplete. The rule exists in the database but the cart-level logic to apply it either doesn’t work correctly or only works in specific conditions. This is the failure mode behind reviews like “you can only create a title for your BOGO rule.” The UI looks feature-complete but the engine isn’t.
This usually affects newer plugins where BOGO was promised in the roadmap but not fully shipped, or older plugins that haven’t been updated to work with recent WooCommerce versions.
Scheduling is an afterthought
Most BOGO plugins treat a rule as a permanent configuration. You turn it on, it runs. You want to stop it, you turn it off. There’s no concept of “run this promotion from November 29 to December 2 and then stop automatically.”
For any time-limited promotion β which is what most BOGO deals are β this means you’re responsible for manually activating and deactivating the rule. If you forget, the promotion keeps running after it was supposed to end. If you’re travelling or otherwise unavailable, you need someone else to do it. The operational discipline required to manage this manually is higher than most store owners anticipate.
Conflict handling is missing
What happens if a customer has a BOGO deal active and also uses a coupon code? What if you have a sitewide percentage discount running alongside a BOGO rule on specific products? Most BOGO plugins have no concept of conflict resolution. The result is either double-discounting (both apply, unexpectedly reducing price) or one silently cancelling the other. Neither is a good outcome, and you often don’t know which will happen until a customer reports something odd.
Cross-product BOGO is often unsupported
A true BOGO can be “Buy product A, get product B at 50% off.” Many BOGO plugins only support same-product rules: Buy 1 of X, Get 1 of X free. If your promotion is “Buy a coffee machine, get a bag of beans free,” you need cross-product support. Not all plugins have it, and the ones that do often implement it incompletely.
The block-based cart and checkout problem
This deserves its own section because it’s the most recent and most common cause of BOGO plugins suddenly not working.
WooCommerce has been migrating from its classic PHP-rendered cart and checkout to a new block-based implementation using Gutenberg blocks. The classic checkout is a PHP template. The block checkout is a React application. They are fundamentally different in how they render and how they interact with WooCommerce’s pricing logic.
Many BOGO plugins were written for the classic checkout. They hook into PHP filters and actions that fire during the classic checkout render. Those hooks either don’t fire, fire at the wrong time, or fire differently in the block checkout. The result is a BOGO deal that appears to work in your product testing (if you tested on the classic checkout) but fails silently when a real customer uses the block-based checkout β which is now the default in WooCommerce and the direction the platform is heading.
Block checkout compatibility is not the same as HPOS compatibility
Some plugins list “HPOS compatible” in their features (High-Performance Order Storage). That’s a separate update to how WooCommerce stores orders. A plugin being HPOS compatible says nothing about whether it works with the block cart and checkout. Always check specifically for block checkout compatibility β they’re different systems and different development work.
If you’re evaluating a BOGO plugin, test it explicitly on the block-based checkout, not just the classic version. Go to WooCommerce → Settings → Advanced → Features and check whether the block checkout is active on your store. If it is, your BOGO plugin must support it.
What a reliable BOGO setup actually looks like
A BOGO implementation worth relying on has a few non-negotiable properties:
- Price modification, not auto-add. The discount is applied to the qualifying item’s price at the cart level, not by adding phantom products.
- Scheduled activation and deactivation. The promotion has a defined start and end time and runs itself. You set it up in advance and don’t need to remember to turn it off.
- Block checkout compatibility. The cart pricing logic works correctly with both the classic and block-based WooCommerce checkout.
- Conflict handling. When other discounts are active, the behaviour is predictable. Either there’s a priority system or the plugin documents clearly what happens when promotions overlap.
- Flexible buy/get configuration. Buy 1 get 1, buy 2 get 1, buy X get Y β and the ability to set the discount on the “get” unit anywhere from 1% to 100%.
That last point matters because “BOGO” is shorthand for a family of deals that all follow the same structure. “Buy One Get One Free” is the extreme version (100% off the get unit). “Buy Two Get One at 50% Off” is a milder version that’s often better for your margins. A flexible implementation lets you use the same setup for all of these rather than needing a different plugin for each variant.
Smart Cycle Discounts includes BOGO in its free version with this kind of flexibility. You configure the buy quantity, the get quantity, and the discount percentage on the get unit (from 0% to 100%). The deal runs as a scheduled campaign with a defined start and end date β it activates automatically and deactivates automatically. It works with both the classic and block-based WooCommerce cart and checkout. And because it sits inside a campaign management system that handles conflict resolution by priority, overlapping promotions don’t produce unpredictable stacking.
Step-by-step: setting up a BOGO campaign
Here’s what a complete BOGO setup looks like using Smart Cycle Discounts. The same principles apply regardless of which plugin you use β the key decisions are universal.
Define what you’re buying and what the customer gets
Before you touch the plugin, be clear on the structure. Is it Buy 1 Get 1? Buy 2 Get 1? Buy 1 Get 1 at 50% off rather than free? Write it down as a sentence: “Buy 2 units, get 1 unit at 100% off.” This becomes your configuration.
Create a new campaign and name it
Give the campaign a name that will still make sense in three months. “BOGO” is too vague. “Summer BOGO β Coffee Pods β June” tells you what it is, what it applies to, and when it ran. Naming discipline matters when you’re managing multiple campaigns or duplicating a previous one next year.
Select the products in scope
Choose whether the deal applies to all products, a specific category, or a manually selected list. For most BOGO deals, you want a specific product or category rather than the whole catalog. A sitewide BOGO is generous to the point of being margin-damaging on almost any product with a low gross margin. Be deliberate about scope.
Configure the BOGO rule
Set the buy quantity and the get quantity. Then set the discount percentage on the “get” unit. For a true Buy One Get One Free, this is 100%. For Buy Two Get One at 50% off, set the get quantity to 1 and the discount to 50%. The plugin applies this logic at the cart level β when the customer meets the buy threshold, the get unit’s price is reduced by the specified percentage.
Set the schedule
Define a start date/time and an end date/time. This is where campaign-based BOGO earns its keep β the promotion activates without you needing to be at your desk. If you’re setting this up a week in advance, save it as a draft first, then switch to Scheduled status when you’re confident in the configuration. The campaign activates at the scheduled start time automatically.
Review and test before going live
Before activating, put a qualifying product in your cart and verify the discount appears correctly. Check that it works on both the classic cart page and the block-based cart and checkout if both are active on your site. If you have other campaigns running, add a product that falls under multiple campaigns and confirm the correct discount is applied. A five-minute test now is worth far more than a customer support conversation later.
Common configuration mistakes and how to avoid them
Setting the buy quantity too low
Buy 1 Get 1 Free is the most commonly configured BOGO β and the most expensive. On a product with a 40% gross margin, a true BOGO deal means the combined margin on both units is 40% (you’re giving away the second unit entirely). Buy 2 Get 1 Free is often a better deal structure: the customer still feels rewarded, but the margin hit is spread across three units instead of two. Many stores configure Buy 1 Get 1 without checking the margin impact first.
If you’re unsure whether your BOGO deal makes financial sense, the WooCommerce discount calculator on the Webstepper site can help you model it before you commit.
No end date
A BOGO rule with no end date runs indefinitely. If you’re using a plugin that requires manual deactivation and you forget, customers continue getting the deal long after your promotional window closed. Always set an explicit end date. If you want a permanent deal, that’s a different product pricing decision β not a promotion.
Forgetting that “get” quantity adds to the cart total
When the deal is “Buy 2 Get 1 Free” and the customer only puts 2 units in the cart, nothing happens β they need to add the third unit for the deal to apply (or the plugin needs to add it automatically, which brings its own problems). Make sure your store’s product pages or cart clearly communicate the deal mechanics. “Add 3 to qualify for Buy 2 Get 1 Free” is clearer than a vague “BOGO deal active” banner that doesn’t tell customers what they need to do.
Applying the deal to products with variable costs
Products where the cost varies significantly by variation (a small item at Β£5 vs. a large at Β£25) can produce unexpected results with a flat BOGO rule. If “Buy 1 Get 1 Free” applies equally to all variations, a customer buying one large and getting one large free may be getting a far better deal than you intended. Consider scoping the rule to specific variations or products rather than an entire variable product if the cost difference is meaningful.
Test with the cart, not just the product page
BOGO discounts are applied at the cart level, not the product page level. The product page price doesn’t change β the discount appears when the qualifying quantity is in the cart. If you’re testing your setup and not seeing a discount on the product page, that’s expected. Test by actually adding the qualifying quantity to the cart and checking the cart total.
Conflicting campaigns without priority settings
If you have a percentage discount campaign active (say, 15% off sitewide) at the same time as a BOGO campaign on specific products, those products fall under both campaigns. Without conflict resolution, the result is unpredictable β you might get both discounts applied, or one might override the other depending on the order they’re evaluated. Use a priority system to make this explicit: set which campaign wins when they overlap, rather than leaving it to chance.
Frequently asked questions
Does WooCommerce support BOGO deals natively?
No. WooCommerce does not have a built-in Buy One Get One mechanism. BOGO requires cart-level conditional pricing logic that WooCommerce’s native pricing model doesn’t support. You need a third-party plugin to add this capability.
Why is my WooCommerce BOGO plugin not working with the block checkout?
Most BOGO plugins were built for WooCommerce’s classic PHP-rendered checkout and use hooks that don’t fire correctly in the block-based checkout. The block checkout is a React application with a different integration model. If your BOGO deal works on the classic cart but not the block cart, your plugin hasn’t been updated for block compatibility. Check the plugin’s changelog or support forum for a block checkout update, or switch to a plugin that explicitly supports both.
How do I set up Buy 2 Get 1 Free in WooCommerce?
You need a BOGO plugin. Configure the rule with a buy quantity of 2, a get quantity of 1, and a discount percentage of 100% on the get unit. The deal applies when a customer adds 3 or more units to their cart β the third unit (or every third unit for larger quantities) is discounted to free. Smart Cycle Discounts supports this configuration in its free version.
Can I run a BOGO deal on a schedule in WooCommerce?
Yes, but only with a plugin that supports scheduled campaigns. Most basic BOGO plugins require you to manually activate and deactivate the rule. A campaign-based plugin lets you set a start date and end date for the promotion β it activates and deactivates automatically. This is especially important for time-limited events like holiday promotions or flash sales.
What’s the difference between Buy One Get One and Buy X Get Y?
Buy One Get One (BOGO) is the specific variant where buying one unit entitles the customer to a second unit at a discount or free. Buy X Get Y is the general form: buy any quantity X, get another quantity Y at a specified discount. A flexible BOGO plugin lets you configure both the buy quantity and the get quantity, so you can set up deals like Buy 2 Get 1 or Buy 3 Get 2 as well as the classic Buy 1 Get 1.
Will a BOGO deal stack with coupon codes in WooCommerce?
It depends entirely on the plugin. Some BOGO plugins have no conflict resolution and will apply both discounts, which usually isn’t what you intended. Others block coupon usage when a BOGO deal is active. The best approach is a plugin with explicit priority handling, where you can define which discount takes precedence when a customer qualifies for multiple promotions at once.
The short version
WooCommerce doesn’t do BOGO natively. The plugin space that fills the gap ranges from solid to barely functional. The failure modes worth watching for are incomplete implementations that only let you name a rule without actually applying it, plugins that break with the block-based checkout, and rules with no scheduling that require you to remember to turn them off.
A BOGO deal worth running is one that activates when you set it to, applies the correct discount at the cart level, works with however your checkout is configured, and stops when the promotion period ends β without you having to be there for any of it. That’s a higher bar than most people expect going in, but it’s entirely achievable if you pick the right foundation.
Decided on the setup β now check the strategy
This guide covers the technical side of getting BOGO working in WooCommerce. If you want to think through whether a BOGO deal makes sense for your store, which products to run it on, and how to model the margin impact before you commit, the guide on BOGO promotions and margins covers that side in detail.