The exact SPF record
Copy the example that matches your setup. Each one is a single TXT record; the host is shown as your DNS provider usually expects it (@ means the domain itself).
Your main domain on Microsoft 365 stays as it is
Type: TXT · Host: @ · 1 of 10 DNS lookups
v=spf1 include:spf.protection.outlook.com -all
Your main domain on Google Workspace stays as it is
Type: TXT · Host: @ · 1 of 10 DNS lookups
v=spf1 include:_spf.google.com ~all
How SPF applies to Customer.io mail
Customer.io sends with a bounce (MAIL FROM) address on a subdomain set up for it, and receivers check SPF on that subdomain. Your main domain's SPF record doesn't need to change for Customer.io. Customer.io doesn't print its SPF value in its documentation. Copy it from Show Records in your workspace and publish it on the cio##### host, not on @.
- Publish Customer.io's SPF value as an ordinary TXT record, not the old SPF record type.
- On Amazon Route 53, which allows one MX record per name, Customer.io says to put both MX values in one record on separate lines; its example is
10 mxa.mailgun.org.and10 mxb.mailgun.org.. - Wix doesn't accept an MX record on a subdomain, so Customer.io says such domains can't be verified there.
How to add it
- In Customer.io, go to Settings > Workspace Settings > Email, add a sending domain and a from address, then click Show Records.
- Add the four records at your DNS host: the MX record (two hostnames) and the SPF TXT record on your
cio#####subdomain, the DKIM TXT record oncio._domainkey.cio#####, and DMARC on_dmarcof your root domain. - If your DNS host appends your domain automatically (GoDaddy does), enter only the front part, such as
cio12345. - Click Verify domain. Customer.io only checks when you click, and says verification can take up to 72 hours. SPF, DKIM and DMARC all need a green checkmark before you can send.
DKIM and DMARC alignment
DKIM is a 2048-bit TXT key at cio._domainkey.cio#####.yourdomain.com (see our Customer.io DKIM page). Because the return path and DKIM sit on a subdomain of your From domain, both align under DMARC's relaxed default. Customer.io warns that aspf=s or adkim=s in your DMARC record makes its mail fail alignment.
DMARC passes when SPF or DKIM passes and the domain it checked matches your From domain. Our guide to SPF, DKIM and DMARC explains how the three fit together.
Common mistakes
- Two SPF records. A domain may publish only one record that starts with
v=spf1. With two, receivers return a permanent error and SPF fails for all your mail (RFC 7208 section 3.2). Merge every sender into one record. - More than 10 DNS lookups. Each
include,a,mx,existsandredirectcosts a lookup, nested ones included; over 10 is a PermError (section 4.6.4). See how to fix too many SPF lookups. - Choosing
~allor-allwithout a plan.-allasks receivers to reject unlisted servers;~allasks them to accept but mark the mail. Once DMARC is enforced, receivers act on DMARC instead. Read SPF soft fail vs hard fail before you choose. - Putting Customer.io's SPF value into the root record on
@. It belongs on thecio#####subdomain. - Deleting your domain's existing MX or SPF records while adding Customer.io's. Customer.io warns you could stop receiving email.
- Removing the Customer.io records after verification, which Customer.io says can cause bounces or spam filtering.
Check your SPF record
See your live record, every nested include and the real lookup count. Free, reads public DNS only.
Building a record for your other senders? Use the SPF Record Generator.
Frequently asked questions
Does Customer.io need an include in my root SPF record?
No. Customer.io's SPF TXT record goes on your account subdomain (cio#####.yourdomain.com), which is also the return path, so receivers check SPF there and your root record is untouched.
Why does Customer.io ask for an MX record on a subdomain?
The MX record makes your cio##### subdomain the custom return path, which receives bounces and spam feedback. It sits on the subdomain, so it doesn't affect mail delivered to your own mailboxes.
Will a strict DMARC policy break Customer.io mail?
Strict alignment will. Customer.io signs and returns mail on a subdomain of your From domain, which passes relaxed alignment only. If your DMARC record has aspf=s or adkim=s, change them to r or remove them.
Sources
Values checked against Customer.io's documentation on November 3, 2026. Lookup counts measured with our SPF Checker on November 3, 2026; providers change their records, so check yours before relying on a number.
SPF records for other providers
- Microsoft 365include:spf.protection.outlook.com
- Google Workspaceinclude:_spf.google.com
- Zoho Mailinclude:zoho.com
- GoDaddyinclude:secureserver.net
- Fastmailinclude:spf.messagingengine.com
- Proton Mailinclude:_spf.protonmail.ch
- iCloud Mailinclude:icloud.com
- Rackspace Emailinclude:emailsrvr.com
- Hostingerinclude:_spf.mail.hostinger.com
- Private Emailinclude:spf.privateemail.com
- IONOSinclude:_spf-us.ionos.com
- Amazon SESinclude:amazonses.com
- SendGridinclude:sendgrid.net
- Mailguninclude:mailgun.org
- PostmarkNone needed
- Mailjetinclude:spf.mailjet.com
- SMTP2GONone needed (return-path CNAME)
- MandrillNone needed
- SparkPostNone needed (bounce-domain CNAME)
- Elastic Emailinclude:_spf.elasticemail.com
- Resendinclude:amazonses.com
- MailerSendinclude:_spf.mailersend.net
- MailchimpNone needed
- BrevoNone for standard sending; spf.brevo.com with a dedicated IP
- HubSpotAccount-specific (copy from HubSpot)
- KlaviyoNone needed
- ActiveCampaignNone needed (Mailserver Domain CNAME)
- SquarespaceNone needed
- ShopifyNone needed (CNAME records)
- Dynamics 365 Customer InsightsNone needed (optional: your envelope-from domain)
- MailerLiteinclude:_spf.mlsend.com
- Campaign Monitorinclude:_spf.createsend.com
- KitNone needed (ckespa CNAME)
- Marketoinclude:mktomail.com
- Account Engagement (Pardot)None needed (SPF passes automatically)
- Constant ContactNone needed
- Zoho Campaignsinclude:zcsend.net
- Salesforceinclude:_spf.salesforce.com
- Zendeskinclude:mail.zendesk.com
- Freshdeskinclude:email.freshdesk.com
- IntercomNone needed
- Help ScoutNone needed (old value: helpscoutemail.com)
- Odooinclude:_spf.odoo.com
Related guides
SPF record syntax and examples
SPF record syntax explained: mechanisms, qualifiers and modifiers, with copy-ready examples for Microsoft 365, Google Workspace, subdomains and parked domains.
9 min read SPF, DKIM & DMARCHow to fix SPF PermError: too many DNS lookups
Why SPF breaks at 10 DNS lookups, how to count them, and step-by-step fixes for Microsoft 365 and Google Workspace domains with many senders.
8 min read SPF, DKIM & DMARCSPF softfail vs hardfail: should you use ~all or -all?
What ~all, -all and ?all mean in SPF, what receivers really do with each, how DMARC changes the choice, and which one to use for sending and parked domains.
8 min readLast updated