Set up DMARC on AWS Route 53
You want a DMARC record on AWS Route 53, and what that comes down to is one TXT record at the host _dmarc under your domain, holding a short policy string that begins v=DMARC1.
Route 53 is the DNS host for the domain, not the mailbox provider. It stores the hosted zone and answers queries for the records held there, but the mail itself is sent from somewhere else.
The record comes first on this page, with what each part of it means, and the exact AWS Route 53 fields it goes into come after, because the record is the same wherever your DNS lives and only the form around it changes.
The record before the console
DMARC is the instruction a receiver reads after it has checked SPF and DKIM on a message claiming to come from your domain. Those two checks each return a pass or a fail. DMARC tells the receiver what you want done with a fail, and where to send a summary of what it saw. The instruction lives in DNS because that’s the one place a receiver anywhere in the world can look up something only the domain’s owner can write.
The host is _dmarc, with the _ character at the front, and the type is TXT. The value to start with is:
"v=DMARC1; p=none; rua=mailto:[email protected]"
Three tags carry the meaning. v=DMARC1 names the version of the standard and has to come first. p= is the policy: none asks receivers to deliver failing mail as they would have anyway and report on it, quarantine asks them to put failing mail in spam or junk, and reject asks them to refuse it during delivery. rua=mailto: names the mailbox that receives the aggregate reports, which arrive as XML attachments listing which servers sent mail as your domain and whether each one passed.
A message passes DMARC when SPF or DKIM passes and the domain that passed matches the domain in the From header. That matching is called alignment, and it’s why a mail provider’s own SPF record isn’t enough on its own: the check has to succeed for your domain, since that’s the one the reader sees.
Other tags turn up in records elsewhere. sp= sets a separate policy for subdomains and defaults to whatever p= says; the subdomain policy piece covers when it’s worth setting. pct= applies the policy to a share of failing mail. adkim= and aspf= switch alignment from relaxed to strict, and ruf= asks for per-message forensic reports, which most large receivers don’t send. Leave all of these out at the start; the three-tag record above is complete and valid.
Start at p=none. Publish p=reject before you know your SPF and DKIM pass on your own mail and you’ll bounce your own invoices along with the forgeries. The reports are how you find that out, so the rua= address has to be a mailbox somebody opens.
Check that AWS Route 53 answers DNS for the domain
Open Hosted zones in the Route 53 console, select the domain, and note the four NS values shown there. Those four values must match the nameservers set at the registrar. If the domain was registered through Route 53 they usually already match; if it is registered elsewhere, or there is more than one hosted zone for the domain, check carefully. If the live nameservers point elsewhere, add the DMARC record at whichever provider runs DNS instead.
Route 53 publishes the TXT record exactly as entered once Create records is clicked. It does not generate the DMARC value itself and does not choose or advise on the policy; the reader supplies the full string and the reporting address.
Publish SPF and DKIM before DMARC. The policy tells receivers what to do when those checks fail, so a domain with neither has nothing for DMARC to work from, and a p=reject on such a domain refuses everything that carries its name.
Add the record in the AWS Route 53 console
- Sign in to the AWS console and open Route 53.
- In the left menu, choose Hosted zones, then click the name of the domain.
- Click the Create record button.
- If a wizard with routing options appears, switch to the simple form by looking for Quick create record.
- In the Record name field, enter exactly
_dmarcand do not type the domain name after it. - Set the Record type field to
TXT. - In the Value field, enter the record text wrapped in double quotes that you type yourself.
- Leave the TTL field at its default setting.
- Click Create records to save the entry.
The Record name field takes _dmarc only, since Route 53 appends the domain itself and shows it beside the field. The Record type field is set to TXT. The Value field takes the full string wrapped in double quotes that the reader types themselves, since Route 53 does not add them. The TTL field is left at its default value.
Look for an existing TXT record at _dmarc before you add one. A domain gets one DMARC record, and a receiver that finds two treats the domain as having none, so if one is already there you edit it. Paste the value without surrounding quotation marks and without a trailing space or line break, then compare the last few characters against the record above once it’s saved.
Traps in the AWS Route 53 form
- The value must be in double quotes and Route 53 expects the reader to type the quotes. Leaving them off is the most common Route 53 mistake.
- The record name is
_dmarcwith the_character. Typing_dmarc.yourdomain.comcreates a broken_dmarc.yourdomain.com.yourdomain.comhost that is never checked. - There should be one DMARC record only, a single TXT record at
_dmarc. If one exists, edit it rather than adding a second. - The address after
rua=mailto:needs to be a mailbox that is read. It can be on the same domain or a different one; a domain you do not control has to authorise reports sent to it, but your own domain needs nothing extra. - With several hosted zones or AWS accounts it is easy to edit the wrong one. Confirm the zone’s four NS values match the live nameservers before saving.
A record that’s present and malformed is worse than an absent one in a single respect: it looks done. v=DMARC1 missing from the front, p= misspelt or left out, a rua= without mailto: in front of the address, or curly quotes pasted in from a document all produce a record receivers can’t parse and so ignore. The DMARC typos piece lists the ones that show up most often in the census.
With those checked and the record saved, run the free scan below. It looks up _dmarc on your domain the way a receiving mail server does and tells you whether the record is present, whether it parses, and which policy it carries.
Wait, then read the result
A change in Route 53 takes a few minutes up to a couple of hours to take effect. The saved record appears under the domain’s entry in Hosted zones alongside the other records in the zone.
After the record has propagated, run the free check on this site to see whether the DMARC record is in place and which policy it carries.
A scan run in the first minutes after saving can read as absent while nothing is wrong, because a resolver somewhere is still handing out its cached answer from before the record existed. If the scan still reports no DMARC after a couple of hours, go back to the nameserver check at the top of this page first and the host name second.
A record saved into a console that isn’t answering DNS for the domain is the most common reason a scan comes back unchanged, and the fix is to add the same record at the company the nameservers point to.
When the scan shows the record and its policy, you’re in the monitoring stage. Nothing about delivery has changed yet, and the first reports take a day or so to arrive.
Tightening from none to reject
p=none leaves delivery as it was and starts the reports arriving. Those reports are the only evidence you’ll get about what sends as your domain: your mail provider, a newsletter tool, an invoicing system, and whatever else somebody connected two years ago. Each report names the sending server, how many messages it sent, and whether SPF and DKIM passed for them. The DMARC piece explains how to read one and what a failing row means.
Without a record, a receiver that sees a message fail both checks has no instruction from you, so most deliver it anyway and nobody tells you. Of the 316,600,902 domains carrying a grade in the September 2026 census, 238,156,049 (75.2%) have no DMARC record at all. The monitoring stage has its own trap: of the domains whose DMARC record carries p=none, 33,651,068 (80.33%) have no rua= address, so they sit at none collecting nothing that would let them move.
Read the reports until every sender you recognise is passing and the failing rows are ones you don’t. Then change p=none to p=quarantine in the same field you saved it in, wait for a further round of reports to confirm your own mail still lands, and change it to p=reject. That last edit is the one that turns a monitoring record into an instruction receivers act on, and it takes the same minute in the AWS Route 53 console as the first one did.
Figures as of 5 September 2026, from the September 2026 edition of the defaults.exposed census. Census numbers move every month; the current values are on the census data page.