<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Broodnet</title>
    <description>The latest articles on DEV Community by Broodnet (@broodnet).</description>
    <link>https://dev.to/broodnet</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12819%2Fe19be5d2-c195-4d6d-a1cf-c897f186cf5e.png</url>
      <title>DEV Community: Broodnet</title>
      <link>https://dev.to/broodnet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/broodnet"/>
    <language>en</language>
    <item>
      <title>12 things you can do today to make your transactional emails work for humans and AI agents</title>
      <dc:creator>Jonathan Tavares</dc:creator>
      <pubDate>Sun, 12 Apr 2026 16:44:51 +0000</pubDate>
      <link>https://dev.to/broodnet/12-things-you-can-do-today-to-make-your-transactional-emails-work-for-humans-and-ai-agents-k1b</link>
      <guid>https://dev.to/broodnet/12-things-you-can-do-today-to-make-your-transactional-emails-work-for-humans-and-ai-agents-k1b</guid>
      <description>&lt;p&gt;AI agents are starting to use email. Not metaphorically. They sign up for services, receive verification codes, get alerts, and act on them. At &lt;a href="https://broodnet.com" rel="noopener noreferrer"&gt;broodnet&lt;/a&gt; we give each agent its own email address and a CLI to manage its inbox. &lt;a href="https://dev.to/broodnet/i-scored-163-real-emails-on-how-well-an-ai-agent-can-read-them-most-of-them-are-terrible-egn"&gt;We recently scored 160+ transactional emails&lt;/a&gt; (verification codes, welcome messages, notifications, security alerts) collected from the team's professional and personal inboxes over the last 5 to 10 years, covering SaaS, games, crypto, dev tools, news, and more. We scored each one on both human UX quality and agent parseability, and the results were rough: over 40% had fully opaque tracking URLs, 66% of welcome emails contained zero usable links, and only 16% of the dataset was clean enough for both audiences.&lt;/p&gt;

&lt;p&gt;That &lt;a href="https://dev.to/broodnet/i-scored-163-real-emails-on-how-well-an-ai-agent-can-read-them-most-of-them-are-terrible-egn"&gt;analysis&lt;/a&gt; taught us what's broken. This is what to do about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Strip tracking from your transactional links
&lt;/h2&gt;

&lt;p&gt;This is the single highest-impact change. Every tracking redirect turns a readable URL into an opaque blob that tells a non-browser client nothing about where it leads.&lt;/p&gt;

&lt;p&gt;Most people overlook this: &lt;strong&gt;transactional emails with a clear call to action don't need click tracking because the CTA &lt;em&gt;is&lt;/em&gt; the metric.&lt;/strong&gt; If you send a "verify your email" message, you already know whether the email got verified. You can measure that on the backend. You don't need a Salesforce Marketing Cloud redirect between the user and the endpoint.&lt;/p&gt;

&lt;p&gt;Your marketing emails can have all the tracking they want. But &lt;code&gt;verify-email&lt;/code&gt;, &lt;code&gt;confirm-account&lt;/code&gt;, and &lt;code&gt;manage-webhooks&lt;/code&gt; links should be &lt;strong&gt;raw destination URLs&lt;/strong&gt;. Companies like GitLab ship every transactional link as a raw URL and still understand their funnel just fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Put the verification code in the subject line
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;847291 is your Acme code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five senders in our dataset did this (Canva, Slack, LinkedIn, Gravatar, Instagram) and &lt;strong&gt;all five scored a perfect 5/5 on subject quality&lt;/strong&gt;. Emails without the code in the subject averaged 3.6/5.&lt;/p&gt;

&lt;p&gt;One template change, every client benefits. iOS and Android detect OTP codes in notifications and surface a "copy code" button on the lock screen. Having it in the subject makes it trivially detectable. An agent scanning its inbox through a CLI extracts the code without opening the message. Humans grab the code without opening the email, sometimes without even unlocking their phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. State the expiry in plain text
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"This code expires in 15 minutes."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Six words. Emails that included this scored &lt;strong&gt;7.4/10&lt;/strong&gt; on agent metrics versus &lt;strong&gt;5.7/10&lt;/strong&gt; for those that didn't. Partly because expiry matters for prioritization (an agent needs to know if it should drop everything), partly because the kind of team that states expiry tends to write cleaner emails overall.&lt;/p&gt;

