Skills/Marketing/Email deliverability audit

Email deliverability audit: the alignment rule that fails mail which passed every check

Reads SPF, DKIM and DMARC as one system rather than three records, then works down through list quality, sending pattern and message construction to a ship or hold.

Measured skill 4,826 words MIT by Locul Verified safe · 0 secrets Tested 2026-08-19
No account, no install, nothing to sign up for. Copy it or download it and it works in Claude Code today. One-click import lands here shortly.
Our verdict

Measured, and it passed on both the ceiling and the floor. It wins on the two findings nobody makes unprompted, and it costs one false alarm.

Measured, and it cleared the pre-registered threshold on both halves of the rule at once.

Median 16 of 22 without the skill, 19 with it. Worst case 13 without, 18 with. 5 runs each way, p=0.0079. A skill only has to move the median by 2 or the worst case by 3 to ship. This moved the median by 3 and the worst case by 5.

The gap is concentrated in two findings, and both are the kind nobody makes unprompted. The first is the DKIM key: the run without the skill spotted the 1024-bit key once in five attempts, and the run with it spotted it every time, along with the testing flag published next to it that tells a receiver to ignore the result of the check entirely. The second is the link domain. Every click in the message pointed at a domain with no visible relationship to the sending domain, registered days earlier. The run without the skill never once mentioned it. The run with it mentioned it every time.

It also did better at the part that is easy to state and hard to hold: treating the list itself as the blocking item rather than as one bullet among twenty. The bought and scraped list is the finding that makes every authentication fix irrelevant, and the run without the skill filed it as an equal item more often than not.

What it costs you, and it is a small cost stated because it is real. The rubric contains a criterion that is only met when a perfectly normal unsubscribe URL hosted on the sending platform is left alone. Without the skill that scored 5 of 5. With it, 4. One run in five talked itself into a problem that was not there, having just been primed to look for domain mismatches.

Two things neither arm found, which is the honest ceiling on all of this. Neither ever flagged the neutral qualifier on the marketing subdomain's SPF record, which authorises everyone and therefore asserts nothing. And neither reliably got the ordering right on the two SPF problems, where the duplicate record has to be resolved first because the check fails permanently before a single mechanism is evaluated, so trimming the lookup chain while both records are published changes nothing at all. Both arms scored well under the maximum, 15.4 and 18.8 out of 22.

When to reach for it

  • Before the first send from a new domain or a new sending platform, which is the last moment the records can be fixed without a live audience watching the result.
  • When mail that used to reach the inbox starts landing in the spam folder, before anyone starts rewriting the subject line.
  • When migrating a list from one sending platform to another, because the return path and the signing domain both change in that migration and alignment usually breaks silently.
  • When daily volume to any one consumer mailbox provider crosses roughly five thousand messages, which is where the published bulk sender requirements begin to apply.
  • Before importing, renting or buying any list of addresses you did not collect yourself, while it is still cheaper to walk away than to recover a domain.

The test we ran

The material was the working files of an invented company about to switch on a new sending setup: a DNS zone excerpt, the full headers of three real-shaped messages as they would arrive at a mailbox, the HTML of a campaign, and an engineer's note describing the plan. Nineteen genuine defects were built into it and nine things were deliberately made correct, so that a run inventing problems to look thorough could be caught.

The prompt mentioned neither deliverability nor authentication. It was the thing a person actually types: we are switching this on next Tuesday and it is the whole list in one go, can you look before we pull the trigger.

The fixture, the prompt and the rubric were built by an author who was instructed never to open the skill file and did not. Every criterion names the exact record or header line behind it, and eight of the twenty-two are negative criteria of the form does NOT report a problem with this, which is genuinely fine. Without those a skill wins by being noisier.

Both arms ran on the strongest model available with every user instruction file, plugin and installed skill disabled. Each output was graded alone by a session that was not told the other arm existed, against the fixed rubric, with every submission scrubbed of anything identifying which arm produced it.

