Shopify email validation works differently from a form plugin, because Shopify hosts the checkout and you don’t add PHP to it the way you can in WooCommerce. What you can do on the Grow, Advanced and Plus plans is check every new customer’s address in Shopify Flow right after they are created, using our email validation API, and tag the ones that can’t receive mail. On any plan, Zapier can do the same, and you can export your customers and check the whole list.
What you get
- A tag such as
email-undeliverableon customers whose mailbox doesn’t exist or whose domain has no mail server. Exclude that tag from email campaigns and look at those orders before shipping questions pile up. - Optional tags for disposable addresses (
disposableistrue), useful when you hand out first-order discounts. - No tag for
unknown(the mail server gave no clear answer) and for catch-all domains, which come back asdeliverablewith the reasonlow_deliverability; see the catch-all email guide for why a single mailbox can’t be confirmed there.
What Shopify allows and what it doesn’t
| Approach | Plans | When it runs | Can stop the order? |
|---|---|---|---|
| Shopify Flow: Send HTTP request | Grow, Advanced, Plus | After a customer is created | No |
| Zapier: New Customer trigger | All (paid Zapier plan) | After a customer is created | No |
| Customer CSV export + bulk check | All | Whenever you choose | No |
| Custom checkout UI extension | Plus (for the information step) | During checkout | Can block progress; needs network access and custom development |
Shopify stores a validFormat flag for each customer email, but its own API documentation notes that this “doesn’t guarantee that the email address actually exists”. That is the gap the mailbox check fills.
The Customer created trigger fires when a new customer places an order or when staff create a customer profile; editing an existing profile doesn’t fire it. Flow’s Run code action can’t make HTTP calls itself, so the request goes through Send HTTP request and Run code only parses the answer.
Shopify email validation in Flow: setup in steps
In Shopify Flow, go to Settings and create a secret, for example with the handle
emailvalidation_api_key, holding your emailvalidation.io API key. Flow never shows secret values in the editor and redacts them from run logs.Create a workflow and choose the trigger Customer created.
Add a Condition that the customer’s email address isn’t empty. A customer record can exist without one.
Add the action Send HTTP request:
HTTP method: Get
URL:
https://apifollowed by the customer’s email address. Insert it with Add a variable and add the.emailvalidation.io/ v1/ info?email= url_encodefilter, which turns@into%40:https://api.emailvalidation.io/v1/info?email={{customer.defaultEmailAddress.emailAddress | url_encode}}Headers: key
apikey, value{{secrets(or pick the secret with Add secret).emailvalidation_ api_ key}} On client error (4XX response): Fail
On server error (5XX or 429 response): Retry
If the variable picker shows a different path for the customer’s email in your store, use the one it inserts.
Add a Run code action. In Input, request the body of the HTTP response:
query { sendHttpRequest { body } }In Output, describe the fields the code returns:
type Output { state: String! reason: String! disposable: Boolean! }And as code:
export default function main(input) { const result = JSON.parse(input.sendHttpRequest.body); return { state: result.state || "unknown", reason: result.reason || "", disposable: result.disposable === true, }; }Add a Condition: the Run code output
stateis equal toundeliverable.Under Then, add Add customer tags with the tag
email-undeliverable. Add a second condition ondisposableif you also want anemail-disposabletag.Turn on the workflow. Test it by creating a customer in the admin with an address on a domain that doesn’t exist, then check the run in Flow’s run history.
Setup in steps: Zapier
Zapier works on every Shopify plan. Shopify is marked Premium on Zapier, and this Zap also uses a Filter step, so it needs a paid Zapier plan (Zapier pricing, checked October 2026).
- Connect your emailvalidation.io account in Zapier, as described on the Zapier integration page.
- Create a Zap with the Shopify trigger New Customer.
- Add the Emailvalidation action Verify E-Mail Address and map the customer’s email to E-Mail Address. Test the step to see the fields it returns.
- Add a Filter step that only lets the Zap continue when the returned state is
undeliverable. - Add the Shopify action Add Tag to Customer, map the customer ID from the trigger and enter the tag
email-undeliverable. - Publish the Zap and test it with a customer whose address is on a domain that doesn’t exist.
Example workflow
A store runs a welcome discount for first orders:
- A shopper orders as a guest with
lena@. Shopify creates the customer and the workflow starts.northwind-tradres .example - The API answers
undeliverable; the customer gets the tagemail-undeliverable. - Support filters customers by that tag each morning. Those shoppers won’t get the shipping confirmation by email, so support reaches them another way if the order needs it.
- The marketing segment for the welcome series excludes the tag, so the series never bounces. Every bounce you avoid helps your email bounce rate.
If Shopify reports that the tag was added but it is missing in the admin, another app may have overwritten the tags at the same moment; Shopify suggests a Wait step before Add customer tags.
Check the customers you already have
- In the Shopify admin, go to Customers and click Export.
- Choose All customers and Plain CSV file, then Export customers. Exports of more than 50 customers arrive by email.
- Upload the file to the bulk endpoint of the API and set
email_columntoEmail. The result CSV keeps every original column and adds 15emailvalidation_*columns, including the state and reason. - Filter the rows with state
undeliverableand tag or remove those customers.
For a short list, the bulk email verifier on our website takes up to 50 addresses per run; if you’d rather hand the file over, there is the email list cleaning service. Shopify’s customer import can add tags from a Tags column, but its “Overwrite existing customers” option replaces the existing data of matching customers, so test it on a few rows first.
Pricing note
Each check costs 1 credit, and only successful calls count. The Flow workflow checks each new customer once. In bulk jobs, duplicate and invalid rows are free and addresses that time out are refunded. The free plan includes 100 credits a month and allows 10 requests a minute; paid plans have no per-minute limit and start at $9.99 a month for 5,000 credits (email validation API pricing).
Sources
Checked October 10, 2026: Zapier, Shopify integrations (Premium, New Customer, Add Tag to Customer), Filters and pricing; Shopify Help Center, Send HTTP request (plans, fields, secrets, timeouts, retries), Run code (input, output, no network access), Customer created, Add customer tags, Flow variables and Importing and exporting customers; Shopify.dev, Checkout UI extensions configuration (network access, block_progress, Plus-only steps) and Admin GraphQL Customer object and CustomerEmailAddress (validFormat); Liquid, url_encode.