Notix
Migrate from Customer.io

Migrate off Customer.io without stopping sending.

Export your contacts and your unsubscribes from Customer.io, upload both, and Notix brings them over in the right order. No key, nothing to revoke afterwards. Your Customer.io account keeps sending the whole time.

CSV upload, no key needed
Code converter

Paste your Customer.io code, get the Notix version

Load an example or paste your own send call: Node.js, Python, PHP or cURL. Anything that does not have a Notix equivalent is listed under the result.

Notix, Node.js (notix-js)
import { Notix } from "notix-js";

const notix = new Notix(process.env.NOTIX_API_KEY);

const { data, error } = await notix.emails.send({
  to: "amara@example.com",
  templateId: "YOUR_NOTIX_TEMPLATE_ID",
  variables: {
    firstName: "Amara",
    trackingCode: "KD-4471",
  },
});
  • Your Customer.io template (3) does not come across by itself. Rebuild it in Notix (or start from one of the 54 starter templates) and put its id where the output says YOUR_NOTIX_TEMPLATE_ID.
  • Customer.io writes data as {{ trigger.name }} in Liquid. In a Notix template the same variable is {{name}}.
  • identifiers was not converted. A Notix send goes to an address; to keep a person's record, add them to an audience with notix.contacts.upsert().
  • No sender was found. Add from with an address on a domain you have verified in Notix.

The converter reads the code as text in your browser. It does not run it, store it or send it anywhere.

Migration Center

Move your audience in one sitting

Upload the files Customer.io already lets you export. The Migration Center shows you what it found before it writes anything.

What comes across, in this order

  • Your unsubscribe and bounce export, first, as suppressions
  • Your contact export, with columns mapped to properties
  • Each file into the contact book you choose

Templates come across from SendGrid only. From anywhere else, rebuild them in the editor or start from the 54 starter templates.

Your exports

People → Export to CSV, and a segment of unsubscribed people exported the same way.

CSV

What happens to your files

The uploaded files are kept for one hour while the import runs and dropped when it finishes.

Held 1 hour
Four weeks

How the migration goes

  1. Day one

    Connect or upload

    Paste an API key, or upload your contacts and unsubscribes as CSV. Nothing is written until you have seen what we found.

  2. During the import

    Unsubscribes first

    Every unsubscribe, bounce and complaint is written before the first contact, so nobody who opted out at your old provider can be emailed from Notix.

  3. During the import

    Your lists and fields

    Contacts land in contact books you choose, with your custom fields mapped. Anyone suppressed arrives unsubscribed.

  4. Before you send

    Add Notix to your domain

    Publish our records alongside your old provider's. Both keep sending; DNS has room for both.

  5. Weeks one to four

    Move volume gradually

    A four-week plan, 15% to 100%, so mailbox providers see a sender that grows steadily. Switch the old provider off at the end, not the start.

Where things live

Customer.io's pages, and where to find them in Notix

The console uses the same words throughout: Emails, Broadcasts, Automations, Templates, Audience, Metrics, Logs, Webhooks and API keys.

Customer.io's names as their dashboard shows them; Notix names as the console shows them.
In Customer.ioIn NotixGood to know
PeopleAudienceAttributes become contact properties.
SegmentsAudience > SegmentsSame idea, same place.
Subscription center topicsAudience > TopicsSame idea, same place.
BroadcastsBroadcastsSame idea, same place.
CampaignsAutomationsEmail, delay, wait for event, if / else, update contact and add to segment steps.
Transactional messagesTemplates, sent through the email APISame idea, same place.
Deliveries and activity logsEmailsSame idea, same place.
Sending domainsDomainsSame idea, same place.
API credentialsAPI keysSame idea, same place.
Reporting webhooksWebhooksSame idea, same place.
SDKs and the API

Send through the API, side by side

The same email, as you send it today and as you send it with Notix.

Notix has official SDKs for Node.js, Python and PHP. Every other language uses the same JSON API.
LanguageCustomer.ioNotix
Node.js and TypeScriptcustomerio-nodenotix-js
Pythoncustomerionotix-sdk
PHP and LaravelTheir HTTP APIusenotix/notix-php
Go, Ruby, Java, .NET and the restTheir libraries, or the REST APIREST API (JSON over HTTPS)
Customer.io today
const { APIClient, SendEmailRequest, RegionUS } = require("customerio-node");

const api = new APIClient(process.env.CUSTOMERIO_APP_KEY, { region: RegionUS });