Where this result is weaker than it looks, and nothing else on the page will tell you. The two strongest results on this site came from real open-source repositories with no planted defects, because a defect placed deliberately is easier to find than one that happened. This case is a constructed fixture, and its defects were planted by the same author who then wrote the rubric. That is a step down from the standard we set ourselves. What holds it up is that the author never opened the skill file, so the criteria could not be fitted to its contents, and that a substantial share of the rubric is negative criteria that only score when something genuinely correct is left alone. What it cannot tell you is whether the same gap would appear on material nobody built for a test.

Result: median 16 of 22 without, 19 with. Worst case 13 without, 18 with. p=0.0079. One case, so weaker evidence than a two-case result.

What it does not do

Stated plainly, because a skill that claims everything is useful for nothing.

  • It adds a false alarm. On the criterion that checks whether a genuinely normal unsubscribe URL is left alone, the run without the skill scored 5 of 5 and the run with it scored 4. One run in five decided a perfectly ordinary platform-hosted unsubscribe endpoint was a domain mismatch. That is a small cost next to what it finds, and it is a real one.
  • It reads records and configuration. It cannot see where your mail actually landed. Seed placement testing, whether through a paid service such as GlockApps or a manual set of accounts at each major provider, is the only thing that answers that question, and this does not do it.
  • It has no access to your aggregate DMARC reports, to Google Postmaster Tools, or to Microsoft SNDS. Those hold your real complaint rate, your real reputation grade and the real list of hosts sending as you. It will tell you to open them and it cannot open them for you.
  • Provider requirements move. Every threshold here is dated. The February 2024 bulk sender rules are stated as they were published and should be checked against the current documentation before you rely on a number.
  • It cannot audit consent. Whether you were permitted to contact these people is a legal question, not a technical one, and a flawless authentication setup pointed at a purchased list still ends in the same place.
  • Every branch that depends on volume needs a number you supply. It does not know how many messages you send, to which providers, or how many of your addresses have been dead for three years.

Install it

  1. Open Locul, go to Library, and choose Import. One-click import from this page lands shortly.
  2. Locul writes the file to the right folder for every assistant you have connected, so you do not have to know where each one keeps its skills.
  3. Environment variables and headers in any shared config are replaced with a placeholder before they reach you, so importing a stranger's setup cannot hand you their credentials or take yours.
  4. Locul is free to start, on Mac and Windows. Get it here.
  1. Download SKILL.md using the button above, or copy the file.
  2. Save it at .claude/skills/email-deliverability-audit/SKILL.md in your project, or under ~/.claude/skills/email-deliverability-audit/SKILL.md on Mac and Linux, or %USERPROFILE%\.claude\skills\email-deliverability-audit\SKILL.md on Windows, to make it available everywhere.
  3. Start a new session. Claude Code picks up the skill from the name and description in the file's frontmatter, so you can also invoke it by name.
  1. Download or copy the file.
  2. For Claude Desktop, add it through the skills panel in settings, or drop the folder into your skills directory.
  3. For Cursor and other assistants that read plain instruction files, paste the body into your project rules file. The skill is plain markdown with no tool bindings, so it carries across.

Pairs well with

What else does this job

Use a record checker first and use it always. A free tool resolves your SPF chain, counts the lookups, fetches a selector and reads your policy faster and more reliably than any reading pass, and there is no reason to do that part by hand.

A specialist deliverability consultant is genuinely better than this for a domain that is already in trouble, because recovery is mostly a negotiation with reputation systems over weeks, informed by data you have to be looking at daily. If mail from an established domain has suddenly stopped arriving and revenue depends on it, hire one.

A competent engineer with the three RFCs open does this well in an afternoon. The specifications are readable and free, and the alignment section of RFC 7489 in particular repays the hour.

Where this file earns its place is the joins: what a broken record does to a policy, what a policy does to a forwarded message, and which of the twenty findings actually blocks the inbox. Those are the parts a checker cannot show you and the parts most articles get wrong.

