Migration guide
Migrate from Mailchimp Transactional to Mailtrap
A complete technical guide to switch from Mailchimp Transactional (formerly Mandrill) to Mailtrap. Most teams complete the migration in under an hour.
Migration Checklist
- Authenticate your domain
Add and verify your domain before sending. Follow the Domain Setup article at docs.mailtrap.io.
Need some help?
Contact our support and our developers will help you with it.
- Get your API token
Mailtrap auto-generates a token when you add a domain. Find it under Settings → API Tokens. Read more on API tokens. - Update your integration
Swap your Mailchimp Transactional endpoints and credentials for Mailtrap’s (API or SMTP). See the migration sections below. - Migrate templates
Both platforms use Handlebars, so content migrates directly. See the templates sections below. - Migrate suppressions
Export Mailchimp Transactional suppressions and import them into Mailtrap via CSV or manually. Click here for more information. - Migrate users
Add users from the User Management tab and review permissions during migration. - Set up webhooks
Follow the Mailtrap Webhooks step-by-step guide. - Security and compliance
Visit the Trust Center page to review Mailtrap’s security practices and compliance standards.
Mailtrap tip
You can use ActionMailer Balancer Ruby gem to proportionally distribute the email sending load between two different sending services (e.g. 70% Mailchimp Transactional and 30% Mailtrap) to mitigate the sending risks.
Concepts
Sending domains
Mailchimp Transactional equivalent: Sending Domains / Domain Authentication
Both platforms require DNS-based domain authentication using SPF, DKIM, and DMARC records. Mailchimp uses two CNAME records for DKIM, plus a TXT record for domain ownership verification. Mailtrap also requires DMARC validation.
The DNS standards are the same. The difference is in how each platform surfaces domain status and what records it generates for you.
And DKIM records can be added alongside Mailchimp’s (different selectors, no conflict), and one DMARC record covers both.
Important: For Mailchimp specifically, SPF inclusion (servers.mcsv.net) is optional. DMARC compliance is achieved via DKIM alone, since Mailchimp doesn’t use your domain in the Return-Path. Adding it to your SPF record is technically harmless but increases your DNS lookup count unnecessarily.
See the Mailtrap domain setup guide for step-by-step instructions.
Separate sending streams
Mailchimp Transactional equivalent: N/A – single endpoint
Mailchimp routes all email through a single API endpoint and SMTP host. Mailtrap separates transactional and bulk email into distinct infrastructure:
- Transactional: For sending user-triggered emails like welcome emails and password resets.
- Bulk: For sending promotional, marketing, emails like newsletters and product updates.
By keeping the sending infrastructures separate, you are able to:
- Protect your transactional email reputation from the performance of your bulk campaigns
- Ensure each stream routes through the right IP pools
- Give mailbox providers the signals they need to categorize and deliver your emails correctly

Email categories
Mailchimp Transactional equivalent: Tags (up to 100 per message)
Mailchimp uses tags – an array of strings in the API request – to group messages for stats aggregation. Stats accumulate per-tag, and you can filter activity by tag.
Mailtrap uses Email Categories – set via the category field in the API or the X-MT-Category header in SMTP. Categories serve a similar purpose: grouping messages for tracking and analytics.

Key difference: Mailchimp supports multiple tags per message; Mailtrap assigns one category per message.
Organization & sub-accounts
Mailchimp Transactional equivalent: Subaccounts
Mailchimp’s Subaccounts API lets you segment sending reputation, track stats, and manage quotas per tenant or team. You pass a subaccount ID in the send request.
Mailtrap offers Organization and sub-account management from Business plan onwards. It lets you manage complex setups involving multiple teams, clients, environments, or products under a single Organization. To start using the feature, you first need to enable it under the Organization tab.

