SPF, DKIM & DMARC for Loops.
Loops (loops.so) is a per-account sender built on Amazon SES, so there is no shared SPF line to paste onto your root domain and no wizard that edits your DNS for you. Instead you open Settings → Domain, click View records, and Loops generates a per-account set of DNS records — three DKIM CNAMEs plus an SPF TXT and an MX record on a dedicated envelope subdomain — that you copy into your DNS host and then confirm with Verify Records. Because Loops provisions a custom MAIL FROM (Return-Path) on envelope.yourdomain.com for you by default, both SPF and DKIM end up aligned to your domain out of the box, which is what makes DMARC pass and your Loops campaigns and transactional mail land in the inbox.
Why authenticate Loops?
Authenticating your Loops domain isn't optional housekeeping — Loops won't send as your domain until the records verify, and that verification is the authentication. Since February 2024, Gmail and Yahoo have required every bulk sender (roughly 5,000+ messages a day) to pass SPF, DKIM, and DMARC with alignment, and Microsoft began enforcing the same requirements for high-volume senders in 2025. Loops runs on shared Amazon SES infrastructure and manages the underlying SES account, reputation, and sending limits for you — so, unlike raw SES, you never touch a sandbox or request production access. But the authentication that ties that mail to your domain is still yours to publish. Until you add and verify the records, mail is signed only with SES's shared amazonses.com key, nothing aligns to your From domain, DMARC fails, and your sending reputation is pooled with every other unauthenticated SES tenant. Publishing the Loops record set fixes all of it in one pass: SES signs as d=yourdomain.com so DKIM aligns, the envelope MAIL FROM aligns SPF, DMARC passes, and the reputation you build accrues to your own domain.
The SPF reality for Loops
Loops is a per-account provider, not an include provider — there is no include:loops.so, and you do NOT add include:amazonses.com to your ROOT SPF record. Loops instead sets a custom MAIL FROM on a dedicated subdomain, envelope.yourdomain.com, and publishes the SPF mechanism there: a TXT record at host envelope with the value v=spf1 include:amazonses.com ~all, plus one MX record at the same envelope host pointing to feedback-smtp.{region}.amazonses.com. Because those two records live on that dedicated envelope subdomain and never on your bare root, they add ZERO DNS lookups to your root SPF and cannot collide with an existing root SPF record — so you do not merge anything into your Google Workspace or Microsoft 365 SPF line, and you should not try to. And because envelope.yourdomain.com shares the organizational domain yourdomain.com with your visible From address, SPF aligns in relaxed mode automatically. That is the key difference from a bare Amazon SES setup: Loops wires up the custom MAIL FROM for you, so you get SPF alignment out of the box rather than SPF that passes only for amazonses.com. The one record you keep singular and at the root is DMARC.
Step by step
- 1
Open your domain settings
On the Loops dashboard (app.loops.so), click the gear icon → Settings → Domain. Enter your company name and the domain you want to send from, then continue to the DNS records screen.
- 2
Choose your sending domain
Enter the exact domain Loops should send as — either your root (yourdomain.com) or a subdomain like send.yourdomain.com or updates.yourdomain.com. Loops generates the DKIM, envelope SPF/MX, and DMARC record set for precisely that domain, so pick it before you copy anything.
- 3
Click View records
Open the record list (Settings → Domain → View records). Loops shows every record with a Type column (TXT, CNAME, MX). Create each record by its Type — not by its friendly title (SPF, DKIM, MX) — because the title is just a label.
- 4
Add the three DKIM CNAME records
Loops lists three DKIM entries shaped host <token>._domainkey → value <token>.dkim.amazonses.com. Add each as a CNAME exactly as shown. Don't change them to TXT — these delegate rotating DKIM keys back to SES, so there is no public key to paste.
- 5
Add the SPF TXT on the envelope subdomain
Add a TXT record with host envelope and value v=spf1 include:amazonses.com ~all. This goes on envelope.yourdomain.com, never on your root domain. You do NOT need to create the envelope subdomain first as an A or CNAME — just add the TXT (and the MX below) at that host label.
- 6
Add the MX record on the envelope subdomain
Add one MX record with host envelope, priority 10, and value feedback-smtp.{region}.amazonses.com (the region is baked into the value Loops shows you, e.g. us-east-1). Some registrars want the priority in its own field; others expect it inline as "10 feedback-smtp.…" — enter it the way your panel requires or verification fails.
- 7
Keep a single DMARC record at your root
Publish (or keep) one TXT record at _dmarc.yourdomain.com starting v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com. Loops lists a DMARC entry too, purely so you have one — but you only need a single DMARC at the root domain, so don't end up with two.
- 8
On Cloudflare, set the CNAMEs to DNS only
If your DNS is on Cloudflare, toggle each DKIM CNAME to "DNS only" (grey cloud). An orange-cloud proxied CNAME won't resolve to *.dkim.amazonses.com and DKIM will stay unverified.
- 9
Click Verify Records in Loops
Back on the Loops domain page, click Verify Records at the bottom. Each row turns green with a verified checkmark when it resolves. Propagation is usually under an hour but can take up to 24–48 hours; if a record still fails after that, it's a DNS misconfiguration, not propagation.
- 10
Send a test and read the headers
Send a real message from your Loops domain, open it in Gmail, and choose ⋮ → Show original. Confirm SPF: PASS showing envelope.yourdomain.com, DKIM: PASS with d=yourdomain.com, and DMARC: PASS — all aligned to your domain, not to amazonses.com.
Records to add
Loops generates the exact values in its setup wizard — these show the shape of what you'll add at your DNS host.
| Type | Host | Value |
|---|---|---|
| CNAME | token1._domainkey | token1.dkim.amazonses.comIllustrative — DKIM key 1. The token is unique to your account; copy the exact host/value from Loops → View records. SES rotates the key behind it. |
| CNAME | token2._domainkey | token2.dkim.amazonses.comIllustrative — DKIM key 2 (per-account token shown in the Loops dashboard). |
| CNAME | token3._domainkey | token3.dkim.amazonses.comIllustrative — DKIM key 3 (per-account token shown in the Loops dashboard). |
| TXT | envelope | v=spf1 include:amazonses.com ~allCustom MAIL FROM SPF — lives on the envelope subdomain, NOT your root. Adds 0 lookups to your root SPF and aligns SPF to your domain. |
| MX | envelope | feedback-smtp.us-east-1.amazonses.comCustom MAIL FROM MX — priority 10; the region (e.g. us-east-1) is baked into the exact value Loops shows you. Only one MX on this subdomain. |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comYour DMARC policy — one per domain, at the root. Start at p=none, then tighten to quarantine/reject. |
Keep exactly one SPF (v=spf1) TXT record on your root domain — merge every sender into it. Two SPF records is itself an error.
The 10-lookup budget
SPF is capped at a hard 10 DNS lookups — go over and it returns a permerror and stops validating everywhere. Here's what Loops's setup costs against that budget.
Loops's recommended setup adds 0 lookups — all 10 stay free for the senders that do need an include.
DKIM
DKIM is the load-bearing record for Loops, and because Loops runs on Amazon SES Easy DKIM it's completely hands-off. Loops generates three CNAME records shaped token1._domainkey.yourdomain.com → token1.dkim.amazonses.com (and the same for token2 and token3). You publish all three as CNAMEs exactly as the View records screen shows them. Because these are CNAMEs that delegate to SES rather than TXT records you paste, Loops and SES hold the private keys and can rotate the published DKIM keys behind those selectors without you ever editing DNS again — there is no public key to copy and no key length to choose. Every Loops message is then signed with d=yourdomain.com, which is what aligns to your From address and lets DMARC pass on DKIM alignment. The exact token hostnames are unique to your account, so copy them from the Loops dashboard rather than reusing another domain's — and if your DNS is on Cloudflare, set all three to "DNS only" (grey cloud) or they'll never verify.
DMARC
DMARC is a separate policy record on your root domain, not something Loops manages for you. Add one TXT record at _dmarc.yourdomain.com beginning v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com — p=none is monitor-only, so it won't affect delivery while you confirm Loops mail passes aligned. Loops does include a DMARC entry in its record list so that you have one, but you only ever need a single DMARC record at the root domain — if you already publish one for Google Workspace, Microsoft 365, or another sender, keep that one and skip Loops' copy rather than publishing two (two DMARC records is invalid). The nice part with Loops is that you don't have to choose between mechanisms: the envelope MAIL FROM aligns SPF and Easy DKIM aligns DKIM, so you get two independent ways to pass DMARC. Once your aggregate (rua) reports confirm Loops is a consistent, aligned source over a week or two, tighten the policy from p=none to p=quarantine and eventually p=reject.
Check it actually worked
Don't trust the dashboard alone — confirm on a real message. In Loops, every row on the domain page should show a green verified checkmark after you click Verify Records. Then send yourself a test from your Loops domain, open it in Gmail, and choose ⋮ → Show original: you want SPF: PASS listing envelope.yourdomain.com (not just amazonses.com), DKIM: PASS with d=yourdomain.com, and DMARC: PASS. Prefer a full report? Send a test to check-auth@verifier.port25.com and it emails back a complete breakdown. You can also run your domain through Qualisend's domain health check to confirm all three DKIM CNAMEs plus the envelope SPF/MX resolve, and once DMARC aggregate reports start arriving, drop one into the DMARC report analyzer — Loops (via Amazon SES) should appear as an aligned, passing source.
Common gotchas
- Breaks auth
Records don't go where you'd guess: SPF and MX live on the envelope.yourdomain.com subdomain (Loops' custom MAIL FROM), so they never touch or collide with your root SPF. Never add include:amazonses.com to your root SPF — it belongs only on the envelope subdomain, and on the root it does nothing useful while burning an SPF lookup.
- DNS setup
Don't pre-create the envelope subdomain. You do NOT need to add an A or CNAME record for envelope first — just publish the SPF TXT and the MX at that host label and they'll resolve.
- DNS setup
MX priority formatting trips people up. The envelope MX must be priority 10; some registrars want the priority in a separate field, others expect it inline as "10 feedback-smtp.…". Enter it the way your panel requires, and keep exactly one MX on the envelope subdomain.
- DNS setup
Use the Type column, not the friendly title. Loops labels rows SPF / DKIM / MX, but you must create each record by its actual Type (TXT, CNAME, or MX). Creating a DKIM CNAME as a TXT, or the SPF as a CNAME, is the most common reason Verify Records fails.
- DNS setup
Cloudflare proxy breaks DKIM. Set all three DKIM CNAMEs to "DNS only" (grey cloud); an orange-cloud proxied CNAME won't resolve to *.dkim.amazonses.com and the record stays unverified.
- Breaks auth
Keep a single DMARC at the root. Loops lists a DMARC entry so you have one, but two DMARC records on the same domain is invalid — if you already have _dmarc.yourdomain.com from another sender, keep it and skip Loops' copy.
- Coverage
Values are per-account — copy them, don't guess. The DKIM tokens and the feedback-smtp region in the MX (e.g. us-east-1) are specific to your Loops domain; paste the exact strings from View records rather than reusing another domain's or another guide's.
- Breaks auth
Watch for host-doubling and trailing dots. Enter just the label (envelope, token1._domainkey) if your panel auto-appends the domain, and where a host wants an FQDN for the CNAME/MX value use a trailing dot so feedback-smtp.us-east-1.amazonses.com isn't mangled into …amazonses.com.yourdomain.com.
Build your SPF record
Loops doesn't need an SPF include: on your root domain — use the generator to assemble one clean record for your other senders, and keep it to a single line.
Sending sources
Search for each platform you send email through and tick it.
Search for your email platform above, or .
This domain's own servers
Authorize the domain itself, if it sends mail directly (not through a platform above).
Other senders & IPs
Anything not in the list — another provider's SPF host, or specific IP addresses.
We add the include: prefix — enter the hostname your provider documents.
Policy for everyone else
What receivers should do with mail from any server not listed above (the all mechanism).
No senders yet, so every message would hit the ~all policy. Add the platforms you send through in step 1.
- Publish it as a TXT record at your root domain — host @ (the bare domain), value the full string above.
- Keep only one SPF record per domain. Merge every sending source into this single line — a second TXT record starting v=spf1 makes both invalid.
- Stay at or under 10 DNS lookups. Each include:, a and mx counts, and an include can trigger more lookups inside itself — ip4: and ip6: are free.
Authentication published? The next step is sending to a clean, verified list.
Verify a listLoops SPF — FAQ
Related reading
Once it's published, confirm everything resolves with the domain health check, then read who's sending as you with the DMARC report analyzer. Browse all sending sources in the generator. Authentication is only half of deliverability, though — a listed sending IP or domain still lands you in spam no matter how clean your SPF is, so it's worth watching the blacklists with blacklist monitoring.
Authenticated — now keep the list clean
Passing SPF, DKIM, and DMARC gets you to the inbox; a clean list keeps you there. Verify yours — start free with 100 credits, no card required.