Email deliverability Q&A

What are DMARC aggregate reports?

Samuel Chenard

By Samuel Chenard · CEO & Co-Founder, Palisade · Reviewed July 20, 2026

DMARC aggregate reports are XML summaries, usually sent daily, that receiving mail servers email to the address in your DMARC record's rua tag. Each report lists every IP that sent mail claiming to be your domain, how many messages it sent, what the receiver did with them, and whether SPF and DKIM passed. No message content is included.

At a glance
FormatXML file, usually gzip-compressed, attached to an email
CadenceDaily by default (the ri tag's default is 86400 seconds)
Who sends themReceiving mailbox providers (Google, Microsoft, Yahoo, and others)
Where they goThe mailto address in your DMARC record's rua tag
What's insidePer-source-IP counts, disposition applied, SPF/DKIM results and alignment
What's NOT insideMessage bodies, subjects, or recipient addresses
Why they matterThe only complete inventory of who sends as your domain: the evidence for p=reject

Publish a DMARC record with a rua tag and something useful happens: every major mailbox provider that receives mail claiming to be from your domain starts emailing you a regular accounting of it. Google's documentation puts it plainly: reports tell you "which servers or third-party senders are sending mail for your domain" and "what percentage of messages from your domain pass DMARC". That includes senders you forgot about and spoofers you never knew about.

The format is fixed by RFC 7489: an XML file, usually gzip-compressed, attached to an email, with a filename that encodes the receiver, your domain, and the reporting window. The default reporting interval is one day (the ri tag defaults to 86400 seconds), and the RFC only requires receivers to honor daily; anything faster is best-effort. In practice you get one report per receiver per day, so a domain with real traffic collects dozens of XML files a week.

Aggregate means aggregate. A report never contains a message body, a subject line, or a recipient address; it contains counts. That distinction matters because DMARC defines a second, separate report type (ruf, the failure or forensic report) that does reference individual messages, and the two get conflated constantly. The next section splits them properly.

Five steps showing how DMARC aggregate reports reach you: publish a rua address, receivers log mail sent as your domain, daily XML reports arrive, you parse and compare sources, then act on the evidence toward p=reject.

What's inside an aggregate report (RFC 7489, Appendix C)

XML sectionFieldsWhat it tells you
report_metadataorg_name, email, report_id, date_range (begin/end)Who generated the report (e.g. google.com) and the window it covers
policy_publisheddomain, p, sp, pct, adkim, aspf, foThe DMARC policy the receiver found in your DNS at evaluation time
record > rowsource_ip, countOne sending IP and how many of its messages this receiver saw
record > policy_evaluateddisposition (none/quarantine/reject), dkim, spf, reasonWhat the receiver actually did, and the aligned pass/fail per mechanism
record > identifiersheader_from, envelope_from, envelope_toThe From domain the mail claimed, next to the SMTP envelope domain
record > auth_resultsdkim (domain, selector, result), spf (domain, scope, result)The raw authentication verdicts before alignment is applied

The split between policy_evaluated and auth_results is the part worth internalizing: auth_results says whether SPF and DKIM passed at all, while policy_evaluated says whether they passed aligned with your From domain. Mail can pass raw SPF for a vendor's bounce domain and still fail DMARC; the report shows you both layers. Schema verified against RFC 7489 Appendix C, 2026-07-20.

Aggregate (rua) vs forensic (ruf): two different report types

RFC 7489 defines both tags. rua is "aggregate feedback": the XML count summaries this page describes, safe to receive because they carry no message content. ruf requests "message-specific failure information": a per-message failure report in AFRF format (RFC 6591) generated when an individual message fails DMARC, which can include headers from the actual message.

In practice the two are not equally available. Google states in its DMARC setup documentation that "Gmail doesn't support the ruf tag, which is used to send failure reports", and most large receivers have followed the same path for privacy reasons. Plan your DMARC rollout around aggregate reports; treat any ruf data that arrives as a bonus, not a data source you can depend on. The glossary entries for the rf and fo tags cover the failure-report format and trigger options if you do publish one.

How to actually read a record

Open a report and skip to the record blocks; everything else is context. For each record, read three things in order. First, source_ip and count: who sent, and how much. Look the IP up (the PTR record or an IP reputation check usually names the service) and decide whether you recognize it as your mail server, your CRM, your helpdesk, or nothing you run.

Second, policy_evaluated: the dkim and spf values here are the aligned verdicts, and disposition is what the receiver did (none, quarantine, or reject). A legitimate source showing fail on both aligned checks is a misconfiguration you need to fix before tightening policy; an unrecognized source showing fail is exactly the spoofing DMARC exists to stop.

Third, when something fails aligned but you know the sender is real, drop down to auth_results and identifiers to see why. The classic pattern is SPF passing for the service's own bounce domain in envelope_from while header_from is your domain: raw pass, alignment fail. That specific failure mode has its own page at /learning/email-questions/why-is-dmarc-failing-but-spf-passes.

Why nobody reads raw XML for long

One report is readable. The steady state is not: every receiving provider sends its own file for its own window, so a real domain accumulates hundreds of gzipped XML attachments a month, keyed by IP address rather than by sender name, with the same third-party service scattered across dozens of IPs. Answering the one question that matters ("is every legitimate sender passing aligned, and who is the rest?") means joining thousands of records across files and mapping IP ranges to services.

That is why DMARC report parsing exists as a product category: everything from open-source parsers to managed platforms ingests the XML at the rua address and turns it into a per-sender view over time. Palisade does this as part of its managed DMARC service, with unlimited report retention on paid plans, and uses the parsed data to drive enforcement rather than just chart it. Whatever tooling you choose, the goal is the same: stop reading XML, start reading senders.

Reading the report: pattern, meaning, action

What you see in the recordsWhat it meansWhat to do
Known sending service, aligned SPF or DKIM passCorrectly authenticated sourceNothing; this sender is ready for enforcement
Known service, raw SPF pass but aligned failService sends from its own envelope domain; no alignmentSet up custom DKIM signing (or a custom return-path) for that service
Known service, both aligned checks failSender was never authenticated for your domainAdd it to SPF and enable DKIM before any policy tightening
Unknown IPs, small counts, everything failsSpoofing or phishing attempts using your domainNo fix needed on their behalf; this traffic is why you move to p=reject
Known mail forwarded via a third party, SPF fails, DKIM passesForwarding breaks SPF; DKIM survives itNormal. This is why aligned DKIM matters more than SPF for enforcement
A legitimate source appears only in some receivers' reportsLow volume to other providers, or reports still in transitWait for more days of data before concluding a sender is clean

Treat the reports as a census that fills in over weeks, not a dashboard that is complete on day one. A sender that mails your customers monthly will not appear until it next sends.

Five steps showing how DMARC aggregate reports reach you: publish a rua address, receivers log mail sent as your domain, daily XML reports arrive, you parse and compare sources, then act on the evidence toward p=reject.

How to fix it

  1. Check what your DMARC record requests today

    Run your domain through the free DMARC checker below. It shows whether a record exists, whether a rua address is set (no rua tag means no reports, ever), and what policy and interval you are currently publishing.

    Run the check now

    Enter your sending domain and the check runs instantly on the next page. Free, no signup.

  2. Publish a rua address you actually control

    Add rua=mailto:... to your DMARC record, pointing at a mailbox or a parsing service's ingest address. If the reports go to a different domain than the one being reported on, that domain must publish a DMARC verification record authorizing it (RFC 7489's external-destination check).

  3. Let reports accumulate for two to four weeks

    Daily reports from each receiver build the sender inventory over time. Weekly and monthly senders (billing runs, newsletters, renewal notices) only show up when they fire, and those are precisely the ones that break when policy tightens early.

  4. Classify every source: yours, a vendor's, or hostile

    Work through the source IPs until each one is identified and either authenticated with aligned SPF or DKIM, or confirmed as traffic you want rejected. The SPF and DKIM checkers at /tools/spf and /tools/dkim validate each fix as you go.

  5. Use the evidence to ratchet the policy

    When the reports show every legitimate source passing aligned for a full cycle of your sending calendar, the remaining failures are spoofing, and moving from p=none through p=quarantine to p=reject is a decision backed by data instead of a leap. The step-by-step is at /learning/email-questions/how-to-move-from-dmarc-p-none-to-p-reject.

