DMARC Deployment Checklist: Operator Quick-Reference Step-by-Step Procedure (RFC 7489)

A focused operator quick-reference checklist for deploying DMARC end-to-end. Unlike the in-depth policy rollout reference (which explains the why), this page is the concise per-phase checklist a DMARC implementer keeps open in a second tab during deployment: prerequisites (DNS edit access, MTA + sender inventory, monitoring mailbox), per-phase action items (discovery, triage, quarantine, reject), the exit criteria that determine when each phase is complete, a decision matrix for the common rollout scenarios that arise mid-deployment, and an FAQ for the questions operators ask most often during real-world DMARC projects.

This reference is provided in English. DMARC is specified in English-language RFCs (RFC 7489, RFC 9091, draft-ietf-dmarc-dmarcbis) and the canonical vocabulary (p=none, p=quarantine, p=reject, pct=, sp=, np=, rua, ruf, "monitoring mode", "aggregate report") does not translate. We keep the body in the source language so technical terms remain consistent with the specifications.

TL;DR

  • Four phases: Discovery (p=none) -> Triage (alignment fixing) -> Quarantine (p=quarantine) -> Enforcement (p=reject). Defined operationally on top of RFC 7489.
  • Three prerequisites: DNS edit access, complete sender inventory, monitoring mailbox for aggregate (rua) reports.
  • Typical duration: 3 to 6 months end-to-end. The bottleneck is Phase 2 (fixing alignment for every legitimate sender) and the confidence wait at Phase 3 quarantine.
  • Single most common mistake: jumping from p=none straight to p=reject. Always quarantine first - the spam folder is recoverable; SMTP reject is not.
  • This page is the operator checklist; the policy rollout deep dive explains the underlying mechanisms (three policy states, pct= sampling, sp= / np= subdomain timing).
  • Rollback: lower p= one stage; keep DNS TTL at 300-3600 seconds during rollout for fast rollback.

1. Overview: how this checklist fits into your DMARC project

Deploying DMARC is a 3-to-6-month operational project, not a one-off DNS edit. The technical surface is small (publish a TXT record at _dmarc.example.com) but the organisational surface is large (every system that sends mail using your domain in the From: header must be inventoried and aligned before you can safely enforce). This checklist is the per-phase operator quick reference that complements the deeper rollout guide.

The four phases follow the canonical RFC 7489 p= progression but are operationally named after the work being done in each phase, not the policy value alone:

  • Phase 1 - Discovery: publish p=none (often called "monitoring mode" - no enforcement, full reporting) with rua=mailto: and read aggregate reports for at least one full traffic cycle. Goal: inventory every legitimate sender.
  • Phase 2 - Triage: for each discovered sender, fix alignment - turn on DKIM in the ESP control panel, clean up SPF includes, delegate third-party DMARC, consolidate where possible. Goal: every legitimate sender produces DMARC-aligned mail.
  • Phase 3 - Quarantine: advance to p=quarantine (optionally with pct= sampling). Goal: confirm the spam folder is the worst outcome for any remaining edge cases.
  • Phase 4 - Enforcement: advance to p=reject. Goal: refuse spoofed mail at the SMTP RCPT TO stage.

Each phase has explicit entry conditions, action items, and exit criteria documented below. Work through them in order. Do not skip phases.

2. Prerequisites checklist (before Phase 1)

Before you publish any DMARC record, confirm these three prerequisites. Missing any one will block the deployment partway through.

2.1 DNS edit access

  • Verify you can publish a TXT record at _dmarc.example.com for the apex domain.
  • Verify you can publish TXT records at sending subdomains (mail.example.com, marketing.example.com, etc.) if any subdomain-scoped policy is planned.
  • Verify you can publish DKIM selector TXT records at the subdomains each ESP requires (Google Workspace, Microsoft 365, SendGrid, Mailgun, SES, Postmark all have different selector conventions; see the per-provider deployment guides).
  • Lower the TTL on the _dmarc record to 300-3600 seconds for the duration of the rollout. Raise it back to 86400+ once you reach steady-state p=reject.

2.2 Complete sender inventory

