<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>PigeonAtlas — Deliverability notes</title>
  <subtitle>Practical writing about SPF, DKIM, DMARC, bounces, and why email ends up in spam.</subtitle>
  <id>https://pigeonatlas.com/blog</id>
  <link rel="alternate" type="text/html" href="https://pigeonatlas.com/blog"/>
  <link rel="self" type="application/atom+xml" href="https://pigeonatlas.com/blog/feed.xml"/>
  <updated>2026-09-01T00:00:00Z</updated>
  <author><name>PigeonAtlas</name></author>
  <entry>
    <title>Don&#39;t send newsletters from your transactional domain</title>
    <id>https://pigeonatlas.com/blog/dont-send-newsletters-from-your-transactional-domain</id>
    <link rel="alternate" type="text/html" href="https://pigeonatlas.com/blog/dont-send-newsletters-from-your-transactional-domain"/>
    <published>2026-09-01T00:00:00Z</published>
    <updated>2026-09-01T00:00:00Z</updated>
    <summary>Complaints about a newsletter follow the domain that sent it. Share one domain and a campaign can cost you password resets.</summary>
    <content type="html"><p>Use a separate subdomain for marketing email than for the mail your product depends on. This is the cheapest deliverability decision available, and it is nearly impossible to make retroactively.</p>

<h2 id="what-reputation-actually-attaches-to">What reputation actually attaches to</h2>

<p>Receivers score senders, and the domain is one of the strongest signals. Complaints, spam-folder placements and bounces accumulate against the domain that sent them.</p>

<p>Your two kinds of mail behave completely differently:</p>

<ul>
<li><strong>Transactional</strong> — password resets, receipts, alerts. Expected, opened, almost never reported as spam.</li>
<li><strong>Marketing</strong> — newsletters, announcements. Sent to people who half-remember signing up. Some will report it as spam. That is normal and unavoidable, even when everything is done correctly.</li>
</ul>

<p>Share one domain and those complaint rates average together. A campaign that draws an ordinary number of complaints drags down the reputation that your password resets depend on.</p>

<p>The failure is not dramatic. It shows up as reset emails arriving in spam, and support tickets from people who cannot get back into their accounts.</p>

<h2 id="the-setup">The setup</h2>

<p>Two subdomains of the domain you already own:</p>

<pre><code>mail.yourcompany.com     password resets, receipts, alerts
news.yourcompany.com     newsletters, announcements
</code></pre>

<p>Each gets its own DKIM key and its own SPF record. Reputation is then tracked separately, and a bad campaign is contained to the subdomain that sent it.</p>

<p>Send from subdomains rather than the bare domain, too. Keeping <code>yourcompany.com</code> out of bulk sending protects it, which matters because it is also the domain your invoices and your staff&#39;s mail come from.</p>

<h2 id="why-later-is-expensive">Why later is expensive</h2>

<p>Moving marketing mail to a new subdomain after a year means starting from zero reputation for that stream, exactly when you have volume. New domains get throttled, so the first campaigns from the new subdomain deliver worse than the ones you were trying to fix.</p>

<p>Splitting on day one costs one extra DNS setup.</p>

<h2 id="the-part-people-miss">The part people miss</h2>

<p>Separate domains only help if the mail is genuinely separated. Sending a &quot;product update&quot; newsletter from your transactional subdomain because it is &quot;not really marketing&quot; puts you back where you started.</p>

<p>The test is not what you call it. It is whether a recipient might reasonably report it as spam. If yes, it belongs on the marketing subdomain.</p>
</content>
  </entry>
  <entry>
    <title>Two DMARC records is worse than none</title>
    <id>https://pigeonatlas.com/blog/two-dmarc-records-is-worse-than-none</id>
    <link rel="alternate" type="text/html" href="https://pigeonatlas.com/blog/two-dmarc-records-is-worse-than-none"/>
    <published>2026-08-28T00:00:00Z</published>
    <updated>2026-08-28T00:00:00Z</updated>
    <summary>A domain with two DMARC records has no DMARC policy at all. It looks configured, reports nothing, and enforces nothing.</summary>
    <content type="html"><p>If your domain publishes two DMARC records, it has no DMARC policy. Not a merged one, not the first one, not the stricter one. None.</p>

<p>RFC 7489 is explicit: a receiver that finds more than one DMARC record for a domain treats the result as if no record were published.</p>

<h2 id="why-this-is-worse-than-not-having-one">Why this is worse than not having one</h2>

<p>A domain with no DMARC record is honestly unprotected, and anyone checking can see it. A domain with two <em>looks</em> protected. It passes a glance at your DNS. Someone on your team ticked it off a launch checklist. And you get no aggregate reports, so the mechanism that would have told you something is wrong is the exact thing that stopped working.</p>

<h2 id="how-it-happens">How it happens</h2>

<p>Almost always the same way: two vendors, each with correct instructions.</p>

<p>Your email provider tells you to add a DMARC record. Later a marketing platform, a helpdesk or a website builder tells you the same thing. Both instructions are right on their own. Neither tells you to check whether one already exists, because from where they stand there is no way to know.</p>