Read the full source
---
name: email-deliverability-audit
description: Audits an email sending setup in descending order of how fatally each defect blocks inbox placement. Covers SPF including the ten lookup evaluation limit, DKIM selectors, key length and what the signature actually covers, DMARC policy and the relaxed versus strict alignment rule that decides whether a technically valid message passes, the bulk sender requirements published in February 2024, spam traps and bounce handling, domain and IP warm-up, shared versus dedicated IP selection, subdomain separation, and the content factors that genuinely matter. This skill should be used before the first send from a new domain or platform, when mail that used to arrive starts going to spam, or when migrating a list between sending platforms.
---

# Email deliverability audit

## The claim this skill is built on

Deliverability advice is usually written in the wrong order, and the wrong order is expensive here in a way it is not elsewhere.

The typical article opens with subject line words to avoid, spends a paragraph on how many images is too many, and mentions authentication near the end as something your provider probably handles. That ordering is close to exactly inverted. A message from a domain that fails DMARC alignment, sent to a list with a twelve percent hard bounce rate, will not reach the inbox no matter what the subject line says. A message from an authenticated domain with a clean, engaged list reaches the inbox while containing every word on every trigger list ever published.

So this audit runs in descending order of fatality and stops to raise the alarm at the first tier that fails. Six tiers:

0. The mail is not authenticated, or it is authenticated and not aligned.
1. The list is the defect.
2. The sending pattern is the defect.
3. The reputation model or the infrastructure is wrong.
4. The message construction is the defect.
5. Nobody is measuring, so nobody will notice when any of the above changes.

Report the highest failing tier first, alone, and loudly. Everything below a Tier 0 failure is an appendix.

## Tier 0. Authentication, and the part nobody gets right

### SPF, and the lookup budget

SPF is published as a DNS TXT record beginning `v=spf1` and it authorises sending hosts for the **envelope sender domain**, the address in the SMTP `MAIL FROM` command, which is also what appears in `Return-Path`. It says nothing at all about the domain a human sees in the From header. This is the first thing to understand and the thing most explanations skip. A message can pass SPF perfectly while displaying any From address in the world.

**The ten lookup limit is the defect you will actually find.** RFC 7208 caps the number of mechanisms and modifiers that cause a DNS query at ten per evaluation: `include`, `a`, `mx`, `ptr`, `exists` and `redirect` all count. Exceed it and the evaluation returns `permerror`, which is a permanent failure, not a retry, and which DMARC treats as an SPF fail. There is a second, separate limit of two void lookups, meaning queries that return no answer or a non-existent domain.

The reason this breaks silently is that `include:` chains are recursive and the lookups inside them count against your budget. A record with four vendor includes looks like four lookups and is frequently eleven, because one of those vendors includes two of their own regional records, each of which includes another. Nobody sees this happen. The record was fine on Tuesday, marketing added a webinar platform on Wednesday, and by Thursday every message from the domain fails SPF. Count the fully resolved chain, not the record you can see.

The remedies, in order of preference: remove vendors that no longer send for you, which is usually two of them; replace an `include` of a vendor who publishes a stable IP range with the `ip4` and `ip6` mechanisms directly, since those cost no lookups; and only then consider an SPF flattening service, which resolves the chain into literal addresses at the cost of breaking whenever a vendor renumbers without telling you.

**The all mechanism.** `-all` is a hard fail, telling receivers that anything not listed is not you. `~all` is a soft fail, meaning treat it as suspicious but accept. `?all` is neutral, which is the same as publishing nothing and worse than publishing nothing because it looks deliberate. Use `~all` while you are still discovering which systems send as you, which is the whole point of the monitoring phase below. Move to `-all` once your aggregate reports have shown you every legitimate source for several weeks. On a domain that sends no mail at all, publish `v=spf1 -all` today, because an unused domain with no record is a free identity for someone else.

**SPF does not survive forwarding.** When a recipient forwards to another address, the forwarding server relays the message from its own IP while preserving the envelope sender, so SPF is evaluated against a host that is not in your record and fails. Sender Rewriting Scheme rewrites the envelope sender to fix this and not every forwarder implements it. This is the structural reason you cannot rely on SPF alone, and it is the structural reason DKIM exists.

