<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>The Duck Press</title>
  <link>https://letterduck.com/blog</link>
  <atom:link href="https://letterduck.com/blog/rss.xml" rel="self" type="application/rss+xml"/>
  <description>Essays and field notes on email from LetterDuck: deliverability, business email, newsletters, outreach.</description>
  <language>en-us</language>
  <item>
    <title>Why are my emails going to spam? Six checks, in the order they fail</title>
    <link>https://letterduck.com/blog/why-emails-go-to-spam</link>
    <guid isPermaLink="true">https://letterduck.com/blog/why-emails-go-to-spam</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>Six checks in the order they fail: authentication, domain reputation, complaints, content, list quality, engagement. Each with a test you can run today.</description>
    <content:encoded><![CDATA[
<p>Emails land in spam for six reasons, and they fail in a predictable order: authentication, domain reputation, complaint rate, content, list quality, engagement. Work through the checks in that order and you will usually find the culprit inside an hour, because the failures at the top of the list are both the most common and the fastest to test. This is the diagnostic sequence from our <a href="/guides/email-deliverability">email deliverability handbook</a>, and it is the one we run on our own mail.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Start with authentication. Since November 2025 Gmail rejects unauthenticated mail outright with a 550-5.7.26 error, so a missing record is no longer a spam problem, it is a delivery failure.</li>
<li>Test it today: send yourself a message at a Gmail address and read "Show original". You want three PASS verdicts.</li>
<li>Complaint math is unforgiving. Three spam reports on a 1,000-email send is 0.3%, Google's never-exceed line.</li>
<li>The fixes that work: DMARC at p=none today, a 4-8 week warm-up for new domains, one-click unsubscribe headers, and permanent suppression of every hard bounce.</li>
</ul></aside><p>Here is the whole diagnostic on one screen. The rest of the article is each check in detail.</p>
<div class="tblwrap"><table><thead><tr><th>#</th><th>Check</th><th>The 60-second test</th></tr></thead><tbody><tr><td>1</td><td>Authentication</td><td>Gmail &quot;Show original&quot; on a message you send yourself</td></tr>
<tr><td>2</td><td>Domain reputation</td><td><a href="https://postmaster.google.com/">Google Postmaster Tools</a> plus a blacklist scan</td></tr>
<tr><td>3</td><td>Complaint rate</td><td>Postmaster spam-rate chart against the 0.1% line</td></tr>
<tr><td>4</td><td>Content triggers</td><td><a href="https://www.mail-tester.com/">mail-tester.com</a> score on the real campaign</td></tr>
<tr><td>5</td><td>List quality</td><td>Hard bounces divided by delivered, against 2%</td></tr>
<tr><td>6</td><td>Engagement</td><td>Share of your list with no click in 90 days</td></tr></tbody></table></div><h2 id="check-1-authentication-the-one-that-bounces-now">Check 1: authentication (the one that bounces now)</h2><p>Since November 2025, Gmail rejects unauthenticated mail with a 550-5.7.26 error instead of filing it in spam (Google sender guidelines, enforcement documented across the industry in late 2025). Microsoft made the same move for Outlook, Hotmail and Live addresses in May 2025, with a <a href="https://support.microsoft.com/en-us/outlook/fix-ndr-error-550-5-7-515-in-outlook-com">550 5.7.515</a> rejection. Partial authentication still lands you in the spam folder: <a href="/glossary#spf">SPF</a> passing while <a href="/glossary#dkim">DKIM</a> fails, or both passing on a domain that does not match your From address, which is a <a href="/glossary#dmarc">DMARC</a> alignment failure.</p>
<p>Test it today. Send a message to a Gmail address you own, open it, choose &quot;Show original&quot; from the three-dot menu, and read the summary table at the top. You want three PASS verdicts: SPF, DKIM, DMARC. Then confirm the DNS from a terminal:</p>
<div class="codewrap"><pre><code>dig TXT yourdomain.com +short
dig TXT _dmarc.yourdomain.com +short
</code></pre></div>
<p>The first should return a record starting <code>v=spf1</code>. The second should return one starting <code>v=DMARC1</code>. Silence on either line is your answer.</p>
<p>The fix: add the SPF include and DKIM records your sending provider lists in its dashboard, then publish a minimum DMARC record (<code>v=DMARC1; p=none;</code> plus a reporting address). Our <a href="/blog/spf-dkim-dmarc">SPF, DKIM and DMARC walkthrough</a> shows the literal records.</p>
<p>One trap we hit ourselves: forwarding breaks alignment. In June 2026 we watched Gmail reject 73% of the mail we were mirroring through Cloudflare&#39;s forwarding, with no error visible on our side. The mail just vanished. We replaced the forward with an API insert and the failures stopped the same day. If your mail passes through any forwarder on the way to its destination, test the full path, not just your DNS.</p>
<h2 id="check-2-domain-reputation-new-domains-are-on-probation">Check 2: domain reputation (new domains are on probation)</h2><p>Mailbox providers score your sending domain&#39;s history, and a new domain has none. Reputation matures over roughly 4 to 8 weeks, and during that window volume itself is a signal: a fresh domain pushing 5,000 emails on day 3 looks exactly like a spammer cycling through burner domains, because that is who else sends that pattern.</p>
<p>Test it: register your domain in <a href="/blog/google-postmaster-tools">Google Postmaster Tools</a> (free, verified with one TXT record) and read the compliance and spam-rate dashboards. Fair warning: the charts need meaningful daily Gmail volume before they show anything. At dozens of emails a day, ours are mostly blank too. While you are logged in anywhere, run a <a href="/blog/email-blacklist-check">blacklist check</a> on the domain and your relay&#39;s IPs.</p>
<p>The fix is <a href="/glossary#warm-up">warm-up</a>: start around 150 emails on day 1 and multiply by roughly 1.4 each day, reaching about 1,100 a day by day 7, then grow 10 to 20 percent daily. That curve comes from <a href="https://resend.com/docs/knowledge-base/warming-up" rel="nofollow">Resend&#39;s documented domain ramp</a>, and it is <a href="/blog/email-warm-up">the one our send path enforces in code</a>. Send to your most engaged recipients first, and keep the cadence steady. Gaps cost progress.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="check-3-your-spam-complaint-rate">Check 3: your spam complaint rate</h2><p><a href="https://support.google.com/mail/answer/81126">Google&#39;s bulk-sender rules</a> (in force since February 2024) draw two lines: keep user spam reports under 0.1% of delivered mail, and never reach 0.3%. At or above 0.3%, Gmail withholds delivery mitigation until you have been back under the line for 7 consecutive days. Seven days of spam-foldered mail is a long time for a newsletter.</p>
<p>The math is harsher than it looks at small scale. Three reports on a 1,000-email send is 0.3%. One report on 300 is worse. We work the numbers at every list size in <a href="/blog/spam-complaint-rate">our complaint-rate breakdown</a>.</p>
<p>Test it: the spam-rate chart in Postmaster Tools, same login as check 2.</p>
<p>The fix has two parts. First, make unsubscribing one click, because a hidden unsubscribe converts bored readers into complainers. Stamp both <a href="https://www.rfc-editor.org/rfc/rfc8058.html">RFC 8058</a> headers on every campaign:</p>
<div class="codewrap"><pre><code>List-Unsubscribe: &lt;https://yourdomain.com/unsub/TOKEN&gt;, &lt;mailto:unsub@yourdomain.com&gt;
List-Unsubscribe-Post: List-Unsubscribe=One-Click
</code></pre></div>
<p>Second, suppress anyone who complains, immediately and permanently.</p>
<h2 id="check-4-content-triggers">Check 4: content triggers</h2><p>Content filters matter less than reputation, but a few patterns still hurt on their own: image-only emails, link shorteners, a fake &quot;Re:&quot; or &quot;Fwd:&quot; on a first contact, ALL-CAPS subject lines, and HTML with no plain-text part.</p>
<p>Test it: mail-tester.com hands you a one-time address. Send it your actual campaign, not a lorem-ipsum stand-in, and read the score out of 10. We treat that score as a pre-send gate.</p>
<p>The fix: send <code>multipart/alternative</code> with a genuine plain-text part, keep the text-to-image ratio at 60:40 or better, link only to your own domain, keep the From name and address stable, and give every image alt text. None of this is exotic. It is just tedious enough that spammers skip it, which is why filters check for it.</p>
<h2 id="check-5-list-quality">Check 5: list quality</h2><p>A <a href="/glossary#bounce-rate">bounce rate</a> above 2% tells providers the list is scraped, bought, or stale, and stale lists carry spam traps: addresses that exist only to catch senders who never verified consent. Role accounts such as info@ and admin@ complain at far higher rates than personal addresses, and postmaster@ should never be on a list at all.</p>
<p>Test it: divide hard bounces by delivered on your last send. Over 2% means stop sending and clean the list before anything else.</p>
<p>The fix: suppress hard bounces permanently on a <a href="/glossary#suppression-list">suppression list</a> that is applied before every send, retry soft bounces about 3 times over 14 days, require <a href="/glossary#double-opt-in">double opt-in</a>, and reject role accounts at signup. Our own playbook makes the last two non-negotiable, because retrofitting hygiene onto a dirty list is much harder than refusing the bad addresses up front.</p>
<h2 id="check-6-engagement-collapse">Check 6: engagement collapse</h2><p>Mailbox providers weight replies above clicks and clicks above opens. Gmail favors recent engagement, Outlook favors consistent history, and <a href="https://www.apple.com/legal/privacy/data/en/mail-privacy-protection/">Apple Mail Privacy Protection</a> auto-fetches images, so open rates read high even when nobody is looking (<a href="https://www.litmus.com/email-client-market-share">Litmus</a> has tracked this effect since Apple shipped MPP in 2021). A list where most people have ignored you for months drags every future send down, and the damage compounds: low engagement causes spam placement, which causes lower engagement.</p>
<p>Test it: count subscribers with no click or reply in 90 days. If that is most of your list, you have found the problem, and no DNS record will fix it.</p>
<p>The fix: send the next campaign to the engaged segment only, run one winback attempt on the rest, then sunset anyone inactive for 60 to 90 days. A small list that gets read outdelivers a big one that gets ignored.</p>
<h2 id="how-to-stop-emails-going-to-spam-run-the-checks-in-order">How to stop emails going to spam: run the checks in order</h2><p>The order is the diagnosis. Authentication failures reject your mail outright. Reputation and complaint problems bury everything you send for weeks. Content triggers hurt one campaign at a time, and list or engagement rot erodes slowly enough that most senders never connect cause to effect. Start at check 1 tonight: it takes five minutes, it is the only one with a hard cliff, and since November 2025 it decides whether your mail arrives at all.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>What is SMTP? Email's sending rail, explained</title>
    <link>https://letterduck.com/blog/what-is-smtp</link>
    <guid isPermaLink="true">https://letterduck.com/blog/what-is-smtp</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>SMTP has moved email since 1982. The protocol conversation line by line, 587 vs 25, when you need an SMTP relay, and how to read 550, 421, and 535 errors.</description>
    <content:encoded><![CDATA[
<p>SMTP (Simple Mail Transfer Protocol) has moved email between servers since 1982, and in all that time it has never once verified that a sender is who they claim to be. Both halves of that sentence matter. The first explains why any two mail systems on earth can talk to each other; the second explains spam, spoofing, and the entire DNS authentication layer bolted on since.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>SMTP is the sending rail: your client or app submits mail to an SMTP server, and those servers pass mail to each other over it. Reading mail is a different protocol's job.</li>
<li>Port 587 (or 465) is authenticated submission, you to your own server. Port 25 is server-to-server relay, and residential ISPs commonly block it.</li>
<li>An SMTP relay service does the port-25 delivery for you from IP addresses with existing reputation. If software sends your mail, you want one.</li>
<li>SMTP itself trusts every sender completely, which is why SPF, DKIM, and DMARC exist in DNS.</li>
<li>Reading errors: 5xx is permanent (stop and fix), 4xx is temporary (retry), 535 means your login failed.</li>
</ul></aside><p>The protocol was written down by Jon Postel as <a href="https://www.rfc-editor.org/rfc/rfc821.html">RFC 821</a> in 1982; the current specification is <a href="https://www.rfc-editor.org/rfc/rfc5321.html">RFC 5321</a>, from 2008, and a server from either era could still complete a delivery today. SMTP is the sending half of a working email setup. The reading half is <a href="/blog/imap-vs-pop3">IMAP or POP3</a>, and if you are building mail on your own domain end to end, our <a href="/guides/business-email-setup">business email setup guide</a> puts both halves in order. This article stays on the rail that moves the mail.</p>
<h2 id="the-conversation-line-by-line">The conversation, line by line</h2><p>An SMTP session is plain text over a TCP connection. You could type one by hand into a terminal, and debugging real delivery problems sometimes still means doing exactly that. Here is a minimal delivery, client lines marked C, server lines marked S:</p>
<div class="codewrap"><pre><code>S: 220 mx.example.com ESMTP ready
C: EHLO mail.sender.example
S: 250 mx.example.com greets mail.sender.example
C: MAIL FROM:&lt;news@sender.example&gt;
S: 250 2.1.0 OK
C: RCPT TO:&lt;pat@example.com&gt;
S: 250 2.1.5 OK
C: DATA
S: 354 Start mail input; end with &lt;CRLF&gt;.&lt;CRLF&gt;
C: From: The Weekly Letter &lt;news@sender.example&gt;
C: To: pat@example.com
C: Subject: Issue 12
C:
C: The body goes here.
C: .
S: 250 2.0.0 OK, queued
C: QUIT
S: 221 Bye
</code></pre></div>
<p>(HELO was the original 1982 greeting; EHLO is its extended replacement and what everything sends today. People still call the whole exchange &quot;the HELO.&quot;)</p>
<p>The structural detail worth memorizing is the split between the envelope and the content. MAIL FROM and RCPT TO are the envelope: they are what the receiving server actually uses to route and return the message. The From, To, and Subject lines inside DATA are content, and to SMTP they are just text. Two everyday consequences follow. BCC works because an address can ride on the envelope without appearing anywhere in the headers. And the envelope sender (delivered mail records it as the Return-Path) can be a different address from the From your reader sees. That seam is where bounce handling lives, and it is exactly where email authentication gets bolted on. Hold that thought two sections.</p>
<h2 id="submission-vs-relay-587-vs-25">Submission vs relay: 587 vs 25</h2><p>SMTP does two different jobs on two different ports.</p>
<div class="tblwrap"><table><thead><tr><th>Port</th><th>Job</th><th>Login</th><th>Encryption</th></tr></thead><tbody><tr><td>587</td><td class="yes">Submission: you to your own server</td><td>Required</td><td>STARTTLS upgrade (<a href="https://www.rfc-editor.org/rfc/rfc6409.html">RFC 6409</a>)</td></tr>
<tr><td>465</td><td class="yes">Submission, implicit TLS</td><td>Required</td><td>TLS from the first byte (<a href="https://www.rfc-editor.org/rfc/rfc8314.html">RFC 8314</a>, 2018)</td></tr>
<tr><td>25</td><td class="dim">Relay: server to server</td><td>None</td><td>Opportunistic STARTTLS</td></tr></tbody></table></div><p>Submission is you handing outgoing mail to your own provider: a mail client with a username and password, or an app with an API key. It is authenticated, always, and it belongs on 587 (formalized for this job by RFC 6409) or 465 (implicit TLS, re-standardized by RFC 8314 in 2018). Use whichever your provider documents; both are fine.</p>
<p>Relay is servers delivering to each other on port 25, and no login exists there. Gmail&#39;s MX servers accept mail addressed to Gmail users from any machine on the internet; what varies is how the mail is judged, and the judging is done on the sending IP&#39;s and domain&#39;s reputation rather than on credentials. This is also why you cannot send mail straight from your laptop: most residential ISPs block outbound port 25 so that infected home machines cannot spray spam, and mailbox providers would distrust a residential IP anyway.</p>
<h2 id="what-an-smtp-relay-service-is-and-when-you-need-one">What an SMTP relay service is, and when you need one</h2><p>An SMTP relay service (Amazon SES, SendGrid, Postmark, Mailgun, Resend) accepts your mail on the submission side, over authenticated SMTP or an HTTP API, and does the port-25 delivery from its own infrastructure: IP addresses with years of accumulated reputation, correct reverse DNS, TLS, bounce processing, and complaint feedback plumbing.</p>
<p>You need one whenever software is the sender. App notifications, receipts, newsletters, and anything else automated all qualify. A human in a mail client already has a relay in effect, because the provider&#39;s submission server is one.</p>
<p>The alternative, running your own mail server on port 25, is more workable than vendors admit and worth less than self-hosters hope. The software is a solved problem: Postfix installs in an afternoon. The IP reputation is not. Mailbox providers treat an unknown sending IP as guilty until proven consistent, proving that takes weeks of steady volume, and low volume can never finish the job. We made this exact call for our own workspace and send through a relay; our position is that below tens of thousands of emails a month, self-hosting the sending rail buys you deliverability risk and nothing else. Our send path also enforces a warm-up throttle on top of the relay: roughly 150 sends on day one, raised by about 1.4x daily toward about 1,100 by day seven, capped at whatever the relay allows, which for us is 95 a day. That is <a href="https://resend.com/docs/knowledge-base/warming-up" rel="nofollow">Resend&#39;s documented domain ramp</a>, and we codified it into the send path so nobody can skip it on launch day. The rest of that policy lives in our <a href="/guides/email-deliverability">email deliverability handbook</a>.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="smtp-verifies-nothing-why-spf-exists">SMTP verifies nothing: why SPF exists</h2><p>Look back at the transcript. Nothing checked whether the client was allowed to say <code>MAIL FROM:&lt;news@sender.example&gt;</code>. Any connected machine can claim any envelope sender, and in 1982, among a few hundred cooperating research hosts, that was a reasonable design. On the open internet it is an open door, and spam and spoofing walked through it.</p>
<p>Authentication was retrofitted next to the protocol, in DNS, rather than inside it:</p>
<ul>
<li><a href="/glossary#spf">SPF</a> (<a href="https://www.rfc-editor.org/rfc/rfc7208.html">RFC 7208</a>, published April 2014) lets a domain publish the list of IP addresses allowed to use it in MAIL FROM. Note the envelope-content split from earlier: SPF checks the envelope sender, not the From header.</li>
<li><a href="/glossary#dkim">DKIM</a> signs the message with a key published in DNS, so altered or forged content fails verification.</li>
<li><a href="/glossary#dmarc">DMARC</a> ties both checks to the From header the reader actually sees and tells receivers what to do on failure.</li>
</ul>
<p>We explain how the three interlock in <a href="/blog/spf-dkim-dmarc">SPF, DKIM and DMARC</a>, and the <a href="/blog/spf-record">SPF record syntax</a> gets its own walkthrough. What you should carry out of this article is the deadline: Gmail (November 2025) and Microsoft (May 2025) now hard-reject unauthenticated mail with a 550 instead of quietly spam-foldering it. Authentication stopped being extra credit.</p>
<p>One first-hand number on what breakage looks like. Forwarding re-sends a message from the forwarder&#39;s IP, which is not in the original domain&#39;s SPF record. In June 2026 we measured Gmail rejecting about 73% of the mail we were mirroring into a Gmail mailbox via Cloudflare&#39;s forwarding, and it happened silently: no bounce reached anyone, the mail just never arrived. We replaced forwarding with an API insert the same week. If forwarded mail is vanishing somewhere in your setup, broken authentication on the forwarding hop is the first suspect, and <a href="/blog/why-emails-go-to-spam">why emails go to spam</a> has the fuller diagnostic list.</p>
<h2 id="reading-smtp-errors-550-421-535">Reading SMTP errors: 550, 421, 535</h2><p>Every server reply starts with a three-digit code, and the first digit does most of the work: 2xx means done, 3xx means continue, 4xx means temporary failure (retry later), 5xx means permanent failure (stop and fix something). Modern servers append an enhanced code, like 5.7.26, plus human-readable text, and the text is usually worth reading.</p>
<div class="tblwrap"><table><thead><tr><th>Code</th><th>What it means</th><th>What to do</th></tr></thead><tbody><tr><td>550</td><td>Permanent rejection. Classically &quot;mailbox unavailable&quot;; today just as often policy: the address is gone, or your mail failed authentication or reputation checks</td><td>Read the text. A dead address goes on your suppression list. Any mention of authentication (Gmail&#39;s 550 5.7.26, for example) means fix SPF, DKIM, and DMARC before retrying</td></tr>
<tr><td>421</td><td>Temporary refusal: the server is busy, greylisting you, or rate-limiting your IP</td><td>Retry later with spacing. Sustained 421s during a big send are the provider saying &quot;too fast&quot;: slow your ramp</td></tr>
<tr><td>535</td><td>Authentication failed at submission: username, password, or API key rejected</td><td>Recheck credentials. Google ended password-only SMTP access on September 30, 2024, so an old app with a saved password now earns a 535 through no fault of the password</td></tr>
<tr><td>452</td><td>Temporary: recipient mailbox full, or too many recipients in one transaction</td><td>Retry; a mailbox that stays full will eventually become a hard bounce</td></tr>
<tr><td>554</td><td>Blanket rejection, frequently reputation or blocklist based</td><td>The text often names the blocklist; check your listing and request delisting</td></tr></tbody></table></div><p>The bounce-handling rule that falls out of this table: a 5xx on a recipient is a hard bounce, and that address should never be tried again. Our own send path suppresses hard bounces permanently and retries soft (4xx) bounces about three times over 14 days before giving up; the distinction matters enough that <a href="/blog/email-bounce-rate">hard bounce vs soft bounce</a> gets its own article.</p>
<p>You will probably never type MAIL FROM by hand outside a debugging session, and that is fine. The layer is still worth knowing, because every delivery problem you will ever have is legible from here. When something bounces, read the three-digit code first: 4xx says wait, 5xx says fix. And before real volume leaves your domain, publish SPF, sign with DKIM, and set a DMARC policy, because since November 2025 the alternative is a mailbox full of 550s.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>What is DMARC? From p=none to p=reject</title>
    <link>https://letterduck.com/blog/what-is-dmarc</link>
    <guid isPermaLink="true">https://letterduck.com/blog/what-is-dmarc</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>DMARC tells mailbox providers what to do with mail that fails authentication. The policy levels, how to read rua reports, and a staged path to p=reject.</description>
    <content:encoded><![CDATA[
<p>DMARC is a single DNS TXT record that tells mailbox providers what to do with mail that claims your domain but fails authentication, and it is the only one of the three core email authentication protocols that enforces anything. <a href="/blog/spf-record">SPF</a> and <a href="/blog/what-is-dkim">DKIM</a> produce pass/fail results; without DMARC, receivers treat those results as suggestions. With it, you publish the verdict in advance: deliver anyway, quarantine, or reject.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>DMARC checks that a passing SPF or DKIM result aligns with the visible From domain, then applies your published policy: p=none, p=quarantine, or p=reject.</li>
<li>Treat the progression to p=reject as a project with exit criteria, not a setting to flip. Publish p=none with a rua address today; enforce in four to ten weeks.</li>
<li>Aggregate (rua) reports arrive as zipped XML from every major receiver. Read one by hand to learn the shape, then use a parser. Nobody reads raw XML for long.</li>
<li>Since May 2025 Microsoft requires a DMARC record from bulk senders, and Gmail has required one since February 2024. p=none satisfies both. p=reject is what actually stops spoofing.</li>
</ul></aside><p>DMARC (Domain-based Message Authentication, Reporting and Conformance, <a href="https://www.rfc-editor.org/rfc/rfc7489.html">RFC 7489</a>, published 2015) is one leg of the trio we cover across <a href="/guides/email-deliverability">our deliverability handbook</a>. If SPF and DKIM are new to you, start with <a href="/blog/spf-dkim-dmarc">how the three records work as one system</a>; this article assumes both are set up and goes deep on the enforcement layer.</p>
<h2 id="what-the-record-looks-like">What the record looks like</h2><p>DMARC lives at the <code>_dmarc</code> label of your domain:</p>
<div class="codewrap"><pre><code>_dmarc.example.com.  TXT  &quot;v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com; sp=quarantine; adkim=r; aspf=r&quot;
</code></pre></div>
<p>The tags that matter, in practice order:</p>
<div class="tblwrap"><table><thead><tr><th>Tag</th><th>Meaning</th><th>Notes</th></tr></thead><tbody><tr><td><code>v</code></td><td>Version</td><td>Always <code>DMARC1</code>, must be first</td></tr>
<tr><td><code>p</code></td><td>Policy for the domain</td><td><code>none</code>, <code>quarantine</code>, or <code>reject</code></td></tr>
<tr><td><code>rua</code></td><td>Where aggregate reports go</td><td>A mailbox you actually monitor</td></tr>
<tr><td><code>sp</code></td><td>Policy for subdomains</td><td>Defaults to <code>p</code> if omitted</td></tr>
<tr><td><code>pct</code></td><td>Percent of failing mail the policy applies to</td><td>Staging tool; <code>pct=25</code> quarantines a quarter</td></tr>
<tr><td><code>adkim</code> / <code>aspf</code></td><td>Alignment mode</td><td><code>r</code> (relaxed, subdomains count) or <code>s</code> (strict); relaxed is the default and the right choice for most senders</td></tr>
<tr><td><code>ruf</code></td><td>Failure (forensic) reports</td><td>Most large receivers no longer send these; do not build a plan around them</td></tr></tbody></table></div><p>A minimal starting record is just three tags: <code>v=DMARC1; p=none; rua=mailto:you@yourdomain.com</code>.</p>
<h2 id="what-dmarc-actually-checks">What DMARC actually checks</h2><p>DMARC passes a message when at least one of two things is true: SPF passed and the Return-Path domain aligns with the From domain, or DKIM passed and the signature&#39;s <code>d=</code> domain aligns with the From domain. Alignment is the whole point. It welds the hidden authentication identities to the address your reader sees, which is the address phishers forge.</p>
<p>One aligned pass is enough. A message that fails SPF outright (every forwarded message does) still passes DMARC on an intact DKIM signature. That redundancy is deliberate, and it is why you set up both before you enforce anything.</p>
<h2 id="the-dmarc-policy-levels-honestly">The DMARC policy levels, honestly</h2><p><code>p=none</code> is monitoring mode. Failing mail is delivered as if DMARC did not exist, but receivers send you reports. This is where everyone starts, and where a great many domains quietly stay forever. A permanent p=none protects nobody; it just watches.</p>
<p><code>p=quarantine</code> sends failing mail to spam. Real consequences, but recoverable: a misconfigured legitimate sender lands in spam folders instead of vanishing, and someone eventually tells you.</p>
<p><code>p=reject</code> refuses failing mail at the door. This is the goal state and the only policy that actually stops your domain being spoofed, because quarantined phishing can still be fished out of a spam folder by a curious reader. The cost: your mistakes become invisible. Rejected mail does not bounce to anyone you control, it is simply gone. We saw this from the receiving side in June 2026, when Gmail enforced sender policies against mail we were forwarding and silently refused 73% of it. No error reached us. Silence is exactly what rejection looks like, which is why you do not publish p=reject on hope.</p>
<h3 id="quarantine-vs-reject-in-one-rule">Quarantine vs reject, in one rule</h3><p>Quarantine while humans can still catch your mistakes; reject once the reports prove there are no mistakes left to catch. If your reports have been clean for a month, quarantine is just reject with extra steps and a worse spoofing story.</p>
<h2 id="the-road-to-preject-a-project-plan-with-exit-criteria">The road to p=reject: a project plan with exit criteria</h2><p>The failure mode with DMARC is not technical, it is organizational: someone flips p=reject in an afternoon and the CRM, the invoicing tool, and the CEO&#39;s newsletter all stop delivering. Run it as four phases and do not leave a phase until its exit criteria hold.</p>
<div class="tblwrap"><table><thead><tr><th>Phase</th><th>Record</th><th>Exit criteria</th></tr></thead><tbody><tr><td>1. Observe</td><td><code>p=none</code> + <code>rua</code></td><td>Two to four weeks of reports collected; every sending source in them identified as yours, a forwarder, or abuse</td></tr>
<tr><td>2. Authenticate</td><td><code>p=none</code></td><td>Every legitimate source passes SPF or DKIM with alignment in the reports; new vendors have a checklist item for authentication</td></tr>
<tr><td>3. Quarantine</td><td><code>p=quarantine</code>, staged with <code>pct</code> if volume is high</td><td>Two to four consecutive clean weeks: no legitimate mail in spam, no missing-mail complaints from customers or staff</td></tr>
<tr><td>4. Reject</td><td><code>p=reject</code></td><td>Ongoing: reports reviewed monthly and whenever a new sending tool is added</td></tr></tbody></table></div><p>Phase 2 is where the actual work lives. The reports will surface senders you forgot existed: the support desk, the survey tool, the office printer that emails scans. Each one either gets authenticated, replaced, or consciously cut off. Budget four to ten weeks for the whole run at a small company, longer if procurement owns your DNS.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="reading-a-dmarc-report-rua">Reading a DMARC report (rua)</h2><p>Aggregate reports are XML files, usually zipped, mailed to your <code>rua</code> address by each receiver roughly daily. Gmail, Yahoo, and Microsoft all send them. A report contains no message content: it is rows of source IPs with counts and results. The heart of one looks like this:</p>
<div class="codewrap"><pre><code class="language-xml">&lt;record&gt;
  &lt;row&gt;
    &lt;source_ip&gt;203.0.113.7&lt;/source_ip&gt;
    &lt;count&gt;412&lt;/count&gt;
    &lt;policy_evaluated&gt;
      &lt;disposition&gt;none&lt;/disposition&gt;
      &lt;dkim&gt;pass&lt;/dkim&gt;
      &lt;spf&gt;fail&lt;/spf&gt;
    &lt;/policy_evaluated&gt;
  &lt;/row&gt;
  &lt;identifiers&gt;
    &lt;header_from&gt;example.com&lt;/header_from&gt;
  &lt;/identifiers&gt;
  &lt;auth_results&gt;
    &lt;dkim&gt;&lt;domain&gt;example.com&lt;/domain&gt;&lt;selector&gt;s1&lt;/selector&gt;&lt;result&gt;pass&lt;/result&gt;&lt;/dkim&gt;
    &lt;spf&gt;&lt;domain&gt;bounce.mailer.net&lt;/domain&gt;&lt;result&gt;pass&lt;/result&gt;&lt;/spf&gt;
  &lt;/auth_results&gt;
&lt;/record&gt;
</code></pre></div>
<p>Read this one carefully, because it shows the distinction that confuses everyone. Under <code>auth_results</code>, SPF shows <code>pass</code>: the sending server was authorized for <code>bounce.mailer.net</code>, its Return-Path domain. Under <code>policy_evaluated</code>, SPF shows <code>fail</code>: that passing domain does not align with <code>example.com</code>, the From domain, so it counts for nothing. DKIM passed with an aligned domain, so the message passed DMARC. This is an <a href="/glossary#esp">ESP</a> sending on your behalf with DKIM set up correctly and SPF alignment absent, which is normal and fine.</p>
<p>Read two or three reports raw so the structure sticks. Then stop. At any real volume you will receive dozens of files a day from different receivers, and the job is aggregation across weeks, not file reading. Use a parser: Postmark runs a free weekly digest service (still free as of mid-2026) that turns the XML into a readable email, and paid dashboards from the DMARC vendors add history and source labeling. There is no prize for hand-parsing XML.</p>
<p>What you are looking for in the aggregate: sources with volume that you cannot name, legitimate sources failing alignment, and, once you enforce, any disposition of <code>quarantine</code> or <code>reject</code> applied to mail that was actually yours.</p>
<h2 id="what-preject-requires-of-you">What p=reject requires of you</h2><p>Prerequisites, all of them, before the final flip:</p>
<ul>
<li>DKIM signing on every legitimate sending source, with 2048-bit keys where your providers support them.</li>
<li>SPF covering every source, kept under the 10-lookup limit so it does not permerror into uselessness.</li>
<li>A subdomain decision: <code>sp=</code> inherits your policy to subdomains, so either authenticate mail from subdomains too or set their policy explicitly.</li>
<li>A monitored <code>rua</code> mailbox and a calendar habit of reading the digest, because vendors change IPs and colleagues add tools without telling you.</li>
<li>Four or more clean weeks at quarantine.</li>
</ul>
<p>Publish <code>p=none</code> with a <code>rua</code> address this week; it is one TXT record and it costs you nothing. Then work the phase table. A domain that reaches p=reject with clean reports has done more for its deliverability than any <a href="/glossary#warm-up">warm-up</a> trick, and it has made itself worthless to every phisher who tries to borrow its name.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>What is DKIM? Selectors, keys, and signatures</title>
    <link>https://letterduck.com/blog/what-is-dkim</link>
    <guid isPermaLink="true">https://letterduck.com/blog/what-is-dkim</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>DKIM signs every message you send so receivers can verify it. What the signature covers, how selectors work, why 2048-bit keys, and how to read a DKIM header.</description>
    <content:encoded><![CDATA[
<p>DKIM (DomainKeys Identified Mail, <a href="https://www.rfc-editor.org/rfc/rfc6376.html">RFC 6376</a>, published 2011) puts a cryptographic signature on every message you send, and it is the only email authentication that survives forwarding. Your server signs the message with a private key; the receiver verifies it against a public key you publish in DNS. A valid signature proves two things at once: the message really was handled by the domain in the signature, and the signed parts were not altered in transit.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>DKIM signs a hash of the message body plus a chosen list of headers. The signature travels inside the message, which is why it verifies anywhere, including after a forward.</li>
<li>The selector (the s= tag) names which DNS key to check, at selector._domainkey.yourdomain.com. Selectors are what make key rotation and multiple senders possible.</li>
<li>Use 2048-bit RSA keys in 2026. 1024-bit is the accepted floor and <a href="https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final" rel="nofollow">NIST</a> deprecated it back in 2013; some providers now score it down.</li>
<li>A DKIM pass without DMARC proves little: the signing domain can be anyone's. Alignment with the From domain is what makes the pass mean something.</li>
</ul></aside><p>DKIM is the second leg of the authentication trio we map out in <a href="/guides/email-deliverability">our deliverability handbook</a>, and the counterpart to <a href="/blog/spf-record">SPF</a>, which authorizes sending servers by IP. SPF authenticates the connection; DKIM authenticates the message. The distinction sounds academic until a message leaves the original connection behind, at which point SPF has nothing to say and DKIM keeps working.</p>
<h2 id="what-the-signature-actually-covers">What the signature actually covers</h2><p>A common misreading: DKIM does not sign &quot;the email.&quot; It signs a hash of the body plus a hash over an explicit list of headers, and only what is listed is protected.</p>
<p>The signer computes a hash of the message body and stores it in the signature&#39;s <code>bh=</code> tag. It then builds a second hash over the headers named in the <code>h=</code> tag, in order, with the signature itself appended, and signs that with the private key to produce <code>b=</code>. RFC 6376 requires exactly one header in the list: From. Everything else is the signer&#39;s choice, and good signers include Subject, Date, To, and the MIME headers, because an unsigned header can be altered or added in transit without breaking the signature.</p>
<p>Two details worth knowing before you read your first header:</p>
<p>Canonicalization (<code>c=</code>) decides how forgiving verification is about whitespace and header formatting. <code>relaxed/relaxed</code> tolerates the folding and re-wrapping that real mail servers do to messages in flight; <code>simple</code> breaks if a single space changes. Sane platforms default to relaxed/relaxed, and this choice is a big part of why modern DKIM usually survives intermediate hops.</p>
<p>The <code>l=</code> tag limits the body hash to the first N bytes, letting anyone append content to a signed message without invalidating it. It exists for mailing-list compatibility and it is a hole. If your platform sets <code>l=</code>, ask why.</p>
<h2 id="selectors-what-s1domainkey-means">Selectors: what s1._domainkey means</h2><p>The public key does not live at a fixed address. The signature&#39;s <code>s=</code> tag names a selector, and the receiver queries:</p>
<div class="codewrap"><pre><code>&lt;selector&gt;._domainkey.&lt;domain&gt;    TXT
</code></pre></div>
<p>So <code>s=s1</code> with <code>d=example.com</code> sends the verifier to <code>s1._domainkey.example.com</code>. The names are arbitrary and every platform picks its own convention: Google Workspace uses <code>google</code>, SendGrid uses <code>s1</code> and <code>s2</code>, Microsoft 365 uses <code>selector1</code> and <code>selector2</code>. When a provider hands you two or three CNAME records at setup, those are selector records delegating the key lookup to infrastructure they control, which lets them rotate keys without asking you to touch DNS again.</p>
<p>Selectors are the mechanism behind two things you want. First, multiple simultaneous senders: your mail host signs with one selector, your newsletter <a href="/glossary#esp">ESP</a> with another, each verifying against its own key, no coordination required. Second, rotation: publish a new key at a new selector, switch signing to it, and retire the old one later, with zero downtime.</p>
<p>The record itself looks like this (chunked, for reasons in the next section):</p>
<div class="codewrap"><pre><code>s1._domainkey.example.com.  TXT  ( &quot;v=DKIM1; k=rsa; &quot;
    &quot;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC...IDAQAB&quot; )
</code></pre></div>
<p>The <code>p=</code> value is the base64 public key. An empty <code>p=</code> is the standard way to say a key is revoked.</p>
<h2 id="key-length-2048-in-2026">Key length: 2048 in 2026</h2><p>Use 2048-bit RSA keys. The floor is 1024: <a href="https://support.google.com/mail/answer/81126">Google&#39;s sender guidelines</a> require at least 1024 bits and recommend 2048, and NIST deprecated 1024-bit RSA for signatures back in 2013. <a href="https://www.rfc-editor.org/rfc/rfc8301.html">RFC 8301</a> (2018) updated DKIM&#39;s algorithm rules to match, requiring verifiers to handle keys from 1024 to 2048 bits and retiring SHA-1 signing outright. In 2026 there is no good reason to generate a new 1024-bit key, and several deliverability platforms now flag them in audits.</p>
<p>One operational consequence of 2048: the base64 public key no longer fits in a single 255-character TXT string, so the record must be split into two quoted strings that resolvers concatenate. Most DNS providers handle the split automatically; a few older panels do not, and the failure is silent, so after publishing, always verify with:</p>
<div class="codewrap"><pre><code>dig +short TXT s1._domainkey.example.com
</code></pre></div>
<p>If the output is empty or visibly truncated, your panel mangled the split.</p>
<h2 id="rotation-the-honest-version">Rotation: the honest version</h2><p><a href="https://www.m3aawg.org/DKIMKeyRotation">M3AAWG</a> (the industry working group on messaging abuse) recommends rotating DKIM keys at least every six months. The honest observation from running mail: most small senders never rotate, and nothing visibly breaks, because a DKIM private key leak is a quiet, low-probability event. That is precisely the argument for making rotation somebody else&#39;s job. If your signing runs through a provider that manages keys behind delegated CNAMEs, rotation happens without you. If you hold your own keys, the parallel-selector method is the whole trick: generate a new key, publish it at <code>s2</code>, switch signing to <code>s2</code>, leave <code>s1</code> published for at least a week so in-flight mail still verifies, then blank its <code>p=</code> value.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="how-to-read-a-dkim-header">How to read a DKIM header</h2><p>Open any message in Gmail, choose Show original, and find the <code>DKIM-Signature</code> header. A representative one:</p>
<div class="codewrap"><pre><code>DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=example.com; s=s1; t=1718200000;
        h=from:to:subject:date:mime-version:content-type;
        bh=4bRPuiVJrcsFY2Vd8MLtaCvMc3F7dQ38rapUqzHTGjY=;
        b=KxLZY0vN3q...
</code></pre></div>
<p>Read it in this order: <code>d=</code> is the domain claiming responsibility, <code>s=</code> is the selector (so the key is at <code>s1._domainkey.example.com</code>), <code>a=</code> is the algorithm (rsa-sha256 is the modern standard; treat rsa-sha1 as broken), <code>c=</code> is canonicalization, <code>h=</code> is the list of protected headers (check From is there; check Subject is too), <code>bh=</code> is the body hash, and <code>b=</code> is the signature itself. The <code>t=</code> tag is the signing timestamp. Gmail summarizes the verdict at the top of the same view: <code>DKIM: PASS with domain example.com</code> is what healthy looks like.</p>
<p>The <code>d=</code> domain is the one to squint at. A pass means that domain signed the message. It does not mean that domain matches the From address your reader sees.</p>
<h2 id="why-a-dkim-pass-alone-proves-little">Why a DKIM pass alone proves little</h2><p>Any domain can sign any message. A spammer signing with <code>d=spammer-infra.net</code> gets a perfectly valid DKIM pass while displaying your domain in the From line. The pass is real; it just vouches for the wrong party. What closes the gap is alignment, enforced by <a href="/blog/what-is-dmarc">DMARC</a>: the signature counts only when its <code>d=</code> domain matches the visible From domain. DKIM is the strongest link in the chain, and it still needs the chain; the full picture of how the three records interlock is in <a href="/blog/spf-dkim-dmarc">our SPF, DKIM, and DMARC overview</a>.</p>
<p>Survivability is what earns DKIM its keep. When Gmail was rejecting 73% of the mail we forwarded to an archive in June 2026, the mechanism was exactly this split: forwarding rewrites the sending IP, so SPF failed on every forwarded message, and only a message with an intact, aligned DKIM signature had any remaining way to pass DMARC. The signature rides inside the message; the connection details do not.</p>
<p>So: confirm every service that sends for you signs with your domain in <code>d=</code>, check the key length on your active selectors with a dig (a <code>p=</code> value around 220 characters is a 1024-bit key worth replacing; around 390 is 2048), and put a note in the calendar to rotate anything you self-manage. Then send yourself a test and read the header you just learned to read.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>What is a cold email? The honest definition</title>
    <link>https://letterduck.com/blog/what-is-cold-email</link>
    <guid isPermaLink="true">https://letterduck.com/blog/what-is-cold-email</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>What counts as a cold email, what separates it from spam and cold calls, when it works, and the anatomy of a message a stranger will answer.</description>
    <content:encoded><![CDATA[
<p>A cold email is a commercial message sent to one specific person who has never heard from you, for a reason you can state in a single sentence. That stated reason carries most of the difference between outreach and spam, and it is what separates cold emailing that works from the kind that gets your domain blocked.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>A cold email is one researched message to one stranger who plausibly benefits from it. Spam is the same message to everyone with an inbox.</li>
<li>In the US it is legal without consent: CAN-SPAM is an opt-out law. Canada and several EU countries require consent first.</li>
<li>It earns replies in B2B, where one closed deal pays for ten minutes of research per prospect. Consumer cold email at scale is spam with better fonts.</li>
<li>The message needs three load-bearing parts: who you are, why this person, and an easy way to say stop.</li>
</ul></aside><p>This article defines the term and draws the lines around it. The sending mechanics (separate domains, warm-up ramps, daily caps) live in our <a href="/guides/cold-email-infrastructure">cold email infrastructure guide</a>, and the statutes get a full treatment in <a href="/blog/is-cold-email-legal">is cold email legal</a>.</p>
<h2 id="the-definition-drawn-precisely">The definition, drawn precisely</h2><p>&quot;Cold&quot; describes the relationship. The recipient never subscribed, never bought anything, and would not recognize your name in the From line. The message is commercial: you want a reply, a call, a trial, an introduction. And it is individual. You picked this person after looking at what they do, and the email should prove it.</p>
<p>Sales teams call the practice outbound prospecting. Recruiters sourcing candidates, founders recruiting design partners, and freelancers pitching editors run the same play under different names.</p>
<p>Three neighbors it gets confused with. A newsletter goes to people who asked for it. A transactional email, like a receipt or a password reset, goes to people who triggered it. Spam goes to whoever a scraper found. Cold email sits in the fourth quadrant alone: unasked for, but aimed.</p>
<h2 id="cold-email-vs-spam-the-three-lines">Cold email vs spam: the three lines</h2><p>Consent separates neither category, because both arrive uninvited. The separation happens on relevance, identification, and the out.</p>
<div class="tblwrap"><table><thead><tr><th>Question</th><th>Cold email</th><th>Spam</th></tr></thead><tbody><tr><td>Who gets it</td><td class="yes">A named person you researched</td><td class="no">Every address a scraper found</td></tr>
<tr><td>Why them</td><td class="yes">A specific, stated reason</td><td class="no">They had an inbox</td></tr>
<tr><td>Who sent it</td><td class="yes">Real name, real company, working reply address</td><td class="no">Forged or rotating identities</td></tr>
<tr><td>The way out</td><td class="yes">A plain &quot;tell me to stop&quot; that is honored</td><td class="no">Hidden, fake, or a click trap</td></tr>
<tr><td>Daily volume</td><td class="yes">Dozens per sender</td><td class="no">Millions</td></tr></tbody></table></div><p>The legal line runs close to that table. CAN-SPAM requires truthful headers and subject lines, a physical postal address, and an opt-out honored within ten business days, and it prices violations per email. The practical line is stricter, because mailbox providers count complaints instead of reading statutes. <a href="https://support.google.com/mail/answer/81126">Gmail&#39;s bulk-sender rules</a>, published February 2024, set a spam-complaint target under 0.1% and a hard ceiling at 0.3%; cross the ceiling and Gmail withholds delivery help until you stay under it for seven consecutive days. Our own send path pauses automatically at those exact thresholds, because stopping a campaign is cheaper than a week of earning back trust.</p>
<h2 id="cold-email-vs-cold-calls-vs-ads">Cold email vs cold calls vs ads</h2><p>The three ways to reach a stranger have different cost structures, and the differences decide when each one makes sense.</p>
<div class="tblwrap"><table><thead><tr><th></th><th>Cold email</th><th>Cold calling</th><th>Paid ads</th></tr></thead><tbody><tr><td>Cost per contact</td><td>Research minutes plus a fraction of a cent to send</td><td>A person&#39;s time, one call at a time</td><td>The auction price of every click</td></tr>
<tr><td>What failure costs</td><td>Your domain&#39;s sending reputation</td><td>Little beyond the wasted hours</td><td>Budget</td></tr>
<tr><td>Scales with</td><td>Domain reputation, slowly, through warm-up</td><td>Headcount</td><td>Money, instantly</td></tr>
<tr><td>Feedback quality</td><td>Written replies you can reread and count</td><td>Live objections, the richest signal there is</td><td>Click rates with no words attached</td></tr>
<tr><td>Channel ownership</td><td class="yes">Your domain and your list</td><td class="yes">Your phone</td><td class="no">A rented auction that reprices daily</td></tr></tbody></table></div><p>The row that matters is failure cost. Ads waste money and calls waste time, but both losses stop when you stop. Cold email failure compounds: spam complaints degrade the domain that carries the rest of your mail. That asymmetry is why this cluster spends an entire article on <a href="/blog/cold-email-domain">setting up a separate outreach domain</a>.</p>
<h2 id="when-it-works-and-when-it-cannot">When it works, and when it cannot</h2><p>Cold email works when three conditions hold at once. The target is a business, so the address is professional and the message concerns the recipient&#39;s job. The deal size pays for research, because ten minutes per prospect only makes sense when a closed deal is worth thousands. And the sender is a human who can hold the conversation a reply starts. Send fifty researched emails, not five thousand scraped ones.</p>
<p>It cannot work as consumer marketing. Law is one reason: Canada&#39;s CASL requires consent before commercial email, and Germany reads its ePrivacy rules the same way. Arithmetic is the other. A 0.3% complaint ceiling means three complaints per thousand delivered messages, and consumers who have never heard of you tap &quot;report spam&quot; without a second thought. Three annoyed strangers per thousand. No purchased consumer list survives that ceiling for long. <strong>Cold email to consumer inboxes at scale is spam, whatever the tool selling it to you calls it.</strong></p>
<p>One myth worth retiring: Gmail defines a &quot;bulk sender&quot; as 5,000+ messages a day, and small senders read the number as an exemption. It is the threshold for extra requirements like one-click unsubscribe. The authentication and complaint rules apply at any volume, and we follow them at dozens of messages a day.</p>
<p><aside class="ctabox">
    <div class="h">Outreach needs a home that can take a punch</div>
    <p>LetterDuck builds the warm-up ramp, the suppression list, and one-click unsubscribe into the send path itself. Flat $50 per domain, unlimited addresses.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="the-anatomy-of-a-legitimate-cold-email">The anatomy of a legitimate cold email</h2><p>Every line of a defensible cold email does one of three jobs: identify you, deliver the reason, or offer the out. The example below is ours, written for this article; both companies and the postal address are invented.</p>
<div class="codewrap"><pre><code>From: Maya Chen &lt;maya@brightloop-hq.com&gt;
Subject: Question about Ridgeline&#39;s onboarding queue

Hi Sam,

Your careers page lists four support hires this quarter, which
usually means the onboarding queue is growing faster than the team.

Brightloop automates the account-provisioning half of that queue.

Worth a 15-minute look, or is onboarding not your side of the org?

If you would rather not hear from me again, say so and I will stop.

Maya Chen, Brightloop
2201 Fourth Ave, Suite 900, Seattle, WA 98121
</code></pre></div>
<p>Identification is the From line, the signature, and the postal address; the address is a CAN-SPAM requirement, and a registered PO box satisfies it. Value is the middle: one observed fact about the recipient, one plain sentence about what you do, one small question. The out is the sentence near the end, and it must be honored the moment someone uses it. On newsletter sends our workspace stamps <a href="https://www.rfc-editor.org/rfc/rfc8058.html">RFC 8058</a> one-click unsubscribe headers automatically; a one-to-one cold email carries its out as a sentence instead, but the discipline behind both is identical. Whoever says stop goes onto a suppression list that is checked before every future send and never expires.</p>
<p>Notice what the example omits. No &quot;hope this finds you well.&quot; No attachment. No fourth paragraph. It runs four sentences because the reader decides in two.</p>
<h2 id="where-to-start">Where to start</h2><p>Work these in order:</p>
<ol>
<li>Rules first. Confirm what your target countries require. The legal article linked above covers CAN-SPAM, GDPR, and CASL in operator terms.</li>
<li>Domain second. Buy a separate outreach domain and publish <a href="/glossary#spf">SPF</a>, <a href="/glossary#dkim">DKIM</a>, and <a href="/glossary#dmarc">DMARC</a> on day one. The domain article linked above walks the checklist in order.</li>
<li>Volume third. Set a daily cap before the first send. <a href="/blog/how-many-cold-emails-per-day">How many cold emails per day</a> publishes the caps math from our own throttle policy.</li>
<li>Copy fourth. Start from working <a href="/blog/cold-email-templates">cold email templates</a> and spend most of your effort on <a href="/blog/cold-email-subject-lines">the subject line</a>, which decides whether anything else gets read.</li>
<li>Persistence fifth. Most replies arrive after the <a href="/blog/cold-email-follow-up">follow-up</a>, so plan the sequence before message one goes out.</li>
</ol>
<p>Copy sits at step four on purpose. A perfect email from an unauthenticated domain never reaches the inbox it was written for.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>We priced 14 email providers so you do not have to</title>
    <link>https://letterduck.com/blog/what-email-costs</link>
    <guid isPermaLink="true">https://letterduck.com/blog/what-email-costs</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>87 plans, 73 sources, one August 2026 afternoon of reading pricing pages. The six findings that surprised us, plus the whole field on one table.</description>
    <content:encoded><![CDATA[
<p>Four of the fourteen email providers we priced raised prices within the past twelve months, and not one of them let existing customers keep the old rate past their next renewal. That is the kind of thing you only notice when you read every pricing page in a category on the same day, which is what we did on August 7, 2026, to build the dataset behind <a href="/guides/email-pricing">our email pricing guide</a> and every comparison table on this site.</p>
<p>The output is a single JSON file: 14 providers besides our own, 87 published plans, 73 named sources, and the cost of each product computed at 1, 5, and 10 seats and at 500, 1,000, 5,000, and 10,000 subscribers. Every price table you see on this site renders from it, stamped with the date it was checked. This post is what the exercise taught us.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Google Workspace and Microsoft 365 have converged on the same three numbers: $7, $14, and $22 per user per month on annual billing.</li>
<li>Both charge exactly 20% more for month-to-month, and Microsoft adds a further 5% for paying an annual term in installments.</li>
<li>Two providers in the set bill you for contacts who unsubscribed. Six state in writing that they do not.</li>
<li>Substack's 10% cut becomes the largest bill in the dataset at about $5,000 a month of paid revenue.</li>
<li>Three of the best-known free tiers shrank or disappeared between July 2025 and February 2026.</li>
</ul></aside><h2 id="what-we-actually-did">What we actually did</h2><p>For each provider we opened the live pricing page and transcribed every plan: name, monthly price, annual-billing effective price, unit, and the limits attached. Where the page was rendered in JavaScript we read the data the page itself loads, which is more reliable than the rendered text. Kit&#39;s price ladder came out of its pricing bundle, beehiiv&#39;s out of the widget behind its slider, MailerLite&#39;s out of the USD matrix in the page source, Brevo&#39;s out of the billing API its calculator queries, and Zoho&#39;s out of the JSON feed that renders its table.</p>
<p>Then we normalized. Prices are US list prices in USD, annual-billing effective where annual billing exists, and the plan we price is the cheapest one that can actually do the job rather than the cheapest one on the page. Introductory promotions are excluded, because month 13 is the price you live with. For each provider we also wrote down four things it genuinely does better than we do and four things that genuinely cost its customers money, from the provider&#39;s own documentation.</p>
<p>Two things we could not get, stated plainly. Enterprise pricing does not exist in public anywhere: Google Enterprise, beehiiv Enterprise, Brevo Enterprise, Ghost Custom, and SendGrid Premier are all quote-only. And Constant Contact&#39;s pricing page returns HTTP 403 to automated fetches, so its tiers are the one set in the file cross-checked against three independent sources rather than read from the source, all updated between June 16 and June 30, 2026.</p>
<h2 id="six-things-that-surprised-us">Six things that surprised us</h2><h3 id="1-the-two-suites-have-converged-on-identical-numbers">1. The two suites have converged on identical numbers</h3><p>Google Workspace charges $7, $14, and $22 per user per month on annual billing for Business Starter, Standard, and Plus. Microsoft 365 Business charges $7, $14, and $22 for Basic, Standard, and Premium. Microsoft only arrived there on July 1, 2026, when Basic went from $6 to $7 (up 16%), Standard from $12.50 to $14 (up 12%), and Apps for business from $8.25 to $10 (up 21%). Premium was already $22.</p>
<p>Two companies competing this hard do not land on the same three numbers by coincidence. It reads as a price umbrella, and it means the suite decision is genuinely about the bundle rather than the bill. The tier-by-tier math is on our <a href="/pricing/google-workspace">Google Workspace pricing page</a>, and <a href="/compare/google-workspace-vs-microsoft-365">Google Workspace vs Microsoft 365</a> referees the choice.</p>
<h3 id="2-flexibility-has-a-published-price-and-it-is-20">2. Flexibility has a published price, and it is 20%</h3><p>Google&#39;s Flexible plan is exactly 20% above the annual rate: $8.40, $16.80, and $26.40 against $7, $14, and $22. Microsoft&#39;s month-to-month rates are the same $8.40, $16.80, and $26.40. Microsoft then adds a second lever most buyers never see: since April 1, 2025, paying an annual-term subscription in monthly installments carries a 5% surcharge. So there are three prices for the same seat, not two.</p>
<p>The rest of the field is all over the map. Zoho&#39;s Mail Lite and Premium have no monthly option at all, only 12 months prepaid per seat. Kit&#39;s annual plan is exactly ten times the monthly price, so a year of monthly billing costs 20% more. beehiiv&#39;s annual is 12% off, MailerLite&#39;s and Brevo&#39;s are 10% off, and Klaviyo, Buttondown, SendGrid, and Mailchimp publish no annual rate at all. When a comparison article quotes prices without saying which billing basis it used, the numbers are worth nothing.</p>
<h3 id="3-two-providers-bill-you-for-people-you-cannot-email">3. Two providers bill you for people you cannot email</h3><p>Mailchimp counts subscribed, unsubscribed, and non-subscribed contacts toward your billable total and never archives anyone automatically. SendGrid&#39;s Marketing Campaigns bills stored contacts, unsubscribed ones included. Everyone else we checked excludes them: Kit bills unique active subscribers, beehiiv bills active subscribers only, Klaviyo drops suppressed profiles from the count, MailerLite excludes unsubscribed and bounced addresses, Constant Contact confirmed in its own community that unsubscribes are not billed, Buttondown bills active subscribers, and Ghost and Substack do not price on this axis at all.</p>
<p>The money is not theoretical. On Mailchimp Essentials the difference between the 2,500-contact tier and the 5,000-contact tier is $45 against $75 a month, so a few hundred dead contacts can cost $360 a year for nothing. Our <a href="/pricing/mailchimp">Mailchimp pricing teardown</a> walks that example. If you take one action from this post, go archive your unsubscribes.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h3 id="4-substack39s-cut-outgrows-every-flat-plan-in-the-set">4. Substack&#39;s cut outgrows every flat plan in the set</h3><p>Substack has no plan ladder to transcribe, which made it the strangest row to build. A free publication costs $0 at any list size. The bill starts when the revenue does: 10% to Substack, plus Stripe&#39;s 2.9% and $0.30 per transaction, plus a 0.7% Stripe Billing fee.</p>
<p>On a $5-a-month subscription, the minimum Substack allows, that stack takes $0.98, an all-in rate of 19.6%. Two hundred and fifty paying readers gross $1,250 a month and hand back about $245 of it. At $5,000 a month of paid revenue, the platform cut alone is $500 a month, more than the priciest published beehiiv plan ($459 at 100,000 subscribers) or Ghost plan ($399 a month at 100,000 members on annual billing), both of which take 0% of subscription revenue. The 10% has not moved since 2017. Full arithmetic on <a href="/pricing/substack">our Substack pricing page</a>.</p>
<h3 id="5-deliverability-is-an-upsell-nearly-everywhere">5. Deliverability is an upsell nearly everywhere</h3><p>This is the finding that hit closest to home. Across the set, the things that actually keep mail out of spam are sold as line items. Brevo charges $251 a year for a <a href="/glossary#dedicated-ip">dedicated IP</a> and $12 a month to remove its logo from your emails on the Starter plan. SendGrid gates email validation to its Pro tier and charges $30 a month per additional IP. Constant Contact sells inbox preview as a $10-a-month add-on. Buttondown puts dedicated IPs on the $79 Professional plan, and beehiiv reserves them for quote-only Enterprise.</p>
<p>There is a whole product category selling the ramp itself, which we priced separately in <a href="/best/email-warmup-tools">the best email warm-up tools</a>. Our position is that a <a href="/glossary#warm-up">warm-up</a> schedule is not a product, it is a throttle: ours computes roughly 150 sends on day one, multiplying by about 1.4 a day to around 1,100 by day seven, enforces whichever is lower of that curve and the relay ceiling (95 a day on our current plan), and pauses the send path entirely at a 0.3% complaint rate or 2% bounce rate. If you want the mechanics rather than the pricing, we wrote up <a href="/blog/email-warm-up">how email warm-up actually works</a>.</p>
<h3 id="6-the-free-tier-you-remember-probably-shrank-or-died">6. The free tier you remember probably shrank or died</h3><p>Three of the best-known free plans in email changed inside seven months. SendGrid&#39;s forever-free 100 emails a day was retired on July 26, 2025, and new accounts now get a 60-day trial and then a bill. MailerLite&#39;s free plan went from 1,000 subscribers to 500 in September 2025 and then to 250 subscribers and 2,500 emails a month. Mailchimp cut its free plan from 500 contacts and 1,000 sends to 250 contacts and 500 sends, effective February 17, 2026.</p>
<p>Generous free tiers do still exist, with a catch attached to each. Kit is free to 10,000 subscribers but withholds automations, sequences, and integrations. beehiiv is free to 2,500 active subscribers, and then the next stop is $89 a month on monthly billing, which is roughly a $0 to $1,000-a-year step for one subscriber. Brevo&#39;s free plan stores 100,000 contacts but caps sending at 300 a day, so a single blast to 1,000 people cannot go out. Zoho hosts five users free but blocks IMAP and POP, so no desktop mail client can connect.</p>
<h2 id="the-whole-field-an-email-pricing-comparison-in-one-table">The whole field: an email pricing comparison in one table</h2><div class="tblwrap"><table><thead><tr><th>Provider</th><th>What the meter counts</th><th>Cheapest paid entry</th><th>Free tier</th></tr></thead><tbody><tr><td class="dim">Google Workspace</td><td>seats</td><td>$7/user/mo annual</td><td class="no">none, 14-day trial</td></tr>
<tr><td class="dim">Microsoft 365 Business</td><td>seats</td><td>$7/user/mo annual</td><td class="no">none, 1-month trial</td></tr>
<tr><td class="dim">Zoho Mail</td><td>seats</td><td>$1/user/mo, annual only</td><td class="yes">5 users, 1 domain, no IMAP</td></tr>
<tr><td class="dim">Mailchimp</td><td>contacts, unsubscribes included</td><td>$13/mo at 500 contacts</td><td class="soft">250 contacts, 500 sends</td></tr>
<tr><td class="dim">Constant Contact</td><td>contacts</td><td>$10.20/mo at 500 (annual prepay)</td><td class="no">none, 14-day trial</td></tr>
<tr><td class="dim">Klaviyo</td><td>active profiles</td><td>$20/mo at 500 profiles</td><td class="soft">250 profiles, 500 sends</td></tr>
<tr><td class="dim">MailerLite</td><td>active subscribers</td><td>$10.80/mo at 500</td><td class="soft">250 subscribers, 2,500 emails</td></tr>
<tr><td class="dim">Kit</td><td>unique active subscribers</td><td>$32.50/mo to 1,000</td><td class="yes">10,000 subscribers, no automations</td></tr>
<tr><td class="dim">beehiiv</td><td>active subscribers</td><td>$43/mo to 1,000</td><td class="yes">2,500 active subscribers</td></tr>
<tr><td class="dim">Buttondown</td><td>active subscribers</td><td>$9/mo to 1,000</td><td class="soft">100 subscribers</td></tr>
<tr><td class="dim">Ghost(Pro)</td><td>members</td><td>$15/mo to 1,000</td><td class="no">none, 14-day trial</td></tr>
<tr><td class="dim">Substack</td><td>10% of paid revenue</td><td>$0 until you monetize</td><td class="yes">unlimited, until you monetize</td></tr>
<tr><td class="dim">Brevo</td><td>emails sent</td><td>$8.08/mo for 5,000 emails</td><td class="yes">300 emails/day, 100k contacts stored</td></tr>
<tr><td class="dim">SendGrid</td><td>emails sent, and contacts stored</td><td>$19.95 API, $15 marketing</td><td class="no">none since July 26, 2025</td></tr>
<tr><td class="yes">LetterDuck (ours)</td><td>domains</td><td>$50/mo flat</td><td class="no">none, waitlist</td></tr></tbody></table></div><p>Annual-billing effective prices where offered. Checked August 7, 2026.</p>
<h2 id="tell-us-when-a-number-drifts">Tell us when a number drifts</h2><p>Every one of these numbers has a shelf life, and the past year suggests that shelf life is short. Four providers raised prices in twelve months. Three cut free tiers. Two renamed their entire plan lineup, which is why third-party pricing articles written before June 2026 quote MailerLite plans that no longer exist and Kit prices from before the October 2025 increase.</p>
<p>So the tables on this site carry the date they were checked, our sources are listed on each pricing page, and one of the products in the dataset is ours and is labeled every time it appears. There are no affiliate links anywhere here, which is the only reason we can put Zoho at $1 a seat next to our $50 and let you draw the obvious conclusion for a five-person team.</p>
<p>If a price on this site is stale, wrong, or missing a fee we did not spot, tell us. Our <a href="/editorial">editorial page</a> has the correction policy and the address to send it to, and corrections get made in the dataset, which means every table on every page updates at once. That is the whole reason we built it as data instead of prose.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Welcome email examples: 5 originals you can adapt</title>
    <link>https://letterduck.com/blog/welcome-email-examples</link>
    <guid isPermaLink="true">https://letterduck.com/blog/welcome-email-examples</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>Five original welcome emails for different newsletter types, plus the three jobs every welcome email has and why a reply prompt helps deliverability.</description>
    <content:encoded><![CDATA[
<p>The welcome email is the only message you will ever send with close to guaranteed attention: the subscriber asked for it seconds ago. Every issue after this one lands in a crowded inbox and competes. This one arrives while the person is still thinking about you, and what you do with that attention decides whether issue two gets opened. It also shapes something less visible: how Gmail scores the next thousand emails your domain sends.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>A welcome email has three jobs: deliver what the signup promised, state your cadence in plain words, and ask one easy question that invites a reply.</li>
<li>Send it instantly, from a real address a human answers. Never noreply@.</li>
<li>A reply is the strongest engagement signal a subscriber can give: mailbox providers weight replies above clicks, and clicks above opens.</li>
<li>Five complete examples below, all written by us for different newsletter shapes. Copy anything.</li>
</ul></aside><p>This article assumes people can already subscribe to you. If you are still wiring that up, start with our guide to <a href="/guides/newsletter-on-your-own-domain">running a newsletter on your own domain</a> and come back for this part.</p>
<h2 id="the-three-jobs-of-a-welcome-email">The three jobs of a welcome email</h2><p>A welcome email that works does three things. Everything else is decoration.</p>
<p>First, deliver the promise. If the signup form offered a guide, the guide is the first line, not paragraph four. If it offered a weekly digest, hand over the best of the archive right now so the subscriber gets value before the first scheduled issue. An empty &quot;thanks for subscribing&quot; wastes the one send with guaranteed attention.</p>
<p>Second, set expectations. What arrives, how often, from which address. A subscriber who knows the Tuesday issue is coming does not mark it as spam on Tuesday. Asking them to add your address to their contacts is worth one line here; a contact add is a small positive signal and it costs nothing to ask.</p>
<p>Third, ask for a reply. One question, specific and easy. This is the deliverability play, and it is the part most welcome emails skip. Mailbox providers rank engagement in a clear order: replies above clicks, clicks above opens. A reply tells Gmail this sender is a correspondent, not a broadcaster, and that judgment matters most in the first weeks, while a new domain&#39;s reputation is still forming (reputation on a fresh domain matures over 4 to 8 weeks). &quot;Let me know your thoughts&quot; gets no replies. &quot;What made you subscribe today?&quot; gets some, and you only need some.</p>
<h2 id="send-it-instantly-from-an-address-that-answers">Send it instantly, from an address that answers</h2><p>Timing is simple: the welcome fires the moment the subscription completes, not in tonight&#39;s batch. Fifteen minutes later the person has moved on and your carefully written email is just another unread row.</p>
<p>The From address matters more than most people think. Never send a welcome from noreply@. It contradicts the email&#39;s own reply prompt, and a subscriber who replies anyway gets a bounce as their first interaction with you. Use a real address: hello@, yourname@, editor@. On LetterDuck an address is a routing rule, not a paid seat, so a dedicated hello@yourdomain costs nothing, and replies thread into a shared inbox where you answer as that address.</p>
<p><aside class="ctabox">
    <div class="h">Your newsletter, your domain, replies included</div>
    <p>Send the welcome from a real address on your own domain instead of noreply@, and answer the replies in a threaded inbox. Unlimited addresses, $50 per domain, flat.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="double-opt-in-makes-it-a-two-part-welcome">Double opt-in makes it a two-part welcome</h2><p>If you confirm subscriptions (we think you should, and we wrote out <a href="/blog/double-opt-in">the double opt-in math</a> separately), the welcome becomes two emails with two different jobs. Part one is the confirmation: one sentence, one button, no marketing. Part two is the welcome proper, and it fires the instant the confirmation click lands. Do not merge them. An unconfirmed address might be a typo or a bot, so welcome content is wasted on it, and anything you add to the confirmation dilutes its single job, which is the click.</p>
<h2 id="five-welcome-emails-written-by-us">Five welcome emails, written by us</h2><p>The usual &quot;welcome email examples&quot; post is screenshots of other companies&#39; mail. These five are originals we wrote for the newsletter shapes we see most, in the plain register we argue for in <a href="/blog/how-to-write-a-newsletter">how to write a newsletter</a>. Steal any of them.</p>
<h3 id="1-the-personal-essay-newsletter">1. The personal essay newsletter</h3><div class="codewrap"><pre><code>Subject: You&#39;re in. Here&#39;s the deal.

You subscribed to [Name], so here is exactly what that means.

One essay, most Fridays, usually about [topic]. No roundups,
no sponsor breaks between paragraphs. When I have nothing
worth your time, I skip the week.

Start with the piece people share most:
[link to your best essay]

One question before you go: what made you subscribe today?
Hit reply and tell me. I read everything.

[Your name]
</code></pre></div>
<p>The cadence carries an honest escape clause. &quot;I skip the week&quot; builds more trust than an &quot;every Friday&quot; you will not keep. One link, one question, done.</p>
<h3 id="2-the-curated-links-digest">2. The curated links digest</h3><div class="codewrap"><pre><code>Subject: Welcome. Your first five links are inside.

Every Tuesday: five links on [niche], each with two sentences
on why it matters. Fifteen minutes of reading, tops.

So you don&#39;t have to wait a week, five from the archive:

- [Link]: one line on why it mattered
- [Link]: one line
- [Link]: one line
- [Link]: one line
- [Link]: one line

Reply with the best thing you read this month and it might
make next Tuesday&#39;s issue, credited to you.

[Name]
</code></pre></div>
<p>A curation newsletter can deliver its product inside the welcome itself, so it should. The reply prompt doubles as sourcing.</p>
<h3 id="3-the-indie-product-changelog">3. The indie product changelog</h3><div class="codewrap"><pre><code>Subject: Subscribed: [Product] updates, monthly-ish

You&#39;ll get an email when we ship something worth telling you
about. In practice that is about once a month. No feature
votes, no &quot;we&#39;ve been quiet lately&quot; filler.

Last month we shipped [feature]: [one line on what it does].
Full changelog: [link]

What is the one thing [Product] doesn&#39;t do that you wish it
did? Reply and it goes straight into the planning doc.

[Founder name], [Product]
</code></pre></div>
<p>&quot;Monthly-ish&quot; is an honest cadence for a changelog, and the reply prompt is roadmap research you would otherwise pay for.</p>
<h3 id="4-the-local-newsletter">4. The local newsletter</h3><div class="codewrap"><pre><code>Subject: Welcome to [Name]. First question: where do you live?

Twice a week, everything worth knowing in [town]: council
decisions, openings and closings, and the stories the
regional paper skips.

Reply with your neighborhood and I&#39;ll keep a closer eye on
it. Not a gimmick: half our best stories start as reader
replies.

While you wait for Thursday&#39;s issue, the three most-read
stories this year: [links]
</code></pre></div>
<p>The reply prompt sits in the subject line itself. A local newsletter runs on reader tips, so the deliverability signal and the editorial engine are the same mechanism.</p>
<h3 id="5-the-paid-newsletter-with-a-free-tier">5. The paid newsletter with a free tier</h3><div class="codewrap"><pre><code>Subject: You&#39;re on the free list. Here is exactly what that means.

Free: the Monday issue, every week, full length.
Paid ([price]/month): Thursday deep dives plus the archive.

No guilt trips. The Monday issue has to earn the upgrade on
its own.

Read the deep dive most subscribers upgrade for, free
for new readers: [link]

Reply if the link is broken or you have a question about
[topic]. A human answers, usually me, usually same day.
</code></pre></div>
<p>Drawing the free/paid line in the welcome prevents the churn that surprise paywalls cause later. The free sample does the selling so the copy does not have to.</p>
<h2 id="before-you-turn-it-on">Before you turn it on</h2><p>Run the finished email against this list:</p>
<ul>
<li>It fires instantly on confirmation (or on signup, if you run single opt-in).</li>
<li>It comes from a real address a human reads.</li>
<li>The signup form&#39;s promise is delivered in the first two lines.</li>
<li>The cadence is stated in plain words, with honest hedges.</li>
<li>There is exactly one question, and it is easy to answer.</li>
<li>The subject line does its own work; if it reads like a receipt, borrow from our notes on <a href="/blog/newsletter-subject-lines">newsletter subject lines</a>.</li>
</ul>
<p>Then send yourself a test, read it on a phone, and answer honestly: would you reply to this? If not, cut it in half and sharpen the question.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>The SPF record: syntax, limits, and breakages</title>
    <link>https://letterduck.com/blog/spf-record</link>
    <guid isPermaLink="true">https://letterduck.com/blog/spf-record</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>A working reference for SPF record syntax: every mechanism and qualifier with examples, the 10-lookup limit, flattening, and the most common breakages.</description>
    <content:encoded><![CDATA[
<p>An SPF record is one TXT record on your domain listing every server allowed to send mail for it, and it fails in more ways than any other line of DNS we manage. The syntax is small (eight mechanisms, four qualifiers, two modifiers) but the operational traps are real: a hard 10-lookup ceiling, a one-record rule, and a 255-character string limit, each of which can silently turn your record into an error that receivers score against you. This page is the reference we wish had existed when we set up ours.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>One TXT record, starting with v=spf1, listing mechanisms left to right, ending with an all. Two SPF records on one domain is an automatic permerror.</li>
<li>include, a, mx, exists, ptr, and redirect each cost a DNS lookup; the hard limit is 10. Past it, receivers return permerror, and DMARC treats permerror as failure.</li>
<li>Publish ~all, not -all, and let DMARC do the enforcement. The tradeoff is named below.</li>
<li>SPF checks the Return-Path domain, not the From your reader sees, and it breaks on every forwarded message. It is one leg of a system, never the whole answer.</li>
</ul></aside><p>SPF (Sender Policy Framework, <a href="https://www.rfc-editor.org/rfc/rfc7208.html">RFC 7208</a>, published 2014) answers a single question for the receiving server: is the IP address delivering this message allowed to send for the domain in its envelope sender? It says nothing about message integrity (that is <a href="/blog/what-is-dkim">DKIM&#39;s job</a>) and enforces nothing by itself (that is <a href="/blog/what-is-dmarc">DMARC&#39;s</a>). Where it fits in the larger system is covered in <a href="/guides/email-deliverability">our deliverability handbook</a>; this page is the syntax and the failure catalog.</p>
<h2 id="anatomy-of-a-record">Anatomy of a record</h2><div class="codewrap"><pre><code>example.com.  TXT  &quot;v=spf1 ip4:203.0.113.0/24 include:_spf.google.com ~all&quot;
</code></pre></div>
<p>Left to right: the version tag (always <code>v=spf1</code>, always first), then mechanisms evaluated in order, then a catch-all. The first mechanism that matches decides the result and evaluation stops. Order matters: put your highest-volume sources first, and <code>all</code> always last.</p>
<h2 id="the-mechanisms-one-by-one">The mechanisms, one by one</h2><div class="tblwrap"><table><thead><tr><th>Mechanism</th><th>Matches when</th><th>Costs a DNS lookup</th></tr></thead><tbody><tr><td><code>all</code></td><td>Always; terminates the record</td><td class="no">No</td></tr>
<tr><td><code>ip4:</code> / <code>ip6:</code></td><td>The sending IP is in the listed address or CIDR range</td><td class="no">No</td></tr>
<tr><td><code>a</code></td><td>The sending IP matches an A/AAAA record of the domain</td><td class="yes">Yes</td></tr>
<tr><td><code>mx</code></td><td>The sending IP matches one of the domain&#39;s MX hosts</td><td class="yes">Yes</td></tr>
<tr><td><code>include:</code></td><td>The named domain&#39;s own SPF record produces a pass</td><td class="yes">Yes</td></tr>
<tr><td><code>exists:</code></td><td>A constructed hostname resolves at all</td><td class="yes">Yes</td></tr>
<tr><td><code>ptr</code></td><td>Reverse DNS matches the domain</td><td class="yes">Yes, and do not use it</td></tr></tbody></table></div><p><code>ip4:</code> and <code>ip6:</code> are the cheapest and most precise: <code>ip4:203.0.113.7</code> for one server, <code>ip4:203.0.113.0/24</code> for a range. Use them when you control the sending IPs. They cost no lookups, which becomes the whole game later.</p>
<p><code>include:</code> is how you authorize a provider. <code>include:_spf.google.com</code> pulls in Google&#39;s record and passes if their evaluation passes. Despite the name, nothing is textually included; it is a nested evaluation, and every nested <code>include</code> inside the provider&#39;s record counts against your lookup budget too.</p>
<p><code>a</code> and <code>mx</code> look convenient and usually are not. <code>mx</code> in particular encodes an assumption that the servers receiving your mail also send it, which stopped being true for most domains once an <a href="/glossary#esp">ESP</a> entered the picture. Your <a href="/glossary#mx-record">MX records</a> point at whoever receives your mail; your outbound often lives elsewhere. Prefer explicit <code>ip4</code> or <code>include</code>.</p>
<p><code>exists:</code> triggers a lookup of a constructed name and passes if it resolves; it enables per-IP macros and almost nobody needs it. <code>ptr</code> is formally discouraged by RFC 7208 itself: slow, unreliable, and some receivers skip it entirely. If you find <code>ptr</code> in your record, remove it today.</p>
<h2 id="qualifiers-the-character-before-the-mechanism">Qualifiers: the character before the mechanism</h2><div class="tblwrap"><table><thead><tr><th>Qualifier</th><th>On match</th><th>Typical use</th></tr></thead><tbody><tr><td><code>+</code></td><td>Pass</td><td>Default; <code>include:</code> means <code>+include:</code></td></tr>
<tr><td><code>-</code></td><td>Fail</td><td><code>-all</code>: unlisted senders hard-fail</td></tr>
<tr><td><code>~</code></td><td>Softfail</td><td><code>~all</code>: unlisted senders are suspect</td></tr>
<tr><td><code>?</code></td><td>Neutral</td><td>Effectively no opinion; rare and mostly useless</td></tr></tbody></table></div><p>In practice you will only ever type a qualifier on <code>all</code>, which brings us to the argument.</p>
<h2 id="all-or--all-our-position">~all or -all: our position</h2><p>Publish <code>~all</code>, and pair it with an enforced DMARC policy.</p>
<p>The case: <code>-all</code> asks receivers to refuse mail at SMTP time on SPF evidence alone, and SPF evidence is structurally unreliable, because forwarding rewrites the sending IP. Every message forwarded from your domain (a university alumni address, an old work account someone redirects) fails SPF at its final destination by design. In June 2026 we watched this class of failure from the receiving side, when Gmail rejected 73% of the mail we were forwarding to an archive; <a href="/blog/spf-dkim-dmarc">the full incident is in our SPF/DKIM/DMARC overview</a>. With <code>~all</code>, a forwarded message survives SPF to be judged on its DKIM signature. With <code>-all</code>, some receivers never get that far.</p>
<p>Meanwhile <code>-all</code> buys you almost nothing that DMARC does not do better. Spoofing protection is DMARC&#39;s job, done with alignment and your published policy, after both SPF and DKIM have been considered. A domain at <code>p=reject</code> with <code>~all</code> is far better defended than a domain at <code>-all</code> with no DMARC.</p>
<p>The tradeoff, named: <code>~all</code> alone, without DMARC, deters nobody, since softfail carries no mandatory consequence. If you genuinely will not publish a DMARC record, <code>-all</code> is the lesser evil. Our position assumes you will do the whole system, because half the system is not worth much.</p>
<h2 id="the-10-lookup-limit-and-flattening">The 10-lookup limit and flattening</h2><p>RFC 7208 section 4.6.4 caps evaluation at 10 DNS-querying mechanisms per check. <code>include</code>, <code>a</code>, <code>mx</code>, <code>exists</code>, <code>ptr</code>, and the <code>redirect</code> modifier each count, including every nested lookup inside every include chain. Cross the line and the receiver returns permerror, a permanent evaluation error. Under DMARC, permerror means SPF contributes nothing, so if DKIM also fails you are now failing DMARC because your record was too long. (A separate cap: more than 2 lookups returning no answer, so-called void lookups, is also a permerror.)</p>
<p>This ceiling arrives faster than it reads. A plausible small-business record:</p>
<div class="codewrap"><pre><code>&quot;v=spf1 include:_spf.google.com include:sendgrid.net include:servers.mcsv.net include:_spf.salesforce.com ~all&quot;
</code></pre></div>
<p>Four includes, but each expands: Google&#39;s chain alone resolves through multiple nested includes. Ten is not a distant limit; it is two or three SaaS signups away for most companies. Check where you stand with an SPF-specific checker (MxToolbox and dmarcian both count lookups for free) rather than eyeballing the record, because the nested expansions are invisible in your own DNS.</p>
<p>When you are over, in order of preference:</p>
<ol>
<li>Prune. Every include should map to a tool that still sends for you. Records accrete; vendors churn. Remove before you optimize.</li>
<li>Move bulk sending to a subdomain. Your newsletter ESP can authenticate on <code>mail.example.com</code> with its own SPF record and its own untouched lookup budget. This also separates reputations, which we recommend anyway.</li>
<li>Flatten last. Flattening replaces includes with the literal <code>ip4:</code>/<code>ip6:</code> ranges they resolve to, which costs zero lookups. The trap: providers change IPs without telling you, and a manually flattened record rots silently until mail starts softfailing. Flatten only with automated re-resolution (several DNS providers and DMARC vendors sell exactly this), never by hand-pasting today&#39;s IPs.</li>
</ol>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="the-modifiers">The modifiers</h2><p><code>redirect=</code> replaces the record wholesale: <code>v=spf1 redirect=_spf.example.net</code> means &quot;evaluate that domain&#39;s record as if it were mine.&quot; Useful for many domains sharing one policy; it costs a lookup and there is no fallback if the target has no record. <code>exp=</code> attaches an explanation string to failures. Receivers largely ignore it; skip it.</p>
<h2 id="common-breakages-from-most-to-least-frequent">Common breakages, from most to least frequent</h2><ol>
<li>Two SPF records. Merging tools, migrations, and helpful colleagues each add their own TXT. Two records starting with <code>v=spf1</code> is an automatic permerror, no matter how correct each one is. Merge into one line. This is the first thing to check when SPF mysteriously fails.</li>
<li>Over the lookup limit. Covered above; it is a permerror and it is invisible until a checker counts for you.</li>
<li>The 255-character split. A single TXT string maxes at 255 characters. Longer records must be split into multiple quoted strings in one record (<code>&quot;v=spf1 ...&quot; &quot;... ~all&quot;</code>), which resolvers concatenate. Some DNS panels do this for you; some fail loudly; some truncate and fail silently. If your record is long, dig it after saving.</li>
<li><code>+all</code>, or a trailing typo. <code>v=spf1 +all</code> authorizes the entire internet to send as you. It shows up in real audits more than you would hope, usually as a debugging step that shipped.</li>
<li>The record on the wrong name. SPF is checked on the Return-Path domain. If your ESP sends with the Return-Path <code>bounce.example.com</code>, the record on <code>example.com</code> is not consulted for those sends; the subdomain needs its own. (Most ESPs handle this in the DNS they hand you at setup; it is the part people delete because it &quot;looked redundant.&quot;)</li>
<li>A dead include. An include pointing at a domain with no SPF record is a permerror. Vendors get acquired, rename, and retire domains; your record inherits the wreckage.</li>
</ol>
<h2 id="verify-it-like-a-receiver-would">Verify it like a receiver would</h2><div class="codewrap"><pre><code>dig +short TXT example.com
</code></pre></div>
<p>Confirm exactly one string starts with <code>v=spf1</code>, then run it through a lookup-counting checker, then send a test message to a Gmail account and read Show original: the SPF line names the domain checked and the verdict, which is the ground truth no syntax audit can give you.</p>
<p>Then remember what you built: a list of allowed senders for the envelope domain, nothing more. It breaks on forwarding, it says nothing about the From your reader sees, and receivers treat it as one signal among several. Count your lookups today, keep the record to one line, and spend the time you save on DKIM and DMARC, where the enforcement actually lives.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>SPF, DKIM, and DMARC: three records, one system</title>
    <link>https://letterduck.com/blog/spf-dkim-dmarc</link>
    <guid isPermaLink="true">https://letterduck.com/blog/spf-dkim-dmarc</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>How SPF, DKIM, and DMARC interlock: who may send, who signed, what receivers do on failure. With a worked DNS example and a real forwarding failure.</description>
    <content:encoded><![CDATA[
<p>Since November 2025, Gmail returns a permanent 550 error to mail that fails both <a href="/blog/spf-record">SPF</a> and <a href="/blog/what-is-dkim">DKIM</a>, and Microsoft&#39;s consumer inboxes have rejected unauthenticated bulk mail since May 2025. Authentication stopped being a best practice and became the price of delivery. The three records involved are usually taught as a checklist. They work better understood as one system with three roles: SPF says who may send, DKIM proves who signed, and DMARC decides what happens when neither holds up for the domain your reader actually sees.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>SPF is a DNS list of servers allowed to send for your domain. DKIM is a cryptographic signature that travels with each message. DMARC ties both back to the visible From address and tells receivers what to do on failure.</li>
<li>Alignment is the part most guides skip: passing SPF or DKIM counts for nothing unless the passing domain matches the From domain.</li>
<li>Forwarding breaks SPF every single time. Gmail rejected 73% of the mail we forwarded in June 2026; an intact DKIM signature was the only thing that could have saved it.</li>
<li>Set up DKIM first, SPF second, DMARC at p=none third. Move to p=reject only after the reports come back clean.</li>
</ul></aside><h2 id="the-problem-all-three-exist-to-solve">The problem all three exist to solve</h2><p>The From header in an email is plain text. <a href="/glossary#smtp">SMTP</a>, the protocol mail servers speak to each other, checks it against nothing. Anyone can put <code>billing@yourdomain.com</code> in the From line of a message sent from anywhere on earth, and for the first few decades of email that message would simply arrive. Every phishing campaign that impersonates a bank works this way.</p>
<p>SPF, DKIM, and DMARC are three DNS records that give receiving servers a way to check the claim. Each answers one question, and none of them is sufficient alone, which is why our <a href="/guides/email-deliverability">email deliverability handbook</a> treats the trio as the floor of every send, not an optional hardening step.</p>
<div class="tblwrap"><table><thead><tr><th>Record</th><th>Question it answers</th><th>Where it lives</th><th>Standard</th></tr></thead><tbody><tr><td>SPF</td><td>Which servers may send mail for this domain?</td><td>TXT record on the domain</td><td><a href="https://www.rfc-editor.org/rfc/rfc7208.html">RFC 7208</a> (2014)</td></tr>
<tr><td>DKIM</td><td>Was this exact message signed by the domain, and did it arrive unmodified?</td><td>TXT record at <code>selector._domainkey</code></td><td><a href="https://www.rfc-editor.org/rfc/rfc6376.html">RFC 6376</a> (2011)</td></tr>
<tr><td>DMARC</td><td>Does the passing domain match the visible From, and what should receivers do if not?</td><td>TXT record at <code>_dmarc</code></td><td><a href="https://www.rfc-editor.org/rfc/rfc7489.html">RFC 7489</a> (2015)</td></tr></tbody></table></div><h2 id="spf-who-may-claim-the-domain">SPF: who may claim the domain</h2><p>SPF is a published list of sending servers. When mail arrives, the receiver looks up a TXT record on the sender&#39;s domain and checks whether the connecting IP address is on the list.</p>
<p>The subtlety: SPF does not check the From address you see in your mail client. It checks the envelope sender, also called the Return-Path, a hidden address used for bounce handling. Those two addresses are frequently different, and that gap matters enormously once we get to alignment.</p>
<p>A typical record is one line:</p>
<div class="codewrap"><pre><code>example.com.  TXT  &quot;v=spf1 include:_spf.google.com ~all&quot;
</code></pre></div>
<p>Translation: Google&#39;s servers may send for this domain, treat everyone else with suspicion. The full syntax (mechanisms, qualifiers, the 10-lookup limit that silently breaks records) gets its own reference in <a href="/blog/spf-record">our SPF record guide</a>.</p>
<h2 id="dkim-who-signed-the-message">DKIM: who signed the message</h2><p>SPF authenticates the connection. DKIM authenticates the message itself. Your sending server computes a hash over the message body and selected headers, signs it with a private key, and stamps the result into a <code>DKIM-Signature</code> header. The receiver fetches the matching public key from your DNS, at an address like <code>s1._domainkey.example.com</code>, and verifies the signature.</p>
<p>Because the signature rides inside the message, DKIM keeps working when mail passes through intermediate servers. That single property makes it the sturdiest of the three, and the details (selectors, key length, what the signature actually covers) are in <a href="/blog/what-is-dkim">our DKIM explainer</a>.</p>
<h2 id="dmarc-who-enforces">DMARC: who enforces</h2><p>Without DMARC, SPF and DKIM are advisory. A receiver sees a failure and makes a private judgment call. DMARC is the domain owner publishing the judgment in advance:</p>
<div class="codewrap"><pre><code>_dmarc.example.com.  TXT  &quot;v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com&quot;
</code></pre></div>
<p>The <code>p=</code> tag is the policy: <code>none</code> (deliver anyway, just report), <code>quarantine</code> (spam folder), or <code>reject</code> (refuse outright). The <code>rua=</code> tag is where receivers send aggregate XML reports about every message claiming your domain, which is how you find senders you forgot about before you tighten the policy. The none-to-reject progression deserves a project plan of its own, and we wrote one in <a href="/blog/what-is-dmarc">What is DMARC</a>.</p>
<h2 id="alignment-the-part-most-guides-fumble">Alignment: the part most guides fumble</h2><p>Here is the loophole that DMARC exists to close, and that most three-paragraph summaries never mention.</p>
<p>SPF checks the Return-Path domain. DKIM checks the <code>d=</code> domain named inside the signature. Neither is required to have anything to do with the From address your reader sees. So a phisher can send from their own domain, with flawless SPF and a valid DKIM signature for <code>phisher-mail.net</code>, while displaying <code>yourbank.com</code> in the From line. Both checks pass. The reader sees your bank.</p>
<p>DMARC adds the missing rule: at least one passing check must align with the From domain. SPF aligns when the Return-Path domain matches the From domain. DKIM aligns when the <code>d=</code> domain matches. In the default relaxed mode a subdomain counts (<code>mail.example.com</code> aligns with <code>example.com</code>); in strict mode the match must be exact.</p>
<p>One aligned pass is enough. That &quot;one is enough&quot; rule is not a technicality. It is the entire reason forwarded mail can survive, as we found out the hard way.</p>
<h2 id="a-worked-example">A worked example</h2><p>Take <code>example.com</code>, hosted on Google Workspace, sending its newsletter through an <a href="/glossary#esp">ESP</a>. Three TXT records make the whole system:</p>
<div class="codewrap"><pre><code>example.com.                    TXT  &quot;v=spf1 include:_spf.google.com ~all&quot;

google._domainkey.example.com.  TXT  &quot;v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEF...IDAQAB&quot;

_dmarc.example.com.             TXT  &quot;v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com&quot;
</code></pre></div>
<p>Now trace one message from <code>hello@example.com</code> to a Gmail user. Gmail&#39;s server accepts the connection and runs the checks in order. SPF: the connecting IP belongs to Google&#39;s pool, which <code>_spf.google.com</code> includes, so SPF passes, and the Return-Path domain is <code>example.com</code>, so it aligns. DKIM: the message carries a signature with <code>d=example.com</code> and selector <code>google</code>; Gmail fetches <code>google._domainkey.example.com</code>, verifies the hash, pass, aligned. DMARC: at least one aligned pass exists, so the message passes DMARC, and the <code>p=none</code> policy would not have punished a failure anyway. The message is delivered, and once a day Gmail mails a summary of everything it saw to <code>dmarc-reports@example.com</code>.</p>
<p>Two passes is the healthy state. You need both because each one fails in situations the other survives.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="forwarding-breaks-spf-we-have-the-numbers">Forwarding breaks SPF: we have the numbers</h2><p>In June 2026 we were mirroring every inbound message on our domain to a Gmail archive using Cloudflare&#39;s <code>message.forward()</code>. No errors on our side, all green. Then we noticed mail was missing from the archive, quietly, with no bounce we could see. When we pulled the numbers, Gmail had been rejecting roughly 73% of everything we forwarded.</p>
<p>The mechanism is textbook. A forwarder re-sends someone else&#39;s message from its own IP address. That IP is not in the original sender&#39;s SPF record, so SPF fails on every single forwarded message, by design, with no workaround. The message can still pass DMARC through the other door: an intact, aligned DKIM signature travels with the message and verifies anywhere. But any message that arrived unsigned, or whose signature broke in transit, had nothing left. Under the sender&#39;s DMARC policy, Gmail refused it.</p>
<p>We stopped forwarding and switched the mirror to a Gmail API insert, which sidesteps SMTP entirely. The general lessons survive the specifics: SPF alone is fragile in the real world, DKIM is the only authentication that survives forwarding, and a DMARC policy is enforced silently, so the sender never sees the damage. If your setup relies on SPF passing everywhere, some of your mail is already failing somewhere.</p>
<h2 id="set-them-up-in-this-order">Set them up in this order</h2><p>The order matters less for DNS than for risk: you want signing and listing in place before any policy exists to punish their absence.</p>
<ol>
<li>DKIM first. Turn on signing at your mail host and ESP, publish the selector records they give you, and send a test to a Gmail address. Open it and use Show original to confirm <code>DKIM: PASS</code>.</li>
<li>SPF second. One TXT record listing every service that sends for you. Keep it under 10 DNS lookups.</li>
<li>DMARC at <code>p=none</code> with a <code>rua</code> address. This punishes nothing and starts the reports flowing.</li>
<li>Read reports for two to four weeks. Find the printer, the CRM, the billing tool you forgot authenticates nothing.</li>
<li>Tighten to <code>p=quarantine</code>, then <code>p=reject</code>, only when the reports show every legitimate source passing with alignment.</li>
</ol>
<p>For where BIMI fits, and what to prioritize at each sending volume, the series overview is <a href="/blog/email-authentication">our email authentication guide</a>. But the sequence above is the work. Three TXT records, one system, and the receivers stop guessing.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Spam complaint rate: the 0.1% and 0.3% lines, with the math</title>
    <link>https://letterduck.com/blog/spam-complaint-rate</link>
    <guid isPermaLink="true">https://letterduck.com/blog/spam-complaint-rate</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>Gmail's complaint thresholds at real list sizes: three reports breach 0.3% on a 1,000-email send. Plus the Feedback-ID header and where to read your rate.</description>
    <content:encoded><![CDATA[
<p>Three spam reports on a 1,000-email send is 0.3%, the complaint rate Google says never to reach. On a 300-email send, a single report is 0.33%, already over the line. Spam complaint rate is the deliverability number with the least room for error, so this article works the math at real list sizes, shows the header Google wants in exchange for the feedback loop it never built, and explains why we made the brake automatic.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Keep complaints under 0.1% of delivered mail and never reach 0.3% (Google sender guidelines, in force since February 2024).</li>
<li>At or above 0.3%, Gmail withholds delivery mitigation until you are back under the line for 7 consecutive days.</li>
<li>Google runs no traditional feedback loop. Stamp a Feedback-ID header on every send and read your rate in Postmaster Tools v2.</li>
<li>Automate the stop: our send path halts itself at 0.3% complaints or 2% bounces, without waiting for a human.</li>
</ul></aside><h2 id="what-the-rate-is-exactly">What the rate is, exactly</h2><p>Gmail&#39;s spam rate is user spam reports divided by mail delivered to the inbox, computed daily, per the definitions in <a href="https://postmaster.google.com/">Google Postmaster Tools</a>. Only Gmail recipients count toward Gmail&#39;s number; Yahoo computes its own equivalent with the same 0.3% ceiling. <a href="https://support.google.com/mail/answer/81126">Google&#39;s sender guidelines</a> (February 2024, tightened through 2025) publish two lines: stay under 0.1%, and avoid ever reaching 0.3%. The full rule set lives in our <a href="/blog/gmail-bulk-sender-requirements">breakdown of the Gmail bulk sender requirements</a>, and the thresholds anchor the send policy in our <a href="/guides/email-deliverability">email deliverability handbook</a>.</p>
<p>The penalty structure is what makes 0.3% special. At or above it, Gmail withholds delivery mitigation until your rate has stayed under 0.3% for 7 consecutive days. In practice that is a week minimum of spam-foldered campaigns, and a week is generous only if you stop making it worse immediately.</p>
<h2 id="the-math-at-real-list-sizes">The math at real list sizes</h2><p>The percentages sound forgiving. The absolute numbers are not.</p>
<div class="tblwrap"><table><thead><tr><th>Delivered to Gmail</th><th>Reports to hit 0.1%</th><th>Reports to hit 0.3%</th></tr></thead><tbody><tr><td>300</td><td>1 (a single report is 0.33%)</td><td>1</td></tr>
<tr><td>1,000</td><td>1</td><td>3</td></tr>
<tr><td>5,000</td><td>5</td><td>15</td></tr>
<tr><td>25,000</td><td>25</td><td>75</td></tr>
<tr><td>100,000</td><td>100</td><td>300</td></tr></tbody></table></div><p>Read the top rows first. Below about 1,000 Gmail deliveries a day, one annoyed recipient breaches both lines at once. The rate is computed daily, so a single spiky day on tiny volume is survivable if it stays rare, but the published rule contains no small-sender exemption. Treat every campaign as if the line is live, because it is.</p>
<p>A worked example at newsletter scale: a 5,000-subscriber list with roughly 60% Gmail addresses delivers about 3,000 messages to Gmail per campaign. Your 0.1% budget is 3 reports. Nine reports on one send, which is nine people out of five thousand having a bad morning, puts you at 0.3% and starts the 7-day clock. Scale changes the arithmetic but never the exposure: at 100,000 delivered you have room for 99 reports, and a single mailing to a stale segment can produce all of them in an afternoon.</p>
<h2 id="make-unsubscribing-cheaper-than-complaining">Make unsubscribing cheaper than complaining</h2><p>The Report Spam button is one click and always visible. If leaving your list costs more than that click (a login, a survey, a &quot;why are you going?&quot; page), some readers will pick the button, and every one of them is a complaint you chose. The countermeasure is <a href="https://www.rfc-editor.org/rfc/rfc8058.html">RFC 8058</a> <a href="/glossary#list-unsubscribe">one-click unsubscribe</a>, stamped as two headers on every campaign:</p>
<div class="codewrap"><pre><code>List-Unsubscribe: &lt;https://yourdomain.com/unsub/TOKEN&gt;, &lt;mailto:unsub@yourdomain.com&gt;
List-Unsubscribe-Post: List-Unsubscribe=One-Click
</code></pre></div>
<p>The rules allow two days to honor the request. We honor it immediately, because a person who has asked to leave and then receives one more email is exactly the person who files a report. Our <a href="/blog/list-unsubscribe">one-click unsubscribe guide</a> covers the headers end to end.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="feedback-id-the-loop-google-never-built">Feedback-ID: the loop Google never built</h2><p>Yahoo and Microsoft run traditional <a href="/glossary#feedback-loop">feedback loops</a>: register for <a href="https://senders.yahooinc.com/complaint-feedback-loop/">Yahoo&#39;s CFL</a> or Microsoft&#39;s JMRP and they email you an ARF copy of each complaint, so you can suppress the complainer within minutes. Google offers no ARF loop at all, at any volume, and never has.</p>
<p>Its substitute is aggregate. You stamp a <code>Feedback-ID</code> header on every send, and Postmaster Tools breaks spam rates out per identifier so you can tell which campaign or list segment is generating complaints. The header is up to four colon-separated fields with the sender identifier last:</p>
<div class="codewrap"><pre><code>Feedback-ID: campaign-2026-08:newsletter:acme:ld
</code></pre></div>
<p>We stamp it on every campaign send, because when a complaint happens at Gmail this aggregate view is the only visibility that exists. The consequence worth internalizing: you never learn who complained at Gmail. Suppressing individual complainers there is impossible, which pushes all the real work upstream into unsubscribe friction and list hygiene.</p>
<h2 id="where-to-read-your-rate-in-2026">Where to read your rate in 2026</h2><p>Google retired the Postmaster Tools v1 interface on September 30, 2025, and the domain and IP reputation dashboards went with it. The spam-rate chart survived into v2, joined by a Compliance Status view that grades you against the sender requirements. So the current monitoring stack, all free:</p>
<ul>
<li><a href="/blog/google-postmaster-tools">Google Postmaster Tools</a> v2 for the Gmail spam rate and compliance checks.</li>
<li>Yahoo CFL for per-complaint ARF reports (registration covers AOL as well).</li>
<li><a href="https://sendersupport.olc.protection.outlook.com/snds/index.aspx">Microsoft SNDS</a> and JMRP for the Outlook side.</li>
</ul>
<p>One honest limit: the Postmaster charts need meaningful daily Gmail volume before they render anything. At dozens of emails a day, which is our own situation as a small live workspace, the graph is often blank. That is not a reason to skip registration. It is a reason not to make the dashboard your only safeguard, which brings us to the part we automated.</p>
<h2 id="auto-pause-as-policy-not-judgment">Auto-pause as policy, not judgment</h2><p>Our send path halts itself at a complaint rate of 0.3% or a <a href="/glossary#bounce-rate">bounce rate</a> above 2%. No human decides to stop; a human is required to resume. We built it that way because dashboards lag and humans rationalize. &quot;Finish this campaign, then investigate&quot; is how a bad hour becomes a bad month, and by the time someone reads a chart, the next thousand sends are already out the door.</p>
<p>There is precedent for the idea at the infrastructure layer: AWS SES reviews and can pause entire accounts around 0.1% complaints or 5% bounces, per its published documentation. Relays enforce this on you eventually, so enforcing it on yourself first is cheap insurance. Behind our brake sits a global <a href="/glossary#suppression-list">suppression list</a> of bounces, complaints and unsubscribes, checked before every single send, so an address that failed once can never be mailed again by accident.</p>
<h2 id="your-complaint-budget-in-one-division">Your complaint budget, in one division</h2><p>Divide your typical Gmail delivery count by 1,000. That is your report budget at the 0.1% target: for most small newsletters, between one and three reports per campaign. Spend it on nothing. Ship the one-click headers this week, register the three dashboards, and put an automatic stop at 0.3% before you ever need one.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Shared inbox: which setup your team actually needs</title>
    <link>https://letterduck.com/blog/shared-inbox</link>
    <guid isPermaLink="true">https://letterduck.com/blog/shared-inbox</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>Google Groups, Gmail delegation, Outlook shared mailboxes, Front, and Hiver compared on cost model and workflow, plus a decision table by team size.</description>
    <content:encoded><![CDATA[
<p>The cheapest way to run support@ is to forward it into one person&#39;s personal inbox, and it fails twice over: nobody else can see the queue, and the forward itself loses mail without telling you.</p>
<p>A shared inbox fixes that. It is one address (support@, sales@, hello@) that several people can read and answer without passing a password around. Every option in this article gets you there. The differences are price, clunkiness, and whether replies go out as the address or as the individual. This article assumes mail on your own domain already works; if it does not, start with our <a href="/guides/business-email-setup">business email setup guide</a> and come back.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Google Groups Collaborative Inbox is free with Workspace and genuinely works, but it lives outside Gmail and replies default to each member's personal address.</li>
<li>Gmail delegation shares one person's mailbox. It caps at 10 delegates on personal accounts and stamps every reply as sent by the delegate.</li>
<li>Outlook shared mailboxes cost nothing up to 50 GB, provided everyone touching them already holds a Microsoft 365 license.</li>
<li>Dedicated tools (Front, Hiver) bill per seat, so the bill tracks headcount: at $25 a seat, five people cost $1,500 a year, and the tiers that add SLA reporting cost more per seat again.</li>
<li>LetterDuck makes every address on the domain shared by default: $50 per domain flat, reply as any address, no seats to count. Seats open from a waitlist, so it is not something you can buy today.</li>
</ul></aside><h2 id="why-support-in-one-person39s-inbox-fails">Why support@ in one person&#39;s inbox fails</h2><p>There are three standard workarounds, and each breaks in its own way.</p>
<p>Password sharing is the first. Two people logging into one mailbox defeats two-factor authentication, makes offboarding a fire drill (change the password, tell everyone, update every saved session), and leaves no record of who said what to a customer.</p>
<p>Forwarding is the second, and it fails quietly. We learned this in production: in June 2026, Gmail silently rejected 73% of the mail our own system auto-forwarded, because forwarding breaks <a href="/glossary#dmarc">DMARC</a> alignment. Nothing errored on our side. The mail simply vanished. A support@ rule that forwards to someone&#39;s personal Gmail fails the same way, for some unpredictable fraction of messages, with no bounce to warn you.</p>
<p>The third workaround is doing nothing: support@ is one employee. That works until they take a vacation, and then your support queue takes one too.</p>
<h2 id="shared-inbox-for-gmail-option-1-groups-collaborative-inbox">Shared inbox for Gmail, option 1: Groups Collaborative Inbox</h2><p>Google&#39;s real answer for teams is not in Gmail at all. It is Google Groups with the Collaborative Inbox feature switched on, included free with every Workspace plan. The group address does not consume a paid seat.</p>
<p>The setup, concretely:</p>
<ol>
<li>In the Admin console (or at groups.google.com on a Workspace account), create a group named <code>support@yourdomain.com</code>.</li>
<li>In the group&#39;s settings, turn on &quot;Collaborative Inbox&quot; under additional Google Groups features.</li>
<li>Set &quot;Who can post&quot; to &quot;Anyone on the web,&quot; or customer mail will be rejected.</li>
<li>Add your teammates as members with permission to moderate metadata, so they can assign conversations and mark them complete.</li>
</ol>
<p>You get assignment, &quot;mark as complete,&quot; and a shared history for $0. Now the clunk. The whole thing lives at groups.google.com in a forum-style interface, not in anyone&#39;s Gmail. Search is weaker than Gmail&#39;s. There are no shared drafts and no warning when two people answer the same message. Worst of all, replies default to the member&#39;s own address; answering as support@ requires each person to configure &quot;Send mail as&quot; in their own Gmail settings, one by one. Teams tolerate this at low volume. Nobody loves it.</p>
<h2 id="shared-inbox-for-gmail-option-2-delegation">Shared inbox for Gmail, option 2: delegation</h2><p>Delegation grants other accounts access to one mailbox, reply rights included. Personal Gmail allows up to 10 delegates; Workspace accounts have allowed up to 1,000 since Google raised the limit in January 2021, with about 40 able to work concurrently under typical use (Google&#39;s published figures).</p>
<p>The catch sits in the From line: delegated replies are visibly marked as sent by the delegate on behalf of the owner. There is no assignment, no status, no queue. Delegation was built for an assistant managing an executive&#39;s mailbox, and for that it is the right tool. As a team support channel it is a hack.</p>
<h2 id="outlook-and-microsoft-365-shared-mailboxes">Outlook and Microsoft 365 shared mailboxes</h2><p>Microsoft&#39;s version is cleaner. A shared mailbox in Exchange Online needs no license of its own up to 50 GB of storage; past that it needs an Exchange Online Plan 2 license for the 100 GB tier (Microsoft&#39;s Exchange Online service description, checked August 2026). The real requirement hides one step back: every person who opens the shared mailbox must hold their own Exchange Online license, so this is only free inside an organization already paying for Microsoft 365.</p>
<p>Send As and Send on Behalf both work and are set by an admin, so replies can go out cleanly as support@. What you do not get is workflow: read and unread state is all the coordination there is, with no way to see who owns which conversation. For a Microsoft shop with modest volume, this is the best free option. The ownership problem stays yours to solve in chat.</p>
<h2 id="dedicated-shared-inbox-software-front-and-hiver">Dedicated shared inbox software: Front and Hiver</h2><p>When email becomes a support operation, the dedicated tools earn their keep: per-message assignment, collision detection (a banner when a colleague is already typing), SLA timers, CSAT surveys, and analytics.</p>
<p>They charge per seat, and that is the whole story of the bill. Neither one is in the 14-provider pricing dataset behind this site, so we will not quote their tiers from memory: open both pricing pages, and read the per-seat rate and the seat minimum before you budget.</p>
<p>Then do the multiplication, because it decides this. A five-person team on a $25 seat is $1,500 a year; the same team on a $65 seat is $3,900. Those are defensible numbers for a ten-plus-person support desk with contractual response times. Below that, you are paying help-desk prices for what is really a rota, and every hire adds a line to the invoice.</p>
<h2 id="the-letterduck-model-every-address-is-already-shared">The LetterDuck model: every address is already shared</h2><p>We built LetterDuck around a different unit. An address is a routing rule, not a seat. A <a href="/blog/catch-all-email">catch-all</a> routes every address on the domain into one threaded inbox, so support@, billing@, and any <a href="/blog/email-alias">alias you invent next week</a> are shared from the moment they exist. There is no provisioning step because there is nothing to provision.</p>
<p>Anyone in the workspace sees every thread. Replies go out as whichever address the conversation belongs to, with In-Reply-To and References headers set so the exchange threads correctly on the customer&#39;s side. The price is $50 per domain, flat, and hiring your fourth person changes nothing.</p>
<p>The honest limitation: LetterDuck has no per-message assignment, no collision detection, no SLA reporting. If you run a support desk that needs those, buy Front or Hiver and do not look back. LetterDuck is for teams of roughly one to ten who want every address on the domain answered from one place without per-seat pricing. It is the system we run our own mail on, and the inbound path behind it has been in production since June 2026 with a watchdog probe round-tripping it every two hours.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="the-decision-table">The decision table</h2><div class="tblwrap"><table><thead><tr><th>Team size and situation</th><th>Pick</th><th>Why</th></tr></thead><tbody><tr><td>Solo founder</td><td>Aliases into one mailbox</td><td>Nothing to share yet; folders and aliases cover it</td></tr>
<tr><td>Executive plus assistant</td><td>Gmail delegation</td><td>Built for exactly this shape; the sent-by label is fine here</td></tr>
<tr><td>2-3 people on Google Workspace, light volume</td><td>Groups Collaborative Inbox</td><td>$0 and workable if you accept the groups.google.com interface</td></tr>
<tr><td>2-10 people already on Microsoft 365</td><td>Outlook shared mailbox</td><td>Free under 50 GB; solve ownership in chat</td></tr>
<tr><td>1-10 people, own domain, several addresses to cover</td><td>LetterDuck</td><td>$50 per domain flat; every address shared by default, reply as any of them. Waitlist only for now</td></tr>
<tr><td>10+ people or contractual response times</td><td>Front or Hiver</td><td>Assignment, collision detection, SLAs, and analytics are worth per-seat money at this scale</td></tr></tbody></table></div><h2 id="where-to-start">Where to start</h2><p>Count two things: the people who need to answer mail, and the addresses they answer for. One person, any number of addresses: aliases. Many people, one executive mailbox: delegation. Many people, many addresses, under ten humans: pick flat pricing over seats, because the per-seat bill grows exactly when your margins are thinnest. And if the count crosses ten, or a contract mentions response times, pay for a real help desk without guilt. The expensive mistake is not choosing the wrong tier; it is leaving support@ pointed at one person&#39;s inbox for another quarter.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Professional email address: formats that earn trust</title>
    <link>https://letterduck.com/blog/professional-email-address</link>
    <guid isPermaLink="true">https://letterduck.com/blog/professional-email-address</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>The address formats that read as professional, the five role addresses every business needs, the ones that hurt trust, and real examples by company type.</description>
    <content:encoded><![CDATA[
<p>Use <a href="mailto:first@yourdomain.com">first@yourdomain.com</a> while your company is small, and <a href="mailto:first.last@yourdomain.com">first.last@yourdomain.com</a> once a name collision becomes plausible. That one decision settles most of this topic, so the rest of this article covers what it does not: the role addresses every business needs, the formats that quietly cost you trust, and the edge rules around dots, hyphens, and unicode.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>first@ under roughly 20 people, first.last@ beyond that. Pick one pattern and apply it to everyone.</li>
<li>The domain carries the trust; any sensible format on your own domain beats a clever @gmail.com.</li>
<li>Five role addresses cover most businesses: hello@, sales@, support@, billing@, press@. Each needs a named owner.</li>
<li>Never send from noreply@. Replies are the engagement signal mailbox providers weight most, and noreply@ forbids them.</li>
<li>Stay ASCII, skip numbers and hyphens, treat dots as significant on your own domain.</li>
</ul></aside><h2 id="the-domain-does-the-work">The domain does the work</h2><p>An address is two parts, and the right-hand side does the heavy lifting. <a href="mailto:maya@atelier-north.com">maya@atelier-north.com</a> says there is a company; <a href="mailto:mayadesigns1988@gmail.com">mayadesigns1988@gmail.com</a> says there is a hobby. Prospects check the domain, not the spelling of your first name. So before debating formats, get on a domain you control, with <a href="/glossary#spf">SPF</a> and <a href="/glossary#dkim">DKIM</a> authenticating it; our <a href="/guides/business-email-setup">business email setup guide</a> walks the whole path from DNS to inbox. The stakes rose recently: Gmail (November 2025) and Microsoft (May 2025) now hard-reject unauthenticated mail with a 550 error rather than filing it under spam.</p>
<p>Once the domain is yours, addresses stop being scarce. On our own stack an address is a routing rule, not a mailbox you pay for, so the only real question left is what the pattern should be.</p>
<h2 id="person-address-formats-our-positions">Person address formats: our positions</h2><p>Format guides usually list options and refuse to choose. Here is what we would actually do, with the tradeoff named.</p>
<div class="tblwrap"><table><thead><tr><th>Format</th><th>Example</th><th>Our position</th></tr></thead><tbody><tr><td class="yes">first@</td><td>maya@</td><td>Best under about 20 people. Short, warm, easy to say aloud. The tradeoff is collisions: the second Maya you hire breaks the pattern.</td></tr>
<tr><td class="yes">first.last@</td><td>maya.chen@</td><td>The default for a company that intends to grow. Survives collisions and stays guessable. One character longer to type, forever.</td></tr>
<tr><td class="no">flast@</td><td>mchen@</td><td>Avoid. Fails the phone test (&quot;m as in... what?&quot;) and produces accidental words often enough that IT departments keep blocklists for it.</td></tr>
<tr><td class="no">initials</td><td>mc@</td><td>Avoid. Unreadable to outsiders and exhausted after a few hires.</td></tr>
<tr><td class="soft">firstlast@</td><td>mayachen@</td><td>Acceptable for short names; long names turn into a wall of letters people mis-segment.</td></tr>
<tr><td class="no">first_last@</td><td>maya_chen@</td><td>The low-line separator gets misheard as a space on calls and looks off in print. The dot does the same job better.</td></tr>
<tr><td class="no">name plus number</td><td>maya2@</td><td>Never. Numbers in a business address read like a burner account. If you hit a collision, that is the signal to move the whole company to first.last@.</td></tr></tbody></table></div><p>The phone test is the honest referee here: read the address aloud, once, to someone who cannot see your screen. If they need it repeated or spelled, the format failed. first@ and first.last@ pass. Almost nothing else does.</p>
<p>Whatever you choose, apply it to everyone, founders included. A team where the CEO is james@ but new hires are j.smith@ broadcasts a two-tier culture in the email directory.</p>
<h2 id="the-role-addresses-every-business-needs">The role addresses every business needs</h2><p>People guess role addresses when they do not know a name, so owning the standard set is free surface area. Five cover most businesses.</p>
<div class="tblwrap"><table><thead><tr><th>Address</th><th>What lands there</th><th>Who should watch it</th></tr></thead><tbody><tr><td>hello@</td><td>General inquiries, partnership feelers, humans guessing</td><td>A founder early on; whoever owns first impressions later</td></tr>
<tr><td>sales@</td><td>Money trying to reach you</td><td>Whoever owns revenue, with a same-day reply habit</td></tr>
<tr><td>support@</td><td>Customers with problems</td><td>The whole team, visibly; rotate the duty, share the history</td></tr>
<tr><td>billing@</td><td>Invoices, receipts, disputes</td><td>Whoever pays the bills and chases the invoices</td></tr>
<tr><td>press@</td><td>Journalists, usually on deadline</td><td>A founder, directly; press mail expires in hours, not days</td></tr></tbody></table></div><p>Two rules make these work. First, every role address needs a named owner, because an address everyone watches is an address nobody answers. Second, role addresses should be readable by more than one person from day one; the mechanics of that (Google Groups, delegation, shared mailboxes, or a workspace where every address is shared by default) are the subject of our <a href="/blog/shared-inbox">shared inbox guide</a>.</p>
<p>On a setup with unlimited addresses these five cost nothing to create, and you can add narrower ones (careers@, security@, partners@) the day you need them. <a href="/blog/email-alias">Aliases</a> make the same point at the personal level.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="addresses-that-hurt-trust">Addresses that hurt trust</h2><p>info@ is the one we would retire. It is the default that nobody owns, and the address a dictionary spray tries first, which is why our own list-hygiene rules bar role accounts (info@, admin@, postmaster@, abuse@) from a newsletter list. They signal a distribution list, not a person. When your public contact is info@, you are telling people their message goes onto a pile. hello@ receives the identical mail and implies a human will read it. Same function, better promise.</p>
<p><strong>Do not send from noreply@.</strong> This one costs you twice. The first cost is stated plainly in the name: you are emailing customers while announcing you will not listen. The second cost is mechanical. Mailbox providers rank engagement signals in a clear order (replies above clicks, clicks above opens), and a From address that cannot receive replies sets your strongest reputation signal to zero by design. Every address you send from should be one a human reads. If the volume worries you, that is a filtering problem inside your inbox, not a reason to slam the door on the sender&#39;s side.</p>
<p>The rest of the trust-killers, briefly: admin@ and office@ as outward identities (internal plumbing, not a face), cutesy addresses (topdog@, duckboss@) outside brands where whimsy is the product, and any abbreviation your own staff have to look up.</p>
<h2 id="business-email-address-examples-by-company-type">Business email address examples by company type</h2><div class="tblwrap"><table><thead><tr><th>Company type</th><th>Person pattern</th><th>Role addresses</th><th>Example set</th></tr></thead><tbody><tr><td>Freelancer</td><td>first@</td><td>hello@, billing@</td><td><a href="mailto:sam@okafor.design">sam@okafor.design</a>, <a href="mailto:hello@okafor.design">hello@okafor.design</a></td></tr>
<tr><td>Agency, ~12 people</td><td>first.last@</td><td>hello@, newbusiness@, billing@</td><td><a href="mailto:lena.ortiz@studionorth.co">lena.ortiz@studionorth.co</a>, <a href="mailto:newbusiness@studionorth.co">newbusiness@studionorth.co</a></td></tr>
<tr><td>SaaS startup</td><td>first@</td><td>support@, sales@, security@</td><td><a href="mailto:priya@shipmate.app">priya@shipmate.app</a>, <a href="mailto:security@shipmate.app">security@shipmate.app</a></td></tr>
<tr><td>Law firm</td><td>first.last@</td><td>reception@, billing@</td><td><a href="mailto:d.whitfield@whitfieldlaw.co.uk">d.whitfield@whitfieldlaw.co.uk</a>, <a href="mailto:reception@whitfieldlaw.co.uk">reception@whitfieldlaw.co.uk</a></td></tr>
<tr><td>Restaurant or local shop</td><td>first@</td><td>hello@, bookings@</td><td><a href="mailto:marco@osteriaverde.com">marco@osteriaverde.com</a>, <a href="mailto:bookings@osteriaverde.com">bookings@osteriaverde.com</a></td></tr>
<tr><td>Media site</td><td>first.last@</td><td>tips@, press@, corrections@</td><td><a href="mailto:june.park@thelocalledger.com">june.park@thelocalledger.com</a>, <a href="mailto:tips@thelocalledger.com">tips@thelocalledger.com</a></td></tr></tbody></table></div><p>Patterns worth noticing: client-facing professions stay formal (a law firm on first.last@ reads as intended), hospitality stays warm (first@ suits a business built on a person&#39;s name), and a media site&#39;s tips@ and corrections@ are trust signals in themselves.</p>
<h2 id="edge-rules-dots-hyphens-unicode">Edge rules: dots, hyphens, unicode</h2><p>Dots. Google famously ignores dots on @gmail.com addresses; m.aya and maya reach the same account there, and Google documents this. On your own domain that guarantee does not exist: maya.chen@ and mayachen@ are distinct addresses on most mail servers. Pick one form, publish it consistently, and if you expect people to guess wrong, run a <a href="/blog/catch-all-email">catch-all</a> so misremembered variants still arrive.</p>
<p>Case. <a href="https://www.rfc-editor.org/rfc/rfc5321.html">RFC 5321</a> technically permits case-sensitive local parts, but no serious provider treats Maya@ and maya@ differently. Publish lowercase anyway; it removes the question.</p>
<p>Length. The local part maxes out at 64 characters (RFC 5321). If a business address is anywhere near that limit, something has gone wrong upstream of the RFC.</p>
<p>Hyphens. Legal, and best avoided in local parts: &quot;maya hyphen chen at&quot; survives dictation worse than the dot does. Hyphens in the domain itself are fine when the unhyphenated name is taken.</p>
<p>Unicode. <a href="https://www.rfc-editor.org/rfc/rfc6531.html">RFC 6531</a> (2012) allows UTF-8 addresses, so josé@ and 田中@ are technically valid. Support remains uneven across providers, web forms, and CRMs, and one broken form is one lost lead. Our position: keep business addresses ASCII, whatever the brand name looks like.</p>
<p>Plus addressing. maya+invoices@ style tags are useful for filtering your own mail, and plenty of web forms reject the + sign. Treat them as a private tool, never as a published address.</p>
<h2 id="do-this-today">Do this today</h2><p>Pick the pattern: first@ if headcount is under 20 and you accept the collision risk, first.last@ if you would rather never migrate. Create the five role addresses and write a name next to each one. Retire info@ in favor of hello@, and delete noreply@ from every template it still haunts. The whole exercise takes an afternoon, and it is the cheapest credibility upgrade a small company can buy.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Plain text vs HTML email: the real answer is both</title>
    <link>https://letterduck.com/blog/plain-text-vs-html-email</link>
    <guid isPermaLink="true">https://letterduck.com/blog/plain-text-vs-html-email</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>HTML-only email is a spam signal, and most plain text newsletters are HTML anyway. The case for multipart/alternative, with the MIME structure shown.</description>
    <content:encoded><![CDATA[
<p>Every campaign we send is one message with two bodies: a multipart/alternative envelope carrying a full HTML part and a real plain-text part. That is the honest answer to &quot;plain text vs HTML email,&quot; and it has been the correct answer since MIME standardized the mechanism in 1996. The interesting questions are why HTML-only mail gets punished, why most &quot;plain text&quot; newsletters are secretly HTML, and where genuinely plain mail still wins.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Send multipart/alternative: one message containing a text/plain part and a text/html part. The recipient's client picks which to render.</li>
<li>HTML with no plain-text part is a literal spam signal: SpamAssassin ships a rule named MIME_HTML_ONLY that scores it.</li>
<li>Most minimal "plain text" newsletters are HTML styled to look plain. Email developers call the pattern fake plain text.</li>
<li>Actually-plain mail wins in two places: cold outreach and short transactional messages.</li>
<li>The MIME sketch below is the whole structure. Plain part first, HTML part last, because clients prefer the last part they can render (<a href="https://www.rfc-editor.org/rfc/rfc2046.html" rel="nofollow">RFC 2046</a>).</li>
</ul></aside><h2 id="you-have-three-options">You have three options</h2><p>The versus framing hides an option, and the hidden option is the right one.</p>
<div class="tblwrap"><table><thead><tr><th>What you send</th><th>What it is</th><th>Where it belongs</th></tr></thead><tbody><tr><td>HTML only</td><td class="no">a text/html body and nothing else</td><td>Nowhere. It is a spam signal with no upside.</td></tr>
<tr><td>Plain only</td><td class="soft">text/plain and nothing else</td><td>Cold outreach, short transactional mail.</td></tr>
<tr><td>Multipart/alternative</td><td class="yes">both bodies in one message</td><td>Newsletters and almost everything else.</td></tr></tbody></table></div><p>This piece is about what the message is made of. If you are still building the list and the domain it comes from, that is <a href="/guides/newsletter-on-your-own-domain">the newsletter-on-your-own-domain guide</a>; come back when something is ready to send.</p>
<h2 id="why-html-only-mail-is-a-spam-signal">Why HTML-only mail is a spam signal</h2><p>SpamAssassin, the open-source filter that a lot of commercial filtering descends from, ships a rule literally named MIME_HTML_ONLY: the message has an HTML part and no plain-text alternative. The rule exists because it separates populations. Real mailing software emits both parts by default, so a missing text part correlates with hand-rolled spam scripts and rushed tooling. The score is small on its own, but spam filtering is cumulative, and this particular point is free to not concede.</p>
<p>The text part has to be real to help. A text/plain part that says &quot;Please view this email in an HTML-capable client&quot; hands back everything the fix bought, because filters read that part too. Generate it from the same content as the HTML: same words, same links, no markup. Our composer does exactly this on every campaign, alongside the rest of the content hygiene our playbook enforces: a text-to-image ratio of at least 60:40, never image-only mail, no link shorteners, links kept on the sending domain. None of these alone decides your fate; they stack, in both directions, with everything else covered in <a href="/blog/why-emails-go-to-spam">why emails go to spam</a>.</p>
<h2 id="the-fake-plain-text-pattern">The fake plain text pattern</h2><p>Here is the part the versus articles skip: the famous &quot;plain text&quot; newsletters mostly are not plain text. They are HTML dressed as plain text, and email developers have a name for the pattern: fake plain text. The anatomy is consistent. A single column capped around 600 pixels. A system font stack. No images, or one small logo. Underneath: fully tracked links rewritten through a click domain, and a styled footer holding the unsubscribe link.</p>
<p>Senders build this because it keeps the two things HTML is genuinely for, click measurement and typographic control, while borrowing the intimacy of a personal note. You can verify the pattern yourself in about ten seconds: open the next minimal newsletter you receive in Gmail, choose Show original from the three-dot menu, and search the source for text/html. It is almost always there.</p>
<p>We think fake plain text is the right call for most newsletters, and it is what a minimal LetterDuck template is: quiet HTML with a true plain part sitting beside it in the same message. The label is the only dishonest thing about the pattern.</p>
<p><aside class="ctabox">
    <div class="h">Templates that ship both parts, every time</div>
    <p>Every campaign LetterDuck sends is multipart/alternative with a real plain-text part generated from the same content. You write the issue; the MIME is our problem. $50 per domain, flat.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="where-actually-plain-still-wins">Where actually-plain still wins</h2><p>Cold outreach. A 90-word text/plain message is structurally identical to mail one human writes to another, which is the entire game when nobody asked to hear from you. A designed HTML template arriving from an unknown domain announces &quot;campaign&quot; before the first word is read. If outreach is your problem, start with <a href="/blog/what-is-cold-email">what cold email actually is</a>, and keep it off your newsletter domain entirely.</p>
<p>Short transactional mail. A password reset is one sentence and a link. It has to survive every client, every screen reader, and every corporate filter, and there is nothing in it to design. Plain, or a near-plain multipart, is the right weight.</p>
<p>Replies. When we answer a reader from the workspace, the reply goes out as ordinary mail with In-Reply-To and References headers so it threads correctly in their client. No template, no tracking. A conversation is not a campaign.</p>
<h2 id="the-multipart-mechanics-literally">The multipart mechanics, literally</h2><p>This is the entire structure, trimmed to its skeleton:</p>
<div class="codewrap"><pre><code>From: The Print Room &lt;hello@yourdomain.com&gt;
To: reader@example.com
Subject: Issue 12: the letterpress that would not die
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=&quot;b1&quot;

--b1
Content-Type: text/plain; charset=utf-8

Issue 12: the letterpress that would not die.
Read the illustrated version: https://yourdomain.com/12

--b1
Content-Type: text/html; charset=utf-8

&lt;html&gt;&lt;body&gt;
  &lt;h1&gt;Issue 12&lt;/h1&gt;
  &lt;p&gt;The letterpress that would not die.&lt;/p&gt;
&lt;/body&gt;&lt;/html&gt;

--b1--
</code></pre></div>
<p>Three details carry all the weight. The boundary string separates the parts and closes the message with a trailing double hyphen. Each part is a complete, standalone rendering of the same message. And the order is a rule, not a habit: RFC 2046 (1996) says the parts appear in increasing order of preference and the client renders the best one it supports, which in practice means the last one it can display. Plain first, HTML last. Reverse them and text-capable clients that follow the spec show your readers the plain part.</p>
<p>We live on both sides of this structure. Outbound, the composer emits it. Inbound, every message that reaches a LetterDuck workspace is parsed from the raw RFC822 stream by postal-mime, both parts stored, so malformed multipart is not an abstraction to us; it is a Tuesday.</p>
<p>One practical ceiling while you are in the HTML part: Gmail clips messages above roughly 102KB, a threshold <a href="https://www.litmus.com/email-client-market-share">Litmus</a> has documented for years, and a clipped message hides everything below the fold, your unsubscribe link included. Keep the HTML lean and the <a href="/blog/email-newsletter-design">design restrained</a>; restraint is also what makes the plain part easy to generate.</p>
<h2 id="what-to-do">What to do</h2><p>For a newsletter: multipart/alternative, always. Generate the text part from the same content and actually read it once before the first send; a stray markdown artifact or a wall of raw URLs tells you the generator needs work.</p>
<p>For cold outreach and one-sentence transactional mail: plain or near-plain.</p>
<p>HTML-only: never. There is no case for it, and one named rule against it.</p>
<p>Before your next send, look at the raw message your tool actually emits. If there is no text/plain part inside it, fix the tool or change tools.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Newsletter subject lines that earn the click</title>
    <link>https://letterduck.com/blog/newsletter-subject-lines</link>
    <guid isPermaLink="true">https://letterduck.com/blog/newsletter-subject-lines</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>What moves newsletter subject lines after Apple Mail Privacy Protection: the 40-character budget, example sets by type, and when A/B tests are noise.</description>
    <content:encoded><![CDATA[
<p>Apple&#39;s <a href="https://www.apple.com/legal/privacy/data/en/mail-privacy-protection/">Mail Privacy Protection</a> has been auto-fetching tracking pixels since September 2021, and Apple devices accounted for about 52% of email opens when <a href="https://www.litmus.com/email-client-market-share">Litmus</a> last measured the market that year. A meaningful share of your &quot;opens&quot; are machines fetching images, not people reading. So the honest way to think about newsletter subject lines is this: you are not optimizing the open rate. You are optimizing the click that follows it.</p>
<p>Subject lines are one piece of the craft; the full path from zero is in our guide to <a href="/guides/newsletter-on-your-own-domain">starting a newsletter on your own domain</a>, and the writing that comes after the open is covered in <a href="/blog/how-to-write-a-newsletter">how to write a newsletter</a>.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Opens are inflated by Apple MPP; judge subject lines by clicks and replies.</li>
<li>Budget 40 characters, with the operative word in the first 30.</li>
<li>Spam folders are decided by reputation and authentication, not by word lists.</li>
<li>Under roughly 2,000 subscribers, an A/B subject test mostly measures noise.</li>
</ul></aside><h2 id="opens-are-inflated-so-optimize-for-the-click">Opens are inflated, so optimize for the click</h2><p>MPP downloads images, including tracking pixels, when mail arrives on an Apple device, whether or not the recipient ever reads it. At launch, Litmus projected Apple Mail open rates would drift toward 75% as adoption peaked. Five years on, an &quot;open&quot; from an Apple reader tells you the mail arrived. That is all.</p>
<p>This changes what a subject line is for. Pre-2021, the industry graded subject lines on opens, which at least measured curiosity. Now the only numbers that survive contact with MPP are clicks and replies, so a subject line succeeds when the reader who opens goes on to do something. A line that tricks a person into opening and gives them nothing does not just waste the nine seconds Litmus measured; it teaches them to skip you next week. More on which metrics still mean anything in <a href="/blog/email-open-rates">our piece on open rates</a>.</p>
<h2 id="the-40-character-budget">The 40-character budget</h2><p>Mobile clients cut subject lines short, and the cut points are tighter than most people write to. Email Tool Tester&#39;s client-by-client measurements (checked August 2026) put the visible portrait-mode budget at:</p>
<div class="tblwrap"><table><thead><tr><th>Where the mail is read</th><th>Subject characters shown</th></tr></thead><tbody><tr><td>iPhone Mail, portrait</td><td>~41</td></tr>
<tr><td>Gmail app, portrait</td><td>~30</td></tr>
<tr><td>Safe across major mobile clients</td><td>~33</td></tr></tbody></table></div><p>The math that falls out of this is simple. Write to 40 characters or fewer, put the word that carries the meaning inside the first 30, and let the preheader carry everything that did not fit, since inboxes render subject and preheader as one continuous line. &quot;New: one-click rollback for failed deploys&quot; runs 42 characters and loses its last word in the Gmail app; &quot;One-click rollback is live&quot; keeps the payload inside every budget and leaves &quot;for failed deploys, no redeploy needed&quot; to the preheader.</p>
<p>People ask us for catchy newsletter subject lines. Catchy is the wrong target at 40 characters. Clear beats catchy in every inbox we have ever read, including our own.</p>
<h2 id="newsletter-headline-examples-by-type">Newsletter headline examples by type</h2><p>The sets below are ours, written for this article for three imaginary senders: a coffee roaster, a local city brief, and a developer tools changelog. We have not A/B tested them at scale, and we would distrust anyone who claims performance numbers for a list of unsent subject lines. Character counts are in parentheses. (Inside the email, the same patterns work as section headlines; the constraint that changes is the 40-character budget, which only applies in the inbox.)</p>
<p>Curiosity lines open a loop the issue must close:</p>
<ul>
<li>The blend we pulled after 12 days (33)</li>
<li>What the inspector found upstairs (33)</li>
<li>We deleted 4,000 lines of config (32)</li>
<li>The feature nobody asked for (28)</li>
<li>Our worst issue, by the numbers (31)</li>
</ul>
<p>Curiosity works when the payoff is real and arrives early in the issue. Its failure mode is fatal, though: tease without a cashout twice and readers stop believing you, which is a worse outcome than never being opened.</p>
<p>Specific lines state the payload outright:</p>
<ul>
<li>Ethiopia Guji is back Thursday, 250g bags (41)</li>
<li>Saturday: the harbor market moves indoors (41)</li>
<li>One-click rollback is live (26)</li>
<li>Free shipping ends Sunday night (31)</li>
</ul>
<p>Specific is the default we recommend. It self-selects the right readers, and the click it earns is a qualified one. The tradeoff: a specific line gets skipped by everyone the payload does not apply to, and you have to be at peace with that.</p>
<p>Number-led lines promise a countable read:</p>
<ul>
<li>3 breweries, 1 permit fight, 12 new jobs (40)</li>
<li>Our January numbers: 41% fewer tickets (38)</li>
<li>5 links on caching, 2 worth your weekend (40)</li>
</ul>
<p>Numbers signal that the issue respects the reader&#39;s time. They fail when every issue leads with a number, because the pattern reads as a template by week four. Rotate.</p>
<h2 id="the-spam-words-reality-check">The spam-words reality check</h2><p>The lists of &quot;spam trigger words&quot; that circulate every year are mostly folklore. Our stance, and the stance of the providers&#39; own documentation: mailbox filters decide folders on sender reputation, authentication, and complaint rates, and vocabulary is a minor signal at the margin. Google&#39;s bulk-sender requirements (February 2024) demand SPF, DKIM, <a href="/glossary#dmarc">DMARC</a>, one-click unsubscribe, and a spam-complaint rate under 0.3%. They contain no list of banned words. Even Mailjet, which publishes a spam-words guide, concedes in it that a sender with a clean reputation can say &quot;free&quot; without incident. Note the example set above: &quot;Free shipping ends Sunday night&quot; is a fine subject line on an authenticated domain with a warm history.</p>
<p>We have first-hand evidence that the folder decision lives below the content layer. In June 2026, Gmail silently rejected 73% of the mail we were forwarding between our own systems. The cause was DMARC alignment broken by forwarding. Not one word of any subject line was involved. If your mail is landing in spam, audit your authentication and your list before you audit your adjectives; the full diagnostic order is in <a href="/blog/why-emails-go-to-spam">why emails go to spam</a>.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="ab-testing-under-2000-subscribers-is-noise">A/B testing under 2,000 subscribers is noise</h2><p>Subject-line split tests need more sample than most newsletters have. The arithmetic: to detect a 5-point lift on a 40% baseline (40% vs 45%) at the standard 95% confidence and 80% power, you need roughly 1,500 recipients per arm, more than 3,000 subscribers split down the middle. Run that same test with 1,000 per arm and the smallest difference you can reliably detect is about 6 points, a swing real subject lines rarely produce. You can rerun this in any two-proportion sample-size calculator; Evan Miller&#39;s free one is the standard. And that math is on opens, the metric MPP already corrupted. Click-based tests need even more sample, because clicks are rarer.</p>
<p>So under about 2,000 subscribers, a per-issue split test is a random-number generator with a dashboard. Test across issues instead: pick one variable (say, specific vs curiosity), hold your send day and voice constant, run each style for a month, and compare clicks and replies over the whole period. Slower, honest, and it measures the thing that matters.</p>
<h2 id="what-we-track-instead">What we track instead</h2><p>Two numbers: clicks and replies. Mailbox providers weight engagement in roughly that order themselves, replies above clicks above opens, so the metrics that tell you the truth are also the ones that build your sending reputation. Keep the From name and address identical on every send while you evaluate anything, because a changed sender identity resets the reader&#39;s pattern recognition and contaminates whatever you were measuring.</p>
<p>Write the subject and preheader together, spend the first 30 characters on the operative word, and grade the result on clicks. Opens flatter you. Clicks pay you.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>26 newsletter ideas worth stealing</title>
    <link>https://letterduck.com/blog/newsletter-ideas</link>
    <guid isPermaLink="true">https://letterduck.com/blog/newsletter-ideas</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>26 newsletter ideas grouped by who you are: expert, curator, operator, or community builder. Each with the format that fits and a real published example.</description>
    <content:encoded><![CDATA[
<p>The only newsletter ideas worth pursuing pass one test: if you stopped sending, someone would email to ask where it went. Naptown Scoop, a three-day-a-week local brief for Annapolis, Maryland, reached 17,000 subscribers and over $200,000 a year in ad revenue by the end of 2023 (Creator Spotlight&#39;s profile of founder Ryan Sneddon). Annapolis has about 40,000 residents (2020 census). That city would notice.</p>
<p>This page is the idea catalog: 26 concepts, grouped by who you are, each with the format that fits it and a real published example where one exists. The mechanics of launching live in our guide to <a href="/guides/newsletter-on-your-own-domain">starting a newsletter on your own domain</a>, and the issue-level craft is in <a href="/blog/how-to-write-a-newsletter">how to write a newsletter</a>.</p>
<p><nav class="toc" aria-label="Contents"><div class="t">In this guide</div><ol><li><a href="#the-differentiation-test">The differentiation test</a></li><li><a href="#expert-ideas-you-know-something-most-people-don39t">Expert ideas: you know something most people don&#39;t</a></li><li><a href="#curator-ideas-you-read-everything-anyway">Curator ideas: you read everything anyway</a></li><li><a href="#operator-ideas-you-run-the-thing">Operator ideas: you run the thing</a></li><li><a href="#community-ideas-you-gather-people">Community ideas: you gather people</a></li><li><a href="#four-repeatable-formats-and-their-effort-budgets">Four repeatable formats and their effort budgets</a></li></ol></nav></p>
<h2 id="the-differentiation-test">The differentiation test</h2><p>Before picking from the list, answer two questions in writing. First: if this newsletter vanished, what would readers use instead? If the answer is &quot;another newsletter, interchangeably,&quot; the idea is not done. Second: which of four things are you? An expert (you know something), a curator (you read everything), an operator (you run something), or a community builder (you gather people). Most failed newsletters die of borrowed identity, an operator writing curator issues because digests look easy. The strong newsletter topics all come from the writer&#39;s actual position, which is why the list below is grouped by position and not by industry.</p>
<h2 id="expert-ideas-you-know-something-most-people-don39t">Expert ideas: you know something most people don&#39;t</h2><h3 id="1-the-one-concept-teacher">1. The one-concept teacher</h3><p>Teach a single idea per issue with one worked real-world example. The format is a short essay, 500 to 800 words, same day every week. The reference: Why We Buy, Katelyn Bourgoin&#39;s Tuesday buyer-psychology letter, which reached roughly 63,000 subscribers and seven figures of 2024 revenue on exactly this format (per Growth In Reverse&#39;s teardown).</p>
<h3 id="2-the-daily-column">2. The daily column</h3><p>Voice-driven commentary on your field&#39;s news, published daily. Matt Levine&#39;s Money Stuff at Bloomberg is the canonical example: thousands of words, one voice, arrives every weekday. Highest-effort idea on this page, and the format least survivable part-time. Start weekly.</p>
<h3 id="3-the-free-weekly-paid-daily-brief">3. The free-weekly, paid-daily brief</h3><p>One substantial free article a week to grow the list, short paid updates the other days. Ben Thompson&#39;s Stratechery built the model that most paid analysis newsletters now copy. Works only when your daily takes are genuinely better than the trade press.</p>
<h3 id="4-the-niche-translator">4. The niche translator</h3><p>Explain a jargon-heavy industry in plain language, for insiders who want clarity and outsiders who want a way in. Alex Johnson&#39;s Fintech Takes does this for financial technology twice a week, with analogies doing the heavy lifting.</p>
<h3 id="5-the-how-i-work-guide">5. The how-I-work guide</h3><p>Tactical walkthroughs of your own craft: templates, checklists, decision frameworks. Lenny Rachitsky&#39;s newsletter grew on exactly this for product and growth people. Format: one question or problem per issue, answered with artifacts the reader can copy.</p>
<h3 id="6-the-annotated-reading">6. The annotated reading</h3><p>You read the dense primary sources (papers, filings, RFCs, court documents) and send the three paragraphs that matter with your annotations. Nobody unsubscribes from the person who reads the boring things for them.</p>
<h3 id="7-the-office-hours-letter">7. The office-hours letter</h3><p>Answer one subscriber question per issue, in depth, with the question quoted. Self-feeding by design: every issue invites the next question, and replies are the strongest engagement signal a mailbox provider can see.</p>
<h3 id="8-the-prediction-ledger">8. The prediction ledger</h3><p>Make dated calls about your field and keep a public scoreboard, including the misses. The scoreboard is the differentiator; commentary is everywhere, accountability is scarce.</p>
<h2 id="curator-ideas-you-read-everything-anyway">Curator ideas: you read everything anyway</h2><h3 id="9-five-good-links">9. Five good links</h3><p>A handful of exceptional reads with a sentence or two of your judgment on each. The Browser, founded by Robert Cottrell, has sold subscriptions on five links a day for years. The taste is the product; the day you pad it with a sixth mediocre link, readers can tell.</p>
<h3 id="10-the-taste-catalog">10. The taste catalog</h3><p>Slower, broader curation with a personal essay up top: tools, design, culture, one issue a week. Kai Brach&#39;s Dense Discovery is the reference, and its longevity shows the format retains readers who skip individual issues without churning.</p>
<h3 id="11-six-short-recommendations">11. Six short recommendations</h3><p>Fixed count, tiny reviews, zero filler. Recomendo (Kevin Kelly, Mark Frauenfelder, Claudia Dawson) sends six one-paragraph recommendations every Sunday. The rigid format is the appeal: readers know the cost of opening it, about a minute.</p>
<h3 id="12-the-day39s-news-through-one-voice">12. The day&#39;s news through one voice</h3><p>Pick what mattered today and say why in your own register. Dave Pell&#39;s NextDraft has done &quot;the day&#39;s most fascinating news&quot; this way for over a decade. Differentiates on personality, so it fails if you write it neutral.</p>
<h3 id="13-the-forum-digest">13. The forum digest</h3><p>Curate the best of a community you do not own. Hacker Newsletter, Kale Davis&#39;s weekly hand-picked digest of Hacker News, has run since 2010 on this model. Every large forum, subreddit, and Discord with no digest is an open slot.</p>
<h3 id="14-the-industry-brief">14. The industry brief</h3><p>Everything that happened in one niche this week, compressed to a five-minute read. Morning Brew proved the format for business news; the play now is the same brief for a market too small for a media company, which is precisely where a solo writer wins.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h3 id="15-the-archive-resurfacer">15. The archive resurfacer</h3><p>Ignore the news entirely and surface old, timeless material: essays, letters, papers, forgotten books. Maria Popova&#39;s The Marginalian has spent two decades proving readers will subscribe to the past. Zero news-cycle pressure, which makes it the most sustainable curator format here.</p>
<h2 id="operator-ideas-you-run-the-thing">Operator ideas: you run the thing</h2><h3 id="16-the-build-in-public-diary">16. The build-in-public diary</h3><p>What you shipped, what broke, what it taught you, weekly. Arvid Kahl&#39;s The Bootstrapped Founder goes out every Friday on this model. The candor is the moat: a competitor can copy your product, not your honest account of running it.</p>
<h3 id="17-the-metrics-memo">17. The metrics memo</h3><p>Your real numbers on a schedule: revenue, churn, conversion, and one lesson per number. Publishing the figure you are slightly embarrassed by is what separates this from marketing.</p>
<h3 id="18-the-teardown-letter">18. The teardown letter</h3><p>Dissect one artifact per issue: a landing page, a pricing page, a checkout flow, with annotations. Harry Dry&#39;s Marketing Examples grew a huge list on visual teardowns. Effort is front-loaded in the analysis, and the archive compounds into a reference readers cite back to you.</p>
<h3 id="19-the-customer-mailbag">19. The customer mailbag</h3><p>Answer real customer questions publicly, names removed. You already wrote these answers in your support inbox once; the newsletter is the second use. The best low-effort operator format, and it doubles as pre-sales.</p>
<h3 id="20-the-process-letter">20. The process letter</h3><p>How the thing got made this week: the roast profile, the print run, the recipe test, the deploy that went sideways. Process is the one story a commodity business owns outright.</p>
<h3 id="21-the-changelog-with-a-narrator">21. The changelog with a narrator</h3><p>Release notes rewritten as a story: what changed, why, what it cost, what almost shipped instead. Most changelogs are lists nobody reads; a narrated one becomes the reason users stay current. We write our own product notes this way, which is partly why this list exists.</p>
<h2 id="community-ideas-you-gather-people">Community ideas: you gather people</h2><h3 id="22-the-local-brief">22. The local brief</h3><p>Your town, three mornings a week, written like a friend who knows everything happening. Naptown Scoop, from the top of this page, is the template: Sneddon reports a 65% open rate in that same profile, and while Apple&#39;s <a href="https://www.apple.com/legal/privacy/data/en/mail-privacy-protection/">Mail Privacy Protection</a> inflates that number for every sender, even discounted it signals a list that would riot if the mail stopped.</p>
<h3 id="23-the-scene-report">23. The scene report</h3><p>Cover a subculture the mainstream press only parachutes into. Ryan Broderick&#39;s Garbage Day, started in 2019, turned internet-culture reporting into a three-day-a-week letter with over 100,000 subscribers (per Broderick&#39;s 2025 interview with Longlead). Substitute any scene you genuinely live in: modular synths, zine printing, competitive gardening.</p>
<h3 id="24-the-advice-column">24. The advice column</h3><p>Readers send dilemmas; you answer one per issue with actual care. Heather Havrilesky&#39;s Ask Polly carried the newspaper advice column into email and proved the format&#39;s pull is intact. Requires a voice, not credentials.</p>
<h3 id="25-the-member-spotlight">25. The member spotlight</h3><p>Interview one member of your community per issue, five questions, same five every time. The subjects share their issues, which grows the list; the archive becomes a directory of the scene. Near-zero writing burden, real scheduling burden.</p>
<h3 id="26-the-jobs-and-events-board">26. The jobs-and-events board</h3><p>Openings, gigs, meetups, and deadlines for one niche, reliably compiled. The least glamorous idea here and among the most defensible: utility newsletters get read on a schedule, and advertisers understand them instantly.</p>
<h2 id="four-repeatable-formats-and-their-effort-budgets">Four repeatable formats and their effort budgets</h2><p>Most of the 26 concepts above run on one of four chassis. Budget honestly before committing; these are our planning budgets, not measurements, and your first three issues will run over.</p>
<div class="tblwrap"><table><thead><tr><th>Format</th><th>The chassis</th><th>Budget per issue</th></tr></thead><tbody><tr><td>Teardown</td><td>One artifact, dissected with annotations</td><td>3-5 hours</td></tr>
<tr><td>Diary</td><td>What happened, what it taught you</td><td>1-2 hours</td></tr>
<tr><td>Digest</td><td>5-10 curated items with judgment</td><td>2-4 hours, and the reading hides here</td></tr>
<tr><td>Q&amp;A</td><td>One question, answered in depth</td><td>2-3 hours</td></tr></tbody></table></div><p>The digest looks cheapest and rarely is, because the curation only works if you were reading widely anyway; the diary is genuinely cheap if the week supplies the material. Whichever chassis you pick, the <a href="/blog/newsletter-subject-lines">subject line and preheader</a> carry the issue into the open, so budget ten minutes for them every single time.</p>
<p>Pick one concept, run the differentiation test on it in writing, and choose the chassis you can sustain in the hours you really have. The right idea is the one still shipping in week six.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Newsletter examples: 9 real newsletters, taken apart</title>
    <link>https://letterduck.com/blog/newsletter-examples</link>
    <guid isPermaLink="true">https://letterduck.com/blog/newsletter-examples</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>Nine newsletters that earn their inbox slot, dissected by mechanism: format, cadence, money, and voice. Plus the anatomy behind our three template designs.</description>
    <content:encoded><![CDATA[
<p>Every newsletter in this piece was still publishing when we checked on August 7, 2026. That was the screen. No dead legends, no famous sends from 2019 that quietly stopped, no screenshot farms. Nine working publications, and for each one the question that matters: what is the load-bearing mechanism, the one thing that would break it if you removed it?</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Great newsletters run on one repeatable mechanism: a habit slot, a voice, a taste filter, a beat, an archive, or two decades of trust.</li>
<li>The money model is downstream of the mechanism. Ads need scale, patronage needs devotion, paid tiers need an archive worth expensing.</li>
<li>Design follows the same split. We build in three directions (Postcard, Letter, Broadsheet), and each maps to a different kind of writer.</li>
</ul></aside><p>Copying a famous newsletter&#39;s look gets you nothing, because the look is the least transferable part. The mechanism transfers. If you are deciding what to build, read these as machines, then pick the one whose moving parts you can actually operate on schedule. (If you have not sent issue one yet, our guide to <a href="/guides/newsletter-on-your-own-domain">starting a newsletter on your own domain</a> covers the plumbing side.)</p>
<h2 id="the-habit-slot-morning-brew-and-the-hustle">The habit slot: Morning Brew and The Hustle</h2><p>Morning Brew topped 4 million subscribers in March 2022, per CNBC, after selling a majority stake to Insider in 2020 at a reported valuation around $75 million. The Hustle went to HubSpot in February 2021 for a reported $27 million and its signup page claimed 2 million plus readers when we checked in August 2026. Two exits, one mechanism.</p>
<p>The mechanism is the habit slot. Both arrive every weekday morning, both promise roughly five minutes, and both compress business news into a conversational register that reads faster than a news site. The product is not any single story. The product is the slot itself: the reader&#39;s coffee has a fixed companion, and an advertiser can buy a seat next to that habit.</p>
<p>Notice what this requires. Daily production, a writing team, referral programs, and a list in the hundreds of thousands before ad revenue covers salaries. The habit-slot model is a media company, not a side project. Steal the compression and the fixed schedule; do not steal the business model unless you are hiring.</p>
<h2 id="the-voice-money-stuff">The voice: Money Stuff</h2><p>Matt Levine&#39;s Money Stuff goes out from Bloomberg every weekday, free, and it is the strongest argument in email that voice is a moat. The subject is securities law and market structure, which should be unreadable. Levine makes it funny in a specific, footnoted, digressive way that no other writer can fake, and readers open it for the sentences, not the news.</p>
<p>The money mechanism is unusual: readers pay nothing. Bloomberg pays, because Money Stuff is talent gravity for the whole Bloomberg brand. Very few writers can run this play directly, but the lesson underneath it scales down: if your voice is distinctive enough, format barely matters. Money Stuff is one enormous column of prose with almost no design at all, and nobody has ever complained.</p>
<h2 id="the-taste-filter-nextdraft-and-dense-discovery">The taste filter: NextDraft and Dense Discovery</h2><p>Dave Pell has called himself Managing Editor, Internet, and NextDraft is that job made literal: each weekday he reads the news so you skim ten items with punchy section titles, each a few sentences plus a link. Still landing as of August 2026. The mechanism is a taste filter with a persona attached. You are not subscribing to news. You are subscribing to Pell&#39;s eye.</p>
<p>Dense Discovery is the same mechanism at a weekly cadence and a slower temperature. Kai Brach has shipped more than 400 issues since 2018: design, technology, urbanism, and books, curated with a stated point of view. The funding model matches the pace. Memberships (Friends of DD) plus small, clearly marked sponsorships, with the issue count and the funding model both read off densediscovery.com in August 2026. No growth team, no ad network, one person with taste and a deadline.</p>
<p>Curation is the most accessible mechanism on this list. It needs no original reporting and no rare expertise, just consistent judgment. It is also the easiest to do forgettably, which is why the persona matters: a link list without a point of view is a bookmarks folder.</p>
<h2 id="the-beat-garbage-day">The beat: Garbage Day</h2><p>Ryan Broderick&#39;s Garbage Day owns a beat that mainstream outlets touch only clumsily: internet culture as its own subject, covered three times a week (Monday, Wednesday, Friday). It won a Webby, passed 100,000 subscribers with 5 to 10 percent paying, per Broderick&#39;s 2025 interview with Longlead, and has grown into an eight-person company with a podcast attached.</p>
<p>The mechanism is territory. Pick ground nobody else patrols seriously, then patrol it so often that anyone who cares about the subject has to read you. The freemium split follows naturally: the free issues establish the beat, the paid issues deepen it. If you have genuine expertise in a niche your industry&#39;s trade press covers badly, this is your model.</p>
<h2 id="the-archive-lenny39s-newsletter-and-stratechery">The archive: Lenny&#39;s Newsletter and Stratechery</h2><p>Lenny Rachitsky&#39;s newsletter passed one million subscribers by his own 2026 count, and the Growth In Reverse teardown puts paying subscribers above 18,000. The paid product is not really this week&#39;s issue. It is the archive: years of product-management deep dives, salary surveys, and templates that a subscriber can search the day a problem hits. The price reads like a business expense because it is one; most subscribers can put it on a company card.</p>
<p>Ben Thompson&#39;s Stratechery built this category. One free weekly article in public, paid Updates behind the subscription, running on that split since 2014 and since expanded into a bundle of newsletters and podcasts. Thompson also proved the strategic point that matters most here: he owns the relationship. His subscribers are email addresses on his list, on his domain, under his terms.</p>
<p>The archive mechanism demands real expertise compounding over years. Slowest to start, strongest once running, because every issue you publish makes the product more valuable.</p>
<h2 id="the-lifetime-the-marginalian">The lifetime: The Marginalian</h2><p>Maria Popova has written The Marginalian alone since 2006, free, ad-free, funded by reader patronage. Essays on books, science, and meaning, collected into a Sunday digest. Twenty years of it.</p>
<p>There is no format trick to extract here, and that is the point of including it. The mechanism is accumulated trust at a scale no growth tactic reaches. Patronage works for Popova because two decades of showing up made readers feel like participants in something. If you plan to fund a newsletter by donation, understand the timescale you just signed up for.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="the-anatomy-lesson-what-the-design-is-actually-doing">The anatomy lesson: what the design is actually doing</h2><p>Strip the nine above to their skeletons and you find three visual grammars, not nine. We built our templates as those three directions, so here is the anatomy with our own drawings as the diagram. The Postcard is the template our composer ships today; Letter and Broadsheet are the other two directions, and you can flip between all three in the live demo on <a href="/">our home page</a>.</p>
<p>Postcard is the image-led grammar. An illustration block up top (ours has a stamp in the corner, because we are that kind of shop), a serif headline under it, a short body, and exactly one button. This is the digest and curator skeleton: it assumes the real content lives at the other end of a link, so the email&#39;s job is to make one click feel inevitable. The discipline is the single button. Add three and you have a homepage, and homepages get archived unread.</p>
<p>Letter is the type-only grammar. A centered small-caps letterhead over a hairline rule, an italic serif title, a salutation (&quot;Dear reader,&quot;), body text set in a serif with generous 1.7 line height, and a signature in place of a button. No images at all. This is the columnist and essayist skeleton, Money Stuff&#39;s and The Marginalian&#39;s shape: the words are the product, so the design&#39;s whole job is to stay out of their way and signal that a human wrote them.</p>
<p>Broadsheet is the edition grammar. A letterspaced uppercase masthead, then a dateline row (volume, issue number, edition name) pinned between a thin rule above and a thick rule below, then a bold headline and dense body. The newspaper feel survives on the masthead-and-dateline furniture alone. Our own browser preview of it does set two justified columns, but that is a wide-screen flourish: in a real email client everything flows as one column, because multi-column email layouts die horribly in Outlook. This is the skeleton for roundups that want institutional weight, the shape Morning Brew gestures at with its own masthead.</p>
<p>Two rules sit under all three directions. First, single-column discipline: every layout is one column at 600 pixels, because that is the only geometry every email client renders faithfully (the full reasoning is in our <a href="/blog/email-newsletter-design">newsletter design rules</a>). Second, the footer is a trust surface, not legal debris. Our shipped template&#39;s footer says why you are receiving this, offers unsubscribe in one click, and carries the sender&#39;s mailing address, and every campaign leaves with <a href="https://www.rfc-editor.org/rfc/rfc8058.html">RFC 8058</a> <a href="/blog/list-unsubscribe">one-click unsubscribe headers</a> attached. Readers who trust the bottom of your email open the next one.</p>
<h2 id="the-pattern-library-which-anatomy-fits-which-writer">The pattern library: which anatomy fits which writer</h2><div class="tblwrap"><table><thead><tr><th>You are</th><th>Steal the mechanism from</th><th>Anatomy</th><th>Cadence that fits</th><th>Money that fits</th></tr></thead><tbody><tr><td>A team compressing news daily</td><td>Morning Brew, The Hustle</td><td>Broadsheet</td><td>Every weekday</td><td>Ads, at serious scale</td></tr>
<tr><td>A writer with an unmistakable voice</td><td>Money Stuff</td><td>Letter</td><td>Weekdays or weekly</td><td>Salary, patronage, or paid tier</td></tr>
<tr><td>A curator with taste</td><td>NextDraft, Dense Discovery</td><td>Postcard</td><td>Weekly is plenty</td><td>Memberships plus small sponsors</td></tr>
<tr><td>An expert on an undercovered beat</td><td>Garbage Day</td><td>Postcard or Letter</td><td>2 to 3 times weekly</td><td>Freemium split</td></tr>
<tr><td>A practitioner compounding expertise</td><td>Lenny&#39;s, Stratechery</td><td>Letter</td><td>Weekly</td><td>Paid archive, expensable pricing</td></tr>
<tr><td>An essayist playing a long game</td><td>The Marginalian</td><td>Letter</td><td>Weekly digest</td><td>Patronage, measured in years</td></tr></tbody></table></div><p>Read the table backwards, too. If you want sponsorship money but publish monthly essays, the mechanism and the model are fighting each other, and the model loses.</p>
<p>Pick one row. Write <a href="/blog/how-to-write-a-newsletter">issue one</a> in that shape this week, and put it on a domain you own, because every newsletter above that controls its own destiny sends from its own address, not a platform&#39;s.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>What is an MX record? How mail routing actually resolves</title>
    <link>https://letterduck.com/blog/mx-record</link>
    <guid isPermaLink="true">https://letterduck.com/blog/mx-record</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>MX records decide where your inbound email goes: how priority numbers really work, our live records, and the full DNS set every domain needs.</description>
    <content:encoded><![CDATA[
<p>An MX record answers exactly one question: which servers accept inbound email for this domain. When someone writes to <code>anything@yourdomain.com</code>, their mail server looks up your MX records before it can deliver a single byte. Here is a real one, pulled from our own zone today:</p>
<div class="codewrap"><pre><code>nostalgiapost.com.  300  IN  MX  12 route1.mx.cloudflare.net.
</code></pre></div>
<p>That single line routes mail for the domain to Cloudflare&#39;s inbound servers. Everything else about email DNS (SPF, DKIM, DMARC) is about trust and authentication; the MX record is the only one about where mail physically goes. This article covers how that resolution really works, the backup-MX myth, and the complete DNS record set for a working email domain, all shown with live records. It is part of our <a href="/guides/email-deliverability">email deliverability handbook</a>.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>An MX record maps your domain to the hostnames that accept its inbound mail, each with a priority number. Lowest number wins.</li>
<li>Senders that cannot reach any MX host queue the message and retry for days (<a href="https://www.rfc-editor.org/rfc/rfc5321.html" rel="nofollow">RFC 5321</a> suggests giving up after 4 to 5 days), so you do not need a backup MX for reliability.</li>
<li>MX is inbound only. Your outbound mail never touches it, which is why you can receive on Cloudflare and send through a relay.</li>
<li>A complete email domain needs MX, SPF, DKIM, and DMARC records. Check all four with dig in under a minute.</li>
</ul></aside><h2 id="anatomy-of-the-record">Anatomy of the record</h2><p>The format is name, TTL, class, type, then two values that matter: a preference number and a target hostname.</p>
<div class="codewrap"><pre><code>nostalgiapost.com.  300  IN  MX  2  route3.mx.cloudflare.net.
nostalgiapost.com.  300  IN  MX  12 route1.mx.cloudflare.net.
nostalgiapost.com.  300  IN  MX  77 route2.mx.cloudflare.net.
</code></pre></div>
<p>Two rules about the target trip people up. It must be a hostname, never an IP address; the sending server resolves that hostname to an address in a separate lookup. And it must not point at a CNAME. Both restrictions come from the DNS and <a href="/glossary#smtp">SMTP</a> standards, and while some servers tolerate violations, &quot;some servers tolerate it&quot; is a terrible foundation for the record that receives your invoices.</p>
<p>The preference number is relative, not absolute. Priorities of 2, 12, and 77 behave identically to 10, 20, and 30; only the ordering counts. Cloudflare assigns those odd-looking values automatically, which is a good reminder that nobody wins points for pretty numbers here.</p>
<h2 id="how-resolution-actually-works">How resolution actually works</h2><p>When a mail server has a message for your domain, the sequence is rigid. It queries DNS for your MX records, sorts them by preference ascending, and attempts SMTP delivery to the lowest number first. If that host refuses connections, it tries the next number up. Records sharing the same preference are used in random rotation, which is how large receivers spread load.</p>
<p>Then comes the part most explanations skip: what happens when every host is unreachable. The sender does not bounce the message. It queues it and retries on a backoff schedule, typically for days; RFC 5321&#39;s guidance is that senders should keep trying for at least 4 to 5 days before giving up. Your mail server can be down for a full weekend and, with no backup MX at all, you lose nothing. The mail arrives Monday.</p>
<p>Two edge cases complete the picture. A domain with no MX records is still emailable: the standard falls back to the domain&#39;s A record, the so-called implicit MX, which is why mail sometimes reaches domains whose owners never configured email. And a domain that wants no mail at all can say so explicitly with a null MX (<a href="https://www.rfc-editor.org/rfc/rfc7505.html">RFC 7505</a>): a single record with preference 0 and a target of just <code>.</code>, which lets senders fail immediately instead of retrying for days against a domain that will never answer.</p>
<h2 id="the-backup-mx-myth">The backup MX myth</h2><p>The traditional advice says to run a secondary MX at a higher preference so mail &quot;has somewhere to go&quot; when your primary is down. For almost everyone, this is solving a problem retry queues already solved while creating two real ones.</p>
<p>The first: spammers noticed decades ago that backup MX hosts usually had weaker filtering and looser recipient checks than the primary, and started delivering straight to the highest preference number. The second: a backup that accepts mail without knowing your valid recipients must accept everything, then bounce the junk later, generating backscatter that damages your reputation on mail you never wanted.</p>
<p>Our position: never run your own backup MX. If you use a managed inbound service you get multiple MX hosts anyway, all with identical filtering, as the three Cloudflare records above show. That is the correct version of redundancy: three equal doors into the same system, not a poorly guarded side entrance.</p>
<h2 id="what-our-records-do-all-day">What our records do all day</h2><p>Those three records feed a catch-all: every address on the domain, whether it existed five minutes ago or not, routes to the same inbound pipeline, where a Worker parses the message and writes it to a database as the source of truth. An &quot;address&quot; in our system is a routing rule, not a mailbox you pay for, which is what makes unlimited addresses literal rather than a pricing gimmick. The pattern is worth a look even if you build it differently: <a href="/blog/catch-all-email">catch-all email</a> changes how you hand out addresses.</p>
<p>We also monitor the whole path rather than trusting it: every two hours a canary message travels through DNS, those MX records, and the parser, and we get an alert if it fails to arrive. MX records fail rarely, but &quot;rarely&quot; is exactly the failure you want a machine watching for.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="the-complete-dns-set-for-email">The complete DNS set for email</h2><p>MX gets mail to you. Three more records get your mail trusted by everyone else, and one optional record serves your ESP&#39;s tracking. This is the full set, with the live values from our zone (DKIM key truncated):</p>
<div class="tblwrap"><table><thead><tr><th>Record</th><th>Host</th><th>Example value</th><th>Job</th></tr></thead><tbody><tr><td class="yes">MX</td><td><code>nostalgiapost.com</code></td><td><code>12 route1.mx.cloudflare.net.</code></td><td>Routes inbound mail to your receiving servers</td></tr>
<tr><td class="yes">TXT (SPF)</td><td><code>nostalgiapost.com</code></td><td><code>v=spf1 include:_spf.mx.cloudflare.net include:amazonses.com ~all</code></td><td>Lists servers allowed to send as your domain</td></tr>
<tr><td class="yes">TXT (DKIM)</td><td><code>resend._domainkey.nostalgiapost.com</code></td><td><code>p=MIGfMA0GCSqGSIb3...</code></td><td>Publishes the public key that verifies your signatures</td></tr>
<tr><td class="yes">TXT (DMARC)</td><td><code>_dmarc.nostalgiapost.com</code></td><td><code>v=DMARC1; p=reject; rua=mailto:dmarc@nostalgiapost.com; fo=1</code></td><td>Tells receivers what to do when authentication fails</td></tr>
<tr><td class="soft">CNAME (tracking)</td><td><code>link.yourdomain.com</code></td><td><code>track.yourprovider.com.</code></td><td>Optional: lets your ESP&#39;s click tracking live on your domain</td></tr></tbody></table></div><p>One nuance from our own zone: your <a href="/glossary#esp">ESP</a> may ask you to add an MX record on a sending subdomain, ours being <code>send.nostalgiapost.com</code> pointing at <code>feedback-smtp.us-east-1.amazonses.com</code>. That is not for your inbound mail; it routes bounce reports back to the relay so your bounce processing works. Add it where they tell you and leave your root MX alone.</p>
<p>How SPF, DKIM, and <a href="/glossary#dmarc">DMARC</a> interlock is its own subject, covered in <a href="/blog/spf-dkim-dmarc">SPF, DKIM, and DMARC explained</a>. The short version: MX without them means you can receive but your outbound lands in spam, and since November 2025 Gmail hard-rejects unauthenticated bulk mail outright.</p>
<h2 id="mx-is-inbound-only">MX is inbound only</h2><p>The most common MX misconception is that it has anything to do with sending. It does not. Outbound mail goes wherever your sending server or relay connects; your own MX records are never consulted. This split is what makes the modern architecture work: our inbound rides Cloudflare&#39;s MX hosts while our outbound goes through a sending relay, and neither system knows the other exists.</p>
<p>It also means changing MX records cannot break your outbound sending, and switching ESPs cannot break your inbound. When you debug a mail problem, first decide which direction is broken; it tells you which records are even relevant.</p>
<h2 id="check-yours-with-dig">Check yours with dig</h2><p>Sixty seconds, four commands, and you know the state of a domain&#39;s email DNS:</p>
<div class="codewrap"><pre><code>dig MX yourdomain.com +short
dig TXT yourdomain.com +short
dig TXT selector._domainkey.yourdomain.com +short
dig TXT _dmarc.yourdomain.com +short
</code></pre></div>
<p>The first should return at least one priority-and-hostname pair. The second should include exactly one line starting <code>v=spf1</code>. The third needs your provider&#39;s selector name (ours is <code>resend</code>; check your ESP&#39;s DNS setup page). The fourth should start <code>v=DMARC1</code>.</p>
<p>Run those four against your own domain now. If the MX answer is empty, your domain is receiving mail by accident through the implicit-MX fallback or not at all; either way, fix that first, because every other email record only matters once mail knows where to go.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>The List-Unsubscribe header: RFC 8058 in practice</title>
    <link>https://letterduck.com/blog/list-unsubscribe</link>
    <guid isPermaLink="true">https://letterduck.com/blog/list-unsubscribe</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>The exact List-Unsubscribe and List-Unsubscribe-Post headers we send, how one-click unsubscribe works under RFC 8058, and the math on hiding it.</description>
    <content:encoded><![CDATA[
<p>Every campaign our system sends carries these two headers. This is the literal output of our send path, with only the per-recipient token shortened:</p>
<div class="codewrap"><pre><code>List-Unsubscribe: &lt;https://nostalgiapost.com/api/unsubscribe?token=9f2c...&gt;, &lt;mailto:unsubscribe@nostalgiapost.com?subject=unsubscribe&gt;
List-Unsubscribe-Post: List-Unsubscribe=One-Click
</code></pre></div>
<p>That pair is what &quot;one-click unsubscribe&quot; means technically, it is what <a href="https://www.rfc-editor.org/rfc/rfc8058.html">RFC 8058</a> specifies, and it is what Gmail and Yahoo require from bulk senders sending commercial mail. Google&#39;s requirement took effect February 1, 2024, with June 1, 2024 as the deadline for senders who already carried some unsubscribe link; Yahoo said only that enforcement would begin in June 2024. It is also one of the cheapest deliverability wins available, because the alternative exit from your list is the spam button, and the spam button is the one that hurts. The wider context lives in our <a href="/guides/email-deliverability">email deliverability handbook</a>; this article is just these two headers, done properly.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>Send both headers: List-Unsubscribe (an HTTPS URL plus a mailto fallback) and List-Unsubscribe-Post: List-Unsubscribe=One-Click.</li>
<li>One-click means the mail client sends a POST to your URL. No landing page, no login, no "are you sure."</li>
<li>Google's rules give you 2 days to honor an unsubscribe. Honor it immediately instead; there is nothing to gain from the delay.</li>
<li>The trade in plain numbers: an unsubscribe costs you one subscriber. One complaint spends your entire 0.1% budget for 1,000 delivered emails.</li>
</ul></aside><h2 id="what-rfc-8058-actually-requires">What RFC 8058 actually requires</h2><p>RFC 8058 (published January 2017) exists because of a quiet failure mode in the older mailto-only approach: mail software sometimes prefetches URLs found in headers, and a GET request that unsubscribes someone means people get silently removed from lists they wanted. The fix is to require deliberate semantics. Three rules do the work:</p>
<ol>
<li>The <a href="/glossary#list-unsubscribe">List-Unsubscribe</a> header must contain at least one HTTPS URI. A mailto alone does not qualify for one-click.</li>
<li>The List-Unsubscribe-Post header must contain exactly <code>List-Unsubscribe=One-Click</code>. This is the signal that the URL accepts the one-click flow.</li>
<li>When the user clicks unsubscribe in their mail client, the client sends an HTTP POST to your URL with the body <code>List-Unsubscribe=One-Click</code>. Your server must complete the unsubscribe on that POST, without any further interaction: no confirmation page that requires a click, no login wall, no survey first.</li>
</ol>
<p>There is a fourth requirement that trips up home-rolled implementations: the message&#39;s <a href="/glossary#dkim">DKIM</a> signature must cover both headers. If your relay signs the message before your code adds the headers, they are outside the signature and the one-click flow is not compliant. Any competent ESP handles this ordering for you, but if you built your own pipeline, check it.</p>
<p>The URL itself should carry a per-recipient token, as ours does. The POST arrives with no cookie and no authenticated user, so the token is the only thing telling you who is unsubscribing. Make it unguessable, and make it work forever; a token that expires after 30 days breaks unsubscribes from old emails, which is exactly when frustrated people go looking for the spam button.</p>
<h2 id="why-both-url-and-mailto">Why both URL and mailto</h2><p>The HTTPS URI satisfies RFC 8058 and powers the one-click button in Gmail and Yahoo. The mailto is a fallback for clients that predate the standard or implement only the older <a href="https://www.rfc-editor.org/rfc/rfc2369.html">RFC 2369</a> behavior: they generate an email to your unsubscribe address instead. If you include the mailto, something on your side has to actually read that mailbox and process the requests, which is why our mailto points at a real routed address and not a decoy.</p>
<p>Belt and suspenders, and each strap costs one header. Gmail&#39;s own bulk-sender documentation asks for one-click support; the mailto costs nothing extra and catches the stragglers. The full requirement list, including the authentication rules that come with it, is in our walkthrough of <a href="/blog/gmail-bulk-sender-requirements">Gmail&#39;s bulk sender requirements</a>.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="the-2-day-rule-and-why-we-ignore-the-allowance">The 2-day rule, and why we ignore the allowance</h2><p><a href="https://support.google.com/mail/answer/81126">Google&#39;s sender guidelines</a> require unsubscribe requests to be honored within 2 days. That is the compliance ceiling, not a design target. We process the unsubscribe the moment the POST arrives: the recipient goes onto the entity&#39;s <a href="/glossary#suppression-list">suppression list</a> in the same request, and that list is checked before every future send.</p>
<p>The reasoning is not virtue. It is that delayed unsubscribes generate complaints. A person who unsubscribed on Tuesday and receives your Thursday campaign does not think &quot;the 48-hour window has not elapsed.&quot; They think it did not work, and they report you as spam, and now the exit you gave them for free has been converted into the expensive kind. Batch-processing unsubscribes nightly was defensible engineering in 2010. In a world where the suppression check is one indexed query, holding a fresh unsubscribe in a queue for two days buys you nothing and risks the complaint you built all of this to avoid.</p>
<h2 id="the-math-on-hiding-your-unsubscribe">The math on hiding your unsubscribe</h2><p>Some senders still shrink the unsubscribe link, bury it under a login, or leave the headers off so Gmail shows no unsubscribe affordance. The theory is retention. The arithmetic says otherwise.</p>
<p>Gmail&#39;s complaint threshold structure gives you a target spam rate under 0.1% and a critical limit of 0.3%. At 0.1%, your budget is one complaint per 1,000 delivered emails. One. A subscriber who wants out and finds no obvious exit does not stay and read your newsletter; they click &quot;report spam,&quot; which is always one click and never hidden. So the real trade on every tired subscriber is: an unsubscribe, which costs you a recipient who had stopped converting anyway, or a complaint, which spends your entire allowance for a thousand deliveries. Cross 0.3% and Gmail withholds delivery mitigation until you have held under the line for 7 consecutive days, degrading placement for everyone on your list, including the people who love your mail.</p>
<p>An unsubscribe is free. A complaint is a thousandth of your budget. Price your UX decisions accordingly, and while you are at it, stop sending to people who have gone quiet: a <a href="/blog/double-opt-in">double opt-in</a> at the front door and a sunset policy at the back keep the tired cohort small in the first place.</p>
<h2 id="testing-yours-in-five-minutes">Testing yours in five minutes</h2><p>Send a real campaign message to a Gmail address you control, then open it and click the three-dot menu, then &quot;Show original.&quot; Search the raw text for <code>List-Unsubscribe</code>. You are checking three things: both headers are present, the List-Unsubscribe value contains an HTTPS URL (not only a mailto), and the DKIM verdict at the top of the page says PASS.</p>
<p>Then check the rendered message for Gmail&#39;s own unsubscribe affordance next to the sender name, and click it. Confirm the address actually lands in your suppression store, and confirm a second send skips it. When we wired this up, the end-to-end test (click, POST handled, suppression row written, next send suppressed) was the test that mattered; the headers merely being present proves formatting, not behavior.</p>
<p>Two headers, a POST handler, and an immediate suppression write. Ship that, and the only people leaving your list will be the ones who were already gone.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>Is cold email legal? CAN-SPAM, GDPR, and CASL</title>
    <link>https://letterduck.com/blog/is-cold-email-legal</link>
    <guid isPermaLink="true">https://letterduck.com/blog/is-cold-email-legal</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>What CAN-SPAM actually requires, the $53,088 per-email penalty, GDPR legitimate interest, CASL consent rules, and a compliance checklist that holds up.</description>
    <content:encoded><![CDATA[
<p>Cold email is legal in the United States, conditionally legal in most of Europe, and close to impractical in Canada without prior context. The margin for error is priced at up to $53,088 per email.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>CAN-SPAM permits unsolicited commercial email. It is an opt-out law: consent is never required, but truthful headers, a postal address, and an honored opt-out are.</li>
<li>The maximum US civil penalty is $53,088 per violating email (FTC inflation adjustment effective January 17, 2025).</li>
<li>GDPR allows B2B outreach under legitimate interest, but national ePrivacy laws differ: Germany requires prior consent, the UK permits email to corporate addresses.</li>
<li>Canada's CASL requires consent, express or implied, with penalties up to CAD $10 million per violation.</li>
</ul></aside><div class="note">We are operators, not lawyers. What follows is our reading of the statutes and the regulators' own guidance, with sources named. When real money or a legal department is involved, buy an hour of counsel.</div><p>The law is one of two rulebooks. The other, enforced faster and without appeals, is mailbox-provider policy, which is why our <a href="/guides/cold-email-infrastructure">cold email infrastructure guide</a> treats compliance and deliverability as a single system. If you want the definitional groundwork first, <a href="/blog/what-is-cold-email">what is a cold email</a> draws those lines.</p>
<h2 id="can-spam-an-opt-out-law">CAN-SPAM: an opt-out law</h2><p>The CAN-SPAM Act of 2003 governs commercial email in the US, and the most misunderstood thing about it is what it does not require: consent. You may email a stranger. <a href="https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business">The FTC&#39;s compliance guide</a> reduces the law to seven obligations:</p>
<ol>
<li>No false or misleading header information. From, reply-to, and routing data must identify the person or business that sent the message.</li>
<li>No deceptive subject lines. The subject must reflect the content.</li>
<li>Identify the message as an advertisement. The law leaves room in how, but disguising a pitch as personal correspondence or a fake &quot;Re:&quot; fails the test.</li>
<li>Include a valid physical postal address. A street address, a PO box registered with the USPS, or a private mailbox registered with a commercial mail receiving agency all qualify.</li>
<li>Tell recipients how to opt out, in language a person can spot and use.</li>
<li>Honor opt-outs within 10 business days, with no fee, no login, and no request for anything beyond an email address.</li>
<li>Monitor what others send on your behalf. Hiring an agency or a sending tool does not transfer the liability.</li>
</ol>
<p>Each non-compliant email is a separate violation, currently priced at up to $53,088 in civil penalties. That figure comes from <a href="https://www.ftc.gov/news-events/news/press-releases/2025/02/ftc-publishes-inflation-adjusted-civil-penalty-amounts-2025">the FTC&#39;s inflation adjustment</a> published in the Federal Register on January 17, 2025. The FTC restates the maximum for inflation most Januaries, so check the current adjustment before you quote it back to anyone. The agency does not chase theoretical maximums against small senders, and the per-email arithmetic is still the point: a 1,000-message campaign with a missing postal address is 1,000 violations on paper.</p>
<h2 id="gdpr-legitimate-interest-with-homework">GDPR: legitimate interest, with homework</h2><p>For prospects in the EU, GDPR governs the processing of personal data, and a work email address tied to an identifiable person qualifies. Consent is one lawful basis. The one B2B outreach actually runs on is legitimate interest, <a href="https://gdpr-info.eu/art-6-gdpr/">Article 6(1)(f)</a>, and <a href="https://gdpr-info.eu/recitals/no-47/">Recital 47</a> says the quiet part aloud: processing for direct marketing purposes &quot;may be regarded as carried out for a legitimate interest.&quot;</p>
<p>That sentence is not a free pass. Relying on legitimate interest obligates you to run and document a balancing test (a legitimate interest assessment): a genuine interest, a real need to use email specifically, and a balance that does not override the recipient&#39;s rights. Emailing someone in their professional capacity about their professional responsibilities strengthens that balance; scraping personal Gmail addresses collapses it. You must also disclose where you got the address, make objection easy, and delete on request. The penalty ceiling under Article 83 is EUR 20 million or 4% of global annual revenue, whichever is higher.</p>
<p>GDPR is also not the whole picture. The ePrivacy Directive (2002) governs the sending itself, and every member state implemented it as national law, so the practical answer changes at each border. Germany&#39;s unfair-competition law (UWG) requires prior consent for commercial email even in B2B; a cold pitch to a CEO in Munich needs the same consent as a consumer campaign. <a href="https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guide-to-pecr/electronic-and-telephone-marketing/electronic-mail-marketing/">The UK&#39;s PECR</a> exempts corporate subscribers, so email to a company address is permitted with identification and a working opt-out. France&#39;s CNIL accepts legitimate interest for B2B with a strict opt-out. The soft opt-in that appears across these regimes covers only existing customers, which by definition never describes a cold prospect. Check the target country before the list is built, and drop the strict-consent countries unless you have counsel.</p>
<p><aside class="ctabox">
    <div class="h">Compliance that runs in the send path</div>
    <p>LetterDuck stamps RFC 8058 one-click unsubscribe on every campaign and checks a permanent suppression list before every send. Flat $50 per domain.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="casl-the-strict-one">CASL: the strict one</h2><p><a href="https://fightspam-combattrelepourriel.ised-isde.canada.ca/site/canada-anti-spam-legislation/en">Canada&#39;s anti-spam law</a>, in force since July 2014, is a consent regime. Commercial email requires consent before sending, and the burden of proving it sits with the sender.</p>
<p>Express consent means an affirmative act, like a checkbox the person ticked themselves; it never expires unless withdrawn. Implied consent is the narrow door cold email must fit through: a recent existing business relationship within time windows the act fixes, or an email address the person conspicuously published in a business capacity, with no note refusing solicitations, and a message relevant to that person&#39;s role. &quot;I found it on LinkedIn&quot; does not, by itself, meet the test.</p>
<p>Every message still needs sender identification and an unsubscribe honored within 10 business days. Penalties reach CAD $1 million per violation for individuals and CAD $10 million for organizations, and directors and officers can be personally liable. Our stance: unless a Canadian prospect plainly published their address in a role relevant to your pitch, or you have genuine prior dealings, leave Canadian addresses out of the sequence.</p>
<h2 id="mailbox-providers-enforce-stricter-rules-than-the-law">Mailbox providers enforce stricter rules than the law</h2><p>A campaign can satisfy every statute above and still land entirely in spam. <a href="https://support.google.com/mail/answer/81126">Gmail&#39;s bulk-sender rules</a> (February 2024) demand aligned <a href="/glossary#spf">SPF</a>, <a href="/glossary#dkim">DKIM</a>, and <a href="/glossary#dmarc">DMARC</a>, a spam-complaint rate under 0.3% with a target under 0.1%, and <a href="https://www.rfc-editor.org/rfc/rfc8058.html">RFC 8058</a> one-click unsubscribe on bulk mail. Since November 2025, Gmail hard-rejects unauthenticated mail with a 550 error; Microsoft has done the same since May 2025. Nothing in CAN-SPAM requires authentication. The inbox does.</p>
<p>The statutes allow 10 business days for an opt-out; honor it in seconds anyway. In our workspace an unsubscribe lands on a suppression list that is checked before every future send and never expires, and the send path pauses itself at 0.3% complaints or 2% bounces. Provider penalties arrive in days, legal ones in years, and only one of those timelines waits for your lawyer.</p>
<h2 id="the-compliance-checklist">The compliance checklist</h2><p>Every regime above compresses into one working list:</p>
<ul>
<li>Send from a domain that identifies your company. A lookalike <a href="/blog/cold-email-domain">outreach domain</a> is fine when it discloses who owns it.</li>
<li>Real From name, real company, working reply address. No forged headers, no fake &quot;Re:&quot;.</li>
<li>A subject line the body can back up.</li>
<li>A physical postal address in every message.</li>
<li>A one-sentence opt-out in every message, honored immediately and permanently.</li>
<li>A record of where every address came from and why you may email it. GDPR makes you disclose the source; CASL makes you prove the consent.</li>
<li>A country check before sending: US, opt-out rules apply. UK, corporate addresses are fair game. Germany, consent first. Canada, consent first.</li>
<li>Volume discipline and complaint monitoring, per <a href="/blog/how-many-cold-emails-per-day">how many cold emails per day</a>. The strictest regulator you answer to is Gmail.</li>
</ul>
<p>Read the rules for your target countries before the list exists, and when a deal is worth real money, spend the hour with counsel. It costs less than one email at $53,088.</p>

    ]]></content:encoded>
  </item>
  <item>
    <title>IMAP vs POP3: what they were built for</title>
    <link>https://letterduck.com/blog/imap-vs-pop3</link>
    <guid isPermaLink="true">https://letterduck.com/blog/imap-vs-pop3</guid>
    <pubDate>Fri, 07 Aug 2026 12:00:00 GMT</pubDate>
    <description>IMAP syncs one mailbox across every device; POP3 downloads it to one machine. What each was built for, the ports to use, and when POP3 still makes sense.</description>
    <content:encoded><![CDATA[
<p>Use IMAP. Every mainstream mail host defaults to it, every client from Outlook to Apple Mail speaks it, and POP3 survives for a short list of specific situations most people never hit. If all you wanted was the verdict, that is it.</p>
<p>The more useful part is why, because IMAP vs POP3 is really a fight between two decades. Each protocol is a snapshot of what a personal computer was at the moment it was designed, and every practical difference between them falls out of that.</p>
<aside class="tldr"><div class="t">The short version</div><ul>
<li>IMAP keeps your mailbox on the server and syncs every device to it. POP3 downloads mail to one machine and, by default, deletes the server copy.</li>
<li>Pick IMAP for anything involving more than one device. Pick POP3 only for single-device control of your archive or a hard mailbox-size quota.</li>
<li>Ports that matter: IMAP 993, POP3 995, SMTP submission 587 or 465. All over TLS.</li>
<li>Neither protocol sends mail. Sending is SMTP's job.</li>
</ul></aside><p>Both protocols handle the reading half of email; neither one sends anything. If you are standing up mail on your own domain from scratch, our <a href="/guides/business-email-setup">business email setup guide</a> walks the whole stack, DNS records included. This article is the layer where mail reaches your devices.</p>
<h2 id="built-for-different-computers">Built for different computers</h2><p>The Post Office Protocol came first: <a href="https://www.rfc-editor.org/rfc/rfc918.html">RFC 918</a>, published October 1984 and marked experimental. The computer it imagines is a workstation that is not always connected to the network. Mail piles up on a server; the workstation connects, downloads everything, deletes the server copies, and disconnects. Server storage was scarce, and your own machine was assumed to be the real home of your mail. The server is a post office box, and the protocol is the trip into town to empty it.</p>
<p>POP3, the version everything still uses, was pinned down in <a href="https://www.rfc-editor.org/rfc/rfc1939.html">RFC 1939</a> in May 1996. It is a genuinely tiny protocol: USER, PASS, STAT, LIST, RETR, DELE, and QUIT cover a normal session. Nothing in it describes folders, read state, or search, because your local mail program was expected to handle all of that after the download.</p>
<p>IMAP began in 1985 at Stanford, designed by Mark Crispin, and it flips the core assumption: the mailbox lives on the server permanently, and a mail client is a window onto it. Read and unread state, folders, flags, and search all exist server-side, so any number of windows can point at the same mailbox and agree about what they see. The protocol is still maintained four decades on; the current base specification is IMAP4rev2 (<a href="https://www.rfc-editor.org/rfc/rfc9051.html">RFC 9051</a>), published August 2021.</p>
<p>POP3 moves the mailbox to your device. IMAP moves your view to the mailbox. Everything in the next table is downstream of that sentence.</p>
<h2 id="sync-vs-download-in-one-table">Sync vs download, in one table</h2><p>The POP3 vs IMAP choice compresses into seven rows.</p>
<div class="tblwrap"><table><thead><tr><th></th><th>IMAP</th><th>POP3</th></tr></thead><tbody><tr><td>Where the mailbox lives</td><td class="yes">On the server</td><td>On one device</td></tr>
<tr><td>A second device sees your mail</td><td class="yes">Yes, identically</td><td class="no">No, or an unsynced copy</td></tr>
<tr><td>Read state and folders sync</td><td class="yes">Yes</td><td class="no">No</td></tr>
<tr><td>Server storage used</td><td class="dim">Grows until you prune</td><td class="yes">Can stay near zero</td></tr>
<tr><td>Survives the server losing everything</td><td class="no">No, the server is the copy</td><td class="yes">Yes, the archive is local</td></tr>
<tr><td>Offline access</td><td class="dim">Cached messages only</td><td class="yes">Everything, always</td></tr>
<tr><td>Bandwidth per message</td><td class="yes">Headers first, body on open</td><td class="dim">Full download every time</td></tr></tbody></table></div><p>The classic POP3 failure is a phone and a laptop on the same account. Each device downloads independently, so whichever checks first takes the mail, and the other may never see it. Clients patch this with a &quot;leave a copy on the server&quot; setting, which fixes the disappearing messages and nothing else: read state still lives per device, sent mail exists only on the machine that wrote it, and deleting a message on one device leaves it sitting on the other. That patched setup is half of IMAP with none of the coordination, which is why providers stopped recommending it years ago.</p>
<h2 id="smtp-vs-imap-is-a-category-error">SMTP vs IMAP is a category error</h2><p>&quot;SMTP vs IMAP&quot; is a heavily searched comparison, and it compares the delivery truck to the front door. IMAP and POP3 are retrieval protocols: they exist so your client can read a mailbox. <a href="/blog/what-is-smtp">SMTP</a> is the transfer protocol: your client submits outgoing mail over SMTP on port 587, and servers hand mail to each other over SMTP on port 25. Every working email setup uses SMTP for sending plus exactly one of IMAP or POP3 for reading. There is no choice between them; the real choice was the one above.</p>
<p><aside class="ctabox">
    <div class="h">Your whole domain, one flat price.</div>
    <p>LetterDuck gives every address on your domain an inbox, sends your newsletter, and keeps SPF, DKIM, DMARC, warm-up and suppression handled. $50 per domain. Seats open in waves.</p>
    <div class="act"><a class="btn" href="/#join">Join the waitlist</a></div>
  </aside></p>
<h2 id="the-two-reasons-pop3-still-exists">The two reasons POP3 still exists</h2><p>Case one is single-device control. With download-and-delete POP3, the server holds your mail only between checks; after that, the sole copy lives on hardware you own. People who treat a mail host as an untrusted relay rather than a storage service want exactly this, and it is a legitimate want: there is no provider-side archive to scan, subpoena, or breach. The cost is symmetrical, and you should hear it as a warning: <strong>with no server copy, one dead laptop drive ends your entire mail archive.</strong> POP3 without a backup routine is a countdown.</p>
<p>Case two is mailbox quotas. Budget shared hosting still hands out mailboxes measured in hundreds of megabytes. On IMAP, a quota that small eventually fills, and once it fills, new inbound mail starts bouncing. POP3 drains the mailbox on every check, so a tiny quota never fills no matter how much mail flows through it. Inelegant but effective, and still the standard advice on hosts with hard mailbox limits.</p>
<p>There are stragglers beyond those two: old scanners and appliances that only speak POP3, and scripts that eat a mailbox and delete as they go. If you have not recognized yourself by now, the answer is IMAP.</p>
<h2 id="ports-and-tls-the-reference-table">Ports and TLS: the reference table</h2><div class="tblwrap"><table><thead><tr><th>Protocol</th><th>Port</th><th>Encryption</th><th>Use it when</th></tr></thead><tbody><tr><td>IMAP</td><td>993</td><td class="yes">Implicit TLS</td><td>The default. Use this.</td></tr>
<tr><td>IMAP</td><td>143</td><td class="dim">STARTTLS upgrade</td><td>Legacy setups that cannot do 993</td></tr>
<tr><td>POP3</td><td>995</td><td class="yes">Implicit TLS</td><td>The default for POP3</td></tr>
<tr><td>POP3</td><td>110</td><td class="dim">STARTTLS upgrade</td><td>Legacy only</td></tr>
<tr><td>SMTP submission</td><td>587</td><td class="yes">STARTTLS upgrade</td><td>Sending from a client or app (<a href="https://www.rfc-editor.org/rfc/rfc6409.html">RFC 6409</a>)</td></tr>
<tr><td>SMTP submission</td><td>465</td><td class="yes">Implicit TLS</td><td>Sending; re-standardized by <a href="https://www.rfc-editor.org/rfc/rfc8314.html">RFC 8314</a></td></tr>
<tr><td>SMTP relay</td><td>25</td><td class="dim">Opportunistic</td><td>Server-to-server transfer only, never clients</td></tr></tbody></table></div><p>Since RFC 8314 (published January 2018) the recommendation is implicit TLS everywhere: the connection is encrypted from the first byte instead of starting in plaintext and upgrading with STARTTLS. In practice that means 993 for IMAP, 995 for POP3, and 587 or 465 for sending. A config screen asking for port 143 or 110 with encryption set to &quot;none&quot; is a setup guide from another era. Close the tab.</p>
<h2 id="team-email-whether-you-want-a-protocol-at-all">Team email: whether you want a protocol at all</h2><p>Both protocols assume one person, one mailbox, one password. That assumption is collapsing from two directions.</p>
<p>Providers closed the password door first. Microsoft permanently disabled basic authentication for IMAP and POP in Exchange Online in the first week of January 2023. Google turned off password-only access to IMAP, POP, and SMTP on September 30, 2024; third-party clients now have to authenticate with OAuth. Both changes were about credential theft, and the practical effect is that type-your-password-into-any-client IMAP no longer exists at the two largest business mail hosts.</p>
<p>Teams break the model from the other side. Point five people&#39;s clients at one shared IMAP mailbox and you get colliding read flags, no record of who took which message, and eventually two different answers sent to the same customer. The protocol has no concept of a team. A <a href="/blog/shared-inbox">shared inbox</a> is shared state with history and assignment, and shared state wants an application, not a retrieval protocol from 1984.</p>
<p>We build on the web side of that line, so weigh the stance accordingly: LetterDuck has no IMAP access today. Inbound mail for a domain arrives on a <a href="/blog/catch-all-email">catch-all</a> route, gets parsed once, and lands in a database that everyone on the team reads through the same threaded inbox; replies can go out as any address on the domain. An address in that model is a routing rule rather than a mailbox with its own credentials, which is why we do not count or bill them. The tradeoff points the other way too: if two decades of your workflow live in Thunderbird, a web workspace is a genuine migration, and you should choose a host that speaks your protocol instead.</p>
<p>So: IMAP on 993 for a person. POP3 on 995 only if you can name your reason, and back up the archive the day you switch it on. And if the address belongs to a team rather than a person, the honest answer to IMAP vs POP3 is neither; compare workspaces instead.</p>

    ]]></content:encoded>
  </item>
</channel>
</rss>
