Behavioral messaging platform
Customer.io logo

Customer.io SMTP Settings and Configuration (2026)

i

No SMTP relay — Customer.io sends over its API only

There is no smtp.customer.io host, no port and no SMTP credential pair anywhere in the official docs. Every message — automation email, one-time send, transactional alike — leaves through the App API at https://api.customer.io/v1/send/email or from the Journeys UI. The one docs page titled Use Your Own SMTP Server describes the opposite direction: Customer.io connecting outward, as a client, to a relay you own.

If you came for credentials to paste into WP Mail SMTP, Laravel or Django, Customer.io cannot serve that job. What it gives you instead is a full sending-domain authentication flow, a transactional API, and a setting that relays through a provider you already pay for. For a behavioural-messaging platform that also exposes a real relay, look at Brevo or SendGrid; the closest peers without one are Klaviyo and ActiveCampaign. Below: what you can actually configure, and how to wire a relay alongside it without wrecking DMARC alignment.

Quick reference

Values below come from Customer.io’s own documentation as of August 19, 2026. Anything unpublished is marked as such rather than guessed.

SMTP relayNot offered API ONLY
No inbound SMTP ingress has ever been published.
Sending methodApp API v1POST https://api.customer.io/v1/send/email with Authorization: Bearer <App API key>. EU accounts use api-eu.customer.io. Sibling channels: /v1/send/push, /sms, /in_app, /inbox_message.
Sending domain authWorkspace Settings › Email › Sending domains. Customer.io mints a subdomain cio#####.yourdomain.com and generates an SPF TXT, a DKIM TXT at selector krs, an MX pair for the return-path, and a DMARC TXT on the root domain.
Transactional emailIncluded on every plan, not a separate SKU. Caps: 15 recipients across To, CC and BCC per request; attachments under 2 MB combined.
Bring your own relayOutbound only, on ports 465, 587 or 2525. Port 25 refused.
Official docsSending domain authentication · Transactional email

Why Customer.io has no SMTP relay

Customer.io is a behavioural messaging and customer-data platform, not email infrastructure. Its unit is not a message but a profile: attributes, events, objects, segment membership, frequency caps, suppression state and a Liquid template resolving against all of it at send time. An SMTP envelope carries none of that. Accepting anonymous submissions would mean accepting messages the platform cannot attribute, suppress, frequency-cap or report on in the Deliveries view — which is most of the product.

So the send surface is an API call carrying a transactional_message_id, an identifiers object and a message_data payload, not a rendered MIME body. Even the transactional product, marketed separately from Journeys automations, runs on the same App API host and the same soft ceiling of 3000 requests per 3 seconds as the rest of the ingress. Any system that can only speak SMTP therefore needs a relay in front of it, and Customer.io is not that relay.

What you actually need instead

Sending transactional email from your application

Use the App API. Create a scoped App API key in Account Settings › API Credentials, build a transactional message in the UI to get its transactional_message_id, then POST to /v1/send/email. Official clients wrap it: customerio (Python), customerio-node, go-customerio, customerio-ruby, each taking a region argument. A successful call returns a delivery_id and queued_at for reconciling against the Deliveries view.

Connecting a CMS, framework or appliance that only speaks SMTP

Point it at a dedicated relay. For WordPress, Laravel, Django or any stock mailer: Postmark for transactional-only traffic where speed and support matter, Amazon SES when cost per thousand dominates and you can own the deliverability work, SendGrid or Brevo for a relay plus a marketing surface in one account. Keep Customer.io for behavioural journeys and let both share one authenticated sending domain.

Routing internal notifications and alerts

If the goal is a Slack ping or an ops alert rather than an inbox, skip email. Customer.io ships a native Slack destination that posts to a chosen channel when journey criteria are met, and a Custom Webhook destination that sends any event or profile payload to an HTTPS endpoint you control. Reporting Webhooks stream lifecycle events — sent, delivered, opened, clicked, bounced, spammed, unsubscribed, failed — into your own systems.

Sending domain authentication

This is what most SMTP-settings searchers actually need: the only place in Customer.io where you configure email at the infrastructure level. In Workspace Settings › Email › Sending domains, enter the domain you want to send From; Customer.io mints a subdomain cio#####.yourdomain.com (the digits are your workspace id) and generates four record sets behind a Show Records button.

SPF and DKIM setup