Terminology comparison
- Sending Domains / Domain Authentication
- Activity / Message Activity
- Subaccounts
- Templates (with
mc:editregions) - Tags
- Headers
- Metadata / Recipient Metadata
- Rejection Denylist / Allowlist
- No direct equivalent
API migration
Authentication
Mailchimp Transactional and Mailtrap authenticate differently:
| Mailchimp Transactional | Mailtrap | |
| Method | API key in JSON request body | Bearer token in Authorization header |
| Header/field | "key": "YOUR_API_KEY" (body field) | Authorization: Bearer YOUR_MAILTRAP_API_KEY |
| HTTP methods | All endpoints are POST | Standard REST (POST for send) |
Mailchimp’s approach means the API key travels inside the payload, not the header. When migrating, move your auth from the request body to the Authorization header.
API mapping
| API type | Mailchimp Transactional | Mailtrap | Notes |
| Transactional email | POST https://mandrillapp.com/api/1.0/messages/send.json | POST https://send.api.mailtrap.io/api/send | Different auth model; different field structure (see field map below) |
| Bulk email | Same messages/send endpoint | POST https://bulk.api.mailtrap.io/api/send | Mailtrap separates bulk to a dedicated host; Mailchimp uses one endpoint for all |
| Template sending | POST https://mandrillapp.com/api/1.0/messages/send-template.json | POST https://send.api.mailtrap.io/api/send (with template_uuid) | Mailchimp has a separate endpoint for template sends |
| Suppressions | POST /api/1.0/rejects/{add,list,delete}.json and /allowlists/ | GET https://mailtrap.io/fr/api/accounts/{account_id}/suppressions | Mailchimp splits into Denylist and Allowlist |
| Stats | POST /api/1.0/tags/{list,info,time-series}.json and /users/info.json | GET /api/accounts/{account_id}/stats, /stats/domains, /stats/categories, /stats/email_service_providers, and /stats/date | Mailchimp aggregates stats by tag |
| Email logs | POST /api/1.0/messages/{search,info,content}.json | GET https://mailtrap.io/fr/api/accounts/{account_id}/email_logs | Mailchimp’s messages/search is rate-limited to 20 calls/min |
Outbound Sending API JSON Field Mapping
| Field | Mailchimp Transactional | Mailtrap |
| From email | message.from_email | from.email |
| From name | message.from_name | from.name |
| To email | message.to[].email | to[].email |
| To name | message.to[].name | to[].name |
| To type | message.to[].type (to, cc, bcc) | Separate to, cc, bcc arrays |
| CC | message.to[] with type: cc | cc[].email |
| BCC | message.to[] with type: bcc or message.bcc_address | bcc[].email |
| Subject | message.subject | subject |
| HTML body | message.html | html |
| Plain-text body | message.text | text |
| Category/Tag | message.tags (array, up to 100) | category (single string) |
| Custom variables/Metadata | message.metadata (object) + message.recipient_metadata (per-recipient) | custom_variables (object) |
| Reply-To | message.headers["Reply-To"] | reply_to object |
| Custom headers | message.headers (only Reply-To and X-* allowed) | headers |
| Template ID | template_name (slug, top-level in send-template) | template_uuid |
| Template variables | message.global_merge_vars + message.merge_vars (per-recipient) | template_variables |
| Template content regions | template_content(fills mc:edit regions) | N/A |
| Merge language selector | message.merge_language (mailchimp” or handlebars) | N/A – Handlebars only |
| Attachments | message.attachments[].{type, name, content} (base64) | attachments:[{content, filename, type, disposition}] (base64) |
| Scheduled send | send_at (UTC timestamp, top-level) | N/A |
| IP pool | ip_pool (top-level) | N/A – managed by Mailtrap |
| Open tracking | message.track_opens (boolean) | Via account settings or headers |
| Click tracking | message.track_clicks (boolean) | Via account settings or headers |
| Multi-recipient batching | personalizations[] (up to 1,000 recipients per request) | – |
| Sending stream | N/A – single endpoint | Determined by endpoint: send.api.mailtrap.io (transactional) or bulk.api.mailtrap.io (bulk) |
| Inline images | message.images[].{type, name, content} | attachments:[{content, filename, type, disposition:”inline”,content_id}] |
| Subaccount | message.subaccount | N/A – determined by API token scope |
| Auto-generate text from HTML | message.auto_text (boolean) | Not supported – send both html and text explicitly |
| Auto-generate HTML from text | message.auto_html (boolean) | Not supported |
| Inline CSS | message.inline_css (boolean) | Not supported – inline CSS before sending |
Code snippets
-
cURL
curl -X POST https://mandrillapp.com/api/1.0/messages/send.json \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"message": {
"from_email": "sender@yourdomain.com",
"from_name": "Sender Name",
"to": [
{
"email": "recipient@example.com",
"name": "Recipient Name",
"type": "to"
}
],
"subject": "Welcome aboard",
"html": "<h1>Hello</h1><p>Welcome to the platform.</p>",
"text": "Hello. Welcome to the platform.",
"tags": ["welcome"],
"track_opens": true,
"track_clicks": true
}
}'
Copy
curl -X POST https://send.api.mailtrap.io/api/send \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": {
"email": "sender@yourdomain.com",
"name": "Sender Name"
},
"to": [
{
"email": "recipient@example.com",
"name": "Recipient Name"
}
],
"subject": "Welcome aboard",
"html": "<h1>Hello</h1><p>Welcome to the platform.</p>",
"text": "Hello. Welcome to the platform.",
"category": "welcome"
}'
Note: Mailchimp Transactional nests all message fields inside a “message” object with the API key at the top level. Mailtrap uses a flat structure with auth in the header.
SMTP migration
| Setting | Mailchimp Transactional | Mailtrap (Transactional) | Mailtrap (Bulk) |
| Host | smtp.mandrillapp.com | live.smtp.mailtrap.io | bulk.smtp.mailtrap.io |
| Port | 587, 25, 2525 (STARTTLS), 465 (implicit TLS) | 587 (recommended), 25, 2525 | 587 (recommended), 25, 2525 |
| TLS | STARTTLS on 587/25/2525; implicit SSL on 465 | Required (STARTTLS) | Required (STARTTLS) |
| Authentication | PLAIN, LOGIN | PLAIN, LOGIN | PLAIN, LOGIN |
| Username | Any valid email address | api (literal string) | api (literal string) |
| Password | API key | API token | API token |
Migration notes:
- Host: Replace
smtp.mandrillapp.comwith the appropriate Mailtrap host. If you send both transactional and bulk email over SMTP, you now need two separate SMTP configurations. - Username: Mailchimp Transactional accepts any email address as the username (it’s ignored for auth). Mailtrap requires the literal string
api. - Port 465: Mailchimp supports implicit TLS on port 465. Mailtrap does not – use port 587 with STARTTLS instead.
- Password: Both use an API key/token as the password. Generate a new token in your Mailtrap dashboard.

