DMARC Aggregate (RUA) Reports Explained: XML Schema, Delivery, RUF Forensic Reports (RFC 7489 §7.2, §7.3)

A practitioner reference for DMARC aggregate (RUA) reports: the daily XML stream receivers send back to domain owners, with every authentication outcome per sending IP. Covers the XML schema (feedback / report_metadata / policy_published / record), the delivery mechanism (gz email attachments named receiver!sender-domain!begin!end.xml.gz), a worked report example, operational reading patterns, and the forensic (RUF) sibling defined in RFC 7489 §7.3.

This reference is provided in English. DMARC aggregate reports are specified in English-language RFCs (RFC 7489 §7.2 + Appendix C) and the canonical XML element names (feedback, report_metadata, policy_published, record, row, identifiers, auth_results, dkim_eval, spf_eval, disposition) are XML identifiers that do not translate. We keep the body in the source language so technical terms remain consistent with the specifications.

TL;DR

  • DMARC aggregate reports (also called RUA reports after the rua= tag that publishes the destination) are daily XML documents receivers send back to domain owners summarising how mail claiming to be from the domain was processed. Defined in RFC 7489 §7.2.
  • The report is grouped by source IP with per-group message counts, SPF / DKIM authentication results, alignment outcome, and the disposition (none, quarantine, or reject) the receiver applied.
  • The XML root is <feedback> with three child element types: <report_metadata> (sender identity + reporting window), <policy_published> (the DMARC record the receiver saw), and one or more <record> elements (one per source-IP / authentication-result combination).
  • Delivery: email attachment, gzip-compressed XML (.xml.gz) or ZIP, filename convention receiver!sender-domain!begin-ts!end-ts.xml.gz. Reports arrive at the mailbox(es) listed in the rua= tag.
  • Cadence: one report per receiver-sender pair per day by default (ri=86400). Major receivers deliver daily, typically 04:00-09:00 UTC. Smaller receivers vary or send no reports at all.
  • RUF (forensic) reports — defined in RFC 7489 §7.3, addressed by ruf= — are per-message failure reports including header content. Privacy implications mean most major receivers no longer send RUF.
  • DMARC Analyzer ingests aggregate reports via includes/DmarcParser.php (XML, ZIP, and GZ formats per RFC 7489 §7.2.1.1) and forensic reports via includes/ForensicReportParser.php (RFC 6591 ARF envelope).

1. What is a DMARC aggregate report?

A DMARC aggregate report — also called a RUA report after the rua= tag in the DMARC record that publishes the destination address — is an XML document that a receiving mail provider sends back to the domain owner once per day, summarising every message claiming to be from the domain that the receiver processed during the reporting window. The format is defined in RFC 7489 §7.2 and the underlying XSD schema is published in RFC 7489 Appendix C.

The data model: receivers group every observed message by source IP and authentication outcome. Each group becomes one <record> element in the report, with a message count and the underlying SPF / DKIM evaluation results. The result is a per-day, per-IP snapshot of every authentication path your domain was associated with — legitimate or not. That snapshot is the primary diagnostic stream for any DMARC deployment.

