beta v2.2636.5

Shopify Flow Send Email to Customer: Why It Fails and What Works

12 minutes to read
18 Sep, 2026

If your Flow is trying to email a customer and failing, the most likely reason is that you're using the wrong action for the job. Flow's Send internal email action is built for staff notifications, not customer messaging. The second most likely reason is the variable itself: Flow uses the Admin API's camelCase field names, so Liquid copied from a notification template breaks. Fix the route first, then the variable, then read Run history for the exact step that failed.

AI Summary

Shopify Flow's Send internal email action is designed for staff notifications, not customer messaging, which is the most common reason customer-facing emails from Flow fail. Customer emails should route through an email platform, typically by tagging in Flow and triggering an automation. Variable errors usually come from snake_case Liquid copied from notification templates, since Flow uses camelCase Admin API fields, or from empty values on guest and POS orders.

The workflow triggers. The condition passes. Then the email step either errors, sends to nobody, or goes to your own inbox instead of the customer's.

Usually, one of two things is going on.

You're using an action built for a different job. Flow's email action is meant for notifying your team — a high-value order landed, stock is low, a fraud check flagged something. It isn't a customer messaging tool, and treating it as one is where most of these problems start.

Or the variable is wrong. Flow's Liquid doesn't use the same field names as your notification templates, so a perfectly valid snippet copied from one breaks in the other.

This article covers both, then how to read the error Flow actually gives you. If your workflow isn't running at all, that's a different problem with different causes — start with Shopify Flow not triggering. If you're building a workflow from scratch, Shopify Flow setup covers the basics.

Flow's actions, connectors and restrictions change regularly. Confirm current behaviour in Shopify's own Flow documentation before relying on any specific detail here.

What the email action in Flow is actually for

Flow's Send internal email action does what the name says: it emails people inside your business. Store staff, a fulfilment partner, a shared ops inbox. It's excellent for alerts — an order over a threshold, a product dropping below reorder point, a high-risk order waiting for review.

It is not designed to message customers, and Shopify has good reasons for that. Customer email carries consent obligations, unsubscribe requirements, sender reputation and deliverability concerns that an internal alert tool isn't built to handle. Putting {{order.email}} in the recipient field won't work: Shopify's Flow documentation says you can't use variables to set the address this action sends to. That's usually the first place things break.

The practical rule: if the email is for someone on your team, use Send internal email. If it's for a customer, route it through a system built for customer messaging — covered in the next section.

Worth checking as well: if the email is arriving in your own inbox rather than the customer's, the action is doing exactly what it was designed to do. That's not a bug to fix. It's a sign the workflow needs a different route.

Send marketing email vs Send internal email

Flow has two email routes, and they aren't interchangeable.

Send internal emailSend marketing email
Built forYour team: staff, a fulfilment partner, a shared inboxCustomers who have opted in to email marketing
RecipientAn address you type in. Variables can't set itThe customer from the trigger
ConsentNot relevant: it never goes to customersRequired. Customers who aren't subscribed are skipped with an error
Comes fromFlow itselfShopify's own email app, Shopify Messaging
Use it forAlerts: big orders, low stock, risky ordersPromotional messages to subscribers

If a marketing email step fails with a message that the customer "is not subscribed to marketing", the action is working as designed. Shopify staff have said this is deliberate: an action that could email any customer without consent would be a spam route. For an order-specific message to a customer who hasn't opted in, use a native notification or an email platform, or a third-party app that adds a transactional email action to Flow.

How to actually email customers from a Flow

Flow is very good at deciding when something should happen. Let it make that decision, and hand the sending to a tool built for customers.

1. Tag, then let your email platform send. The most robust pattern. Flow adds a customer or order tag when the condition is met. Your email platform watches for that tag and sends the message. Flow handles the logic; the email platform handles consent, templates, unsubscribes and deliverability. When something goes wrong, you know which system to look at.

2. Trigger an email platform directly. Most major email platforms connect to Flow, so a Flow step can fire an event or add a profile to a list that starts an automation. Klaviyo is the common one. The platform-side setup is in the Klaviyo flows guide.

3. Use Shopify's own marketing email actions where they're available to you — but only for customers who've agreed to marketing. See Shopify Email setup.

4. Use native notifications for transactional messages. Order confirmations, shipping updates and refunds already have templates under Settings, Notifications. If what you want is a transactional message, edit the template rather than rebuilding it in Flow.

The consent point matters here. A message triggered by Flow is still marketing if it promotes something, and it needs the customer's permission. Transactional and marketing email have different rules, covered in GDPR and cookie compliance for Shopify. Routing through an email platform keeps those rules enforced automatically.

Why the variable comes back empty or errors

If the route is right and the email still fails, the variable is the next suspect. Five causes cover almost everything.

1. snake_case copied from a notification template. The most common cause and the least obvious. Notification templates use names like customer.first_name and order.line_items. Flow's Liquid follows the Admin API, which uses camelCase: order.customer.firstName, order.lineItems. A snippet that works perfectly in one place fails silently in the other.