For more information on migrating your SMTP configuration, click this link. ⬅️
Rate limits & quotas
| Limit | Mailchimp Transactional | Mailtrap |
| API rate limit | Not publicly documented | 150 requests per 10 seconds per API token |
| Batch size | No dedicated batch endpoint; multi-recipient via to array (constrained by 10 MB payload limit) | 500 emails per batch call |
| Message size | 25 MB | 10 MB default (extendable to 30 MB on request) |
| Max recipients per SMTP send | 1,000 | Single send ( /api/send ) → 1 email, up to 1,000 recipients per field ( to / cc / bcc ) Batch send ( /api/batch ) → up to 500 separate emails per API call |
| Hourly sending quota | Account-dependent (reputation-based); 5% reserved for transactional when bulk is queued | Plan-dependent |
Email templates
Mailchimp Transactional supports two template syntaxes: Mailchimp merge tags (*|VAR|*) and Handlebars ({{var}}). Mailtrap uses Handlebars exclusively.
If your Mailchimp templates already use Handlebars (merge_language: "handlebars"), the template markup migrates directly – just copy the HTML.
| Mailchimp merge tag | Handlebars equivalent |
*|FNAME|* | {{fname}} |
*|IF:FNAME|*…*|ELSE:|*…*|END:IF|* | {{#if fname}}…{{else}}…{{/if}} |
Syntax comparison
| Pattern | Mailchimp Transactional | Mailtrap |
| Variable insertion | {{variable_name}} (Handlebars) or *|VARIABLE|* (Mailchimp) | {{variable_name}} |
| Default/fallback value | Same in Handlebars mode; conditional *|IF:VAR|* in Mailchimp mode | {{#if var}}{{var}}{{else}}default{{/if}} |
| Date formatting | Not supported – format before passing | Not supported – format before passing |
| Pass variables via API | global_merge_vars + merge_vars (array of {name, content} objects, with per-recipient overrides) | template_variables (flat object) |
| Template identifier | template_name (slug) | template_uuid |
| Editable regions | mc:edit regions filled via template_content | N/A |
| Loops | {{#each items}}…{{/each}} (Handlebars mode only) | {{#each items}}…{{/each}} |
Migration notes:
- Mailchimp Transactional variable format uses arrays of {“
name“: “var“, “content”: “value“} objects, with separateglobal_merge_vars(all recipients) andmerge_vars(per-recipient). - Mailtrap uses a flat
template_variablesobject: {“var“: “value“}. You’ll need to restructure this when migrating your send calls.
Frequently Asked Questions
-
Do I need to re-verify my domain if I’ve already set it up in Mailchimp Transactional?
Yes, you’ll need to re-verify your domain. See the Mailtrap Knowledge Base for up-to-date guidance.
-
Why does Mailtrap have two separate SMTP hosts?
Mailtrap separates transactional and bulk streams to protect your sender reputation and ensure proper delivery routing for each email type.
-
Does Mailtrap offer migration assistance?
Yes, Mailtrap offers migration assistance from Business plan onwards.
-
How do I migrate templates from Mailchimp?
If your Mailchimp Transactional templates use Handlebars syntax, the template markup copies over directly. Update your API calls to use
template_uuidinstead oftemplate_name, and pass variables viatemplate_variables(a flat object) instead ofglobal_merge_vars/merge_vars(arrays of name/content pairs). If you use Mailchimp merge tags (*|VAR|*), convert them to Handlebars ({{var}}) first. -
What about Mailchimp’s ‘mc:edit’ template regions?
Mailtrap doesn’t use editable content regions. Instead, use Handlebars variables directly in your template markup to insert dynamic content.
-
Can I keep using port 465 with implicit TLS?
Mailtrap does not support port 465. Use port 587 with STARTTLS instead – this is the recommended configuration.