Also worth checking: the `ptr` mechanism is deprecated by the RFC and should not appear in a modern record; there must be exactly one SPF record per domain, since two is an error rather than a merge; and subdomains do not inherit, so every sending subdomain needs its own.

### DKIM, and what the signature covers

DKIM signs the message with a private key held by the sending system. The matching public key is published in DNS at `selector._domainkey.yourdomain.com`, where the selector is an arbitrary label chosen by the sender, which is what makes multiple simultaneous keys possible.

**Key length.** 1024 bits is the historical floor and is still widely deployed. 2048 bits is the current recommendation and what you should publish for anything new. The practical obstacle is that a DNS TXT string is capped at 255 characters, so a 2048 bit key must be split across multiple quoted strings in the record, and a DNS control panel that does not handle that correctly will produce a key that silently fails to verify. After publishing, always verify the selector resolves and the key parses.

**What the signature covers.** The `h=` tag lists which headers are signed, typically From, To, Subject, Date and a handful more. The `bh=` tag holds a hash of the message body. If any signed header or any byte of the body changes in transit, the signature no longer verifies. Two consequences follow. First, a mailing list that appends a footer, rewrites the subject with a `[list-name]` prefix, or converts the body encoding breaks DKIM by definition, which is why such lists rewrite the From header or implement ARC. Second, the `l=` tag, which limits how much of the body is hashed, exists and should not be used, because it lets anyone append arbitrary content below the signed portion.

Set canonicalisation to `relaxed/relaxed`. The `simple` canonicalisation tolerates no change at all, including the whitespace normalisation that ordinary mail servers perform routinely.

**Rotation.** Keys should be rotated on a schedule, commonly every six to twelve months, and immediately if a key is ever exposed. The sequence matters: publish the new public key under a new selector, switch signing to the new selector, wait long enough for mail signed with the old key to be delivered and verified, and only then remove the old record. Removing the old selector first invalidates every message still in flight.

The domain in the `d=` tag is the domain DKIM authenticates, and it is the one alignment will care about.

### DMARC, and alignment, which is the whole game

DMARC is a TXT record at `_dmarc.yourdomain.com`. The minimum useful form is `v=DMARC1; p=none; rua=mailto:[email protected]`.

**The policy values.** `p=none` asks receivers to do nothing differently and to send you reports. `p=quarantine` asks them to treat failing mail as suspicious, in practice the spam folder. `p=reject` asks them to refuse it at the SMTP conversation, so it does not arrive anywhere.

**Alignment is the part almost nobody gets right.** DMARC passes if **either** SPF passes and its domain aligns with the visible From domain, **or** DKIM passes and its `d=` domain aligns with the visible From domain. Only one has to hold. But raw pass is not enough, and this is where working setups fail.

Concretely. Suppose the visible From is `[email protected]`. Your sending platform uses its own bounce domain, so the envelope sender is `[email protected]`. SPF is evaluated against `mail.sendingplatform.net`, and it passes, because the platform's record is correct. It is not aligned, because that domain is not yours. Meanwhile the platform signs with `d=sendingplatform.net`. DKIM passes and is also not aligned. Both raw checks are green in every header inspector, and DMARC fails, and at `p=reject` the message is refused. Every checker that reads only records will tell you your setup is perfect.

**Relaxed versus strict.** Relaxed alignment, the default for both `aspf` and `adkim`, requires only that the organisational domains match, meaning the registrable domain determined from the public suffix list. So `mail.yourcompany.com` aligns with `yourcompany.com` under relaxed alignment, and a subdomain sending arrangement works. Strict alignment, `aspf=s` or `adkim=s`, requires an exact string match of the full domain, so `mail.yourcompany.com` does not align with `yourcompany.com`. Strict is for organisations that have finished the work and want to close the subdomain door. Relaxed is correct for almost everyone, and it is what makes the standard fix possible: point a subdomain of yours at the platform as the custom return path, and have the platform sign with `d=` in your domain.

