Automation
Building Workflows
Triggers, steps, delays, conditions, discounts and A/B splits. Build a flow yourself, from a template, or with your own AI.
A workflow is an automated sequence that runs on its own when something happens in your store. For example: a customer abandons their cart → xUpsell waits 1 hour → sends a reminder email → waits 1 day → sends a follow-up with a discount code. It runs 24/7, even while you sleep.
Workflows are the most powerful feature in xUpsell. Once you set one up and turn it on, it works forever — reaching every customer at the perfect moment, automatically.
Three Ways to Create a Workflow
You don’t need to be a marketing expert. xUpsell gives you three ways to create workflows — pick the one that fits your comfort level:
1. Ask Your Own AI Assistant (Fastest)
xUpsell doesn’t have an AI assistant of its own. Instead, you connect the AI you already use — Claude, ChatGPT, or any other MCP-compatible client — and it builds workflows in your store on your behalf.
How to do it:
- Go to Settings → Connect AI and copy Your connection URL
- Paste it into your AI client’s Connectors / MCP servers settings
- Approve the connection when your Shopify admin opens (click Allow access)
- Ask your AI for what you want — for example:
“Create an abandoned cart workflow with an email after 4 hours and an SMS after a day”
- Your AI builds the workflow and saves it as a draft
- Open it in xUpsell, review and edit anything you like
- Turn it on when you’re ready
Everything your AI builds is a draft. A draft sends nothing to anyone. Making a workflow live is a separate, deliberate step — your AI can’t slip it past you, and xUpsell refuses to publish a workflow that has no trigger, has no steps, or clashes with a workflow that’s already live on the same trigger.
Two things to check on an AI-built workflow: personalization tags don’t work in xUpsell (see Personalizing Your Messages below), and if you later ask your AI to change the steps it rewrites the whole flow — anything it wasn’t told to keep is removed.
2. Use a Template
Pick a ready-made workflow from the template library — a complete set of steps and message content you only need to adjust.
How to do it:
- Go to the Templates page
- Browse the xUpsell Templates tab (or My Templates for ones you saved yourself)
- Click a template to preview all the steps
- Click Use template — this creates a new draft workflow and opens it in the workflow editor
- Click Select trigger and choose what starts the workflow (a template arrives with no trigger set)
- Customize the content to match your brand
- Turn on the workflow from its Overview page when ready
Good to know: The xUpsell template library is available on Basic ($99/mo), Pro ($199/mo), and Premium ($299/mo) plans. On the free plan those cards are disabled and you’ll see an “xUpsell Templates require a paid plan” banner. Save as template works on every plan, including Free — your own templates are never gated. Upgrade from Settings → Plans & billing. Full details are in our Templates guide.
3. Build It Yourself (Full Control)
Use the visual drag-and-drop canvas to build your workflow step by step.
How to do it:
- Go to the Workflows page
- Click Create workflow
- Click Select a trigger to start from scratch, or Browse Templates to start from a template
- In the editor, choose your trigger from the panel that slides in from the right
- Drag steps from the left sidebar onto the canvas — Email, Card (SMS/MMS), Notification, Delay, Condition, and more
- Connect the steps by drawing lines between them
- Configure each step (write your email, set the wait time, etc.)
- The editor saves as you work — you’ll see Saved in the top-right, and there’s a Save changes button if you want to save immediately
- Close the editor and click Turn on workflow on the workflow’s Overview page
If you see “Validation failed” instead of “Saved”, hover it to see why. The editor won’t save a flow with unconnected steps, an email with no subject, an SMS with no message, a delay of zero, or a condition whose True/False paths aren’t both connected.
Choosing a Trigger
A trigger is the event that starts your workflow. When the trigger happens, xUpsell creates a new “run” of the workflow for that specific customer.
Think of it like a domino — the trigger is the first domino that sets everything else in motion.
| Trigger | What Starts the Workflow | Best Used For |
|---|---|---|
| Abandoned cart | Customer adds items to cart but doesn’t check out | Cart recovery emails with reminders and discounts |
| Abandoned checkout | Customer starts checkout but doesn’t finish | Checkout recovery — they were very close to buying |
| Abandoned product page | Customer views a product page but leaves without action | Nudge with more info, reviews, or a small discount |
| New customer | Someone creates an account in your store | Welcome series — introduce your brand |
| Subscribed to receive email marketing | Customer subscribes to receive marketing emails | Email welcome series, first-purchase incentive |
| Subscribed to receive push notifications | Customer enables browser push notifications | Instant push welcome, flash sale alerts |
| Subscribed to receive SMS/MMS marketing | Customer subscribes to receive text messages | SMS welcome, exclusive text-only offers |
| Order created | A new order is placed in your store | Thank-you sequence, ask for a review, cross-sell |
| Post-purchase | After checkout is completed | The upsell offers shown right after checkout |
| Shopify flow | Triggered by a Shopify Flow automation | Advanced: combine Shopify Flow logic with xUpsell messaging |
| View product | Customer views a product page | Follow up with product info or related products |
| Low stock | A product variant drops to 5 or fewer in stock, for shoppers who asked to be told about that product | Alert interested customers to buy before it’s gone |
| Out of stock | A sold-out product variant comes back in stock, for shoppers who asked to be told | Notify customers who were waiting |
| Product discount | A price change on a product a shopper signed up to watch | Alert customers when products go on sale |
| Discount subscription | Someone signs up to receive a discount code | Send the promised discount code |
Which trigger should I start with? Abandoned cart is the highest-ROI automation for most stores. Customers who abandoned their cart were already interested — they just need a nudge. Try it first.
Two Rules About Triggers
- A workflow can’t be turned on without a trigger. If you try, xUpsell shows “Can’t activate workflow without trigger”.
- Only one workflow can be live per trigger. If you turn on a second workflow that uses the same trigger, xUpsell warns you and offers to turn the other one off — otherwise both would run for the same customer and every message would arrive twice.
Head Start Delays
Three triggers wait a while before they start a workflow, so you don’t chase a customer who was simply still shopping: Abandoned cart, Abandoned checkout and Abandoned product page. Set how long in Settings → Preferences (minimum one hour each) — the defaults are 2 hours, 1 hour and 8 hours.
Every other trigger, Order created included, starts its workflow as soon as the event happens. To delay one of those, put a Delay step at the start of the workflow.
Adding Steps to Your Workflow
Steps are the actions your workflow takes after the trigger fires. You drag them from the sidebar on the left of the editor. You can add as many as you need and connect them in any order.
| Step | What It Does | Example |
|---|---|---|
| Sends an email to the customer. Rich content with images, buttons and links. A subject line is required. | ”You left something in your cart!” with product images | |
| Card (SMS/MMS) | Sends a text message to the customer’s phone. Requires a connected Twilio account. | ”Your cart is waiting! Use code SAVE10 → [link]“ |
| Text / Image / Audio / File / Video | Dragged onto an existing Card to add another part to that message — extra text, or media so it goes out as an MMS. Up to 10 media parts per card. | Add a product photo to your text |
| Notification | Sends a browser push notification to the customer’s device. Free and unlimited on every plan. | ”Don’t forget your cart! 🛒“ |
| Delay | Pauses the workflow for a set time before continuing to the next step. | Wait 4 hours, wait 1 day, wait 3 days |
| Condition | Checks a fact about the event that started the workflow, then splits into a True and a False path. | ”Cart total greater than 50?” → True: send a discount → False: send a reminder |
| Discount | Creates a Shopify discount and makes its code available to later steps as {{discount_code}}. Two types: Percentage or Free Shipping. | Generate a 10%-off code, then include it in the next email |
| Update Product | Changes the actual Shopify product price by a percentage (drop or raise). This affects the price everyone sees. | Drop the price by 10% for a flash sale |
| Shopify Flow Trigger | Hands the run over to Shopify Flow so you can continue the logic there. | Trigger a Shopify Flow to tag the customer |
| AB Split | Splits the flow into weighted branches on the canvas. Each customer continues down exactly one branch, chosen at random in the proportions you set (for example 50/50 or 70/30). | Send half your customers a discount email and the other half a plain reminder |
| Offer | The post-purchase upsell shown right after checkout. Only available when the workflow’s trigger is Post-purchase. | ”Add this matching product for 20% off” |
Important: Discount and Update Product are not the same. Discount creates a Shopify discount code you can put in your messages. Update Product changes the live Shopify product price for everyone and creates no discount code.
Post-purchase workflows are different. When a workflow’s trigger is Post-purchase, the sidebar offers only the Offer step — you build a chain of offers, each branching on whether the shopper accepted or declined. Shopify shows at most 2 offers in a row (up to 3 in total if you branch), and post-purchase upsells require Basic or higher. How that offer page looks is designed separately in Settings → Post-purchase.
How Steps Connect
Steps are connected by drawing lines between them on the canvas. The workflow follows the lines from one step to the next:
- Linear flow: Trigger → Step 1 → Step 2 → Step 3 (one after another)
- Branching flow: Trigger → Condition → True path (Step A) / False path (Step B)
- Parallel flow: Trigger → Step 1 splits into Step 2A and Step 2B, and both run
Good to know: You can mix and match step types in almost any order — an email, then a wait, then a condition on the cart total, then either a follow-up email or an SMS.
What Conditions Can Check
A condition checks a fact about the event that started the workflow — not the customer’s history. The available checks depend on your trigger:
| Trigger | Examples of What You Can Check |
|---|---|
| Abandoned cart | Cart Total, Cart Quantity, Currency, Product Title, Vendor, SKU, Line Quantity, Line Price, and whether the person is an Email / Phone / Notification subscriber |
| Abandoned checkout | Total Price, Currency, whether a Shipping Address or Discount Code exists, and subscriber channels |
| Abandoned product page / View product | SKU, Price, Vendor, Product Title, Product Type, Currency |
| Order created | Total Price, Currency, Financial Status, Total Discounts, Created At |
| Post-purchase | Total Price, Currency, Fulfillment Status, Tracking Company, dates, and subscriber channels |
| New customer and the three Subscribed to… triggers | Whether the person is an Email / Phone / Notification subscriber |
There is no condition for “did they purchase?” or “did they open the last email?” — xUpsell can’t check those. Use the facts above instead, for example Cart Total greater than 50 to send a bigger discount only to bigger carts.
Personalizing Your Messages
In the email editor you can insert variables such as {{firstName}} from the variables menu, and they appear as gold tokens on screen.
Please read this before using them. Those tokens are not filled in when the message is sent — your customer would receive the text
{{firstName}}exactly as written. Write your copy without them for now.
The one variable that genuinely works is {{discount_code}}:
| Variable | What It Does | Where It Works |
|---|---|---|
{{discount_code}} | Replaced with the code created by a Discount step earlier in the same workflow | Email body, SMS/MMS message, and push notification content |
How to use it: put a Discount step in your workflow before the message, then write {{discount_code}} where the code should appear. If no Discount step ran first, the text is left as-is — so always add the Discount step.
Turning Workflows On, Off, and Archiving
Workflow Statuses
| Status | What It Means | What Happens |
|---|---|---|
| Draft | Workflow is saved but has never been turned on | Nothing happens — it’s just a design waiting to be turned on |
| Active | Workflow is live | Listens for its trigger and automatically processes customers |
| Inactive | Workflow has been turned off | No new runs start, and runs already in progress stop too |
| Archived | Moved out of your active list | Hidden from the main Workflows view, but its data is kept |
How to Change Status
| Action | How to Do It | When to Use |
|---|---|---|
| Turn on workflow | Open the workflow → on the Overview page, click Turn on workflow | When your workflow is ready to go live |
| Turn off workflow | Open the workflow → on the Overview page, click Turn off workflow | When you want to stop it |
| Archive | Overview page → ⋯ → Archive, or tick the workflow on the Workflows page and choose Archive workflows | When you’re done with it but want to keep the data |
| Duplicate | Overview page → ⋯ → Duplicate, or tick one workflow on the Workflows page → Duplicate workflow | To reuse a flow as the starting point for a new one |
| Delete | Only offered while the workflow has never run — Overview page → ⋯ → Delete, or tick it on the Workflows page → Delete workflows | To remove a workflow you never used |
Important: Turning a workflow off is a full stop, not a pause. Customers who are partway through it will not receive their remaining steps. Turning it back on does not resume them either — only new triggers create new runs.
Once a workflow has run at least once you can’t delete it — only archive it. Archiving keeps its history and metrics.
How Workflow Execution Works
Here’s what happens behind the scenes when a workflow runs — explained simply:
- A trigger fires — For example, a customer abandons their cart (after the delay you set in Settings → Preferences)
- xUpsell creates a “run” — A new, independent run of the workflow starts for that specific customer, using a snapshot of the workflow as it is right now
- Steps execute in order — Each step happens one at a time, following the lines on the canvas
- Delay steps pause the run — If a step says “wait 4 hours,” the run pauses and resumes automatically after 4 hours
- Conditions check and branch — The workflow checks the condition and follows the appropriate path (True or False)
- The run completes — When all steps are done the run finishes, and the counters on the workflow’s Overview page go up
Each customer gets their own independent run. If 50 people abandon their carts, 50 separate runs happen — each at the right time for that individual customer.
What Happens in Parallel
If a step has more than one outgoing line, every one of those branches runs. The two exceptions are Condition and AB Split: those always continue down exactly one path. Branches are independent and don’t interfere with each other.
What Happens When a Step Fails
Sometimes a step can’t complete successfully. Here’s what happens:
| Failure Scenario | What Happens | What You Should Do |
|---|---|---|
| Email provider rejects the send | The email step is marked as failed with the reason and the rest of that customer’s run stops. | Check your email provider in Settings → Mailbox management — the deliverability checklist there flags what’s missing |
| Subscriber has no email address | The email step is marked as failed (“No recipient email address found”). The run continues. | Reach that person on another channel, or gate the email behind a condition on Email Subscriber |
| Subscriber has no phone number | The SMS step is marked as failed. The run continues to the next step. | Reach them on another channel, or put the SMS behind a condition on Phone Subscriber |
| Customer replied STOP to your texts | The SMS step is marked as failed and the run continues, so they still get your email and push steps. Their opt-out applies to SMS only | Nothing to fix — texting them again isn’t possible until they reply START |
| Phone number or email address isn’t usable | That step is marked as failed and the run continues to the next step | Correct the address on the subscriber, or gate the step behind the matching Subscriber condition |
| The phone number on file isn’t a valid number | The SMS step is marked as failed and the rest of that customer’s run stops. | Fix the number on that subscriber’s record — it needs the country code, like +14155551234 |
| Customer never allowed push notifications | The notification step is marked as failed. The run continues to the next step, so they still get your email and SMS steps. | Nothing to fix — or put the push behind a condition on Notification Subscriber if you’d rather it didn’t show as failed |
| The push is rejected when it’s sent, or push is switched off for your store | The notification step is marked as failed and the rest of that customer’s run stops. | Check that push notifications are switched on for your store. A device that has unsubscribed is cleared automatically, so the next run treats that customer as having no push and carries on |
| You’ve hit your send limit, or no plan is selected | The email or SMS step fails with “Send limit reached (X/Y). Please upgrade your plan.” — and the rest of that customer’s run stops. | Go to Settings → Plans & billing to choose or upgrade a plan. Push notifications keep working |
Good to know: If a customer can’t be reached on one channel, that step is recorded as failed and the run keeps going, so they still receive your other channels. That covers no email address on file, no phone number, notifications never allowed, an address or number that isn’t usable, and a customer who replied STOP to your texts — an SMS opt-out never costs them your emails. What still stops the rest of that customer’s run is a problem on your side rather than theirs: a send blocked by your plan, your email or SMS provider rejecting the send for an account reason (wrong credentials, no credit), or a channel switched off for your whole store. That way a real problem surfaces instead of being quietly skipped.
There’s no failure report screen in xUpsell today. The Executed / Impressions / Clicks / Conversions counters on each workflow’s Overview page are where you’ll notice a workflow that isn’t delivering.
Example Workflows
Here are three workflows you can build today — with your AI assistant, from a template, or by hand.
Example 1: Abandoned Cart Recovery (Multi-Channel)
The highest-ROI workflow for most stores. Trigger: Abandoned cart.
| Step | Type | Timing | What It Does |
|---|---|---|---|
| 1 | Notification | Straight away | ”You left something behind! 🛒 Complete your order before it sells out.” |
| 2 | Delay | 4 hours | — |
| 3 | — | Full email with product images and a link back to their cart | |
| 4 | Condition | — | Check: Cart Total greater than 50 |
| 5a | (True) Discount | — | Create a 10%-off Percentage discount |
| 5b | (True) Email | — | “Here’s 10% off to finish your order: {{discount_code}}” |
| 6 | (False) Delay → Card | 24 hours | ”Hey! Your cart is still waiting → [link]” |
Remember the trigger’s own head start: the run begins after the Abandoned cart delay you set in Settings → Preferences.
Example 2: Welcome Series for New Email Subscribers
Build a relationship over their first week. Trigger: Subscribed to receive email marketing.
| Step | Type | Timing | What It Does |
|---|---|---|---|
| 1 | Immediately | Welcome email: introduce your brand, what to expect, link to bestsellers | |
| 2 | Delay | 2 days | — |
| 3 | Notification | — | “Check out our newest arrivals! 🆕“ |
| 4 | Delay | 2 days | — |
| 5 | — | Your bestsellers and what makes them worth it | |
| 6 | Delay | 3 days | — |
| 7 | Discount → Email | — | Create a 15%-off code and send it: “15% off your first order: {{discount_code}}” |
Example 3: Back-in-Stock Alert
Turn a sold-out product into a sale. Trigger: Out of stock (it fires when a variant comes back into stock, for people who asked to be told).
| Step | Type | Timing | What It Does |
|---|---|---|---|
| 1 | Notification | Immediately | ”It’s back! Your item is in stock again.” |
| 2 | Delay | 2 hours | — |
| 3 | — | Product photo, price, and a direct link to buy | |
| 4 | Delay | 1 day | — |
| 5 | Card (SMS) | — | “Still available — but not for long → [link]“ |
Frequently Asked Questions
How many workflows can I have?
There’s no limit on the number of workflows you can create on any plan.
Can I run multiple workflows at the same time?
Yes — as many as you like, and they all run independently. The one restriction is that only one live workflow per trigger is allowed, so you can have an abandoned cart workflow, a welcome series and an order follow-up all live at once, but not two live abandoned cart workflows.
What happens if a customer triggers the same workflow twice?
A new run is created each time. If a customer abandons their cart on Monday and again on Wednesday, they go through the cart recovery workflow twice.
Can I edit a workflow that’s already running?
Yes. Each run uses a snapshot of the workflow taken when it started, so your changes apply to new runs only. Customers already partway through continue with the version they started on.
What’s the difference between workflows and campaigns?
Workflows run automatically when triggered by customer behaviour (abandoned cart, new subscriber, etc.). Campaigns are messages you decide to send — right now or at a scheduled time. Use workflows for automated responses. Use campaigns for announcements and promotions.
Can I preview a workflow before turning it on?
You can review every step and its content in the editor, and the Preview button in the editor’s top bar shows the flow in read-only form.
To try a workflow for real, open it and click Test on its overview page. (Post-purchase workflows don’t have a Test button — their offers only appear during a real checkout, so test those by placing a test order in your store.) The test runs this one workflow once, and picks a recipient who can actually receive what your workflow sends — a push step needs a subscriber with notifications enabled, an email step needs one with an email address, an SMS step needs one with a phone number. If your workflow uses several channels, it first looks for one subscriber who has all of them. If nobody does, it tests a single channel instead — trying your workflow’s channels in the order the workflow uses them — so the test still sends something real. That’s usually you, if you subscribed on your own storefront first.
Real messages are sent, so test with your own subscription, not a customer’s. The confirmation tells you which channels the test used and where to look — for example “Test sent by push and email — check your device and inbox.” If one of your workflow’s channels has no eligible subscriber, it says so and tells you that step is skipped — the rest of the workflow still runs. And if nobody in your store can receive the workflow at all, the test won’t start: you’ll be told exactly what’s missing (notifications turned on, an email address or a phone number) so you can subscribe on your storefront and try again.
What if a customer only has some of the channels my workflow uses?
They still get the ones they can receive. If your workflow sends a push notification and then an email, someone who never allowed notifications simply doesn’t get the push — and still gets the email. Each channel is delivered on its own, and a channel that can’t reach someone is recorded as skipped rather than cancelling the rest.
The same applies to campaigns: a customer stays in the audience as long as they can receive at least one of the channels your campaign uses.
A genuine problem is treated differently. If a send fails because something is actually wrong — your Twilio account is disconnected, or you’ve hit your plan’s send limit — the workflow does stop for that customer, so the failure surfaces instead of being hidden.
How do conditions work?
A condition checks a fact about the event that started the workflow — the cart total, the product’s price, whether the person is an SMS subscriber, and so on. Based on the result the workflow follows the True or the False path. Both paths must be connected to something, or the workflow won’t save.
Can my AI assistant build complex workflows with conditions?
Yes. Be specific — “Create an abandoned cart workflow that checks whether the cart total is over 50 before sending a discount, using email first and SMS the next day” — and it will build the conditions, delays and channels for you. It always saves the result as a draft for you to review, and it can’t turn anything on without your explicit go-ahead. See Settings → Connect AI.
Do I pay xUpsell extra for the AI?
No. Connecting an AI client is available on every plan and there’s no limit on how many clients you can connect. You pay your own AI provider directly at their rates.