const request = new SendEmailRequest({
  to: "amara@example.com",
  transactional_message_id: "3",
  message_data: { firstName: "Amara", trackingCode: "KD-4471" },
  identifiers: { id: "user-4471" },
});

await api.sendEmail(request);
Notix, with notix-js
import { Notix } from "notix-js";

const notix = new Notix(process.env.NOTIX_API_KEY);

const { data, error } = await notix.emails.send({
  to: "amara@example.com",
  templateId: "YOUR_NOTIX_TEMPLATE_ID",
  variables: {
    firstName: "Amara",
    trackingCode: "KD-4471",
  },
});
SMTP

SMTP settings, side by side

Notix: host smtp.usenotix.dev, ports 465 (TLS) or 587 (STARTTLS), username notix, and an API key as the password.

Customer.io sends transactional mail through its API, so there is usually no SMTP setting to change. If another app of yours sends over SMTP, point it at Notix with the settings on the right.

Webhooks

Your events, by their new names

Every Notix webhook is signed with X-Notix-Signature and retried up to six times. Point a new endpoint at Notix and match the names below.

Customer.io's event names as their docs list them; Notix names as they arrive in the X-Notix-Event header.
Customer.ioNotixGood to know
email sentemail.sent
email deliveredemail.delivered
email openedemail.opened
email clickedemail.clicked
email bouncedemail.bounced
email spammedemail.complained
email droppedemail.suppressed
email failedemail.failed
email unsubscribedcontact.unsubscribed
Security and safety

What protects your mail and your data

Suppressions before contacts

The importer enforces the order. Someone who opted out at Customer.io cannot get mail from Notix.

Keys with limits

Give each app the key it needs: full access, or sending only.

Signed webhooks

Every delivery carries an HMAC signature and a timestamp, so your handler can refuse anything forged or replayed.

Logs without secrets

API request logs are kept 30 days. Keys, codes, email bodies and attachments are hidden before a log is saved.

A domain that protects itself

If bounces or complaints climb past safe levels, the domain pauses before it damages your reputation. How it works.

A second pair of eyes

The first broadcast to imported contacts is reviewed by us before it goes out.

Idempotency

Retries never send twice

Send an Idempotency-Key header, up to 256 characters, with any send or batch. Notix keeps the result for 24 hours: a retry with the same key and body gets the first answer back, marked Idempotent-Replayed: true, and the same key with a different body is refused with a 409.

In notix-js it is one option: emails.send(payload, { idempotencyKey }). See it in action.

Also in your account

What else comes with Notix

SMS and one-time codes

Send sign-in codes by SMS or email, with a risk check first, and verify them in one call. One-time codes.

Connect your AI

Claude, ChatGPT or Cursor can work with Notix, and live keys ask you first above a limit you set. Connect your AI.

Pay in NGN, KES or USD

Top up a wallet in naira, shillings or dollars, and Pro renews from it. Pricing.

Inbound and forwarding

Receive mail on your own domain and forward it on, with an optional forwarded-message header. Inbound email.

Broadcasts and automations

Campaigns to a list, segment or topic, and email sequences that run themselves, behind the same key.

DNS

Your SPF record keeps both

A domain may only have one SPF record, so you add Notix to the line you already have rather than replacing it. Add include:_spf.usenotix.dev beside the include Customer.io gave you, and remove theirs once you have switched off.

Pricing

What it costs

We haven't recorded Customer.io's list prices for the plan this page is about, so there is no comparison here rather than a figure for a different product of theirs. Notix pricing is on one page, and a migration call can work your own numbers through with you.

FAQ

Questions, answered

Do I have to rewrite my sending code?
Not by hand. Paste your Customer.io send code into the converter on this page to get the Notix version, or change four SMTP settings if you send over SMTP.
Will my Customer.io unsubscribes come across?
Yes, and first. The import writes every unsubscribe, bounce and complaint before the first contact, so a person who opted out there cannot be emailed from Notix, even if the rest of the import stops halfway.
Do I need to give Notix a key?
No. Customer.io migrates by the CSV files it already lets you export. The files are kept for one hour while the import runs, then dropped.
Can I keep sending from Customer.io while I migrate?
Yes. Notix's DNS records sit beside Customer.io's, and the migration takes four weeks, from 15% of your volume to all of it. Switch Customer.io off at the end, not the start.
Is there someone who can help?
Yes. Book a free migration call from the contact page and we will look at your setup with you. The first broadcast to imported contacts is also reviewed by us before it goes out.

Start migrating off Customer.io.

Convert your code, bring your audience across with unsubscribes first, and move your volume over four weeks. We are happy to do it with you.