**The aggregate report address.** The `rua=` tag receives daily XML reports from participating receivers listing every IP that sent mail claiming to be your domain, with volumes and pass or fail results per authentication method. This is the only visibility you will ever have into who is sending as you. Set it before you set anything else. Raw DMARC XML is unpleasant to read, so route it to a parsing service, of which several offer a free tier at low volume. The `ruf=` tag requests per-message forensic reports and is largely unsupported now for privacy reasons.

**The sequence, which is not optional.** Start at `p=none` with `rua` set. Read reports for at least two to four weeks, longer if you have quarterly sending systems. You will discover senders you forgot: the ticketing system, the payroll provider, an old CRM, someone's script. Fix alignment for each legitimate one. Only then move to `p=quarantine`, and only then to `p=reject`. Publishing `p=reject` first is how an organisation discovers on a Monday morning that its invoices have stopped arriving. Note that `pct=` exists in RFC 7489 for ramping a policy across a fraction of mail, and that the revision of DMARC working through the standards process changes how ramping is expressed, so check the current specification before building a plan around that tag.

**The subdomain policy.** `sp=` sets policy for subdomains. In its absence, subdomains inherit `p`. This matters in both directions: a parked or non-sending domain should carry `v=DMARC1; p=reject; sp=reject;` so nobody can send from `invoices.yourcompany.com`, while a domain in the middle of a rollout may want `p=quarantine; sp=none` so an unfinished subdomain is not caught by the parent policy. A subdomain with its own DMARC record overrides both.

### The February 2024 bulk sender requirements

In October 2023 the two largest consumer mailbox providers, Gmail and Yahoo Mail, published requirements that apply to senders above roughly 5,000 messages a day to their users. They did not all start on the same day: authentication and the complaint-rate ceiling took effect on 1 February 2024, and one-click unsubscribe was given a later date of its own, set out below. **These are stated here as published in 2024 and must be re-checked against current documentation, because they have been tightened once already and the thresholds are the sort of thing that moves.**

- **Authentication.** SPF and DKIM both, plus a DMARC record at minimum `p=none`, plus alignment of the From domain with either the SPF domain or the DKIM domain. Alignment is named explicitly, which is why the section above is the longest in this file.
- **One-click unsubscribe** for commercial and subscribed mail, implemented as the `List-Unsubscribe` header together with `List-Unsubscribe-Post` per RFC 8058, honoured within two days, and in addition to a visible unsubscribe link in the message body. This one is dated separately: senders that already carried an unsubscribe link had until 1 June 2024 to support one-click, rather than the 1 February 2024 date that applies to authentication and the complaint rate.
- **A user-reported spam rate below 0.3 percent**, as measured in the provider's own postmaster tooling, with a stated target of staying under 0.1 percent. The gap between those two numbers is the working margin, and a sender sitting at 0.25 percent is not compliant with a margin, it is one bad campaign from filtering.
- Valid forward and reverse DNS for sending IPs, TLS for transmission, and messages that conform to RFC 5322 formatting.

A third major consumer provider announced comparable requirements taking effect during 2025. Treat the direction of travel as settled: authentication plus alignment plus a low complaint rate is now the entry ticket rather than an optimisation.

## Tier 1. The list is the defect

**Spam traps, and why the two kinds behave differently.** A **pristine trap** is an address that has never belonged to a person and has never opted in to anything. It is published where only an automated harvester would find it. Hitting one is close to proof that you scraped or bought addresses, and it can produce an immediate blocklisting rather than a gradual reputation decline. A **recycled trap** is an address that did belong to a person, was abandoned, bounced for a defined period, and was then reactivated by the provider specifically to catch senders who never clean their lists. Hitting one implies neglect rather than theft, and is treated more leniently, but it is still a direct statement to the receiver that you do not process bounces. The practical difference: recycled traps are cured by hygiene, pristine traps are cured only by never acquiring the address in the first place.

