How features interact
What overrides what, the order features are evaluated in, and how campaigns, discounts, restrictions, limiters, and the cart affect each other.
Several Llama Upsells features can act on the same cart at the same time. A shopper might match more than one campaign, qualify for several discounts, and run into a restriction or a limiter — all in one visit. This page explains the ordering and precedence rules so you can predict what shoppers will see when features overlap, and design rules that work together instead of fighting each other.
The short version: campaigns mostly run independently and all matching offers fire at once, while restrictions and limiters are enforced later at the cart and checkout stages. Knowing which stage each feature runs in is the key to understanding every interaction below.
Campaigns: how multiple campaigns evaluate together
When more than one campaign is active and their conditions could match the same cart, each campaign is evaluated independently. There is no "first match wins" rule for most campaign types — every matching campaign can fire at the same time, and a single cart visit can display more than one offer.
- Auto-Add campaigns — If more than one Auto-Add campaign qualifies, all of their matching products are added. There is no priority ordering between Auto-Add campaigns.
- Pre-purchase and Gift with Purchase widgets — If several campaigns are placed in the same storefront location, they render in the order they appear in your theme editor.
- Post-purchase campaigns — These are the exception. Post-purchase offers are shown one at a time in priority order (priority 1 first), and only the first matching campaign is shown. If the shopper declines it, a downsell offer (when configured) is shown before the next priority is evaluated. You set each campaign's priority in the campaign editor.
Post-purchase is the only campaign type with strict priority ordering. For everything else, assume all qualifying campaigns can appear together. See Showing multiple offers for placement tips.
Campaign targeting filters: the order within a single campaign
Each campaign's own settings layer on top of its condition rules. Within one campaign, the filters are checked in this order — and the first one that fails skips the campaign entirely:
Date range
If the current date is outside the campaign's scheduled window, the campaign is skipped completely. No conditions are evaluated.
Market targeting
If the shopper's market is not in the campaign's market list, the campaign is skipped. A campaign with no market list set runs for all markets.
Customer tag targeting
Evaluated before the individual condition rules. If the shopper does not match the tag requirement, the campaign is skipped.
Condition rules
Evaluated last. All rule groups must pass — or at least one, depending on your AND/OR connector setting — for the offer to appear.
For how scheduling, markets, and customer tags are configured, see Schedule, markets & customer tags. For the condition rules themselves, see the Condition selectors reference.
Auto-Add changes the cart, so conditions re-evaluate
When an Auto-Add campaign fires and adds a product, the cart itself changes. Because conditions always reflect the live cart state, that change can cause other campaigns' conditions to re-evaluate and trigger. For example:
- An Auto-Add campaign adds a free gift, which increases the cart subtotal.
- A second campaign with a "subtotal greater than $50" condition now matches and fires.
This chaining is intentional. If you stack campaigns that react to subtotal or quantity, expect an Auto-Add to potentially trigger downstream offers.
Campaigns and discounts
Automatic product discounts are an optional add-on to a campaign. A campaign can run with no discount at all. When a discount is configured, it applies only to the products added from that campaign's offer — other items already in the cart are not affected.
Campaign discounts are implemented as Shopify automatic discounts, so they follow Shopify's standard discount combination rules:
- Whether app discounts can stack with Shopify discount codes depends on the combination settings of each Shopify discount. The app does not override Shopify's own combination logic.
- Multiple campaign discounts can apply to the same order if the shopper adds products from more than one campaign.
- Automatic campaign discounts stack with other automatic discounts unless Shopify's platform prevents it for your subscription type.
Discount types run independently
The app's three discount features operate separately and can all apply to the same order:
- Tier discounts and campaign discounts run independently. A shopper can qualify for a tier discount on the overall cart while also receiving a campaign-linked discount on an offered product. Both apply.
- Shipping discounts run independently of campaign and tier discounts. A shopper who earns free shipping still receives any applicable campaign or tier discounts.
For how each discount type is configured, see Applying discounts, Tier discounts, and Shipping discounts.
Campaigns and cart restrictions
Restrictions and campaigns are evaluated independently, and they do not block each other when an offer is shown. A shopper who qualifies for a campaign offer can still be blocked later if a restriction's rules also match the resulting cart.
The key point is timing: campaigns fire when their conditions match, but restrictions are checked at the cart and checkout stages, not at the moment a campaign triggers. This leads to two important behaviors:
- A campaign can show — or auto-add — a product that a restriction will later block from checking out.
- If an Auto-Add creates a cart that violates a restriction, the shopper sees the restriction error only when they reach the relevant stage, not at the instant the Auto-Add fires.
Which stage wins
- At checkout, restrictions take precedence. If a restriction blocks checkout, the shopper cannot complete the order regardless of any campaign or discount that is active.
- At the cart stage, restrictions run first. If a restriction with "Run on cart" enabled fires when a shopper tries to add or update items, the cart action is blocked before any campaign condition re-evaluation happens.
If you do not want Auto-Add to add products that conflict with a restriction, design both rules so they cannot contradict each other. The app will not stop an Auto-Add just because a restriction would later block the resulting cart.
For where restrictions run and how to write their rules, see Cart restrictions.
Campaigns and product limiters
Product limiters enforce per-product quantity caps at checkout, not when an offer is shown. A campaign offer can include a product that also has a limiter, and the offer displays normally. But:
- If the shopper already holds the maximum allowed quantity, the checkout extension blocks the purchase of additional units.
- If a campaign auto-adds a quantity that exceeds a limiter, checkout is blocked with the limiter's error message.
To avoid this conflict, configure your campaign's target quantity to stay within the limiter's bounds.
See Product limiter for how quantity caps are defined and enforced.
Unlisted products and campaign types
Shopify "unlisted" products are published to your store but hidden from search and collection pages. How they behave in offers depends on the campaign type:
- Auto-Add, Gift with Purchase, and Post-Purchase support unlisted products. By default, unlisted products can appear in those offer widgets. For Gift with Purchase specifically, enabling the Hide unlisted products toggle in the GWP customizer hides them.
- Pre-purchase and checkout upsell campaigns only show products with a fully active storefront status. Unlisted products are excluded from those offer types.
Llama Cart and campaigns
Campaigns embedded in the Llama Cart drawer behave the same as campaigns shown on the page. If an embedded campaign's conditions are not met, its block in the drawer shows no products — or is hidden, depending on your customizer settings.
- Auto-Add campaigns run regardless of Llama Cart. Auto-adds are handled by the global app embed, not the drawer widget, so they run whether or not the drawer is open.
- If a campaign is deactivated after a Llama Cart block has been configured to reference it, the block renders empty on the storefront. The block is not removed automatically. Either re-activate the campaign or remove the block from your Llama Cart layout.
See Widgets & Llama Cart for how cart blocks are configured.
Promo-code campaign triggers
Campaigns that use a discount code as their trigger (the promo-code condition selector) are evaluated by the app's server, not by the storefront widget. This has a few practical effects:
- The discount code text is never exposed in the storefront page source.
- There is a short delay between when a shopper applies a code and when the triggered campaign appears — roughly one round trip to the app.
- Promo-code-triggered campaigns are excluded from the data that Shopify's checkout extensions read directly. They are evaluated only through the app's server endpoint.
See Promo code triggers for how to set up code-based campaigns.
When changes take effect: metafield syncing
The app stores its rules in Shopify metafields so that checkout extensions can read them without calling the app's backend. When you make a change in the admin — activate a campaign, update a restriction, change a discount — the app pushes updated data to those metafields.
This sync is nearly instant under normal conditions, but it is asynchronous. There is a brief window after a change where the old rules are still in effect on the storefront.
If rules look out of sync on the storefront, use the Sync action on the campaign to force a metafield refresh.
Metafield size limits
Because campaign data lives in metafields, having many active campaigns with many conditions can push you toward Shopify's metafield character limit. The admin shows a warning when you get close. If the limit is exceeded, some campaigns may not display correctly on the storefront — deactivating or simplifying campaigns reduces the stored payload.
Automatic product discounts are the only feature that automatically splits its data across multiple Shopify discount nodes when the configuration exceeds the limit. No action is required from you.
How analytics sees each feature
Every feature above doesn't just change what shoppers see — it also changes what your Analytics page records. Because discounts, auto-adds, and gifts all flow through the same offer-tracking system, it helps to know how each one shows up in your numbers.
- Discounts change recorded revenue, and the timing matters. For offers accepted before the order is placed (pre-purchase, Gift with Purchase, Auto-Add, checkout), the app records the amount the shopper actually paid — the line price after the campaign discount and any other discount allocations on that line. For post-purchase offers accepted after checkout, the app records the product's list price instead, because those add-ons are billed separately and the after-discount amount isn't available the same way. So the same product can post a slightly different figure depending on whether it was sold up front or as a post-purchase upsell.
- Free and discounted auto-add / Gift with Purchase items still count as sold offers. An item given away at 100% off, or steeply discounted, carries the same hidden offer marker as any other accepted offer. It is counted as a sold offer (it appears in the offer's item counts), but its recorded revenue is whatever the shopper paid — $0 for a true freebie. Expect gift and free-item campaigns to show units sold with little or no attached revenue; that is correct, not a bug.
- Deleting a campaign does not erase its analytics. When you delete a campaign, the orders it already drove keep their recorded revenue. Those figures roll up under a special (Deleted campaigns) option in the Analytics campaign filter, so a deleted campaign's past performance is never lost — it is just no longer broken out by name.
- The orders list is unfiltered. The list of orders on the Analytics page is not narrowed by the campaign or other filters above the chart. It always shows your tracked orders (newest first) for the shop, regardless of which campaign you have selected. Only the cards and chart respond to the campaign filter.
This section is just the interaction summary. For the exact attribution rule, what counts as a tracked order, and the post-purchase list-price behavior, see How revenue is attributed. For precise per-metric definitions, see the Metrics reference.
What happens on a plan downgrade
When you downgrade to a lower plan, the newest active campaigns that exceed the new campaign limit are deactivated automatically, newest first. A few things to know:
- Restrictions and product limiters are not auto-deactivated on downgrade.
- Deactivated campaigns are not deleted. You can reactivate them if you upgrade again.
- No metafield syncs run during the deactivation batch, so deactivated campaigns may keep displaying on the storefront until the next campaign save or a manual re-sync from the campaign list.
See Settings & billing for plan limits and how plan changes affect your active features.
Quick reference: what runs when
| Feature | Evaluated when | Precedence note |
|---|---|---|
| Campaigns (most types) | When conditions match the live cart | All matching campaigns fire together |
| Post-purchase campaigns | After purchase, in priority order | Only the first match shows; downsell before next priority |
| Auto-Add campaigns | On cart change | Can re-trigger other campaigns; runs regardless of Llama Cart |
| Campaign & tier & shipping discounts | At discount calculation | Run independently; follow Shopify combination rules |
| Cart restrictions | Cart stage and/or checkout | Block the cart; take precedence at checkout |
| Product limiters | At checkout | Enforce max quantity even on auto-added products |
Key takeaways
- Most campaigns run independently and all matching offers appear at once. Post-purchase is the only type with strict priority ordering.
- Within a campaign, filters are checked in order: date range, then market, then customer tag, then condition rules. The first failure skips the campaign.
- Auto-Add changes the live cart, which can re-trigger other campaigns.
- Campaign, tier, and shipping discounts run independently and follow Shopify's own combination rules.
- Restrictions and limiters are enforced at the cart and checkout stages, so they can block a cart that a campaign created. Design your campaigns and restrictions so they do not contradict each other.
- Changes sync to Shopify metafields asynchronously. Use Sync if the storefront looks out of date.
Related
Cart restrictions
Block or warn shoppers at the cart and checkout based on cart conditions.
Product limiter
Set minimum and maximum quantity caps per product, variant, or SKU.
Applying discounts
Automatic product discounts and how they combine with Shopify discounts.
Showing multiple offers
How several campaigns share the same storefront location.
Timezones, currencies, and data freshness
The three behind-the-scenes mechanics — store timezone, per-currency totals, and the daily worker — that shape every number on Analytics.
Campaign not showing on the storefront
A step-by-step checklist to find why your upsell or cross-sell campaign isn't appearing for shoppers and how to fix it.