Catalogue every system that sends mail using your domain in the From: header. Common categories operators miss:

  • Production mail server (Postfix, Exchange, Sendmail, Exim, the MTA itself).
  • Transactional ESP - SendGrid, Mailgun, Amazon SES, Postmark, SparkPost, Mandrill.
  • Marketing automation - Mailchimp, HubSpot, Marketo, Salesforce Marketing Cloud, Pardot, Klaviyo, Constant Contact, ActiveCampaign.
  • Helpdesk / CRM - Zendesk, Salesforce Service Cloud, Freshdesk, Intercom, Help Scout.
  • Application notifications - GitHub, GitLab, Jira, Trello, Asana, Monday, Slack-to-email notifications, AWS CloudWatch alarms, PagerDuty.
  • Monitoring + alerting - Datadog, New Relic, Grafana, Prometheus AlertManager, Opsgenie.
  • Internal Linux cron jobs and Windows scheduled tasks - the easiest to miss because they rarely send daily.
  • Partner integrations - shared mail relays, white-labelled SaaS that sends as your domain.

2.3 Monitoring mailbox for aggregate reports

  • Create a dedicated mailbox - dmarc@example.com or dmarc-reports@example.com - to receive aggregate (rua) reports.
  • Configure an automated parser - DMARC Analyzer (this site, free), Valimail, PowerDMARC, EasyDMARC, dmarcian, Cisco DMARC, or a self-hosted open-source parser like parsedmarc.
  • Verify the parser ingests reports via IMAP or Microsoft Graph and aggregates per-source-IP and per-sender pass and fail metrics.
  • Bookmark or pin the parser dashboard - you will read it weekly for the duration of the rollout.

3. Phase 1: Discovery (p=none)

Entry condition: prerequisites checklist complete.

Goal: inventory every legitimate sender that uses your domain in the From: header by reading aggregate reports.

3.1 Publish the initial DMARC record

_dmarc.example.com.  IN  TXT  "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com; ruf=mailto:dmarc-forensic@example.com; fo=1; adkim=r; aspf=r; pct=100; ri=86400"
  • p=none requests no enforcement - receivers report but do not act on the result.
  • rua= is the mailbox that receives aggregate (daily XML) reports. Mandatory.
  • ruf= is the optional forensic (per-message) report mailbox. Few receivers send forensic reports, but the ones that do are valuable for diagnosis.
  • fo=1 requests forensic reports for any DMARC-fail (rather than only SPF-and-DKIM both fail).
  • adkim=r and aspf=r set relaxed alignment - the production default; switch to s for strict only after you understand which senders rely on relaxed.
  • pct=100 is the default but make it explicit for clarity.
  • ri=86400 requests daily aggregate reporting (the default; many receivers ignore this anyway).

3.2 Wait for at least one full traffic cycle

  • Minimum 2 weeks - cover Monday through Sunday plus end-of-month batch jobs.
  • Recommended 4 weeks - catch quarterly senders, monthly newsletters, and edge-case senders.
  • Aggregate reports arrive 24-72 hours after the mail is sent; expect noise in the first 48 hours, signal stabilises after that.

3.3 Read the aggregate reports weekly

  • Sort sources by mail volume - the biggest senders matter most.
  • For each source IP, identify the d= domain in the DKIM-Signature and the envelope MAIL FROM domain - both must align with the From: header.
  • Classify each source as: aligned (no action needed), misaligned but legitimate (queue for Phase 2), unknown legitimate (queue for Phase 2 investigation), forwarded (consider ARC), or attacker / spoofer (no action - DMARC rejection at p=reject will block it later).
  • Build a sender registry - a spreadsheet with columns: source IP, organisation, what it sends, current alignment state, owner contact, Phase 2 action.

4. Phase 2: Triage (alignment fixing)

Entry condition: Phase 1 sender registry complete - every misaligned legitimate sender identified.

Goal: every legitimate sender produces DMARC-aligned mail.

4.1 SPF cleanup

  • Audit the apex SPF record for unused include: mechanisms - every legacy SaaS that left the estate.
  • Count the DNS lookup cost (RFC 7208 section 4.6.4 caps it at 10). If over budget, see the SPF lookup limit deep dive for remediation.
  • Confirm each SPF-aligned source has an ip4, ip6, or include mechanism that authorises its sending IP.

4.2 DKIM enabling

  • For each ESP and SaaS sender, follow the provider's DKIM activation procedure - usually a control-panel button that generates a key pair and gives you a CNAME or TXT record to publish.
  • Verify the published selector resolves via dig TXT selector._domainkey.example.com and contains a valid public key.
  • Send a test message and verify dkim=pass in the Authentication-Results header at a receiver (Gmail, Outlook, Yahoo).
  • For DKIM key rotation guidance, see the DKIM key rotation deep dive.

4.3 Third-party DMARC delegation

  • For senders that send as your domain but cannot align (rare modern ESPs, legacy partners), consider moving them to a subdomain (marketing.example.com, notifications.example.com) where a more permissive policy is acceptable.
  • Some operators delegate the entire DMARC record management to a third-party SaaS (Valimail, PowerDMARC, EasyDMARC) by pointing _dmarc as a CNAME to their managed zone - useful for organisations without DNS edit access.

