Running multiple campaigns on the same product or page
How several different campaigns interact when their conditions overlap on the same cart, product, or page — what stacks, what wins, and what to watch for.
Running one campaign is simple. Things get more interesting when two or more different campaigns could fire on the same cart, the same product, or the same storefront page at the same time. This page explains exactly how separate campaigns interact when their conditions overlap — which ones stack and show together, which one wins, and the edge cases that trip merchants up.
This page is about separate campaigns overlapping. It is not about multiple offers inside one campaign — that is a different feature where tiers live in a single campaign. For the full feature-by-feature precedence map, see How features interact.
Campaigns are independent
Every active campaign evaluates its own conditions against the live cart on its own. There is no global "first match wins" rule across campaign types. If three different campaigns all match the same cart, all three can act at the same time — one might render a widget on the page, another might silently auto-add a gift, and a third might surface an offer in checkout.
This is the opposite of how multiple offers inside a single campaign behave (where the offers share one widget and you pick which tier applies). Separate campaigns do not know about each other, do not suppress each other, and do not share placement.
The one exception is Post-Purchase, which is evaluated in priority order and shows only a single offer per order. Everything else stacks. The table below is the short version; the rest of the page covers each row in depth.
| Campaign type | What happens when several overlap |
|---|---|
| Product Recommendations (Pre-Purchase) | Each widget block renders its own campaign; multiple can show on the same page |
| Gift with Purchase | Each widget block renders its own campaign; multiple can show on the same page |
| Auto-Add | Every matching campaign adds its own line; they do not suppress each other |
| Checkout Upsells | Multiple offers surface together inside the checkout block |
| Post-Purchase | First-valid-wins — only one offer per order, chosen by priority |
Storefront widgets stacking
Product Recommendations and Gift with Purchase are storefront widget campaigns — they render a visible widget on a page. Two of them can absolutely appear on the same page or react to the same cart at once.
Placement is driven by the Widget block you add in the Shopify theme editor, not by the campaigns themselves. Each Widget block resolves to exactly one campaign and renders that campaign's widgetId. So if you want two widgets in the same location, you add two separate Widget blocks, each pointing at its own campaign.
Add the first Widget block
In the Shopify theme editor, open the section where you want the widget, choose Add block, and add the Widget block. Either leave the Widget ID blank to auto-bind to an active Gift with Purchase or Product Recommendations campaign, or paste a specific Widget ID from the campaign in the admin.
Add a second Widget block
Add another Widget block in the same (or a different) section and bind it to your second campaign by pasting that campaign's Widget ID. Each block renders independently and reserves its own placeholder space while loading.
Save the theme
Save the theme editor. Both widgets now render on the page, and each evaluates its own campaign's conditions against the live cart.
If you add two Widget blocks but leave both Widget IDs blank, both fall back to "an active campaign" and may resolve to the same campaign — showing the same widget twice. To show two different campaigns in one spot, set an explicit Widget ID on at least one of the blocks.
A widget block whose campaign's conditions are not met renders nothing (an empty placeholder), so a page with three widget blocks may show one, two, or three widgets depending on which campaigns currently qualify.
Auto-Add overlap
Auto-Add campaigns are the clearest case of independent stacking. When several Auto-Add campaigns qualify on the same cart, each one adds its own line item — they do not compete, and none suppresses the others.
Each auto-added line is tagged with the condition that added it, using a hidden line property (_lcu_condition_id). The app uses this tag to decide whether a line "belongs" to a given campaign condition. Because every campaign condition has its own tag, two campaigns adding the same product variant still produce two separate lines — one keyed to each condition — rather than one campaign overwriting the other's line.
The app also tracks which variants it has already auto-added so it does not re-add a line the shopper deliberately removed. And when a cart stops matching a campaign's condition, only the lines tagged with that condition are removed; lines added by other campaigns stay untouched.
Duplicate gifts. If two Auto-Add campaigns are configured to add the same free product, a qualifying shopper gets that product added twice — once per campaign — because each campaign keys its line independently. The app will not merge them. To avoid this, make sure no two Auto-Add campaigns target the same offer product for the same cart, or tighten one campaign's conditions so they can't both match.
Because Auto-Add changes the live cart (subtotal and quantity go up), an auto-add can also push a different campaign over its threshold and trigger it. This chaining is expected — see How features interact for the details.
Post-Purchase is first-valid-wins
Post-Purchase is the only campaign type with strict ordering. After checkout completes, the app shows exactly one post-purchase offer per order — never two. It decides which one by evaluating your post-purchase campaigns in priority order and showing the first whose conditions match the order.
How priority works
- Priority 1 is highest. The app walks campaigns from priority 1 upward and stops at the first valid match.
- New campaigns go to the bottom. When you create a post-purchase campaign, it is automatically assigned the next lowest priority (the current lowest priority plus one), so a brand-new campaign never jumps ahead of your existing ones.
- Only Active campaigns are evaluated. Inactive and draft post-purchase campaigns are skipped entirely.
- Only the main offer of the winner is shown. If the shopper declines it, that same winning campaign's downsell offer (if configured) appears next — the app does not move on to the second-priority campaign's offer.
Reordering priority
You control the order from the post-purchase campaign list. Reordering the list updates the priorities as a batch, so you can promote the campaign you want shoppers to see first.
Open the Post-Purchase list
Go to your post-purchase campaigns. They are listed in priority order, top (priority 1) to bottom.
Reorder the campaigns
Move the campaign you want evaluated first toward the top. The app saves the new priority numbers for all affected campaigns at once.
Save
The new order takes effect for the next order that completes checkout.
What happens after a delete
When you delete a post-purchase campaign, the remaining campaigns' priorities are renormalized to be gap-free, starting again at 1. So deleting the priority-2 campaign out of three doesn't leave a hole — the former priority-3 campaign becomes priority 2. You don't have to manually re-number anything.
"Only one of my two post-purchase campaigns ever shows." This is by design — post-purchase is first-valid-wins. If your higher-priority campaign's conditions match every order (for example, a subtotal rule of "greater than or equal to 0"), it will always win and the lower-priority campaign will never be reached. Fix: make the higher-priority campaign's conditions narrower so some orders fall through to the next campaign, or reorder priority so the more specific campaign is evaluated first.
Checkout Upsells overlap
Checkout Upsells render inside the Shopify checkout block (Shopify Plus). Unlike post-purchase, checkout upsells are not limited to a single winner — multiple checkout campaigns and offers can surface together in the checkout block when their conditions match the order being placed.
If you run several Checkout Upsells campaigns that target overlapping carts, expect their offers to appear together rather than one suppressing the next. To keep the checkout uncluttered, give each campaign distinct conditions so a given cart only matches the ones you actually want shown there.
Checkout Upsells require a Shopify Plus subscription, and the Llama Upsells app block must be added to your checkout template for any of them to render. See Checkout Upsells.
Discounts interaction and the Shopify discount cap
Several campaign types can attach an automatic discount to their offer products (Product Recommendations, Gift with Purchase, Auto-Add, Checkout Upsells, Post-Purchase, and Unlock). When more than one discounting campaign is active, they all draw from the same shared pool of Shopify automatic discounts — and that pool has hard limits.
| Limit | Value | Who enforces it |
|---|---|---|
| Shopify automatic discounts per store | 25 across all of your apps | Shopify (platform-wide) |
| Discount metafield character cap | 9,990 characters per discount node | Llama Upsells (under Shopify's ~10,000 limit) |
There is no separate app-imposed cap on the number of automatic discounts — the only hard ceiling is Shopify's platform-wide maximum of 25 automatic discounts per store, shared across every app.
To stay within Shopify's per-discount metafield size, the app packs many campaign conditions into a single automatic discount node — and when that node's data would exceed 9,990 characters, it splits the conditions across additional discount nodes, creating new nodes and deleting empty ones as needed. This splitting is automatic; you don't configure it. But it means a store with many discounting campaigns and many conditions consumes more of the 25-slot Shopify pool.
Discounts can silently drop. If your campaigns need more automatic discount slots than Shopify allows (25 store-wide, shared with every other app), or the conditions can't be packed under the character cap, some discounts may not be created — and a shopper who should qualify simply won't see the reduced price, with no error shown. Fix: deactivate discounting campaigns you no longer need, simplify conditions, and check Why isn't my discount applying?.
The discount on one campaign only applies to that campaign's offer products — it never reaches into another campaign's items or the rest of the cart. Multiple campaign discounts can therefore apply to one order at once, as long as each is created and within Shopify's combination rules. See Applying discounts.
Edge cases and recipes
Troubleshooting
- Two widgets show the same offer. Two Widget blocks both have a blank Widget ID and resolved to the same campaign. Set an explicit Widget ID on at least one block.
- A second post-purchase offer never appears. Expected — only one post-purchase offer shows per order. Reorder priority or narrow the winning campaign's conditions so other orders reach the next campaign.
- A discount stopped applying after you added more campaigns. You may be near Shopify's 25-automatic-discount cap or the per-node character limit. Deactivate unused discounting campaigns and re-check the discount troubleshooting guide.
- A campaign you expected to stack isn't showing. Confirm it's Active (not inactive or draft) and within your plan's active-campaign limit — see Campaign statuses, limits & health warnings.
Key takeaways
- Separate campaigns are independent: most types all fire together on the same cart or page.
- Storefront widgets stack via separate Widget blocks — one block per campaign, each rendering its own Widget ID.
- Auto-Add campaigns each add their own line, keyed by their condition, so they never suppress each other — but they can duplicate the same gift.
- Post-Purchase is the only first-valid-wins type: one offer per order, chosen by priority (1 = highest), with gap-free renumbering after deletes.
- Checkout Upsells can surface multiple offers together in the checkout block.
- Discounting campaigns share Shopify's 25-slot automatic-discount pool, and the app splits conditions under a 9,990-character cap — exceeding the limits can silently drop discounts.
Related
How features interact
The full precedence map for campaigns, discounts, restrictions, and limiters.
Post-Purchase campaign
Set up one-click post-checkout offers and priority ordering.
Applying discounts
Automatic discounts and the Shopify discount limits.
Campaign statuses & limits
Active-campaign limits that cap how many campaigns can stack.
Use unlisted or hidden products as gifts
Give away a freebie, sample, or GWP-only SKU you keep off your catalog — without making shoppers able to find or buy it on its own.
Customize the Post-Purchase offer page
A complete reference for the Post-Purchase customizer — timer, layout, titles, buttons, and labels, with defaults and edit recipes.
