# Shopify Integration: Email Validation

URL: https://email-validation.org/integrations/shopify/
Updated: 2026-11-06

> Documentation index: https://email-validation.org/llms.txt

Check each Shopify customer’s email address when the customer is added or its address changes, and save the status in customer metafields that your segments, flows and exports can use. A webhook relay in your own Cloudflare account checks new customers, and a clean-up command catches up the ones you already have.

[Read the full setup guide](https://email-validation.org/docs/guides/shopify/) [Get an API key](https://email-validation.org/signin/)

- Status: Setup guide
- A relay and a command, in your own accounts

**Clean your customers** Node 22.18 or later

Terminal

```bash
export EV_API_KEY=…  SHOPIFY_SHOP=acme  SHOPIFY_CLIENT_ID=…  SHOPIFY_CLIENT_SECRET=…
node clean.mjs --dry-run    # counts what it would check
node clean.mjs              # checks and writes the results
```

## At a glance.

- **Status**: **Setup guide.** Not listed on a marketplace yet: you set it up yourself in a few steps, below and in the full guide.
- **For**: Shopify merchants who email their customers and want to know which addresses will bounce before a campaign or a flow sends to them, and stores that want a doubtful address flagged on the order before fulfilment.
- **You need**: A Shopify store and a custom app you create for it in Shopify’s Dev Dashboard, a Cloudflare account for the relay, Node 22.18 or later for the command, and an [API key](https://email-validation.org/app/api-keys/) made for it, with a [daily credit cap](https://email-validation.org/docs/authentication/#limits). For a clean-up large enough to go as one bulk job, the key also needs Bulk lists.
- **Costs**: 1 credit = 1 validated address, as with any API request. Free: unknown results, API errors, malformed addresses and test addresses on sandbox.email-validation.org.
- **Full guide**: [Read the full setup guide](https://email-validation.org/docs/guides/shopify/)

## Typical uses.

- **Segment by status**: Each checked customer gets `email_validation.status` and `email_validation.reason` metafields, so a segment, a flow or an export can leave out the invalid and disposable addresses.
- **Check new customers**: The relay checks a customer within seconds of being added, and again only when its address changes. With tags turned on, the customer also gets a tag such as email-invalid.
- **Flag doubtful orders**: Optionally, each new order gets a tag with the status of its address, so your team or a flow can look at it before fulfilling. It does not stop a checkout.

## Set it up. 5 steps.

The short version of the [full setup guide](https://email-validation.org/docs/guides/shopify/), which stays the reference when a step does not match what you see.

1. **Create a custom app**: In Shopify’s Dev Dashboard, create an app for your store with read\_customers and write\_customers (and the two order scopes to tag orders), release it, install it on your store and copy its Client ID and Client secret.
2. **Deploy the relay**: Deploy `relay.js` from the guide to your Cloudflare account with Wrangler and your store’s myshopify name, and add the secrets `EV_API_KEY`, `SHOPIFY_CLIENT_ID` and `SHOPIFY_CLIENT_SECRET`.
3. **Run the setup**: `node clean.mjs --setup --relay-url` with the relay’s address creates the four metafield definitions and subscribes the relay to customer creation and customer updates.
4. **Test it**: Add a test customer with `no_mailbox@sandbox.email-validation.org`: within a few seconds its Email status metafield is `invalid`, at no cost. Then delete the test customer.
5. **Clean the rest**: Run the clean-up command with --dry-run to count what it would check, then without it to check every customer that has no result yet and write each one’s metafields.

## Good to know.

- A customer is not checked again while its address is still the checked one, and the relay ignores its own metafield writes, so a result never starts a second check.
- Shopify does not deliver a webhook again when a check could not run, for example because the key has no credits left: run the clean-up command to catch those customers up.
- If a clean-up stops, run the same command again: it keeps the bulk job’s id in a small state file (ids only, no addresses) and resumes that job, so a list is never paid for twice.
- For [EU data residency](https://email-validation.org/docs/eu-data-residency/), add `--var EV_REGION:eu` to the relay’s deploy command and `--region eu` to the clean-up command.
- The relay refuses any request that Shopify did not sign with your app’s client secret, and follows the API limit Shopify reports with each answer.

## Related

- [The full Shopify setup guide](https://email-validation.org/docs/guides/shopify/)
- [Tag new orders with the status of their address](https://email-validation.org/docs/guides/shopify/#orders)
- [The clean-up command and its options](https://email-validation.org/docs/guides/shopify/#clean)
- [Statuses and reasons: what each metafield value means](https://email-validation.org/docs/statuses/)
- [All integrations](https://email-validation.org/integrations/)