4.4 Re-verify with aggregate reports

  • After each alignment fix, wait 48-72 hours for aggregate reports to confirm the source now produces DMARC-aligned mail.
  • Update the sender registry: mark each source as aligned / still-misaligned / decommissioned.

5. Phase 3: Quarantine (p=quarantine)

Entry condition: sender registry shows 95%+ of legitimate mail volume aligned for at least 2 consecutive weeks.

Goal: confirm the spam folder is the worst outcome for any remaining edge cases.

5.1 Optionally start with pct= sampling

_dmarc.example.com.  IN  TXT  "v=DMARC1; p=quarantine; pct=10; rua=mailto:dmarc-reports@example.com; fo=1; adkim=r; aspf=r"
  • pct=10 applies p=quarantine to 10% of failing mail and downgrades the rest to p=none behaviour.
  • Ramp the value: 10 -> 25 -> 50 -> 100 over 4-8 weeks.
  • Note: pct= is deprecated in the in-progress dmarcbis successor draft. Read the dmarcbis transition notes before depending on it for new long-term deployments.

5.2 Monitor for quarantine signals

  • Watch the support inbox for "did not receive the email" reports - usually password resets, receipts, or partner notifications routed to spam.
  • Check aggregate reports daily for new misaligned sources - a previously-aligned sender may have rotated keys without updating the published selector.
  • Confirm the user-visible behaviour at major receivers (Gmail, Outlook, Yahoo) by sending test messages from each known legitimate source.

5.3 Stay at p=quarantine until exit criteria are met

Quarantine is not a destination - it is a safety-net stage. Do not stay here indefinitely "in case something breaks". The spam folder is a worse user experience than reject + bounce because there is no automatic feedback to the sender. Advance to p=reject when exit criteria are satisfied (see Section 7).

6. Phase 4: Enforcement (p=reject)

Entry condition: Phase 3 exit criteria all satisfied (see Section 7).

Goal: refuse spoofed mail at the SMTP RCPT TO stage; this is the steady state.

6.1 Publish p=reject

_dmarc.example.com.  IN  TXT  "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com; fo=1; adkim=r; aspf=r"
  • Drop pct= at this point - leave the implicit default pct=100.
  • Continue receiving aggregate reports - they remain the primary signal during steady-state operation.

6.2 Advance sp= and np= ahead of any non-sending subdomain

  • sp=reject applies p=reject behaviour to ALL subdomains regardless of whether they send mail.
  • np=reject (RFC 9091) applies p=reject only to non-existent subdomains - a stronger anti-spoofing protection because NXDOMAIN subdomains never send mail.
  • If subdomains send under a different schedule, publish per-subdomain _dmarc.sub.example.com records with their own p= at their own rollout pace.

6.3 Raise DNS TTL and switch to maintenance mode

  • Raise the _dmarc TTL from 300-3600 to 86400+ for caching efficiency.
  • Schedule monthly review of aggregate reports - any new misaligned source is either a new legitimate sender to onboard or an attacker being rejected.
  • Consider adding BIMI for the visible-brand-logo benefit (BIMI requires DMARC at p=quarantine or stricter).

7. Per-phase exit criteria

Do not advance between phases on a calendar - advance when the exit criteria for the current phase are satisfied. The cost of waiting an extra week is small; the cost of advancing prematurely is dropped legitimate mail.

7.1 Phase 1 -> Phase 2 (exit Discovery)

  • At least 2 consecutive weeks of aggregate reports received and parsed.
  • The sender registry covers at least 95% of observed mail volume - no large unknown sources remaining.
  • Each row in the registry has an assigned owner and a Phase 2 action item.

7.2 Phase 2 -> Phase 3 (exit Triage)

  • Each legitimate sender in the registry produces DMARC-aligned mail for at least 2 consecutive weeks of aggregate reports.
  • Cumulative aligned-volume ratio is 95%+ across the entire observed mail estate.
  • Known-misaligned sources are explicitly documented as accepted (legacy partner with no fix path) - not silently misaligned.

7.3 Phase 3 -> Phase 4 (exit Quarantine)

  • Two to four consecutive weeks at pct=100 of p=quarantine with no support tickets about missed mail.
  • Aggregate reports show zero DMARC-failing legitimate sources.
  • The on-call team has been briefed on what to do if a missed-mail ticket arrives within 24 hours of advancing to p=reject.

7.4 Phase 4 steady-state

  • Continue monthly aggregate report review.
  • Onboard new senders into the registry as they appear.
  • Rotate DKIM keys per cadence (see the DKIM key rotation deep dive).