&lt;p&gt;GitLab states it on every OTP. Hetzner includes the exact datetime. Docker says 15 minutes. Gravatar says 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Use semantic URL paths
&lt;/h2&gt;

&lt;p&gt;Compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;/verify?token=eyJhbGciOiJIUzI1NiJ9.eyJtZXNzYWdl...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;/email_verify/?email=user@example.com&amp;amp;hash=a336a019-f7cf-4454-b3bd-8aa1e134cd29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both work. Both are secure. But the second one tells you what it does and who it's for just by reading it. UUID4 tokens, short hex hashes, or alphanumeric codes with readable path segments all beat opaque JWTs.&lt;/p&gt;

&lt;p&gt;Some patterns from the dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app.pulsetic.com/email_verify/?email=&amp;lt;email&amp;gt;&amp;amp;hash=&amp;lt;uuid4&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;raider.io/verify?user=&amp;lt;username&amp;gt;&amp;amp;token=&amp;lt;token&amp;gt;&lt;/code&gt; (note the semantic prefix)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;signup.mailgun.com/activate/&amp;lt;hex&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;accounts.random.org/create/confirm?secret=&amp;lt;uuid4&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Hand-write the plain-text MIME part
&lt;/h2&gt;

&lt;p&gt;Every email is a MIME multipart with HTML and plain-text versions. Most ESPs auto-generate the plain-text from the HTML, and the result is usually garbage: stripped tags, broken links, spacer characters left in.&lt;/p&gt;

&lt;p&gt;This matters because &lt;strong&gt;terminal clients, CLI tools, agents, screen readers, and LLMs&lt;/strong&gt; all consume the plain-text part. If yours is auto-generated trash, that entire audience sees trash.&lt;/p&gt;

