Migrate from Loops
Moving from Loops to SendRaven.
Loops exports its audience as one CSV with a subscribed column and one column per contact property, which is the easiest shape there is: one file, one import, the status read from the column.
What you rebuild by hand is the loops themselves. Sequences do not export from any tool; in SendRaven they are automations, with their exits (unsubscribe, reply, suppression) wired in.
Export steps checked 6 September 2026 against loops.so. Weighing it up? SendRaven vs Loops.
- Audience, then the export option at the top of the contact list. Loops builds the CSV and offers it for download, or emails a link for a large audience.
- Choose all contacts and all properties. A filtered export is a fine way to bring one segment across first, but bring the unsubscribed people in some export, as below.
Compared
What changes when you move from Loops.
| What changes the architecture or the bill | SendRaven | Loops |
|---|---|---|
| Priced per email sent, never per contact | Yes One meter. A contact is free. | No by subscribed contacts; sends unlimited |
| Transactional, campaigns and automations on one plan | Yes One key, one plan, one dashboard, one suppression list. | Partly marketing and transactional together; no inbound |
| The reply is a thread, not a webhook | Yes Joined on Message-ID to the message it answers. | No |
| One query for what is awaiting a reply | Yes GET /v1/threads?awaiting_reply=true | No |
| Per-key daily cap and recipient allowlist | Yes daily_send_limit and allowed_recipients on the key, checked on every send. | No |
| Human approval hold on a key | Yes requires_approval drafts the message and waits for a person. | No |
| Unsubscribe cancels queued sends and ends the sequence | Yes Two writes: suppress the address, cancel what is scheduled for it. | Partly an unsubscribed contact gets no further campaign or workflow email |
From Loops's own pricing and documentation, last verified 16 September 2026. A “No” means not offered or not documented on that date. Everything else is on SendRaven vs Loops.
What moves
What comes across, and what you rebuild.
| In Loops | In SendRaven |
|---|---|
| Contacts, names | email, firstName, lastName are matched automatically. |
| User group | The userGroup column imports as tags. |
| Contact properties | Every other column becomes a custom property, typed from its values. Loops' own userId, source and createdAt are ignored by default. |
| Subscribed | The subscribed column, true or false. false imports as unsubscribed and suppressed for marketing. |
| Mailing lists | If you use them, each is a column. Turn each into a topic and load it with POST /v1/topics/{key}/import. |
| Transactional emails | Their HTML moves into SendRaven templates; data variables become {{variables}}. |
| Loops (sequences) | Rebuilt as automations. |
The file
What the export looks like, and how the import reads it.
email, firstName, lastName, source, subscribed, userGroup, userId, createdAt, then one column per contact property with the property's name as the header, and a column per mailing list if you have any.
subscribed is true or false. The import reads it as the person's status, so a single file carries both the subscribers and the opt-outs.
The part that matters
Bring the opt-outs.
Because the unsubscribed people are in the same file with subscribed set to false, one import brings them across correctly, as long as the export includes them. Do not filter the export to subscribed only. Loops' bounced addresses are not in the contact export; if you have a list of them from its deliverability view, import that file with the status "everyone in this file bounced".
Templates and sending
The copy and the code.
Loops' transactional emails and campaigns are built in its editor and can be copied out as HTML. Paste into a SendRaven template and change the data variables to {{variables}}. A Loops {{firstName}} is a SendRaven {{first_name}} if you map to the built-in field, or {{firstName}} as a custom property. SendRaven adds the unsubscribe link and headers to marketing sends itself.
Loops' transactional API takes a transactionalId and dataVariables. SendRaven's takes a template slug and variables, or the HTML directly: POST /v1/emails with from, to, subject and either template plus variables or html. Add an Idempotency-Key header and retries are free.
# Loops: POST /v1/transactional { transactionalId, email, dataVariables }
# SendRaven: the same send, from a stored template
curl -X POST https://api.sendraven.ai/v1/emails \
-H "Authorization: Bearer sk_live_..." \
-H "Idempotency-Key: welcome-usr_42" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme <hello@mail.acme.com>",
"to": "ana@example.com",
"template": "welcome",
"variables": { "first_name": "Ana", "plan": "Pro" }
}'What it costs
Estimate the bill by emails sent, not contacts.
- Emails a month
- 200,000
- SendRaven, Standard plan
- $85.00 a month
- For the 50,000 contacts
- $0
On a new sending domain, the first campaign to all 50,000 goes out over 8 days: the warm-up pauses it at each day's ceiling and resumes it at midnight UTC. The ceiling keeps rising for 14 days from the first send, then comes off. Published plan prices, before tax. Transactional mail, if you move it too, counts on the same meter; replies are never metered.
Then, in order
The steps every migration shares.
Verify your domain first
Add the domain under Domains and publish the DNS records it gives you. Use a subdomain you have not sent from before if you can (mail.yourdomain.com for transactional, news.yourdomain.com for campaigns), so the two reputations stay separate. Nothing sends until this is green, and it can take a while for DNS to settle, so start it before the export.
Import the subscribers
Contacts → Import a CSV. Pick or create the list, upload the export, and check the column mapping: address, names, tags, and which columns become custom properties. Re-running the same file is safe: existing contacts are updated, not duplicated.
Import the opt-outs
Then the unsubscribed, bounced and complained lists, with the matching status. Each one is flagged and suppressed before your first send: unsubscribes for marketing only, bounces and complaints for everything. An import never resubscribes someone who has opted out here.
Check the counts
The audience page shows how many were imported, updated and suppressed. Compare the suppressed count to what the old provider reported. If it is far off, the status column was read differently from how you meant. The mapping step shows what each value became.
Switch the API key
For transactional mail, point the code at POST /v1/emails with a SendRaven key. The request shape is from, to, subject, html or text, and an Idempotency-Key header. Keep the old key alive for a day in case something still points at it.
Send the first campaign to the engaged part of the list
A new domain has no history, and mailbox providers judge it on the first few thousand messages. Opens and clicks start from your first SendRaven send, so use the old provider's engagement: tag the recently engaged people on import, send the first campaign to a segment on that tag, then widen. A new sending domain also warms up, so a large first campaign spreads over several days on its own. The reputation gate refuses a campaign once the bounce or complaint rate is already high; it cannot refuse the one that gets you there.
Questions
Asked by people leaving Loops.
Can I keep using Loops' contact properties as they are?
Yes. Each column becomes a custom property with the same name, and the key is derived from it: "Plan Tier" becomes plan_tier. Segments filter on them and the API exposes them under attributes.
What happens to a loop that is mid-way for someone?
It does not carry across; they would restart. The honest move is to let the old loop finish for people already in it, and enrol only new signups in the SendRaven automation. Run both for the length of the sequence, then turn Loops off.

Start with the domain.
3,000 emails a month, inbound included, and no charge until you switch paid sending on. Verify the domain today and import the list once the DNS has settled. The other guides are on the migrate page.