8. Decision matrix for common scenarios

The decisions operators reach for most often during deployment. Use the matrix to short-circuit the "what do I do here" question without re-reading the policy rollout deep dive.

8.1 "I see a high-volume source I do not recognise in the aggregate reports"

  1. Reverse-DNS the source IP - the PTR record often names the organisation (ESP, partner, attacker).
  2. WHOIS the source IP - confirms the organisation.
  3. If the organisation is unknown / hostile: no action - DMARC reject will block it later.
  4. If the organisation is a SaaS your team uses but did not flag: open an internal ticket to onboard them into the sender registry.

8.2 "A previously-aligned sender is suddenly failing alignment"

  1. Check if the source rotated DKIM keys - verify the published selector still resolves and matches the DKIM-Signature: s= tag.
  2. Check if the source moved IP ranges - verify the SPF record still authorises the new IP.
  3. Check if the source is forwarding mail through a relay - ARC may be needed.

8.3 "Should I use pct= sampling or jump straight to pct=100?"

  • If your sending volume is small (under 10k messages per day) and your sender inventory is high-confidence: skip pct= and go straight to pct=100.
  • If your sending volume is large (over 100k messages per day) or you have many third-party senders: ramp pct=10 -> 25 -> 50 -> 100 over 4-8 weeks.
  • Note: pct= is being removed in dmarcbis. If you are starting a brand-new deployment in 2026, consider the alternative of staying longer at p=quarantine with pct=100 instead of using the soon-to-be-deprecated sampling mechanism.

8.4 "My organisation acquired another company - what about their domain?"

  1. Treat the acquired domain as a separate deployment - run Phase 1 Discovery against it independently.
  2. If the acquired domain sends low-volume mail only, you may be able to short-circuit by publishing p=reject after a 2-week Discovery phase.
  3. Do not merge the rollout calendars - each domain advances on its own exit criteria.

8.5 "We have non-sending subdomains - what about them?"

  1. Non-sending subdomains can move to p=reject on day one - they have no legitimate mail flow to break.
  2. Publish _dmarc.parked.example.com with v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com.
  3. Alternatively use the apex sp=reject tag to default ALL subdomains to reject and only override per-subdomain for actively-sending subdomains.
  4. np=reject (RFC 9091) covers non-existent subdomains - a free anti-spoofing win.

9. Common mistakes

  • Jumping from p=none straight to p=reject without an intermediate p=quarantine stage. This is the single most common cause of self-inflicted DMARC outages.
  • Forgetting to publish rua= from day one. Without aggregate reports you are flying blind - you cannot identify misaligned senders, you cannot confirm progress, you cannot validate exit criteria. Always publish rua= even at p=none.
  • Not lowering the DNS TTL during rollout. If something goes wrong you need fast rollback - a default 86400 TTL means a 24-hour wait for the change to propagate. Lower to 300-3600 during rollout and raise again at steady state.
  • Skipping the sender inventory. Without a complete inventory you will find senders during Phase 3 quarantine that you missed during Phase 1 discovery, and they will arrive as user complaints about missed password resets and partner notifications.
  • Treating Phase 3 quarantine as the destination. Quarantine is a safety-net stage, not a permanent state. The spam folder is a worse user experience than reject + bounce because there is no automatic feedback to the sending system. Always advance to p=reject once exit criteria are met.
  • Forgetting sp= and np= for subdomains. The apex p= only covers the apex. Without sp=reject or np=reject, attackers can spoof from non-existent subdomains like billing.example.com with no protection.
  • Publishing a forensic (ruf=) endpoint that is not protected. Forensic reports may contain message-content snippets that include sensitive data - protect the mailbox accordingly. Some operators avoid forensic reports entirely.

10. Troubleshooting common deployment failures

10.1 "I published p=none but I am not receiving any aggregate reports"

  • Verify the published record syntax with a DMARC syntax checker - a malformed v=DMARC1 tag silently invalidates the entire record.
  • Verify the rua= address accepts mail from outside the organisation - some spam filters block report-bearing messages from senders the organisation has never emailed.
  • Send a few outbound messages to Gmail or Outlook to generate report-bearing traffic.
  • Reports arrive 24-72 hours after the mail is sent - wait 3 days before assuming the pipeline is broken.

10.2 "Aggregate reports show a source IP I cannot identify"

  • Reverse-DNS the IP - dig -x 192.0.2.10 usually resolves to the organisation's PTR record.
  • WHOIS the IP - whois 192.0.2.10 shows the owning organisation.
  • Check the d= domain in the DKIM-Signature column of the report - it often names the ESP.