&lt;p&gt;Put links on their own lines. Use dashes as section dividers. Include the same critical info as the HTML. The best plain-text emails in our dataset (ngrok's verify, GitLab, RANDOM.ORG) were written as plain text first and it shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Kill the spacer characters
&lt;/h2&gt;

&lt;p&gt;ESPs inject zero-width Unicode characters after the preheader to prevent email clients from pulling body text into the preview. In raw text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Click the button to verify ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌
‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We found 7 distinct zero-width character types in the dataset. 29% had moderate pollution. Nearly 12% were severely polluted. Google Workspace's welcome email had hundreds of combined &lt;code&gt;U+034F&lt;/code&gt; and soft hyphens before the first real sentence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;These characters are a hack that directly poisons every non-HTML reader.&lt;/strong&gt; Terminal clients render garbled whitespace. Agents waste processing on invisible noise. Screen readers may choke.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The alternative: &lt;code&gt;display:none&lt;/code&gt; or &lt;code&gt;mso-hide:all&lt;/code&gt; on a hidden span after your preheader. You avoid poisoning the plain-text part entirely. For transactional emails you don't need pixel-perfect preheader control.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Provide a raw URL fallback for every button
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If the button doesn't work, copy this link:
https://app.example.com/verify?token=abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even if your button CTA goes through a tracker, &lt;strong&gt;the fallback gives every non-browser client something it can actually use&lt;/strong&gt;. Mobile users with broken rendering get a working link. CLI users get an extractable URL. It costs one extra line in the template.&lt;/p&gt;

&lt;p&gt;Buffer did this on exactly one of their five emails (the login security alert) and it was the only Buffer email that scored above worst-in-class.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Add schema.org JSON-LD
&lt;/h2&gt;

&lt;p&gt;Gmail supports embedded structured data through JSON-LD. A &lt;code&gt;ConfirmAction&lt;/code&gt; in the email HTML surfaces one-click actions in the Gmail UI and provides a &lt;strong&gt;machine-readable, typed representation&lt;/strong&gt; of what the email wants the reader to do.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@context"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://schema.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EmailMessage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"potentialAction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ConfirmAction"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verify Email"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"handler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"@type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HttpActionHandler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://app.example.com/verify?token=abc123"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verify your email address for Acme"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embed in a &lt;code&gt;&amp;lt;script type="application/ld+json"&amp;gt;&lt;/code&gt; tag. Any parser that knows to look for JSON-LD gets a structured action without heuristic text matching. Gmail also supports &lt;code&gt;ViewAction&lt;/code&gt;, &lt;code&gt;SaveAction&lt;/code&gt;, and &lt;code&gt;TrackAction&lt;/code&gt; (for shipments). Almost nobody uses this for transactional emails, but the infrastructure has been there for years.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Set meaningful email headers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;X-Entity-Ref-ID&lt;/code&gt;&lt;/strong&gt;: unique value per email. Prevents Gmail from threading your OTP under a week-old verification thread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;List-Unsubscribe&lt;/code&gt; + &lt;code&gt;List-Unsubscribe-Post&lt;/code&gt;&lt;/strong&gt;: RFC 8058. Machine-readable unsubscribe entirely through headers. Gmail and Yahoo require this for bulk marketing senders, and while transactional emails are technically exempt, adding it improves deliverability and gives agents a structured way to manage subscriptions. &lt;code&gt;List-Unsubscribe: &amp;lt;https://app.example.com/unsubscribe?id=&amp;lt;token&amp;gt;&amp;gt;&lt;/code&gt; plus &lt;code&gt;List-Unsubscribe-Post: List-Unsubscribe=One-Click&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Message-ID&lt;/code&gt;, &lt;code&gt;In-Reply-To&lt;/code&gt;, &lt;code&gt;References&lt;/code&gt;&lt;/strong&gt;: if you send follow-up emails (password reset after failed login), proper threading headers let agents understand email B relates to email A.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Keep your sender identity consistent
&lt;/h2&gt;

&lt;p&gt;If your verification comes from &lt;code&gt;noreply@mail.accounts.acme.com&lt;/code&gt;, your welcome from &lt;code&gt;no-reply@notify.acme.com&lt;/code&gt;, and marketing from &lt;code&gt;hello@youraccount.acme.com&lt;/code&gt;, an agent has to learn a different sender for each template.&lt;/p&gt;

&lt;p&gt;Not a made-up example. Buffer sent from both &lt;code&gt;hello@youraccount.buffer.com&lt;/code&gt; and &lt;code&gt;hello@buffer.com&lt;/code&gt; depending on the template. An agent searching by sender misses half the emails.&lt;/p&gt;

&lt;p&gt;Pick one address for transactional, one for marketing. Be consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Separate transactional from marketing infrastructure
&lt;/h2&gt;

&lt;p&gt;Our data showed this already happens accidentally at most companies. Product team sends clean transactional emails. Marketing sends tracked welcome emails through their ESP. The quality gap between templates from the same sender was as high as &lt;strong&gt;5 points on a 10-point scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Make it intentional. ESP for marketing. Transactional sender (Postmark, AWS SES direct, your own SMTP) for verifications, OTPs, and security notifications. Different domain, different templates, different tracking config.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Design verification for every client
&lt;/h2&gt;

&lt;p&gt;Most verify-link flows assume a human clicking in a browser. An agent can't "click" anything. A phone user might prefer typing a code. A text-only reader can follow a raw URL but can't render a button.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Provide the clickable link for browsers, provide the code in the body (and ideally the subject) for everything else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The emails that offered both a link and a standalone code (NiceHash, Telltale Games, Gravatar) scored well on both human and agent metrics. The link works for desktop. The code works for agents, mobile, screen readers, and anyone who'd rather type 6 digits than tap a tiny button. This dual-path approach is already standard in SMS verification. No reason email can't do the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  TLDR; The checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Transactional CTA links are raw destination URLs, not tracker redirects&lt;/li&gt;
&lt;li&gt;[ ] OTP code appears in the subject line&lt;/li&gt;
&lt;li&gt;[ ] Expiry is stated explicitly in the body&lt;/li&gt;
&lt;li&gt;[ ] URL paths are human-readable (semantic paths, UUID tokens, not opaque JWTs)&lt;/li&gt;
&lt;li&gt;[ ] Plain-text MIME part is hand-written or at least reviewed&lt;/li&gt;
&lt;li&gt;[ ] No zero-width spacer character injection in the plain-text part&lt;/li&gt;
&lt;li&gt;[ ] Raw URL fallback provided alongside tracked buttons&lt;/li&gt;
&lt;li&gt;[ ] JSON-LD structured data in the HTML part for key actions&lt;/li&gt;
&lt;li&gt;[ ] Meaningful headers set (&lt;code&gt;X-Entity-Ref-ID&lt;/code&gt;, &lt;code&gt;List-Unsubscribe&lt;/code&gt;, threading)&lt;/li&gt;
&lt;li&gt;[ ] Consistent sender address across all transactional email types&lt;/li&gt;
&lt;li&gt;[ ] Transactional email sent through separate infrastructure from marketing&lt;/li&gt;
&lt;li&gt;[ ] Verification flow supports both link-click and code-entry paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these hurt human readability. Most of them improve it. The data from 179 scored emails backs this up: &lt;strong&gt;the emails that scored highest for agents also scored highest for humans&lt;/strong&gt;. Writing for machines and writing for people is the same job.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://broodnet.com" rel="noopener noreferrer"&gt;broodnet&lt;/a&gt; gives AI agents their own email addresses. CLI-native, built for agent-to-owner communication. Free tier available.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>agents</category>
      <category>tutorial</category>
      <category>datascience</category>
    </item>
    <item>
      <title>I scored 163 real emails on how well an AI agent can read them. Most of them are terrible.</title>
      <dc:creator>Jonathan Tavares</dc:creator>
      <pubDate>Fri, 10 Apr 2026 00:55:30 +0000</pubDate>
      <link>https://dev.to/broodnet/i-scored-163-real-emails-on-how-well-an-ai-agent-can-read-them-most-of-them-are-terrible-egn</link>
      <guid>https://dev.to/broodnet/i-scored-163-real-emails-on-how-well-an-ai-agent-can-read-them-most-of-them-are-terrible-egn</guid>
      <description>&lt;p&gt;We are building &lt;a href="https://broodnet.com" rel="noopener noreferrer"&gt;Broodnet&lt;/a&gt;, email infrastructure for AI agents. Each agent gets its own address and its own inbox. Through the &lt;a href="https://docs.broodnet.com/cli/mail/" rel="noopener noreferrer"&gt;Broodnet CLI&lt;/a&gt;, an agent can list its emails, open individual messages, search for specific senders or subjects, and send messages to its owner or other agents in the same account.&lt;/p&gt;

&lt;p&gt;While testing with real agent frameworks like &lt;a href="https://openclaw.ai/" rel="noopener noreferrer"&gt;Openclaw&lt;/a&gt; and &lt;a href="https://hermes-agent.nousresearch.com/" rel="noopener noreferrer"&gt;hermes&lt;/a&gt; I kept running into the same wall: the agents could receive the email just fine, but when it tried to actually &lt;em&gt;do something&lt;/em&gt; with it, the email was unreadable. Every link wrapped in a 200-character tracking redirect. Invisible Unicode characters scattered through the body. OTP codes buried in template noise. Some were instantly interpreted, but others left the models running in circles&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fegw9qvwxa83ubj2ignxc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fegw9qvwxa83ubj2ignxc.png" alt=" " width="466" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, &lt;em&gt;for science&lt;/em&gt;, I grabbed 160+ real transactional emails — verification codes, welcome messages, notifications, security alerts — that had been sitting across the Broodnet team's professional and personal inboxes for the last 5 to 10 years. SaaS platforms, games, crypto wallets, dev tools, news services, government portals, you name it. I scored every single one on two perspectives: how good is this email for a human, and how good is it for an agent reading through a CLI. All scores are normalized to a &lt;strong&gt;0-10 scale&lt;/strong&gt; so they're comparable across dimensions.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I scored them
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Human side&lt;/strong&gt;, five metrics: clarity, warmth, visual noise (inverted, 10 means clean), subject line quality, and onboarding helpfulness. Averaged and normalized to 0-10.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent side&lt;/strong&gt;, using Claude Opus 4.6, four scaled metrics plus two binary flags: extractability (can a plain-text parser get the key info?), sender clarity, URL cleanliness, body noise level, and whether the code appears in the subject line (yes/no), whether expiry is explicitly stated (yes/no). Also normalized to 0-10. &lt;/p&gt;

&lt;p&gt;Plus a shared metric: CTA URL quality and clarity.&lt;/p&gt;

&lt;p&gt;The dataset breaks down into 53 welcome emails, 52 verify-link flows, 20 verify-code OTPs, and 35 notifications, with a few others and edge cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tradeoff that doesn't exist
&lt;/h2&gt;

&lt;p&gt;Going into this I assumed there'd be a tradeoff. Emails that look great for humans probably look worse for agents, right? Rich templates, beautiful buttons, all that stuff an LLM can't see. Turns out that's wrong.&lt;/p&gt;

&lt;p&gt;The 26 emails that scored "double pristine" (clean URLs &lt;em&gt;and&lt;/em&gt; no spacer pollution) averaged &lt;strong&gt;7.0/10&lt;/strong&gt; on the human scale. The dataset overall averaged &lt;strong&gt;6.3/10&lt;/strong&gt;. The cleanest emails for agents were also better for humans. Not by a little, by almost a full point.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Clean emails for agents are also better emails for humans. The supposed tradeoff is a myth.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This surprised me until I thought about where the noise actually comes from. The same ESPs and marketing tools that inject tracking links also inject spacer characters, bloated templates, and broken plain-text fallbacks. Clean emails tend to be clean everywhere.&lt;/p&gt;

&lt;p&gt;If you plot human noise score against agent URL cleanliness, &lt;strong&gt;86.5% of emails fall within 1 point of the diagonal&lt;/strong&gt;. An email that's noisy for you is almost certainly opaque for an agent too. These aren't independent dimensions. They share a root cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  The onboarding trap
&lt;/h2&gt;

&lt;p&gt;Here's the pattern I didn't expect.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Onboarding quality&lt;/th&gt;
&lt;th&gt;Agent score (out of 10)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.7&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Some&lt;/td&gt;
&lt;td&gt;5.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;5.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Great&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.3&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The emails with the &lt;em&gt;best&lt;/em&gt; human onboarding had the &lt;em&gt;worst&lt;/em&gt; agent scores. &lt;strong&gt;The email that helps a human the most is the email that buries an agent the deepest.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What's happening is that "good onboarding" in practice means multiple sections, step-by-step flows, feature highlights, images, and CTAs. Every one of those CTAs gets a tracking link because the marketing team wants to know which step users click.&lt;/p&gt;

&lt;p&gt;The 29 emails that scored high on &lt;em&gt;both&lt;/em&gt; dimensions broke this pattern. They include things like Paymo, Pulsetic, AITopTools, IndieHunt, Baselight. What these have in common: they're mostly small companies. They didn't invest in an elaborate ESP with click tracking. Their onboarding emails just... link to the product. Directly. With normal URLs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5uqn1leeen6hx5a3t39f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5uqn1leeen6hx5a3t39f.png" alt=" " width="672" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tracking Tax
&lt;/h2&gt;

&lt;p&gt;42.9% of all emails in the dataset have fully opaque tracking URLs (scored 1 out of 5 on URL cleanliness). Only 19.6% have perfectly clean raw URLs.&lt;/p&gt;

&lt;p&gt;For welcome emails specifically, &lt;strong&gt;66% have zero usable CTA links&lt;/strong&gt;. Two thirds. For an agent that just signed up for a service and gets a welcome email, there is literally nothing actionable in the email body. Every "Get Started" button goes to &lt;code&gt;click.whatever.com/ls/click?upn=u001.aKJF8sldjf...&lt;/code&gt; and the destination is unknowable without following the redirect.&lt;/p&gt;

&lt;p&gt;I catalogued 11 distinct tracking systems across the dataset. They all look different but produce the same result: a URL that tells you nothing. Salesforce Marketing Cloud, customer.io, HubSpot, Braze, Beehiiv, Eloqua, AWS SES awstrack, Google's own tracker, Microsoft, vialoops, Stripe. From an agent's perspective they're all equally opaque.&lt;/p&gt;

&lt;p&gt;The worst offender for sheer URL ugliness was Microsoft's Bing Webmaster Tools: &lt;code&gt;mucp.api.account.microsoft.com/m/v2/c?r=&amp;lt;UPPERCASE-BASE32&amp;gt;&lt;/code&gt;. But the most &lt;em&gt;consistently&lt;/em&gt; bad was customer.io (used by Buffer, daily.dev, Uphold), which wraps every link in a JWT-encoded redirect on every email type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh1jy25ntl11bryfqwq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbh1jy25ntl11bryfqwq3.png" alt=" " width="647" height="935"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The marketing team doesn't talk to the product team
&lt;/h2&gt;

&lt;p&gt;One of the weirdest patterns in the data: the same company can produce wildly different email quality depending on which template they use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailgun&lt;/strong&gt;: welcome email scores &lt;strong&gt;3.2/10&lt;/strong&gt; on agent metrics (every link through their own Mailjet tracker). Verify-link email scores &lt;strong&gt;7.7/10&lt;/strong&gt; (raw &lt;code&gt;signup.mailgun.com/activate/&amp;lt;hex&amp;gt;&lt;/code&gt; URL). That's a swing of &lt;strong&gt;4.5 points out of 10&lt;/strong&gt; across templates from the same sender. And Mailgun is an &lt;em&gt;email infrastructure company&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ngrok&lt;/strong&gt;: both welcome emails score &lt;strong&gt;3.6/10&lt;/strong&gt; (all links through HubSpot tracker). Their verify-link? Scores &lt;strong&gt;8.6/10&lt;/strong&gt;. Pure plain text, 3 lines total, raw URL. Swing: &lt;strong&gt;5 points&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loops&lt;/strong&gt;: welcome routes everything through &lt;code&gt;c.vialoops.com&lt;/code&gt; (their own tracker, ironic since they sell email delivery). Their DNS notification email? All records in plain text, raw links, scores &lt;strong&gt;8.2/10&lt;/strong&gt;. Swing: &lt;strong&gt;4.6 points&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Polar, Docker, and others follow the same pattern. Transactional emails come from engineering. Welcome emails come from marketing. Different tools, different templates, different philosophies.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The best predictor of email quality isn't the company or the industry. It's which team within the company owns the template.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The gaming industry tells the whole story
&lt;/h2&gt;

&lt;p&gt;I had gaming emails in the dataset and they split perfectly into two groups with nothing in between.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indie studios and smaller gaming sites&lt;/strong&gt; (itch.io, Larian Studios, Raider.IO, etc): agent scores of &lt;strong&gt;7.7 to 8.6/10&lt;/strong&gt;. All raw URLs. Zero tracking. Raider.IO's verify URL has the username right in it: &lt;code&gt;raider.io/verify?user=&amp;lt;username&amp;gt;&amp;amp;token=validation3ad9de269693489d&lt;/code&gt;. That &lt;code&gt;validation&lt;/code&gt; prefix in the token is a small touch but it tells you what the URL does just by reading it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AAA studios and big gaming platforms&lt;/strong&gt; (HoYoverse, Bethesda, Discord, Riot Games, etc): agent scores of &lt;strong&gt;2.7 to 3.6/10&lt;/strong&gt;. Everything through AWS SES awstrack, Braze, Salesforce, Eloqua. Every link opaque. Image-heavy marketing.&lt;/p&gt;

&lt;p&gt;The dividing line isn't the content or the email type. It's whether the company has a marketing department with access to an ESP.&lt;/p&gt;

&lt;h2&gt;
  
  
  The invisible character zoo
&lt;/h2&gt;

&lt;p&gt;This one gets technical but it matters. Email senders inject zero-width Unicode characters to control how mail clients render the preview text. In a normal email client you never see them. When an agent reads the raw text through the CLI, it gets hundreds of invisible characters mixed into the content.&lt;/p&gt;

&lt;p&gt;I found 7 distinct character types used across the dataset, including compound sequences of 4-5 different invisible characters repeated dozens of times. Trading 212's verify email has over a hundred &lt;code&gt;U+200C&lt;/code&gt; characters before the actual message starts. MoonPay chains together &lt;code&gt;U+034F&lt;/code&gt;, &lt;code&gt;U+200C&lt;/code&gt;, and &lt;code&gt;U+FEFF&lt;/code&gt; in repeating sequences.&lt;/p&gt;

&lt;p&gt;It's not malicious, it's just how ESPs handle preheader text. But it means an agent parsing email output has to strip a zoo of invisible Unicode before it can even find the verification code. &lt;strong&gt;30.7% of emails had moderate pollution. 11.7% were severely polluted.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What good actually looks like
&lt;/h2&gt;

&lt;p&gt;26 of the 163 emails (16%) were double pristine: clean URLs and clean body text. The standouts by category:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bzhs17ljurgayjstcvg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bzhs17ljurgayjstcvg.png" alt=" " width="734" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify-link&lt;/strong&gt;: Pulsetic's URL is the one I keep coming back to: &lt;code&gt;app.pulsetic.com/email_verify/?email=&amp;lt;email&amp;gt;&amp;amp;hash=&amp;lt;uuid4&amp;gt;&lt;/code&gt;. Named parameters, the intent readable in the URL itself, UUID4 as the token. ngrok's verify is even more minimal: 3 lines of plain text, no HTML at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify-code&lt;/strong&gt;: GitLab is the template to copy. 6 emails across every type, consistently at the top. Code in body, expiry stated in plain text, raw &lt;code&gt;gitlab.com&lt;/code&gt; URLs for everything. Zero tracking on any email they send. On a related note, &lt;strong&gt;every email that put the verification code in the subject line scored a perfect 5/5 on subject quality&lt;/strong&gt;. Only four senders in the entire dataset did this: Canva, Slack, LinkedIn, and Gravatar. This also happens to be exactly what iOS and Android need to surface that "copy code" button on the lock screen notification. Both platforms use heuristics to detect OTP codes in message content, and having the code right in the subject makes it trivially detectable. Good for humans tapping their phone, good for agents scanning their inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Welcome&lt;/strong&gt;: the rare ones that work for both sides tend to be small companies that link directly to their product. Paymo, Pulsetic, IndieHunt, EarlyHunt, AITopTools. No elaborate onboarding funnels, so no tracking on every CTA.&lt;/p&gt;

&lt;p&gt;Emails that explicitly stated expiry ("this code expires in 60 minutes") scored &lt;strong&gt;7.4/10&lt;/strong&gt; on agent metrics versus &lt;strong&gt;5.7/10&lt;/strong&gt; for those that didn't. It's a small detail, but teams that think to add it tend to care about the other stuff too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The irony hall of fame
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mailgun&lt;/strong&gt; (email infrastructure company): welcome email agent score &lt;strong&gt;3.2/10&lt;/strong&gt;. Uses their own Mailjet tracker on all links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loops&lt;/strong&gt; (email platform for SaaS): welcome email agent score &lt;strong&gt;3.6/10&lt;/strong&gt;. Uses their own vialoops tracker.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic&lt;/strong&gt; (AI company): Claude Code welcome email agent score &lt;strong&gt;4.1/10&lt;/strong&gt;. The email for their AI coding tool can't be read by an AI agent. The onboarding steps are actually great (&lt;code&gt;/init&lt;/code&gt;, git commands, all in plain text) but every URL is opaque and the social links resolve to anchor-only references that go nowhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buffer&lt;/strong&gt; (5 emails, all consistently worst-in-class): the only sender in the dataset where the &lt;em&gt;best&lt;/em&gt; email they sent still scored below average. Multiple emails at &lt;strong&gt;2.7/10&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;deviantART&lt;/strong&gt;: tracked every single element in the email with individual &lt;code&gt;utm_term&lt;/code&gt; values. The greeting text was wrapped in its own tracked URL with &lt;code&gt;utm_term=greeting&lt;/code&gt;. Even the paragraph between the greeting and the CTA had its own tracker: &lt;code&gt;utm_term=ph1&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What now
&lt;/h2&gt;

&lt;p&gt;16% of the emails in this dataset were fully clean for both humans and agents. The other 84% have room to improve. Some of them have a lot of room.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://broodnet.com/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2bpxhydafvse1h36i4x.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're building agents that need to receive email, that's what &lt;a href="https://broodnet.com" rel="noopener noreferrer"&gt;Broodnet&lt;/a&gt; does. Each agent gets its own address, checks its own inbox through the CLI, and acts on what it finds. We solved the infrastructure problem. The email design problem... well that's on the senders.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://broodnet.com" rel="noopener noreferrer"&gt;broodnet&lt;/a&gt; gives AI agents their own email addresses. CLI-native, built for agent-to-owner communication. Free tier available.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>marketing</category>
      <category>agents</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