2. The variable doesn't exist for that trigger. Each trigger exposes different data. An Order created trigger gives you the order and, through it, the customer. A Customer created trigger has no order at all. Referencing order in a customer-triggered workflow returns nothing.

3. The value is genuinely empty. Guest checkouts may have no customer record attached. Some POS, draft and phone orders have no email. The variable path is correct — there's just no data behind it for that particular order. Add a condition that checks the field is present before the email step.

4. A list treated as a single value. Line items, tags and fulfilments are lists. Printing them directly outputs nothing useful; they need a for loop.

5. A typo or wrong nesting. The simplest and still common. Build variables with Flow's variable picker rather than typing them by hand. It only offers fields that exist for your trigger, which rules out causes 1, 2 and 5 in one move.

Reading Run history properly

Flow tells you what broke. Most people just don't look in the right place.

Saving catches some errors, running catches the rest. Flow checks your Liquid when you save the workflow, which catches typos and invalid syntax. It can't know whether a particular order will have a customer email, so empty values only show up at runtime.

Open Run history and find a failed run. Each run shows which steps completed and which one stopped. Open the failed step and read the actual error text rather than the status label. Errors about missing data almost always point to cause 2 or 3 above: the field doesn't exist for this trigger, or it was empty for this record.

Compare a failed run with a successful one. If the same workflow succeeds for some orders and fails for others, the logic is fine and the data isn't. Look at what's different about the failing orders: guest checkout, POS, draft order, missing email.

Test with a real record. Place a test order that matches your conditions, including an email address you can check. Then confirm three separate things: the workflow ran, the step succeeded, and the message arrived. Those are three different problems, and knowing which one failed saves hours.

Symptom, cause, fix

What you seeLikely causeFix
Email goes to your own inbox, not the customer'sInternal email action used for customer messagingTag in Flow, send from your email platform
Error about missing data in Run historyField not available for this trigger, or empty for this orderCheck the trigger; add a condition that the field is present
Variable outputs nothingsnake_case copied from a notification templateRebuild with the variable picker using camelCase fields
Works for some orders, fails for othersGuest, POS or draft orders without a customer emailAdd a presence condition before the email step
Line items or tags missing from the emailList printed as a single valueWrap it in a for loop
Step succeeds but nothing arrivesDeliverability, not FlowSee the section below
Workflow doesn't run at allTrigger or condition problemSee Flow not triggering

When the step succeeds but nothing arrives

If Run history shows the email step completed and the message still didn't land, Flow did its job. The problem is further down the line.

Check spam and filtering first. Automated internal alerts often trip company spam filters, especially if they're sent to shared inboxes or aliases.

Check the recipient address. Aliases, forwarding rules and distribution lists all fail quietly. Test with a single real inbox before assuming anything else is broken.

If it's a customer email sent through your email platform, the issue is almost always deliverability: sender authentication, list quality, or the platform suppressing someone who previously unsubscribed. That's covered in Klaviyo deliverability.

If Shopify's own notifications aren't arriving — order confirmations and shipping updates — that's a separate problem with its own causes, covered in Shopify email not sending.

When to get help

Most of this is fixable in an afternoon with the variable picker and Run history. Three situations are worth handing over.

Workflows that span several systems. Flow triggering an email platform, which updates a helpdesk, which tags an order back in Shopify. When a message goes missing somewhere in that chain, it takes someone who can trace each hop — Shopify Flow specialists.

Customer messaging built in the wrong place. If a store has grown a web of Flow workflows doing a job that belongs in its email platform, moving it properly is a migration, not a fix — email marketing experts. Klaviyo specialists are listed for the United States and the United Kingdom.

Intermittent failures you can't reproduce. Workflows that fail on some records and not others, with no obvious pattern, need someone to compare runs systematically — bug fixing and troubleshooting experts.

How to vet: ask where they'd send a customer email from. If the answer is Flow's internal email action, they've diagnosed the symptom, not the cause.

Flow doing a job it wasn't built for?

Matias Lopez
ML
Front-End DeveloperArgentinaFrom $70
4.97(159 reviews)
shopexpertsscore
85

I have over five years of experience in web development using technologies such as Shopify, Angular, Node.js, JavaScript, React, Vue, MongoDB, MySQL, and PHP. My journey with Shopify started when I joined Hey Carson, now known as 'Shop Experts', successfully completing their trial period. I have gained significant experience in Shopify development. I've worked in complex tasks such as integrating Shopify apps, Shopify Admin API, custom design development, apps extensions development, theme development and much more. Over the past few years, I've acquired what I believe is a solid understanding of Shopify development, which helps me deliver high-quality solutions to the clients I've worked with.

Rabia Tariq
RT
Shopify Plus EngineerPakistanFrom $100
4.99(17 reviews)
shopexpertsscore
100