10.3 "DKIM is misaligning even though the signature passes"

  • DKIM passing is not the same as DMARC-aligned - DMARC requires the DKIM d= domain to match the From: header domain (with relaxed alignment allowing organisational-domain match).
  • If the ESP signs with their own domain (d=sendgrid.net) instead of yours, you need to enable branded DKIM in the ESP control panel.
  • See the DMARC alignment deep dive for the full alignment semantics.

10.4 "I moved to p=quarantine and now users are missing transactional email"

  • Roll back to p=none immediately - do not debug in production with broken mail flows.
  • Aggregate reports will show which sender hit the quarantine - usually a transactional ESP that needs branded DKIM enabled.
  • Fix the alignment, then re-advance to p=quarantine.

11. Frequently asked questions

What is a DMARC deployment checklist?
A DMARC deployment checklist is the concise per-phase action list an operator works through to deploy DMARC end-to-end without breaking legitimate mail. It complements the policy-rollout deep dive (which explains the why) by giving the operator concrete checkboxes for prerequisites (DNS edit access, MTA + sender inventory, monitoring mailbox), per-phase action items (discovery, triage, quarantine, reject), and exit criteria for advancing between phases.
What are the prerequisites for a DMARC deployment?
Three prerequisites: DNS edit access for the apex and any sending subdomains, a complete inventory of every system that sends mail using your domain in the From: header (production MTA, transactional ESPs, marketing automation, helpdesk + CRM, monitoring + alerting systems, internal cron jobs and Windows scheduled tasks, partner integrations), and a monitoring mailbox to receive aggregate (rua) reports - ideally with an automated parser like this DMARC Analyzer instance.
How long should each DMARC deployment phase last?
Typical durations: Discovery 2-4 weeks; Triage 4-8 weeks; Quarantine 2-4 weeks; Reject is the steady state (ongoing). Larger organisations with diverse sending estates often need the upper end of each range. Skipping phases is the most common cause of self-inflicted DMARC outages.
When is it safe to advance from quarantine to reject?
Three signals must all be true: two to four weeks of aggregate reports show zero DMARC-failing mail from legitimate sources; no support tickets about missed mail; the pct= sampling ramp reached pct=100 with no new failure modes. If any one is false, hold at quarantine.
What is the difference between this checklist and the DMARC policy rollout page?
The policy rollout page is a deep-dive reference that explains the three policy states, the semantics of pct= sampling, the subdomain policy timing, and the worked Week 0 through Week 26 timeline - the WHY and the underlying mechanisms. This checklist is the operator quick-reference that converts those mechanisms into actionable per-phase checkboxes - the WHAT and WHEN, in the order an operator works through them during deployment.
Do I need a paid DMARC tool to deploy DMARC?
No, but you do need some way to parse aggregate (rua) reports. DMARC Analyzer is a free option that ingests reports via IMAP or Microsoft Graph and aggregates the per-source-IP, per-sender pass and fail metrics into a dashboard. Commercial alternatives include Valimail, PowerDMARC, EasyDMARC, dmarcian, and Cisco DMARC. Open-source alternatives include parsedmarc.
What is the most common DMARC deployment mistake?
Jumping straight from p=none to p=reject without an intermediate p=quarantine stage. Legitimate senders that were quietly failing alignment under p=none have never been noticed; moving directly to p=reject means every one of those senders now hits a hard SMTP reject and the messages are dropped. Pass through p=quarantine first.
How do I roll back a DMARC deployment if something goes wrong?
Lower the p= tag one stage - from p=reject back to p=quarantine, from p=quarantine back to p=none. The DNS TTL on the _dmarc TXT record determines propagation speed - keep the TTL at 300-3600 seconds during rollout for fast rollback (raise it to 86400+ once you reach steady-state p=reject). Aggregate reports continue regardless of the p= value as long as the rua= tag is published.

13. Start your DMARC deployment now

DMARC Analyzer's free Domain Security Checker performs live DMARC + SPF + DKIM + MTA-STS + BIMI lookups against any domain. Use it to check your current DMARC record before Phase 1, to validate new selectors during Phase 2 triage, and to confirm each phase advance has propagated through DNS. The DNS Record Generator (linked above) builds syntactically-correct DMARC records with the right rua= + fo= + pct= + sp= tags for each phase. Imported DMARC aggregate reports (via includes/DmarcParser.php) drive the per-source-IP pass and fail dashboard that powers your sender registry. The includes/EmailHeaderParser.php backend surfaces inline Authentication-Results diagnosis when troubleshooting individual failure cases.

Check my current DMARC record Sign up — Free plan