Customer.io publishes no global SPF include. The include value, DKIM public key, the two return-path MX hostnames and the link-tracking CNAME target are generated per workspace and revealed only in the app, so the template below shows shape and placement, not copyable values. The one documented constant is the DKIM selector: always krs.

; Generated per workspace — Settings › Email › Sending domains › Show Records

; 1. SPF — authorises Customer.io on the sending subdomain
cio12345.yourdomain.com.                 IN  TXT    "v=spf1 include:<value shown in app> ~all"

; 2. DKIM — selector is always "krs"
krs._domainkey.cio12345.yourdomain.com.  IN  TXT    "k=rsa; p=<public key shown in app>"

; 3. Custom return-path — one MX record, two hostnames
cio12345.yourdomain.com.                 IN  MX 10  <mx host 1 shown in app>
cio12345.yourdomain.com.                 IN  MX 20  <mx host 2 shown in app>

; 4. Optional — HTTPS link tracking on your own host
links.yourdomain.com.                    IN  CNAME  <target shown in app>

; 5. DMARC — on the ROOT domain, never on the cio##### subdomain
_dmarc.yourdomain.com.                   IN  TXT    "v=DMARC1; p=none; adkim=r; aspf=r"

Two edge cases bite. If a custom SMTP server is already configured, Customer.io cannot verify the domain automatically and the docs tell you to contact support for manual authentication — so verify before switching custom SMTP on. And record values are workspace-scoped: a US and an EU workspace on the same brand domain need two separate sets. Otherwise verification is automatic once DNS propagates.

DMARC alignment

Customer.io states the minimum acceptable record is v=DMARC1; p=none, published at _dmarc.yourdomain.com on the organisational domain, not on the cio##### subdomain. Relaxed alignment is what makes it work: with aspf=r and adkim=r the sending subdomain aligns with the organisational domain in your visible From header, so DMARC passes even though the return-path sits on a subdomain. Tighten to adkim=s and the DKIM d= on the subdomain no longer aligns with the root From domain, and mail fails.

Since the 2024 Google and Yahoo bulk-sender rules a DMARC record is effectively mandatory at volume. Treat p=none as a starting position: publish it with an rua address, read reports until every legitimate stream passes, then move to p=quarantine and eventually p=reject.

Sending limits

There is no per-hour email throttle, because there is no relay to throttle. Customer.io meters monthly email volume per plan and applies request-rate limits per API instead. It calls these limits not strictly enforced, while warning that consistently exceeding them may lead to throttling or dropped data, and that they are subject to change.