<p>Then it sits there for months.</p>

<h2 id="checking">Checking</h2>

<pre><code>dig +short TXT _dmarc.yourcompany.com
</code></pre>

<p>You want exactly one line beginning <code>v=DMARC1</code>. Two lines is the problem. Zero means you have no DMARC, which is a different conversation.</p>

<p>Note that DMARC lives on the organisational domain. If you send from <code>mail.yourcompany.com</code>, the record still belongs at <code>_dmarc.yourcompany.com</code>.</p>

<h2 id="fixing-it">Fixing it</h2>

<p>Merge into one record. DMARC takes multiple reporting addresses, comma-separated:</p>

<pre><code>v=DMARC1; p=none; rua=mailto:dmarc@yourcompany.com,mailto:reports@vendor.example
</code></pre>

<p>Delete the other record entirely — do not leave it &quot;just in case&quot;. Two records is the failure.</p>

<p>If the two disagreed on policy, take the weaker one and tighten later after reading reports. Going from an accidental no-policy straight to <code>p=reject</code> will find every system quietly sending as your domain, all at once, in production.</p>
</content>
  </entry>
  <entry>
    <title>SPF, DKIM and DMARC, explained by what actually breaks</title>
    <id>https://pigeonatlas.com/blog/spf-dkim-dmarc-what-actually-breaks</id>
    <link rel="alternate" type="text/html" href="https://pigeonatlas.com/blog/spf-dkim-dmarc-what-actually-breaks"/>
    <published>2026-08-14T00:00:00Z</published>
    <updated>2026-08-14T00:00:00Z</updated>
    <summary>Three records, three different jobs. Here is what each one does, and the specific ways each one silently fails.</summary>
    <content type="html"><p>Most explanations of these three start with what they stand for. That is the least useful part. What matters is which one is failing when your mail lands in spam, and they fail in different ways.</p>

<h2 id="spf-says-which-servers-may-send">SPF says which servers may send</h2>

<p>SPF is a DNS record listing the servers allowed to send for your domain. A receiver checks the connecting server against that list.</p>

<p><strong>How it silently fails:</strong> SPF checks the domain in the envelope sender — the <code>MAIL FROM</code> — not the <code>From:</code> header your recipient sees. If you send through a provider that uses its own bounce domain, SPF passes for <em>the provider&#39;s</em> domain, and your domain has authenticated nothing. Everything looks fine in a header dump. DMARC still fails, because SPF did not align.</p>

<p>This is why a proper setup gives you a bounce subdomain of your own, like <code>bounce.mail.yourcompany.com</code>, with its own SPF record. Then SPF passes <em>and</em> aligns.</p>

<p><strong>The other one that catches people:</strong> SPF allows ten DNS lookups. Each <code>include:</code> counts, and each <code>include:</code> inside those counts too. Add a fourth or fifth vendor and you quietly cross the limit; receivers then treat SPF as permanently failing. Nothing tells you.</p>

<h2 id="dkim-says-the-message-was-not-altered">DKIM says the message was not altered</h2>

<p>DKIM signs the message with a private key. The matching public key sits in your DNS, and the receiver verifies the signature.</p>

<p><strong>How it silently fails:</strong> a 2048-bit key does not fit in one DNS character-string, so it is always published split across several. Tools that read only the first chunk see a truncated key and report a mismatch, even though the record is correct. If you are debugging a DKIM failure and the key &quot;looks wrong&quot;, check that whatever is reading it joins the parts.</p>

<p>The second failure mode is anything that modifies the message in flight. A mailing list that appends a footer breaks the signature it was signed with. So does a tracking system that rewrites links <em>after</em> signing rather than before.</p>

<h2 id="dmarc-says-what-to-do-when-the-first-two-fail">DMARC says what to do when the first two fail</h2>

<p>DMARC ties SPF and DKIM to the <code>From:</code> header your recipient actually reads, and tells receivers what to do when neither aligns: nothing (<code>p=none</code>), quarantine, or reject.</p>

<p><strong>How it silently fails:</strong> publishing two DMARC records. It happens when two vendors each tell you to add one. Per RFC 7489, a receiver that finds more than one record treats the domain as having <strong>no DMARC policy at all</strong>. Both records are ignored. The domain looks configured, reports nothing, and enforces nothing.</p>

<p>If you use more than one sending service, you get one record with both reporting addresses:</p>

<pre><code>v=DMARC1; p=none; rua=mailto:you@yourcompany.com,mailto:reports@vendor.example
</code></pre>

<h2 id="the-order-to-fix-them-in">The order to fix them in</h2>

<ol>
<li><strong>DKIM first.</strong> It survives forwarding, where SPF does not.</li>
<li><strong>SPF on a bounce domain you control</strong>, so it aligns rather than merely passing.</li>
<li><strong>DMARC at <code>p=none</code></strong>, and read the reports for a couple of weeks before tightening.</li>
</ol>

<p>Going straight to <code>p=reject</code> is how people discover, in production, the one system that was sending as their domain and that nobody remembered.</p>
</content>
  </entry>
</feed>
