WooCommerce Buy X Get Y: Same-Product vs. Cross-Product BOGO
WooCommerce Discount Types
One BOGO. Two Completely Different Deals.
Same-product and cross-product BOGO look identical to the customer โ “buy something, get something cheaper” โ but they’re built on different mechanics, configured differently, and fail in different ways. Here’s how to tell them apart and set each one up correctly.
Most store owners think of BOGO as a single thing: “buy one, get one.” In practice there are two quite different structures that both go by that name, and conflating them causes real problems at configuration time.
The first structure โ same-product BOGO โ is about quantity. A customer buys two units of one product and the second unit is discounted. The buy and the get come from the same product pool. The second structure โ cross-product Buy X Get Y โ is about pairing. A customer buys a defined set of “buy” products and gets a different defined set of “get” products at a discount. The buy and the get are explicitly separate.
Same-product BOGO has been the standard interpretation in most WooCommerce plugins for years. Cross-product Buy X Get Y requires a more sophisticated discount engine because it needs to evaluate two independent product pools simultaneously. Smart Cycle Discounts treats them as distinct discount types โ same-product BOGO in the free tier, cross-product Buy X Get Y in Pro. This guide covers what each one is, when each one makes sense, and what to watch out for when setting them up.
What same-product BOGO actually is
Same-product BOGO is the classic “buy two of something, get one cheaper” deal. The qualifying products for the “buy” side and the discounted products for the “get” side come from the same eligible pool. When a customer adds enough units of a qualifying product, the discount fires on the additional units.
In Smart Cycle Discounts, same-product BOGO is configured with three values:
- Buy quantity โ how many units the customer needs to add before the discount applies
- Get quantity โ how many units get discounted once the threshold is reached
- Discount percentage โ what percentage comes off the “get” units, from 1% to 100%
A classic Buy One Get One Free is buy quantity 1, get quantity 1, discount 100%. A Buy Two Get One Free is buy quantity 2, get quantity 1, discount 100%. You can also do partial discounts: buy quantity 2, get quantity 1, discount 50% gives you one unit at half price after every two full-price units.
The mechanics operate entirely within a single product scope. The campaign can apply to all products, a specific list of products, or a category. But the buy units and the get units always come from the same qualifying pool โ there’s no concept of a separate “get” product list.
How the discount calculation works across multiple sets
If a customer adds six units of a qualifying product to a Buy Two Get One Free cart, the plugin calculates two complete “sets” (each set = 2 buy + 1 get), meaning two units are discounted. The discount is distributed across all six units as a blended price rather than appearing as two specific “free” line items. The effective price per unit is lower, but you don’t see oddly-priced individual line items.
What cross-product BOGO (Buy X Get Y) actually is
Cross-product Buy X Get Y is a structurally different mechanism. Instead of working within a single product pool, it maintains two separate product pools โ a “buy” pool and a “get” pool โ and evaluates them independently. A customer must meet a minimum quantity threshold from the buy products before the discount applies to items from the get products.
In Smart Cycle Discounts, the cross-product Buy X Get Y strategy (available in Pro, introduced in version 1.9.0) is configured with six values:
- Buy product IDs โ the specific products (or variations) the customer must purchase
- Buy quantity โ how many buy-side units are required to trigger the deal
- Get product IDs โ the specific products (or variations) that will be discounted
- Get quantity โ how many get-side units receive the discount
- Discount percentage โ the percentage off the qualifying get-side units
- Get discount target โ whether the discount applies to the cheapest or most expensive matching get-side items (by price rank)
There is also an optional max applications cap, which limits the number of times the deal fires per cart. Without a cap, a customer who adds ten buy-side units could trigger the deal multiple times if they also have enough get-side units. The cap lets you bound that exposure.
Fixed product pools are required
Cross-product Buy X Get Y requires both product pools to be explicitly defined โ fixed lists of product IDs. The strategy is incompatible with random product selection or smart selection modes. This isn’t an arbitrary constraint: the discount applies to specific buy/get pairings, so the engine needs deterministic, stable pools to evaluate against. If your campaign uses random or smart selection, you’ll need same-product BOGO instead.
Side-by-side comparison
| Dimension | Same-Product BOGO | Cross-Product Buy X Get Y |
|---|---|---|
| Product pools | One shared pool for buy and get units | Two separate pools: buy products and get products |
| Trigger condition | Quantity threshold from the qualifying pool | Quantity threshold from the buy pool, discount fires on get pool |
| Product selection | All products, specific products, or category | Fixed product IDs only (both pools) |
| Discount target | Proportional across all units in the set | Cheapest or most expensive get-side items by price rank |
| Max applications cap | Supported | Supported |
| Cart total apply_to | Incompatible | Incompatible |
| Random / smart selection | Compatible | Incompatible (fixed pools required) |
| Smart Cycle Discounts tier | Free (strategy id: bogo, since v1.0.0) |
Pro (strategy id: buy_x_get_y, since v1.9.0) |
| Best for | Moving volume of a single product type | Cross-selling: buy A, get B at a discount |
When to use same-product BOGO
Same-product BOGO earns its place when you want to move more units of a single product โ or a category of similar products โ and the customer’s incentive is to stock up rather than to discover something new.
Consumables and replenishables
Coffee beans, protein powder, skincare, cleaning products, pet food โ anything a customer uses regularly and will eventually need more of. When a customer leaves with four bags instead of two, they’re not buying from a competitor for twice as long. Same-product BOGO is one of the cleanest retention tools in a consumables store because the margin cost is real but so is the loyalty value. The customer feels like they got a deal; you extended the repurchase window.
Inventory clearance on a specific SKU
If you need to move a specific product fast โ approaching end-of-season, excess stock, a new version incoming โ same-product BOGO lets you apply the deal to a fixed product list rather than your whole catalog. Set the buy and get quantities, run it for two weeks, and let it expire automatically. The deal is targeted; it doesn’t accidentally discount everything.
Simple social-sharing moments
The phrase “buy one get one free” is memorable and shareable in a way that “buy product A and get product B at a discount” rarely is. If word of mouth matters for your store, a clearly-stated same-product BOGO on a popular product is a stronger signal to share. The psychology of “free” removes hesitation in a way that percentage discounts don’t โ though that same psychology can anchor expectations if you run the deal too often. The full treatment of when BOGO free outperforms 50% off is covered in the guide on Smart Cycle Discounts’ BOGO capabilities.
Run the margin math before choosing your buy/get ratio
Buy 1 Get 1 Free has an effective discount of 50% per transaction. Buy 2 Get 1 Free drops to 33%. Buy 3 Get 1 Free is 25%. Each step back in the buy quantity significantly improves the margin picture. For products with thin margins, starting at Buy 2 Get 1 is usually the more sustainable structure. The effective discount formula is: (get quantity ร discount %) รท (buy quantity + get quantity). Run it before you decide on the ratio.
When to use cross-product Buy X Get Y
Cross-product Buy X Get Y is a cross-selling tool. Its defining characteristic is that the buy products and the get products are different. You’re using a product the customer already wants as leverage to get a different product into their cart at a reduced price.
Product discovery for items that don’t sell on their own
This is the strongest case for cross-product Buy X Get Y. You have a product that gets overlooked because customers don’t search for it directly โ a complementary accessory, a newer model of something, a product that requires the customer to already know why they need it. Pairing it as the “get” product against a bestselling “buy” product gives it a runway it wouldn’t otherwise have. The popular product does the traffic acquisition; the overlooked product gets the trial.
Accessories and complementary pairings
A camera and a memory card. A skincare cleanser and a matching toner. A pair of running shoes and a set of insoles. These are product pairings that make intuitive sense to the customer and that benefit your AOV because the get-side product has meaningful margin. Cross-product Buy X Get Y is the natural structure here because you want the discount to be specific and intentional โ “buy the main product, get the accessory cheaper” โ not a general volume deal.
Choosing cheapest vs. most expensive on the get side
The get discount target setting โ cheapest or most expensive โ is worth thinking through carefully before launch. Discounting the cheapest qualifying get-side item protects your margin on higher-priced items; the customer gets a discount on a lower-value product. Discounting the most expensive is more generous and creates a stronger perceived value (“the most expensive thing in my cart just got cheaper”) but costs more per triggered deal. Neither is universally right โ it depends on your price spread across the get-side products and what you want the deal to feel like to the customer.
How Smart Cycle Discounts handles both
Smart Cycle Discounts treats same-product BOGO and cross-product Buy X Get Y as separate campaign types rather than variations of the same setting. This is the architecturally correct decision โ they have different configuration fields, different eligibility rules, and different edge case behaviors. Conflating them into a single “BOGO” setting is how configuration errors get introduced.
Same-product BOGO (free tier)
The BOGO campaign type in Smart Cycle Discounts is available in the free version and has been since version 1.0.0. You configure buy quantity, get quantity, and discount percentage. The product scope can be all products, specific products, or a category โ the buy and get units always come from the same eligible pool. Setting the discount percentage to 100 gives a true “free” unit; any value below 100 gives a partial discount on the get units.
Same-product BOGO runs as a scheduled campaign with defined start and end times, activating and deactivating automatically. It’s incompatible with the cart-total apply_to mode, which is expected behavior โ BOGO applies to specific units, not to the cart value as a whole.
Cross-product Buy X Get Y (Pro)
The Buy X Get Y campaign type is a Pro feature, introduced in version 1.9.0. You define the buy product IDs, the buy quantity, the get product IDs, the get quantity, the discount percentage, and the get discount target (cheapest or most expensive). Both product pools must be fixed lists โ random and smart selection modes are incompatible because the engine needs stable, deterministic pools to evaluate the buy/get pairing correctly.
The optional max applications cap lets you limit how many times the deal fires per cart. Without a cap, a customer with ten buy-side units and ten get-side units could trigger the deal multiple times. For most promotions you’ll want to set a cap of one or two applications to keep the discount exposure predictable.
Like same-product BOGO, Buy X Get Y runs as a scheduled campaign and is incompatible with cart-total apply_to. The Campaign Intelligence system evaluates both types at launch time โ checking for priority conflicts with other active campaigns, flagging low-stock risks on the buy or get products, and identifying configuration issues before they reach customers. The full setup walkthrough for both types is in the discount types documentation.
Edge cases and things that trip stores up
Both structures have edge cases that are easy to miss during configuration and only surface when a customer hits an unexpected cart state.
Variable products and which ID to use
For cross-product Buy X Get Y, both the buy and get product pools accept either parent product IDs or variation IDs. Using a parent product ID qualifies all variations of that product for the relevant pool. Using a specific variation ID qualifies only that variation. If you want “any size of Product A” to qualify as a buy-side product, use the parent ID. If you want only the 500ml version to qualify, use the variation ID. Getting this wrong is a common source of “the deal didn’t apply” complaints.
Overlapping campaigns and priority conflicts
If a product is eligible under both a same-product BOGO campaign and a cross-product Buy X Get Y campaign simultaneously โ say, Product A is the “get” product in a Buy X Get Y deal, and there’s also an active BOGO campaign covering all products โ you have a conflict. Smart Cycle Discounts handles overlapping campaigns through its campaign priority system: the higher-priority campaign applies, the lower-priority one does not stack. Always check priority settings when running multiple discount campaigns during the same window.
The max applications cap and bulk orders
Without a max applications cap on a cross-product Buy X Get Y campaign, a customer placing a large order could trigger the deal many times in a single cart. For B2C retail this is usually fine (most customers won’t add ten of everything), but if your store handles any wholesale or bulk purchasing, the cap becomes important. Set it before launch, not after reviewing an unexpectedly large discount on a single order.
Cart-total apply_to is not compatible with either type
Both same-product BOGO and cross-product Buy X Get Y apply discounts at the product unit level, not at the cart total level. Setting the apply_to field to cart_total for either campaign type will produce an error or unexpected behavior. These discount types operate on specific items in the cart, so the cart-total mode is not a valid scope for them. This is by design โ a “buy X get Y” deal doesn’t make conceptual sense at the cart-total level.
The “cheapest vs. most expensive” setting and mixed-price get pools
The get discount target setting on cross-product Buy X Get Y only becomes meaningful when your get-side product pool has products at different price points. If all get-side products are priced identically, it makes no difference. If you have a mix of $20 and $80 products in the get pool, the setting determines which one the customer gets discounted โ and which outcome is better for your margin depends on whether you want the discount to protect your high-margin products (choose cheapest) or create a more compelling customer-facing offer (choose most expensive).
A scenario worth thinking through before launch
Imagine you’re running a Buy X Get Y deal: buy any camera, get any camera bag at 50% off. Your camera bag range runs from $25 to $120. With the get discount target set to “most expensive,” a customer who adds a $120 premium bag to their cart alongside a camera gets $60 off. That’s a strong deal and a real cost to you. With it set to “cheapest,” the same customer gets $12.50 off a $25 bag instead. Same campaign structure, very different margin impact โ and very different customer perception of the offer’s generosity. Think through the price spread in your get pool and what you actually want to offer before choosing.
Frequently asked questions
Is same-product BOGO available in the free version of Smart Cycle Discounts?
Yes. Same-product BOGO (strategy id: bogo) is available in the free tier of Smart Cycle Discounts and has been since version 1.0.0. You configure the buy quantity, get quantity, and discount percentage. Cross-product Buy X Get Y (strategy id: buy_x_get_y) is a Pro feature, introduced in version 1.9.0.
Can I use random or smart product selection with cross-product Buy X Get Y?
No. Cross-product Buy X Get Y requires fixed product pools for both the buy and get sides. The strategy needs deterministic, stable product lists to evaluate the buy/get pairing correctly. Random and smart selection modes are incompatible. If your campaign relies on dynamic product selection, same-product BOGO is the appropriate type.
What happens if a product appears in both the buy pool and the get pool of a cross-product Buy X Get Y campaign?
The engine evaluates the buy and get pools independently. A product listed in both pools contributes units to both sides โ the buy quantity check and the get discount application are separate evaluations. In practice this is usually a misconfiguration rather than an intentional setup, so it’s worth reviewing whether you actually want a product to appear in both pools before launch.
How do I limit a Buy X Get Y deal to fire only once per cart?
Use the max applications field and set it to 1. Without a cap, the deal can fire multiple times if the customer has enough buy-side and get-side units to satisfy the buy quantity threshold more than once. Setting max applications to 1 ensures the discount applies once regardless of how many qualifying units are in the cart.
Does cross-product Buy X Get Y apply to the cheapest or most expensive get-side items by default?
The get discount target field must be explicitly set โ there is no default that applies invisibly. You choose either “cheapest” or “most expensive” during campaign configuration. Choosing “cheapest” protects your margin on higher-priced get products; choosing “most expensive” creates a stronger perceived deal for the customer but costs more per trigger. The right choice depends on the price spread in your get pool and your promotional goals.
Can I run a same-product BOGO and a cross-product Buy X Get Y campaign at the same time?
Yes โ they’re separate campaign types and can run simultaneously. The consideration is what happens to a product that falls under both: if Product A is both a qualifying product in a same-product BOGO campaign and a buy-side product in a Buy X Get Y campaign, Smart Cycle Discounts’ campaign priority system determines which campaign applies. The higher-priority campaign wins; the lower-priority one does not stack on top. Always review priority assignments before running concurrent discount campaigns.
Choosing the right structure starts with the right question
Before picking same-product BOGO or cross-product Buy X Get Y, it’s worth pausing on a single question: do you want the “buy” and “get” products to be the same thing, or different things?
If they’re the same โ a customer adds more of one product and the extra units get cheaper โ same-product BOGO is the natural fit. It’s simpler to configure, available in the free tier, and works across flexible product scopes including categories and all-products modes.
If they’re different โ a customer buys Product A and gets Product B at a discount โ cross-product Buy X Get Y is the right structure. It requires fixed product pools and the Pro upgrade, but it enables a genuinely different promotional mechanic: using a product the customer already wants as leverage to move a product they hadn’t yet considered.
The two structures can coexist in the same store during the same promotional window. They serve different goals. And as with any discount, the margin math should run before launch โ not after you’ve seen what the discount actually cost you.
Key Takeaways
- Same-product BOGO uses a single product pool โ the buy and get units come from the same qualifying products. Cross-product Buy X Get Y maintains two separate pools: a buy pool and a get pool. They are different discount structures, not the same structure with a setting changed.
- In Smart Cycle Discounts: same-product BOGO (strategy id:
bogo) is free, available since v1.0.0, compatible with all products / category / specific products scopes. Cross-product Buy X Get Y (strategy id:buy_x_get_y) is Pro-only, available since v1.9.0, requires fixed product pools. - Cross-product Buy X Get Y is a cross-selling tool. Use it when the goal is “customer buys A and gets B cheaper” โ product discovery, complementary pairings, accessory upselling.
- Same-product BOGO is a volume tool. Use it when the goal is “customer buys more of one thing” โ consumables stocking, inventory clearance, habit formation.
- The get discount target on Buy X Get Y (cheapest vs. most expensive) has real margin implications when your get-side pool spans a wide price range. Think through the price spread before choosing.
- Both types are incompatible with cart-total apply_to. Both support a max applications cap to limit how many times the deal fires per cart. Both run as scheduled campaigns with automatic activation and deactivation.
- Random and smart product selection modes are incompatible with cross-product Buy X Get Y. Fixed product ID lists are required for both the buy and get pools.
Both BOGO structures, one plugin
Smart Cycle Discounts includes same-product BOGO in the free tier and cross-product Buy X Get Y in Pro โ each as a distinct campaign type with scheduled activation and Campaign Intelligence to catch configuration issues before launch.