Start conditions: choose which shoppers start a campaign
Write a formula that decides who starts a campaign, set the order campaigns are tried in, and limit how often one shopper can be contacted.
Last reviewed November 7, 2026
How ACR picks a campaign
A shopper starts at most one campaign: the first in the list that accepts them. When a checkout counts as abandoned, ACR walks the campaigns that share that event and lead source from the top, and checks each one in this order:
- The campaign is published and not paused, and its trigger is on.
- Its shopper cap has not been reached.
- This shopper's cooldown for this campaign has passed.
- Its formula matches, or it has no formula.
- Consent, the suppression list and country rules leave at least one channel it can use.
If no campaign accepts, no run starts, and the lead's history records why each one passed. A lead already in a running campaign is skipped before any of this.
Leads you add by hand or import with a chosen campaign skip the order, the formula and the cooldown, because a person picked the campaign. The cap and the consent and country checks still apply.
Read and reorder the list
The Who to contact list shows every campaign that shares this campaign's trigger, with its formula and one of these labels:
| Label | What it means |
|---|---|
| Takes matching shoppers | It has a formula, and shoppers who match start it. |
| Takes every shopper | It has no formula. Campaigns below it get nobody, so keep it last. |
| Never reached: a campaign above takes everyone | A campaign higher up has no formula. |
| Trigger off | The campaign is paused or its trigger is off. |
| Shopper cap reached | It has taken as many shoppers as its cap allows. |
| Not published | It has never been published, so it takes nobody. |
Use the up and down arrows beside a row to move it. The new order saves at once. Campaigns that belong to an A/B test do not appear here, because the test splits shoppers between its two variants before the order applies.
Write the formula
A formula saves straight away, with no publish step, even on a running campaign. It can be up to 4,000 characters. The buttons on your campaign's row give you three ways to change it:
- Write the conditions with AI (the sparkle): describe who should start the campaign, choose Generate, read the formula and its explanation, then choose Use these conditions. Nothing changes until that last click. If the store has no AI provider set up, ACR asks you to write the formula by hand.
- Edit the formula (the pencil): type it yourself. ACR checks it as you type, lists the fields it uses, and warns about any field this lead source never sends. Finish with Save conditions.
- Remove all conditions (the ban sign), then Remove all: the campaign now takes every shopper its trigger sends. To stop a campaign, pause it or switch its trigger off instead.
Formula examples
| Formula | Who it takes |
|---|---|
country_code IN ('US', 'CA') AND context.total_price >= 100 | Shoppers in the US or Canada with a cart of 100 or more |
region_code IN ('US-CA', 'US-NY') AND language STARTS WITH 'en' | English speakers in California or New York |
is_returning = FALSE AND context.discount_codes IS EMPTY | Shoppers with no order on record and no code applied yet |
context.line_items CONTAINS 'duvet' AND NOT (email CONTAINS '@yourstore.com') | Carts with a duvet in them, leaving out your own staff |
context.utm_source = 'meta' AND has_phone = TRUE | Shoppers who came from a link tagged meta and gave a phone number |
tags CONTAINS 'vip' OR context.item_count >= 3 | Leads tagged vip, or carts of three or more items |
Operators
| Operator | Use |
|---|---|
=, != | Text, numbers, TRUE or FALSE |
>, <, >=, <= | Numbers only. ACR refuses them on any other known field. |
CONTAINS, NOT CONTAINS | Part of a text field, or one whole item of a list |
STARTS WITH, NOT STARTS WITH | The start of a text field |
IN ('a', 'b'), NOT IN ('a', 'b') | Any value from a list you write out |
IS EMPTY, IS NOT EMPTY | Missing, blank, or a list with nothing in it |
Put text in single quotes. Text comparisons ignore capitals and surrounding spaces, and a number sent as text compares as a number. Combine rules with AND, OR, NOT and brackets; AND is read before OR. A TRUE or FALSE field needs the comparison written out, as in is_returning = TRUE.
Fields about the lead
| Field | What it reads |
|---|---|
country_code | Country from the phone number or address, in capitals: 'US' |
region_code | State or province: 'US-CA' |
language | Language: 'en-US' |
timezone | Time zone: 'America/New_York' |
email, phone | Contact details. The phone number is in international format: '+12025550143' |
first_name, last_name | The shopper's name |
has_email, has_phone | TRUE when ACR has a usable address or number |
is_returning | TRUE when ACR has an order on record for this lead. Orders from before you connected do not count. |
tags | The lead's tags, as a list |
source | Where the lead came from: 'shopify', 'custom_api', 'csv' or 'manual' |
Fields about the checkout
| Field | What it reads | Sent by |
|---|---|---|
context.total_price | Cart total, in the checkout's currency | Shopify, Custom API |
context.item_count | Number of items | Shopify, Custom API |
context.items | Items as a list of names and ids | Shopify, Custom API |
context.line_items | Item names as one piece of text | Shopify, Custom API |
context.discount_codes | Codes already applied, as a list | Shopify, Custom API |
context.currency | Currency | Shopify, Custom API |
context.utm_source, context.utm_medium, context.utm_campaign | Link tags | Shopify, from the landing page; Custom API, if you put them in context |
context.shipping_price | Shipping cost | Shopify; Custom API, if you put it in context |
context.subtotal_price | Cart subtotal | Shopify |
context.source_name | Sales channel, such as 'web' | Shopify |
context.landing_site, context.referring_site | Landing page and referring site | Shopify |
context.shipping_country, context.shipping_province | Shipping country and state or province | Shopify |
context.accepts_sms_marketing, context.accepts_email_marketing | TRUE when the shopper ticked that box at checkout | Shopify |
A Growth Dept connection reads fewer Shopify fields than the app does; that article lists them. On the Custom API, anything else you send in context works too, including nested values such as context.customer.tier = 'gold'.
Rules that surprise people
- A comparison on a field the lead does not have is false, and that includes
!=,NOT CONTAINSandNOT IN. Socontext.utm_source != 'meta'skips a lead with no UTM source, whileNOT (context.utm_source = 'meta')takes it. CONTAINSfinds part of a text field, but on a list it wants a whole item.context.line_items CONTAINS 'duvet'finds a Linen Duvet Cover.context.items CONTAINS 'duvet'does not.- A rule on a field this lead source never sends still saves, with a warning, and never matches.
- The formula belongs to the campaign, so all of a campaign's triggers share it.
How often the same shopper can start
Recommended limits set no cap on shoppers and a 30-day wait before the same shopper can start this campaign again. Custom limits let you change both, and either choice applies as soon as you save, with no publish step.
- Most shoppers this campaign takes: leave it empty for no cap, or enter up to 10,000,000. Every run started counts toward it. At the cap, ACR sends a notification and new shoppers pass to the next campaign. The count and Reset the count are on the lead source step.
- Days before the same shopper can start again: 0 to 3,650, where 0 means no wait. It counts from the shopper's last run in this campaign, so a different campaign can still take them sooner.