**Bounce handling.** A hard bounce is a permanent 5xx failure, meaning the mailbox or the domain does not exist. Suppress the address immediately, permanently, and never retry it. A soft bounce is a temporary 4xx, meaning full mailbox, greylisting or rate limiting. Retry with backoff and suppress after a defined run of consecutive failures, commonly three to five over several days. Keep the hard bounce rate under 2 percent, and treat anything above that as a list problem rather than a sending problem. Many sending platforms suspend accounts above that line automatically.

**A purchased list is a technical problem, not only a legal one.** The addresses were harvested, so pristine traps are close to certain. There is no engagement history, so the first send is a large volume of mail to strangers with no prior positive signal. Complaint rates on such sends routinely exceed the 0.3 percent threshold by an order of magnitude. And the fingerprint of the send, a new sending identity, a sudden volume, an unengaged audience, is precisely the pattern the filters are trained on. One send can move a domain from good standing to filtered, and the recovery is measured in weeks of clean sending, not in an appeal.

**Re-engagement before suppression.** Engagement is the strongest single input to modern filtering, and continuing to mail people who never open teaches the filter that your mail is unwanted by your own audience. Define a dormancy window appropriate to your sending frequency, commonly 90 to 180 days with no open or click. Send a short re-engagement series of two or three messages that asks a direct question and makes staying subscribed an active choice. Then suppress everyone who did not respond. Suppressing them is not a loss. They were already a cost.

## Tier 2. The sending pattern is the defect

**A new domain and a new IP are different problems.** A new IP has no reputation, and receivers rate limit unknown IPs by default, so the fix is volume applied gradually. A new domain is worse than neutral, because the overwhelming majority of newly registered domains that start sending are sending something nobody asked for, and some filters apply additional scrutiny to domains registered in the last month. Let a domain exist, resolve, and send small amounts of real mail for a few weeks before you point a campaign at it.

**Ramp shape.** Start low, in the tens per day per IP, and roughly double every day or two as long as bounces and complaints stay clean. Four to eight weeks to full volume is a normal shape. Send to your most engaged recipients first, because their opens and replies are the positive signal the ramp exists to generate. If complaints rise, hold volume flat rather than continuing to climb.

**The spike is the signal that hurts.** Filters model an expected volume for a sending identity. Zero for three weeks followed by fifty thousand in an hour is anomalous regardless of how good the content is, and the response is throttling or bulk foldering. Consistency beats volume. A sender who mails ten thousand a week every week is in a better position than one who mails forty thousand once a month, with identical annual totals.

Avoid reciprocal warm-up networks, where accounts open and reply to each other's mail to manufacture engagement. The engagement comes from an audience that looks nothing like yours, it is a recognisable pattern, and it teaches you nothing about whether real people want your mail.

## Tier 3. Reputation and infrastructure

**Domain reputation versus IP reputation.** IP reputation attaches to the sending host and can be escaped by moving. Domain reputation attaches to the domain in the From header and the DKIM `d=` domain, travels with you wherever you send from, and is the dominant signal at the large consumer providers. You cannot outrun it by changing platforms.

**Shared versus dedicated IP, with an honest rule.** A dedicated IP gives you a reputation nobody else can damage, and requires enough consistent volume to establish and maintain one. A shared IP pool means inheriting an established warm reputation, at the price of sharing it with the pool's worst tenant.

- Under roughly 5,000 messages a month, or sending less often than weekly: **shared**. A dedicated IP at that volume never accumulates enough signal to be trusted and looks dormant between sends.
- Above roughly 100,000 messages a month on a steady weekly or better cadence: **dedicated**, and warm it properly.
- In between, or if your volume is seasonal: **shared**, and revisit when the volume is steady rather than when it is large.
- If you cannot get a reliable monthly figure: **stay shared**. The failure mode of a premature dedicated IP is worse than the failure mode of a slightly late one, because it is invisible for months.

**Subdomain separation.** Send transactional mail, meaning receipts, password resets and alerts, from one subdomain, and marketing mail from another, each with its own DKIM selector. The reason is blast radius: when a campaign draws complaints, the damage lands on the marketing subdomain rather than on the stream that has to work. Be honest about the limit of this, though. Reputation aggregates at the organisational domain too, so separation reduces contagion rather than eliminating it. Do not send bulk mail from the root domain, because that is the one you cannot afford to replace.