Aggregate reports are the artefact every DMARC rollout depends on:

  • Phase 1 (Discovery) of the rollout — see DMARC policy rollout — uses aggregate reports to inventory every legitimate sender that currently sends mail claiming to be from your domain.
  • Phase 2 (Alignment fix-up) uses aggregate reports to verify each remediation landed (a misaligned SaaS sender flips to aligned in the next day's report).
  • Phase 3-5 (Enforcement) uses aggregate reports to confirm no unexpected legitimate flows are being blocked.
  • Post-rollout steady state keeps aggregate-report monitoring forever as the detection mechanism for newly misaligned senders (new SaaS deployments, new partner integrations).

The mechanism is asymmetric: the receiver knows everything (every message, every SPF / DKIM result, every disposition) but the sender knows only what the receiver chooses to report. Without aggregate reports, the sender is blind. With aggregate reports, the sender has near-complete visibility into the full sending estate — including senders the sender did not know existed.

2. The RUA mechanism: how reports get generated and delivered

  1. The sender publishes a DMARC TXT record at _dmarc.example.com with a rua= tag listing one or more report destination URIs (typically mailto: addresses). rua=mailto:dmarc-reports@example.com is the minimum.
  2. The receiver consumes the DMARC record on every inbound message claiming the sender's domain in From:. For each such message the receiver records the source IP, the SPF / DKIM outcomes, and the disposition applied.
  3. At the end of the reporting interval (default 86400 seconds, the ri= tag overrides), the receiver groups the day's observations by source-IP / auth-result combinations and emits one XML report per sender-receiver pair.
  4. The report is gzip-compressed (or sometimes ZIP-compressed) and emailed as an attachment to every mailto: address in rua=. Filename convention: receiver!sender-domain!begin-ts!end-ts.xml.gz where the timestamps are Unix epoch seconds.
  5. The sender ingests the XML (typically via tooling like includes/DmarcParser.php), decodes the records, and surfaces the per-sender authentication breakdown.

Two RFC-defined nuances matter for the mechanism:

  • Cross-domain authorisation (RFC 7489 §7.1): the rua mailbox does not have to be on the same domain as the DMARC-protected sender. To accept reports for example.com at reports.aggregator.example, the aggregator must publish a TXT record at example.com._report._dmarc.aggregator.example containing v=DMARC1. Without the authorisation record, receivers SHOULD NOT send reports across domain boundaries.
  • Report-size limits (RFC 7489 §7.2.1): receivers MAY truncate oversized reports. A report with thousands of source-IP groups may exceed the receiver's email-attachment size limit, in which case the receiver typically emits the most-active groups and drops the long tail. High-volume senders should expect truncation and plan around it.

3. The aggregate-report XML schema

The keystone reference for this page. RFC 7489 Appendix C defines the full XSD; the table below summarises the elements every parser encounters in real-world reports.

Element Parent Required? Meaning
<feedback> (root) Yes The XML document root. Contains one report_metadata, one policy_published, and one or more record children.
<report_metadata> feedback Yes Receiver identity and reporting window.
<org_name> report_metadata Yes Human-readable name of the reporting organisation (e.g. "google.com", "Yahoo").
<email> report_metadata Yes Contact email at the reporting organisation.
<report_id> report_metadata Yes Unique identifier per receiver per report. Used for deduplication on the sender side.
<date_range> report_metadata Yes Two children (begin and end) carrying Unix epoch timestamps that bound the reporting window.
<extra_contact_info> report_metadata No Optional URI for additional receiver contact information.
<policy_published> feedback Yes The DMARC record as the receiver saw it during the reporting window. Children mirror the DMARC tags: domain, adkim, aspf, p, sp, pct, fo.
<record> feedback Yes (1+) One per source-IP / authentication-result combination. Contains row, identifiers, auth_results.
<row> record Yes The source IP (source_ip), the message count (count), and the policy_evaluated block (disposition + dkim/spf alignment outcome).
<policy_evaluated> row Yes The DMARC outcome. Children: disposition (none / quarantine / reject), dkim (pass / fail), spf (pass / fail).
<identifiers> record Yes The domains involved. header_from is the From: header domain; envelope_from and envelope_to are the SMTP-level addresses.
<auth_results> record Yes The underlying SPF / DKIM results before alignment is applied. Zero or more dkim blocks (each with domain, selector, result) and one spf block (with domain and result).

The XML root is <feedback> rather than the more obvious <report> for historical reasons — DMARC reports were originally modelled on RFC 5965 Abuse Reporting Format (ARF), which uses feedback-type in its email-headers form. The aggregate- report XML kept the feedback root.

4. A worked aggregate-report example

A minimal aggregate report from Google for the sending domain example.com during a 24-hour window:

<?xml version="1.0" encoding="UTF-8"?>
<feedback>
  <report_metadata>
    <org_name>google.com</org_name>
    <email>noreply-dmarc-support@google.com</email>
    <extra_contact_info>https://support.google.com/a/answer/2466580</extra_contact_info>
    <report_id>12345678901234567890</report_id>
    <date_range>
      <begin>1716163200</begin>
      <end>1716249600</end>
    </date_range>
  </report_metadata>

  <policy_published>
    <domain>example.com</domain>
    <adkim>r</adkim>
    <aspf>r</aspf>
    <p>quarantine</p>
    <sp>quarantine</sp>
    <pct>100</pct>
  </policy_published>

  <record>
    <row>
      <source_ip>209.85.220.41</source_ip>
      <count>1547</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>pass</dkim>
        <spf>pass</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>example.com</header_from>
      <envelope_from>bounce.example.com</envelope_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>example.com</domain>
        <selector>mail</selector>
        <result>pass</result>
      </dkim>
      <spf>
        <domain>bounce.example.com</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>

  <record>
    <row>
      <source_ip>192.0.2.200</source_ip>
      <count>23</count>
      <policy_evaluated>
        <disposition>quarantine</disposition>
        <dkim>fail</dkim>
        <spf>fail</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>example.com</header_from>
    </identifiers>
    <auth_results>
      <spf>
        <domain>attacker.example</domain>
        <result>none</result>
      </spf>
    </auth_results>
  </record>
</feedback>

Reading the report:

  • The reporter is Google (org_name), the window covers 2024-05-20 00:00 UTC to 2024-05-21 00:00 UTC (date_range in Unix epoch), and the published DMARC record at the time was v=DMARC1; p=quarantine; sp=quarantine; adkim=r; aspf=r; pct=100.
  • Record 1 covers 1,547 messages from 209.85.220.41. Both DKIM and SPF aligned and passed — legitimate mail through a properly- configured custom-bounce domain (bounce.example.com) and custom DKIM (selector mail). Disposition is none (delivered normally) because DMARC passed.
  • Record 2 covers 23 messages from 192.0.2.200 claiming to be from example.com. SPF produced no result (result=none for attacker.example — the wrong domain), no DKIM signature was present, alignment failed for both, and the receiver quarantined per the published p=quarantine policy. This is the spoofing-attempt signal the rollout is designed to surface.

The count field is critical — it is the per-day message count for that source-IP / auth-result combination. A legitimate sender shows up as one record with a high count; a spoofing source shows up as one record with a low count (or as several records with low counts from a botnet).

5. Report cadence and delivery

Aggregate reports are delivered as email attachments to every mailto: address in the DMARC record's rua= tag. The attachment is compressed XML — typically .xml.gz from major receivers, occasionally .zip from smaller receivers.

Filename convention

receiver-domain!sender-domain!begin-timestamp!end-timestamp!unique-id.xml.gz

Example:
google.com!example.com!1716163200!1716249600.xml.gz

The exclamation-mark-separated fields encode the receiver, the sender domain, the reporting-window epoch timestamps, and an optional unique identifier. Not every receiver includes the unique-id suffix.

Reporting interval

The default interval is 86400 seconds (one report per sender-receiver pair per day). RFC 7489 §6.6.5 defines the ri= tag for requesting different intervals (ri=3600 for hourly), but most receivers honour only the default and ignore custom ri= values.

Delivery timing

Major receivers deliver reports at consistent times. Typical schedule:

  • Google — daily, 04:00-06:00 UTC.
  • Microsoft / Outlook — daily, 06:00-08:00 UTC.
  • Yahoo — daily, 07:00-09:00 UTC.
  • Comcast, AOL, Mail.ru — daily, varies.

A new DMARC record takes one full reporting interval to surface in aggregate reports — receivers cached the old record for the TTL duration plus the reporting-interval window. Expect 24-48 hours after publishing or changing a record before the next report reflects the change.

6. Reading aggregate reports operationally

Aggregate reports are dense, repetitive, and tedious to read by hand — a typical daily report from a single major receiver is several hundred lines of XML covering a dozen source-IP groups. Tooling is essential. DMARC Analyzer's ingestion pipeline at includes/DmarcParser.php parses XML, ZIP, and GZ formats, deduplicates by report_id + org_name, persists per-record rows to the dmarc_records table, and surfaces per-sender / per-IP / per-day aggregations in the dashboard.

The diagnostic questions reports answer:

  • Who is sending mail claiming to be from my domain? Group records by auth_results/spf/domain and auth_results/dkim/domain; every distinct domain is a candidate sending source. Legitimate senders use recognised domains (your bounce domain, SaaS DKIM domains you provisioned); unknown domains are either shadow IT or spoofing.
  • Which legitimate senders are misaligned? Filter to records where the source IP belongs to a known legitimate sender but policy_evaluated/dkim or policy_evaluated/spf is fail. These are your rollout-blocking remediations.
  • What is the apex pass rate? Sum count across all records where both alignment outcomes are pass; divide by total count. A healthy apex sits at 99%+ aligned; a rollout-ready apex sits at 99.5%+.
  • What is the current disposition distribution? Group by policy_evaluated/disposition. At p=none, every disposition is none by definition; at p=quarantine, you see a mix of none (passing mail) and quarantine (failing mail); at p=reject, you see none + reject.
  • Are receivers seeing the policy I published? Check policy_published/p matches the intended value. Mismatch indicates a propagation delay or a typo in the DNS record.

7. Forensic (RUF) reports

DMARC defines a second report type — the forensic or failure report (also called RUF after the ruf= tag). RUF reports are per-message rather than per-day, triggered by individual DMARC-failing messages, and they include header content from the failing message (From:, To:, Subject, sometimes a body excerpt).

RUF is specified in RFC 7489 §7.3 and uses the RFC 6591 Abuse Reporting Format (ARF) envelope rather than the XML schema. A RUF report is an email message with a multipart structure: a machine-readable message/feedback-report part plus a message/rfc822 part containing the actual failing message headers and body (or excerpt).

Privacy implications: RUF reports include actual From: addresses and subject lines from failing messages — which means user PII from every legitimate alignment failure is forwarded to the rua mailbox. Mailing-list forwarding, SaaS sender misconfiguration, and forwarding chains all generate forensic reports that include user data. The privacy posture led the major consumer mailbox providers to stop sending RUF reports entirely:

  • Google — never sent RUF.
  • Microsoft / Outlook — does not send RUF.
  • Yahoo — does not send RUF.
  • Comcast, AOL — do not send RUF.

Some smaller receivers and enterprise gateways still send RUF reports. DMARC Analyzer ingests them via includes/ForensicReportParser.php (RFC 6591 ARF envelope, RFC 7489 §7.3 forensic-content format), persists to dmarc_forensic_reports, and surfaces them alongside aggregate-report data in the dashboard. The fo= tag in the DMARC record controls forensic report generation (fo=0 default, fo=1 any auth failure, fo=d DKIM failure, fo=s SPF failure) but only influences the receivers that actually emit RUF.

Practical guidance: publish ruf=mailto:dmarc-forensic@example.com if your mail-flow can handle the privacy implications, but treat any RUF data as a bonus signal. The major-receiver RUA stream is sufficient to drive a rollout; RUF is supplemental, not primary.

For a deeper dive into RUF including the full AFRF MIME schema, the message/feedback-report key-value fields (Feedback-Type, Reported-Domain, Auth-Failure, Source-IP, Original-Mail-From, Identity-Alignment), a worked AFRF example, GDPR / CCPA implications, and operational reading patterns, see the dedicated DMARC forensic (RUF) reports guide.

8. RUA mailbox best practices

  1. Host the rua mailbox at a different domain. Reports for example.com delivered to rua@example.com create a chicken-and-egg problem: if example.com fails DMARC during rollout, its own reports may fail to deliver. Use rua@reports.example-corp.com or a dedicated reports domain.
  2. Disable spam filtering for the rua mailbox. Aggregate reports arrive from dozens of receiver domains with attachments and varied DKIM signatures — exactly the pattern that triggers spam filters. Allowlist or skip spam filtering for the rua mailbox.
  3. Use a parser, not a human. Aggregate reports are dense XML — the diagnostic value comes from per-sender aggregation across many reports. Pipe the mailbox into DMARC Analyzer (includes/DmarcParser.php) or another reporting tool.
  4. Deduplicate by report_id + org_name. Receivers occasionally resend reports after delivery failures; without deduplication the same observations are counted twice.
  5. Publish cross-domain authorisation if needed. If the rua mailbox is at a different domain, publish example.com._report._dmarc.aggregator.example with v=DMARC1 so receivers will send across domain boundaries (RFC 7489 §7.1).
  6. Retain reports for at least 13 months. Aggregate-report history is the only artefact that documents what the sending estate looked like at a given point in time. Year-on-year comparisons require at least one full year of retained reports plus margin.
  7. Monitor for missing receivers. If you typically receive daily reports from Google, Microsoft, and Yahoo and one stops arriving, something changed — either at the receiver, in the DNS propagation of your record, or in your rua mailbox delivery path.
  8. Alert on new spoofing IPs. The same record-pattern (failing DMARC, high count, unfamiliar source IP) is the spoofing signal. Alert on it.
  9. Treat aggregate reports as confidential. Reports list every IP that sent mail claiming to be from your domain — including internal infrastructure IPs. The report itself does not contain user PII but the IP inventory is sensitive for an attacker mapping your sending infrastructure.
  10. Never disable RUA after p=reject. Aggregate-report monitoring is the detection mechanism for newly misaligned senders. Drop rua= and you lose visibility into every future configuration drift.

9. Common aggregate-report mistakes

  1. Publishing rua= without a plan for the reports. Reports arrive in volume from day one. A mailbox that fills up and bounces means receivers stop sending and you lose the diagnostic stream.
  2. Hosting the rua mailbox on the same domain DMARC is protecting. Chicken-and-egg delivery problem during rollout. Host at a different domain or publish cross-domain authorisation.
  3. Treating each report in isolation. A single report from one receiver covers a fraction of total volume — the diagnostic value comes from aggregating across receivers across days. Use tooling.
  4. Confusing auth_results with policy_evaluated. The auth_results block is the raw SPF / DKIM verdict before alignment is checked; the policy_evaluated block is the final DMARC outcome after alignment. SPF can pass in auth_results and fail in policy_evaluated if the SPF-authorised domain does not align with the From: header.
  5. Setting ri= too short. The default is 86400 seconds (daily). Lower values are explicitly allowed by RFC 7489 §6.6.5 but most receivers ignore them — and the few that honour them produce far more report email than is operationally useful.
  6. Publishing rua= at a non-existent mailbox. Receivers attempt delivery, bounce, and may stop retrying. A non-existent rua destination is silently zero reports.
  7. Forgetting to deduplicate. Some receivers resend reports after transient delivery failures. Without report_id + org_name deduplication, a resent report is double-counted.
  8. Treating RUF as primary. RUF reports are sparse (major receivers don't send them) and carry user-PII privacy risk. The diagnostic-stream commitment is RUA; treat RUF as a bonus.
  9. Disabling rua after rollout. Aggregate-report monitoring is the post-rollout detection mechanism. Drop rua= and a new misaligned sender is invisible until it produces a support ticket.
  10. Mistaking spoofing volume for a problem to fix. A report showing 10,000 DMARC-failing messages from a Russian IP block is not a misalignment — it is the spoofing being blocked by your DMARC record. The win is that the receiver applied the policy.

10. Aggregate-report troubleshooting

Reports are not arriving at the rua mailbox
Verify the mailbox accepts mail and is not over-quota. Test by sending a message from a different domain. If the rua mailbox is on the same DMARC-protected domain, publish cross-domain authorisation at example.com._report._dmarc.aggregator.example or move the mailbox to a separate domain. Confirm the DMARC record has propagated — receivers typically need 24-48 hours after a record change before reports reflect the new configuration.
Reports are arriving but the parser rejects the XML
Some receivers produce malformed XML (missing required elements, encoding glitches, broken gzip streams). A robust parser (such as includes/DmarcParser.php) handles common defects: optional elements, both draft and RFC 7489 formats, and disables external entity loading for XXE defence-in-depth. Inspect the raw attachment in a text editor before assuming a parser bug.
The report shows unfamiliar source IPs
The full list: legitimate senders you forgot, SaaS senders sending without custom-domain DKIM, partners forwarding mail (envelope-rewrite from the forwarder's IP), and spoofing sources. Look up each unfamiliar IP using reverse DNS (dig -x) and WHOIS. Legitimate SaaS senders resolve to recognisable provider names (SendGrid, Mailgun, Marketo); spoofing sources typically resolve to consumer-ISP or hosting-provider ranges.
Disposition is none even though p=reject is published
Check policy_published/p in the report — if it shows none, the receiver was still seeing the previous record at the time of the reporting window (TTL propagation delay). If it shows reject but disposition is none, the record passed DMARC and the receiver delivered normally (the none disposition is the DMARC-passing-mail label, not the p=none policy label).
Volume is dropping week over week
Usually benign — a legitimate seasonal cycle, a one-off marketing campaign that ended, or a SaaS sender that was retired. Compare against historical baselines (the 13-month retention recommendation exists for exactly this purpose). A sharp drop across all senders may indicate an outbound mail-flow problem.
The report references a domain I do not own
If policy_published/domain is a domain you do not control, something is wrong with your DMARC record publication. Check that the TXT record at _dmarc.your-domain is actually serving the intended content using domain_checker.php or dig +short TXT _dmarc.your-domain.
Reports stopped from one receiver
If a specific major receiver stops sending reports, the receiver may have observed a delivery failure to the rua mailbox and stopped retrying. Some receivers re-enable after a quiet period; others require a manual unblock request through the receiver's postmaster interface.

11. Frequently Asked Questions

What is a DMARC aggregate report?
A DMARC aggregate report (also called a RUA report, from the rua= tag that publishes the destination address) is an XML document that a receiving mail provider sends back to the domain owner once per day. It summarises every message claiming to be from the domain that the receiver processed during the reporting window, grouped by sending IP, with per-group SPF / DKIM authentication results, alignment outcome, and the disposition the receiver applied. RFC 7489 §7.2 defines the format. Aggregate reports are the primary diagnostic stream for any DMARC deployment.
What is the difference between RUA and RUF reports?
RUA reports (aggregate) are daily XML summaries describing message volumes and authentication outcomes per sending IP — defined in RFC 7489 §7.2, addressed via the rua= tag in the DMARC record. RUF reports (forensic, or failure reports) are per-message reports describing individual DMARC-failing messages, including header content — defined in RFC 7489 §7.3, addressed via the ruf= tag. RUF reports include sensitive content (the From: header, subject line, sometimes the message body) and have meaningful privacy implications, which is why most major receivers stopped sending RUF entirely. RUA is universal; RUF is patchy at best.
How often are aggregate reports sent?
The default reporting interval is 86400 seconds (one daily report per sender-receiver pair). The ri= tag in the DMARC record allows a domain owner to request a different interval (e.g. ri=3600 for hourly), but most receivers honour only the daily default. Major receivers (Google, Microsoft, Yahoo, Comcast, AOL, Mail.ru) send reports daily at consistent times, typically between 04:00 and 09:00 UTC. Smaller receivers may send less frequently or not at all.
How are aggregate reports delivered?
Reports are delivered as email attachments to the mailbox(es) listed in the rua= tag. The attachment is a gzip-compressed XML file (.xml.gz) — or sometimes a ZIP-compressed XML — named by convention: receiver!sender-domain!begin-timestamp!end-timestamp.xml.gz. The email itself follows RFC 5322 with a body referencing the attached report. Domain owners parse the XML using tooling like DMARC Analyzer's ingestion pipeline at includes/DmarcParser.php (RFC 7489 §7.2.1.1 specifies the email-attachment delivery mechanism).
What are the main elements of the aggregate report XML?
A DMARC aggregate report has three top-level child elements under the root <feedback>: <report_metadata> (the receiver organisation name, the report_id, the date_range begin/end timestamps, optional extra_contact_info), <policy_published> (the DMARC record as the receiver saw it during the reporting window — domain, adkim, aspf, p, sp, pct, fo), and one or more <record> elements (one per source-IP / authentication-outcome combination). Each <record> contains a <row> (source_ip, count, policy_evaluated/ disposition + dkim/spf evaluation), an <identifiers> block (header_from, envelope_from, envelope_to), and an <auth_results> block (the underlying SPF and DKIM results).
Why are aggregate reports not arriving at my rua mailbox?
Most common causes: (1) The rua= mailbox is on the same domain that DMARC protects and the mailbox itself fails DMARC — receivers reject reports they cannot deliver, creating a chicken-and-egg loop. Host the rua mailbox at a different domain, or publish a cross-domain authorisation TXT record per RFC 7489 §7.1 at your-domain._report._dmarc.rua-mailbox-domain. (2) The mailbox mail-flow is filtering reports as spam — DMARC report mail comes from many varied receiver domains with attachments, which spam filters often flag. Allowlist or unfilter the rua= mailbox. (3) A new DMARC record hasn't propagated to receivers yet — receivers cache DMARC records for the duration of the TTL, so changes take up to TTL seconds plus one reporting interval (typically 24-48 hours) to surface in reports.
Do all receivers send DMARC aggregate reports?
No. The major consumer-mailbox providers (Google, Microsoft / Outlook, Yahoo, AOL, Comcast, Mail.ru, Tencent QQ, Rambler) reliably send aggregate reports. Smaller corporate gateways and ISP mailers vary — many enforce DMARC at delivery time without ever sending reports back. RFC 7489 §7.2 specifies SHOULD-strength language for report generation rather than MUST, and receivers exercise that discretion. The major-receiver coverage is sufficient to power a useful rollout (those receivers handle the vast majority of consumer mail volume) but expect gaps for B2B and niche-receiver traffic.

13. Ingest your aggregate reports now

DMARC Analyzer's ingestion pipeline at includes/DmarcParser.php parses aggregate-report XML, ZIP, and GZ formats (RFC 7489 §7.2.1.1), deduplicates by report_id + org_name, persists per-record rows to the dmarc_records table, and surfaces per-sender / per-IP / per-day aggregations in the dashboard. Forensic (RUF) reports flow through includes/ForensicReportParser.php (RFC 6591 ARF envelope) into dmarc_forensic_reports.

Sign up — Free plan Check my rua= destination