# Klaviyo Integration: Email Validation

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

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

Check the email of each new Klaviyo profile from a flow’s webhook action, and save the status, reason and action as profile properties your segments and flow splits can use. A small relay you deploy as a Cloudflare Worker does the check within seconds, and a Node sync script catches up on profiles created earlier.

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

- Status: Setup guide
- A flow webhook and a relay you run

**Webhook action** In your flow

Action settings

```text
Destination URL  the relay’s workers.dev address (HTTPS)
Headers          X-Relay-Secret: <your RELAY_SECRET>
JSON body        { "email": "{{ email }}" }

Flow filter      email_validation_status is not set
```

## 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**: Klaviyo users who grow a list through sign-up forms and want every new profile’s address checked before the first campaign, so segments and flow splits can leave out the ones that will bounce.
- **You need**: A Klaviyo private API key with the custom scopes Profiles: Read and Profiles: Write, two-step authentication on your Klaviyo login (Klaviyo requires it for webhook actions), a Cloudflare account for the relay, Node 22.18 or later for the sync script, 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).
- **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/klaviyo/)

## Typical uses.

- **Check new sign-ups**: A flow that starts when a profile is added to your sign-up list sends it to the relay, which checks the address and writes the result to the profile within seconds.
- **Leave out bad addresses**: Build a segment on email\_validation\_action equal to remove: it holds every profile you should not mail, including spam traps and complainers, which are valid with the action remove.
- **Backfill and catch up**: The sync script checks every profile created after a time you give that has no status yet: for a first clean-up, after a gap, or on a schedule instead of the relay.

## Set it up. 5 steps.

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

1. **Create both keys**: Create an API key with Validate addresses and a daily credit cap, and a Klaviyo private key with the custom scopes Profiles: Read and Profiles: Write. Klaviyo does not let you change a key’s scopes later.
2. **Deploy the relay**: Deploy `relay.js` from the guide to your Cloudflare account with `wrangler`, and set its three secrets: `EV_API_KEY`, `KLAVIYO_API_KEY` and a `RELAY_SECRET` of 32 or more random characters.
3. **Create the flow**: Use the trigger Added to List for your sign-up list, or any trigger that starts for each new profile, with the flow filter “email\_validation\_status is not set”, so a profile is never checked and charged twice.
4. **Add the Webhook action**: Set the destination URL to the relay’s address, the header `X-Relay-Secret` to the relay secret, and the JSON body `{ "email": "{{ email }}" }`.
5. **Test, then turn it on**: Add a test profile with `no_mailbox@sandbox.email-validation.org` to a test list, kept off lists that send mail. When the flow has run, its status property is `invalid`; then delete the test profile.

## Good to know.

- Four properties are saved: `email_validation_status`, `email_validation_reason`, `email_validation_action` and `email_validation_checked_at`. Klaviyo creates them on the first write, and your own properties stay unchanged.
- Klaviyo delivers a webhook again after a 503 for about 24 hours, so a rate limit or an outage at our API needs nothing from you. When the check ran but Klaviyo refused the write, the relay does not ask for a new delivery, which would pay again: run the sync script for that period.
- The sync script waits and tries again after rate limits and outages, but never resends a check that got no answer: the profile still has no status, so the next run picks it up. It prints profile IDs and statuses, never addresses.
- For [EU data residency](https://email-validation.org/docs/eu-data-residency/), add `--var EV_REGION:eu` to the relay’s deploy command, or run the sync script with `--region eu`.
- The relay’s answers never contain an address or a key, and the relay logs nothing.

## Related

- [The full Klaviyo setup guide](https://email-validation.org/docs/guides/klaviyo/)
- [How the relay answers Klaviyo, and what to do](https://email-validation.org/docs/guides/klaviyo/#answers)
- [Check existing profiles with the sync script](https://email-validation.org/docs/guides/klaviyo/#sync)
- [Statuses and reasons](https://email-validation.org/docs/statuses/)
- [All integrations](https://email-validation.org/integrations/)