**Why one bad campaign moves everything.** Reputation systems weight recent behaviour heavily and decay slowly. A single send to a stale segment produces a complaint spike, the spike moves the domain's grade, and the next campaign, which is fine, is filtered because of the last one. There is no reset. The only recovery is a period of low volume mail to your most engaged recipients until the average recovers.

## Tier 4. Content, ranked honestly

Content-level factors matter, and they matter far less than everything above. A skill that opens with a list of forbidden words has its priorities inverted, and the words themselves are close to irrelevant at the large providers, which have not relied on naive keyword matching for a very long time. The content factors that are real are structural rather than lexical:

- **Image-only messages.** A message that is one large image has no text to classify, and images are frequently not loaded for an unknown sender, so what arrives is a blank rectangle. This is also the classic construction for evading text filters, which is why it is treated as suspicious.
- **Link shorteners.** A shortened link carries the shared reputation of everyone else using that shortener, including the abusive ones, and hides the destination from filters that would otherwise assess it. Use your own domain if you need short links.
- **Mismatched link domains.** Display text saying one domain with an `href` pointing at another is the defining fingerprint of phishing. Tracking redirects through a platform domain are a mild version of the same thing and are tolerated because they are ubiquitous, but a redirect chain through three unrelated hosts is not.
- **No plain text alternative.** Send `multipart/alternative` with a real text part, not an empty one and not a machine-stripped one. An HTML-only message is a small negative signal and an accessibility failure.
- **Link destination reputation.** A link to a domain that is itself blocklisted will bulk an otherwise perfect message. Check where you are pointing, particularly for user-supplied or partner links.
- **Size.** Very large HTML gets clipped by some clients, which hides the unsubscribe link at the bottom, which raises complaints. Keep the body small.

**BIMI belongs here rather than at the top.** BIMI displays your logo beside the message in supporting clients. It requires DMARC at enforcement, meaning quarantine or reject rather than none, an SVG logo hosted over HTTPS in the required profile, and for the major supporting inboxes a Verified Mark Certificate or Common Mark Certificate from an approved authority, which is a recurring annual cost in the high hundreds to low thousands of US dollars. It is a reward for having finished the work below it, not a lever that improves placement. Anyone selling BIMI as a deliverability fix has the causation backwards.

## Tier 5. Measurement

If you are not reading aggregate DMARC reports and the provider postmaster tools, you will discover your next problem from a colleague asking why they stopped getting the newsletter. Set up the `rua` destination, verify your domain in the provider postmaster consoles, and check the complaint rate against the 0.3 percent threshold weekly rather than after a campaign. Keep a seed set of real accounts at the major consumer providers and look at where your own mail lands, since placement is not visible in any sending platform's dashboard.

## The decision rule for a suspected placement problem

- **Authentication or alignment fails.** Fix it, change nothing else, wait a full sending cycle. Everything downstream is unmeasurable until this is clean.
- **Authentication is clean and the complaint rate is above 0.3 percent.** The list is the defect. Suppress dormant segments and cut volume before touching creative.
- **Authentication is clean, complaints are low, and one provider is filtering while others are not.** It is a reputation problem specific to that provider. Read their postmaster tooling and reduce volume to that provider while sending only to engaged recipients there.
- **Authentication is clean, complaints are low, and everything is filtered everywhere.** Check blocklist status and check link destinations, then look at the sending pattern for a recent spike.
- **You cannot tell, because you have no complaint data and no aggregate reports.** Stop diagnosing. Instrument first: `rua` destination, postmaster verification, seed accounts. Guessing at deliverability without data produces confident changes that cannot be evaluated, and the most common outcome is three simultaneous changes and no idea which one helped.

## Worked example, compressed

A software company with about 40,000 recipients moved from one sending platform to another six weeks ago. Open rates halved at one consumer provider and are unchanged elsewhere. The team has rewritten the subject lines twice.

