Why teams leave Klaviyo
- Klaviyo bills by active profile. Volume-pricing surprises every time your list grows. Relayly bills by send volume only.
- Email-only marketers pay for SMS infrastructure. Klaviyo's tiers are bundled. You pay for the whole product whether you use SMS or not.
- EU data residency requires Enterprise contract. Klaviyo's EU region is gated. Relayly EU is on every tier from $25/mo.
- Segment definitions trapped in Klaviyo's DSL. Vendor lock-in. Relayly's predicate DSL is JSON, exportable, and documented.
- Slow segment evaluation at scale. Common complaint above 200k profiles. Relayly evaluates predicates against a Postgres index — sub-second on multi-million-row lists.
What carries across
| Klaviyo concept | Relayly equivalent | Auto-migrates? |
|---|---|---|
| Profiles | contacts | Yes — full export with custom properties. Source ID preserved as external_id. |
| Lists | lists | Yes — preserves names + opt-in setting (single vs double). |
| List memberships | list_members | Yes — direction preserved (subscribed / unsubscribed / pending-confirm). |
| Segment definitions | Predicate-based segments | Klaviyo segment DSL → Relayly JSON predicates. ~80% auto-translate; complex temporal logic flagged. |
| Email templates | email_templates | HTML pulled inline. Klaviyo Liquid → Relayly Liquid (~99% identical syntax). |
| Suppression list | Suppressions | Bounces + unsubs + complaints all carry. Hard-bounced profiles never re-mailed. |
| Campaigns (drafts + queued) | Campaigns | Migrated and pointed at the new lists/templates. |
| Sent campaign analytics | Read-only archive | Optional. For analytics continuity only — never re-delivered. |
| Flows | Flows | Klaviyo flows use a custom DSL we partially translate. Linear flows convert; branched logic gets a manual review checklist. |
| Metrics + events | Custom events | Last 90 days of Opened / Clicked / Bounced events imported for segment continuity. |
The codebase swap
API shapes are similar enough that find/replace handles most call sites. The key differences:
// Klaviyo Node SDK import { ApiKeySession, EventsApi } from "klaviyo-api"; const session = new ApiKeySession(process.env.KLAVIYO_API_KEY); const events = new EventsApi(session); await events.createEvent({ data: { type: "event", attributes: { profile: { email: "u@example.com" }, metric: { name: "Welcome Sent" }, properties: { plan: "pro" } } } });
// Relayly Node SDK import Relayly from "@relayly/node"; const r = new Relayly({ apiKey: process.env.RELAYLY_API_KEY }); await r.events.create({ email: "u@example.com", metric: "Welcome Sent", properties: { plan: "pro" } });
Segment translation table
The trickiest part of any Klaviyo migration is segment translation. Our exporter writes each Klaviyo segment to segments.json verbatim, then auto-translates the common predicates to Relayly's DSL. Here's the mapping it uses:
| Klaviyo predicate | Relayly predicate |
|---|---|
profile-group-membership groupIds=[id] | {"list_member_of": "<list_id>"} |
profile-metric Opened Email count > 0 last 90 days | {"event_within_days": {"event": "opened", "days": 90}} |
profile-metric Clicked Email count > 0 last 30 days | {"event_within_days": {"event": "clicked", "days": 30}} |
profile-marketing-consent email canReceiveMarketing=true | (implicit — every contact in subscribed status) |
timeframeFilter in-the-last 14 days on group membership | {"joined_within_days": 14} |
| Boolean AND across predicates | {"all": […]} |
| Boolean OR | {"any": […]} |
The cutover playbook
- Run the export script. It's read-only against Klaviyo and re-runnable.
- Review the manifest. Anything flagged as "needs review" gets a copy-paste remediation snippet.
- Apply to Relayly. Idempotent SQL + REST imports. Re-run safely.
- Dual-send for a week. Compare inbox rates at Gmail / O365 / Yahoo through the dashboard.
- Flip the API key. Search-and-replace your codebase, deploy, monitor 24h.
- Pause Klaviyo. Don't delete the account — keep it for 30 days as an unsubscribe-list reciprocity reference.
- After 30 quiet days, terminate Klaviyo. You're done.
Pricing-side check
| Volume | Klaviyo | Relayly | Annual delta |
|---|---|---|---|
| 10k active profiles, 50k sends/mo | $45/mo (Email + SMS) | $25/mo | + $240/year |
| 50k active profiles, 200k sends/mo | $175/mo | $100/mo | + $900/year |
| 200k active profiles, 1M sends/mo | $720/mo | $130/mo | + $7,080/year |
| 500k active profiles, 5M sends/mo | $1,700/mo | $249/mo (overage) | + $17,412/year |
Klaviyo pricing as of 2026-05 from klaviyo.com/pricing. Active-profile pricing is the dominant cost driver — Relayly bills by send volume only, so the savings compound as your list grows.
Start the migration
Sign up free, run the export script, dual-send for a week. We'll spot you 10,000 verification sends.
Start free