Why teams leave Mailchimp
- Audience-based pricing surprises. Mailchimp bills by audience size, not send volume. Cleanups don't reduce the bill until you re-archive.
- Limited segment logic. Mailchimp's segment builder maxes out at 5 conditions. Predicate-based DSL has no such limit.
- Slow at scale. Many teams report multi-second segment evaluation above 100k members.
- API is an afterthought. Mailchimp's REST API exists but isn't the primary interface. Relayly is API-first.
What carries across
| Mailchimp concept | Relayly equivalent | Auto-migrates? |
|---|---|---|
| Audiences | lists | Yes — names + opt-in setting. |
| Members + tags | contacts + custom fields | Yes — Mailchimp tags become contact tags directly. |
| Segments | Predicate-based segments | Mailchimp DSL → Relayly predicates. Most rules translate; we flag the rest. |
| Templates | email_templates | Drag-drop preserved via MJML re-render. Classic templates carry as HTML. |
| Customer Journeys | Flows | Step-by-step automation translates to flow nodes. |
| Forms (Mailchimp signup forms) | Signup forms | Hosted forms migrate; embedded JS forms get a snippet swap. |
The codebase swap
API shapes are similar enough that find/replace handles most call sites. The key differences:
// Mailchimp Marketing API import mailchimp from "@mailchimp/mailchimp_marketing"; mailchimp.setConfig({ apiKey: process.env.MAILCHIMP_API_KEY, server: "us1", }); await mailchimp.lists.addListMember("<list_id>", { email_address: "user@example.com", status: "subscribed", merge_fields: { FNAME: "Alex" }, });
// Relayly Node SDK import Relayly from "@relayly/node"; const r = new Relayly({ apiKey: process.env.RELAYLY_API_KEY }); await r.contacts.upsert({ email: "user@example.com", list: "<list_id>", fields: { first_name: "Alex" }, });
Customer Journeys → Flows
Mailchimp's Customer Journey builder maps cleanly to Relayly Flows. The migrator walks each journey graph and translates each node:
- Trigger → flow trigger (event, list join, custom field change)
- Send email → send action with a template reference
- Wait → delay node (preserves the duration)
- If/else → branch node with the same predicate
- Tag / untag → tag mutation action
Branched journeys with custom decision logic are flagged — usually 5-10 min of manual review per journey.
The cutover playbook
- Run the export script. It's read-only against Mailchimp 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 Mailchimp. Don't delete the account — keep it for 30 days as an unsubscribe-list reciprocity reference.
- After 30 quiet days, terminate Mailchimp. You're done.
Pricing-side check
| Volume | Mailchimp | Relayly | Annual delta |
|---|---|---|---|
| 10k contacts, 50k sends/mo | $32/mo (Standard) | $25/mo | + $84/year |
| 50k contacts, 200k sends/mo | $255/mo | $100/mo | + $1,860/year |
| 200k contacts, 800k sends/mo | $700/mo | $130/mo | + $6,840/year |
Mailchimp Standard pricing as of 2026-05 from mailchimp.com/pricing. The contact-based pricing is the dominant cost driver — Relayly bills by send volume only.
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