I’m a Shopify & Shopify Plus Engineer with 9+ years of hands-on experience, specializing in building, optimizing, and scaling high-performing eCommerce stores. At ShopExperts, I work with growth-focused brands to deliver clean, conversion-driven Shopify solutions, from custom theme development and advanced Liquid/JavaScript customization to store migrations, speed optimization, and complex third-party integrations. My core strengths include: Shopify & Shopify Plus development Custom theme development and heavy theme refactors Site speed optimization & Core Web Vitals Wix / Magento / Squarespace / Square Up / Kajabi / WordPress → Shopify migrations with SEO preservation Custom apps, APIs, and system integrations CRO-focused UX improvements for higher conversions I’m known for my structured approach, clean code, and transparent communication. I don’t just “implement features”, I focus on long-term store health, scalability, and performance, ensuring merchants are set up for sustainable growth. If you’re looking for a reliable senior Shopify engineer who understands both the technical and business side of eCommerce, I’d be happy to help. Big ideas, small questions, or “help, my store is broken” moments — let’s talk on a free discovery call 💬 https://calendly.com/rabia234t/call

Awais Javed
AJ
Front-End DeveloperCanadaFrom $295
5.00(19 reviews)
shopexpertsscore
100

I'm a Shopify developer with years of hands-on experience building and scaling e-commerce stores — from custom theme development to conversion rate optimization and third-party integrations. I've worked with brands like Après Nail and through platforms like Storetasker, delivering solutions that look great and perform even better. I specialize in Liquid programming, frontend development, and UI/UX enhancement. Whether you need a full theme build, a tricky app integration, or a speed and SEO overhaul, I bring a detail-oriented approach that gets results — not just code. I leverage AI tools like ChatGPT and GitHub Copilot throughout my workflow — drafting Liquid logic faster, QA-testing edge cases, and generating content-ready section structures. This means faster turnaround, fewer revisions, and more value for your budget. My background spans custom store builds, GA4 + GTM tracking setups, Klaviyo integrations, loyalty app configurations, A/B testing, and cross-functional collaboration with design and marketing teams. I treat every project like it's my own store on the line. I'm a Computer Software Engineering graduate and Growth Collective certified in Creative Website Design (Shopify). Let's build something that converts.

Frequently asked questions about Shopify Flow emails

Can Shopify Flow send an email to a customer?
Flow's Send internal email action is designed for staff notifications rather than customer messaging, which is the most common reason customer emails from Flow fail or arrive in the store's own inbox. To email customers, let Flow decide when something should happen and route the sending through a tool built for customer email, typically by adding a tag in Flow that triggers an automation in your email platform. Confirm current action behaviour in Shopify's Flow documentation, as it changes.
What's the difference between Send marketing email and Send internal email in Shopify Flow?
Send internal email notifies your team at an address you type in, and Shopify's documentation says you can't use variables to set that address. Send marketing email comes from Shopify Messaging and goes to the customer from the trigger, but only if they're subscribed to email marketing. Use the first for alerts and the second for promotions to subscribers.
Why does Shopify Flow say the customer is not subscribed to marketing?
The marketing email action only sends to customers who have agreed to email marketing, so the step errors for everyone else. That's intentional, not a bug. For order-specific messages to customers who haven't opted in, use Shopify's notification templates, your email platform, or an app that adds a transactional email action to Flow.
Why does my Shopify Flow email variable not work?
The most common cause is Liquid copied from a notification template. Notification templates use snake_case names like customer.first_name, while Flow follows the Admin API and uses camelCase like order.customer.firstName. Other causes are referencing a field the trigger doesn't provide, such as an order in a customer-triggered workflow, and empty values on guest, POS or draft orders. Building variables with Flow's variable picker avoids most of these.
Why does my Flow email work for some orders but not others?
When the same workflow succeeds for some records and fails for others, the logic is usually fine and the data is not. Guest checkouts may have no customer record, and some POS, draft and phone orders have no email address. Compare a failed run with a successful one in Run history, then add a condition that checks the required field is present before the email step runs.
Where do I see why a Shopify Flow step failed?
Open the workflow's Run history, select a failed run and open the step that stopped. Read the error text rather than the status label. Saving a workflow catches syntax errors, but empty values only appear at runtime, so errors about missing data usually mean the field is unavailable for that trigger or was empty for that specific order.
The Flow email step succeeded but nothing arrived. Why?
If Run history shows the step completed, Flow did its job and the problem is delivery. Check spam filtering, especially on shared inboxes and aliases, and test with a single real inbox. For customer emails sent through an email platform, look at sender authentication, list quality and suppressed contacts. If Shopify's own order notifications aren't arriving, that is a separate issue with its own causes.
Do emails triggered by Shopify Flow need customer consent?
It depends on the content, not the trigger. A transactional message about an order a customer placed follows different rules from a promotional one, and a Flow-triggered message that promotes something is still marketing and needs permission. Routing customer email through an email platform keeps consent, unsubscribes and suppression enforced automatically.

Next step

Open the failing workflow and check the action first. If a customer email is going through Send internal email, move the sending to your email platform and let Flow add a tag instead. That fixes the most common version of this problem outright.

If the route is already right, rebuild the variable with the picker, add a condition that the email field is present, and compare a failed run with a successful one in Run history.

For multi-system workflows or messaging that has outgrown Flow, browse Shopify Flow experts. Free matching, verified experience, no commissions.

Flow emails not reaching customers?

Get a Free Quote