Related free tools: DMARC record generator · SPF checker · DKIM checker

Reports are the evidence; enforcement is the point

It is easy to run DMARC as a reporting hobby: reports arrive, a dashboard fills, and the policy stays at p=none forever, which blocks nothing. The reports have exactly one job: to prove, sender by sender, that tightening the policy will not break legitimate mail. Once they prove it, the value is in acting on it.

Palisade's agent does the acting: it hosts your SPF, DKIM, and DMARC records, reads the aggregate reports continuously, and executes the walk to p=reject when the evidence supports it, so spoofed mail gets dropped by receivers instead of counted by dashboards.

DMARC software that does the work

Palisade's AI agent hosts your SPF, DKIM, and DMARC records and takes every domain to p=reject automatically. Your first domain is free.

First domain free forever

Why it matters for MSPs

Aggregate report volume scales with tenants: fifty client domains means fifty streams of daily XML from every receiver, and hand-parsing stops being a viable service model at about domain number three. The MSP play is one ingest pipeline and a per-client sender inventory, so onboarding a new client starts with two weeks of reports naming every shadow-IT mailer before you touch a record. Palisade runs that pipeline per client domain with unlimited report retention on paid plans, walks each domain to p=reject, and pushes alerts into ConnectWise, HaloPSA, or Autotask so a new unauthenticated source becomes a ticket. Pricing is per domain ($9/mo, dropping to $7 at 100+ domains and $5 at 1,000+), and your own MSP domain is a free NFR domain to run it on first.