LimitValueNotes
Transactional send API3000 requests / 3 secondsSoft limit on /v1/send/*, shared with App API ingress.
App API standard endpoints10 requests / secondCampaigns, segments, collections, exports, deliveries.
API-triggered broadcasts1 request / 10 secondsStrictest limit in the platform. Batch recipients into one trigger, do not loop.
Track API ingest1000 requests / secondApplies to live integrations and historical backfill alike.
Transactional message caps15 recipients · 2 MB attachments15 counts To, CC and BCC together. Executable extensions blocklisted.

Two 2026 workspace controls sit on top: channel frequency caps with windows up to 31 days and automation rate limiting by channel. Throttles you configure, not platform ceilings — but they silently hold messages if you forget them.

Common mistakes

Reading “Use Your Own SMTP Server” backwards

The most-cited Customer.io SMTP page describes Customer.io acting as the SMTP client against a server you own; search engines and AI assistants routinely surface it as evidence of a relay. Relay vendors compound it with pages titled “Send emails using Customer.io with SMTP”, which are guides for pointing the custom-SMTP setting at their relay. Neither describes a Customer.io-hosted endpoint, because none exists.

Publishing port 25, 587 or 2525 as “Customer.io SMTP ports”

Customer.io’s custom-SMTP form refuses port 25 outright and accepts 465, 587 or 2525. Those ports belong to whichever provider you relay through — they are inputs to the form, not Customer.io endpoints. Recording them internally as “Customer.io settings” costs the next engineer an afternoon against a host that never answers.

Enabling custom SMTP and losing the feedback loop

Once Customer.io relays through your server, bounce, delivery and spam data stop landing in the Deliveries view unless your provider is one Customer.io can ingest feedback from — it names Mailgun, Mailjet, Mandrill, Postmark, SendGrid and SparkPost — and that feedback is configured. Suppression quality degrades from that point, and support can no longer help with provider-specific deliverability.

Assuming one API key, and one region

Three APIs, three credential types: Track uses HTTP Basic with the Site ID as username, Pipelines uses HTTP Basic with the source write key as username and a blank password, and the App API — the one that sends email — uses a scoped Bearer token. Cross them and you get a bare 401 with no hint which key was expected. Region compounds it: only track and transactional calls auto-redirect, so a hardcoded US host on an EU account sends fine and silently fails on management or Pipelines calls.

Pairing Customer.io with an SMTP provider

The recommended setup

Run one dedicated relay for machine SMTP traffic, then point Customer.io’s custom SMTP setting at that same provider. Both streams then share one reputation, one authenticated domain and one DNS record set, and bounce handling lives in one place. Order matters: authenticate the domain in Customer.io and let verification finish, configure the relay’s own SPF and DKIM on the same organisational domain, then switch to custom SMTP and ask support to re-authenticate manually.

There is one real financial argument for it: Customer.io documents that emails sent through your custom SMTP server do not count against your plan’s allotted email volume. On a plan starting at $100 per month for 5k profiles and 1 million emails, that only pays off at genuine scale, and the price is lost delivery reporting.

Keeping the two systems from colliding

Two failure modes are worth designing against. The first is double-sending: an order-confirmation event that fires both a Customer.io journey and your application’s own relay call produces two near-identical emails. Pick one owner per message type and write it down. Usual split: Customer.io owns anything triggered by behaviour or segment membership, the application owns anything triggered by a database state change.

The second is DMARC drift. If the relay signs with DKIM on the root domain while Customer.io signs on cio#####.yourdomain.com, both pass under relaxed alignment — but only if your record actually specifies adkim=r and aspf=r. Tighten to strict alignment for the relay’s benefit and you break Customer.io in the same edit. Keep one relaxed DMARC record on the organisational domain, read aggregate reports for both sources before changing policy, and if the two systems share a suppression list sync it in one direction only.

Frequently asked questions

What are the Customer.io SMTP settings (server, port, username, password)?

They do not exist. Customer.io publishes no SMTP hostname, port or credential format in its documentation, API reference, release notes or public repositories, because it operates no relay. Sending is an HTTP request to https://api.customer.io/v1/send/email authenticated with a Bearer App API key. Any page offering “Customer.io SMTP credentials” is describing a third-party relay, or inventing it.

Does Customer.io have an SMTP relay, or is it API only?

API only. Automations, one-time sends and transactional messages all leave through the App API or the Journeys UI, via /v1/send/email, /push, /sms, /in_app and /inbox_message on api.customer.io (or api-eu.customer.io in the EU).

How do I use my own SMTP server with Customer.io?

Workspace Settings › Email › custom SMTP, on all plans: supply your provider’s hostname, port, username and password and Customer.io connects out as a client. Two consequences — domain verification stops being automatic, so support must authenticate it manually, and delivery feedback only flows back if your provider is one Customer.io ingests events from.

Why can’t I use port 25 with Customer.io custom SMTP?

Customer.io explicitly refuses port 25 and directs you to 465, 587 or 2525. Port 25 is the server-to-server relay port, is widely blocked at the cloud-provider level, and carries no expectation of authenticated submission. The submission ports are the correct ones for an authenticated client, which is what Customer.io is here.

What SPF, DKIM, MX and DMARC records does Customer.io need?

Four sets, generated per workspace on a cio#####.yourdomain.com subdomain: an SPF TXT there, a DKIM TXT at selector krs, an MX record with two hostnames for the custom return-path, and a DMARC TXT at _dmarc on your root domain. Only the DKIM selector is a published constant; every value is account-specific and revealed behind the Show Records button, so no generic include string exists to copy.

What changes if my Customer.io account is in the EU region?

Every API host gains an -eu twin: api-eu.customer.io, track-eu.customer.io, cdp-eu.customer.io and mcp-eu.customer.io. Only track and transactional calls auto-redirect, so management and Pipelines calls to a US host fail rather than reroute. Region is fixed at account creation, the dashboard URL is identical in both, and DNS values differ per workspace, so an EU workspace needs its own record set even on the same brand domain.

AAlaa Touil RRabeb How we test →

This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.