**Tier 0, fatal.** The From header is `[email protected]`. The envelope sender, read from a received message rather than from a record, is `[email protected]`. SPF passes for that domain and is not aligned. DKIM is signed with `d=platformdomain.example`, passes, and is not aligned. The DMARC record reads `v=DMARC1; p=quarantine; rua=` with an address at a domain that no longer exists, so no reports have been received or noticed for a year. The result is that every message fails DMARC and is quarantined by the provider that enforces the policy most strictly. Separately, the SPF record now resolves to eleven lookups after the new platform's include was added alongside the old platform's, which was never removed, so SPF returns permerror on top of everything else.

**The fix, in order.** Delete the old platform's include, taking the chain to eight. Configure a custom return path on a subdomain, so the envelope sender becomes a subdomain of the company domain and SPF aligns under relaxed alignment. Configure DKIM signing with `d=examplecompany.com` on a new selector, with a 2048 bit key, so DKIM aligns as well and survives forwarding. Repair the `rua` address and read reports for two weeks before touching the policy.

**Tier 1.** 6 percent of the list has not opened in two years and has never been suppressed. Nothing about that is fatal on its own, and it is the reason the complaint rate is 0.24 percent, uncomfortably close to the threshold.

**Tier 2.** The migration sent full volume from the new platform on day one with no ramp, which is the spike shape described above.

**Tier 3.** Content is fine. The subject line rewrites addressed nothing.

**Verdict: hold.** Do not send another campaign until alignment is fixed, because every message sent in the meantime adds a failing authentication result to the domain's record. The subject lines were never the problem, and the two rewrites cost six weeks.

## Failure modes

**Reading records and calling it an audit.** Every record can be individually valid while the system fails. Alignment is only visible in a real message, so fetch one and read its `Authentication-Results` and `Return-Path` headers.

**Counting the SPF lookups you can see.** The record shows four includes. The evaluation performs eleven queries. Resolve the whole chain.

**Publishing p=reject on day one.** It works immediately, in the sense that legitimate mail from systems you had forgotten stops being delivered immediately.

**Treating a soft bounce like a hard bounce, or the reverse.** Suppressing on a full mailbox loses real subscribers. Retrying a nonexistent mailbox for weeks is a direct signal to the receiver that you do not process failures.

**Blaming content.** The subject line is where teams look because it is the part they control without asking anyone. It is very rarely the cause, and the time spent rewriting it is time the domain spends still broken.

**Assuming the sending platform handles it.** Platforms handle their own authentication. Aligning that authentication with your domain is a configuration step somebody has to perform, and the default on most platforms is not aligned.

**Buying a dedicated IP because it sounds professional.** Below the volume needed to sustain a reputation, a dedicated IP is worse than a shared pool, and the damage is invisible for months.

**Fixing several things at once during an incident.** Alignment, list suppression and a volume cut in the same week means you learn nothing about which of them mattered, and you will face this again.

## What this skill does not do

- It does not check where your mail landed. Inbox placement requires seed accounts or a placement testing service, and no amount of record reading substitutes for looking.
- It cannot read your aggregate DMARC reports, your postmaster console or your bounce logs. It will tell you what to look for in them and cannot look for you.
- It does not assess consent or legality. Whether you were permitted to contact these people is a separate question with its own jurisdictional answers, and a technically perfect setup does not make an unlawful send lawful.
- It does not know your volume, your provider mix or your complaint rate, so every volume-dependent branch needs a number you supply.
- Provider requirements and thresholds move. The figures here are dated to February 2024 and the specifications to their published versions, and both should be checked against current documentation before you rely on them.
- It will not recover a burned domain. Reputation recovery is a slow process of consistent, engaged sending, and no audit shortens it.
Why import instead of copy

A skill is only as good as what it can read.

These skills all ask your assistant to check things against your actual codebase, your actual schema, your actual design system. Locul keeps that context current on its own, from the files you already have, on your machine. Mac and Windows, free to start.

Start free