Frequently asked questions

Usually once per day per receiving provider. The DMARC record's `ri` tag sets the requested interval and defaults to 86400 seconds; RFC 7489 requires receivers to support daily reports and treats anything faster as best-effort. Google's documentation likewise says reports are usually sent once a day by email.

The `rua` tag requests aggregate reports: XML count summaries per source IP, with no message content. The `ruf` tag requests per-message failure (forensic) reports in AFRF format, which can include headers from failing messages. Aggregate reports are widely sent; Google states Gmail does not support the ruf tag at all.

No. The RFC 7489 schema holds counts and metadata: source IPs, message totals, dispositions, SPF and DKIM results, and the domains involved. There are no subjects, bodies, or individual recipient addresses. That privacy property is a big part of why aggregate reporting is universal while forensic (ruf) reporting mostly is not.

The usual causes, in order: your DMARC record has no `rua` tag, the record has a syntax error so receivers ignore it, the reports go to another domain that has not published the external-destination verification record RFC 7489 requires, or your domain simply sent no mail that reporting receivers saw. Check the record first.

One report, yes: it is plain XML once you unzip it, and the record structure is simple. The full stream, no: every receiver sends its own daily file, sources are keyed by IP rather than sender name, and answering questions across weeks of reports requires parsing tooling. Read one by hand to learn the format, then automate.

Long enough to cover one full cycle of your sending calendar, typically four to six weeks, so monthly senders like billing or newsletter runs appear at least once. The trigger is evidence, not elapsed time: every legitimate source passing aligned SPF or DKIM in the reports, with remaining failures identified as spoofing.

The mailbox providers and receiving servers that get your mail and implement DMARC reporting: Google, Microsoft, Yahoo, and many smaller operators. Each reports independently about the mail it saw, which is why coverage of a given sender depends on where that sender's recipients are hosted, and why multiple reports arrive daily.

Sources

Every benchmark above was verified against the vendor's own documentation on the date shown.

Related reading

Email deliverability, fixed: the full guide