<?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: Peter Linkwell</title>
    <description>The latest articles on DEV Community by Peter Linkwell (@peterlinkwell).</description>
    <link>https://dev.to/peterlinkwell</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4202466%2Fc05c2985-19a2-4b90-bed4-8a6ec73fbd04.png</url>
      <title>DEV Community: Peter Linkwell</title>
      <link>https://dev.to/peterlinkwell</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/peterlinkwell"/>
    <language>en</language>
    <item>
      <title>Cold email infrastructure as code review: domains, inboxes, DNS and warmup</title>
      <dc:creator>Peter Linkwell</dc:creator>
      <pubDate>Fri, 23 Oct 2026 11:23:51 +0000</pubDate>
      <link>https://dev.to/peterlinkwell/cold-email-infrastructure-as-code-review-domains-inboxes-dns-and-warmup-1dl</link>
      <guid>https://dev.to/peterlinkwell/cold-email-infrastructure-as-code-review-domains-inboxes-dns-and-warmup-1dl</guid>
      <description>&lt;p&gt;&lt;em&gt;This post contains affiliate links.&lt;/em&gt; It is adapted from the &lt;a href="https://nerdyjoe.com/blog/cold-email-infrastructure/" rel="noopener noreferrer"&gt;Nerdy Joe cold email infrastructure guide&lt;/a&gt;. I work with Nerdy Joe.&lt;/p&gt;

&lt;p&gt;If you have ever been asked to "just get the outbound emails working," you already know the problem is not the copy. It is infrastructure: domains, mailboxes, DNS, reputation and monitoring. Treat it like any other system you would deploy, with a spec, a checklist and alerts.&lt;/p&gt;

&lt;h3&gt;
  
  
  The six layers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Failure mode if skipped&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sending domains&lt;/td&gt;
&lt;td&gt;Separate domains related to your brand&lt;/td&gt;
&lt;td&gt;A bad campaign hurts your main domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inboxes&lt;/td&gt;
&lt;td&gt;Google Workspace, Microsoft 365 or SMTP mailboxes&lt;/td&gt;
&lt;td&gt;Too few inboxes forces high volume per inbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS authentication&lt;/td&gt;
&lt;td&gt;SPF, DKIM, DMARC, MX, reverse DNS, tracking domain&lt;/td&gt;
&lt;td&gt;Mail is rejected or filtered as unauthenticated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warmup&lt;/td&gt;
&lt;td&gt;Gradual low-volume sending&lt;/td&gt;
&lt;td&gt;New inboxes at full volume look like spam operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rotation and limits&lt;/td&gt;
&lt;td&gt;Spreading sends across inboxes with daily caps&lt;/td&gt;
&lt;td&gt;One inbox burns while the rest sit idle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring&lt;/td&gt;
&lt;td&gt;Bounces, complaints, placement tests, blacklists&lt;/td&gt;
&lt;td&gt;Problems go unnoticed until replies stop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. Isolate the blast radius with separate domains
&lt;/h3&gt;

&lt;p&gt;Never send cold email from the domain that sends your invoices and support replies. Register lookalikes such as &lt;code&gt;getacme.com&lt;/code&gt; or &lt;code&gt;tryacme.com&lt;/code&gt;, and forward each one to your main site so a curious prospect lands somewhere real. Stick to mainstream extensions. Instantly's AirMail accepts only .com and .org domains, which says something about how providers treat the rest.&lt;/p&gt;

&lt;p&gt;Size it like capacity planning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;domains = ceil(new_prospects_per_day / emails_per_inbox_per_day / inboxes_per_domain)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vendor defaults put most setups at two to five inboxes per domain. PlusVibe's Google Workspace offer creates 3 inboxes per domain and its Microsoft 365 offer 5, and Instantly allows up to 5 accounts per done-for-you domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create the inboxes
&lt;/h3&gt;

&lt;p&gt;Pick Google Workspace, Microsoft 365, SMTP, or a mix. Smartlead and PlusVibe can match sender provider to recipient provider (Gmail to Gmail, Outlook to Outlook), which only works if you run both. Give every inbox a real name, photo and signature.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. DNS: the part receivers check first
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Gotcha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MX&lt;/td&gt;
&lt;td&gt;Receive replies&lt;/td&gt;
&lt;td&gt;Domain looks fake without it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPF (TXT)&lt;/td&gt;
&lt;td&gt;Authorize sending servers&lt;/td&gt;
&lt;td&gt;One record per domain, max 10 DNS lookups (RFC 7208)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKIM (TXT)&lt;/td&gt;
&lt;td&gt;Sign each message&lt;/td&gt;
&lt;td&gt;Google requires at least 1024 bits and recommends 2048&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC (TXT)&lt;/td&gt;
&lt;td&gt;Policy plus reporting&lt;/td&gt;
&lt;td&gt;Start at &lt;code&gt;p=none&lt;/code&gt; with a report address, tighten later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tracking CNAME&lt;/td&gt;
&lt;td&gt;Custom open/click domain&lt;/td&gt;
&lt;td&gt;Instantly points to &lt;code&gt;prox.itrackly.com&lt;/code&gt;, Smartlead to &lt;code&gt;open.sleadtrack.com&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PTR&lt;/td&gt;
&lt;td&gt;Reverse DNS for the IP&lt;/td&gt;
&lt;td&gt;Google and Microsoft handle it for their inboxes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A starting point for a new sending domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example-send.com.         TXT  "v=spf1 include:_spf.google.com ~all"
_dmarc.example-send.com.  TXT  "v=DMARC1; p=none; rua=mailto:dmarc@example-send.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then enable DKIM in the Google or Microsoft admin console and publish the record it gives you. Check your work from the shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig +short TXT example-send.com
dig +short TXT _dmarc.example-send.com
dig +short TXT google._domainkey.example-send.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The acceptance test: send a message to a personal Gmail account, open "Show original" and confirm SPF, DKIM and DMARC all say &lt;code&gt;pass&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Why bother below bulk volume? Google requires all senders to personal Gmail accounts to have SPF or DKIM, valid forward and reverse DNS, TLS, and a spam rate under 0.3% in Postmaster Tools (it recommends under 0.1%). Senders of more than 5,000 messages a day need SPF, DKIM and DMARC with alignment. Microsoft introduced similar rules for outlook.com, hotmail.com and live.com, and according to dmarcian moved from junking non-compliant mail to rejecting it in May 2025. The records cost nothing, so set all three up.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Warm up like a canary release
&lt;/h3&gt;

&lt;p&gt;New mailboxes have no history. Ramp slowly. Vendor guidance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instantly recommends 3 weeks for AirMail inboxes, starting at 2 warmup emails on day one, then 4, then 6.&lt;/li&gt;
&lt;li&gt;Smartlead says existing accounts need 2+ weeks and new domains can need 1 to 2 months, with 40 or fewer warmup emails a day for new accounts.&lt;/li&gt;
&lt;li&gt;PlusVibe's default ramp starts at 5 a day, adds 5 a day, and tops out at 50.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per nerdyjoe.com, Koldify (the agency behind Nerdy Joe) warms inboxes for about three weeks and typically launches campaigns around week four. Keep warmup running after launch.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Rate limits and rotation
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Guidance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Apollo knowledge base&lt;/td&gt;
&lt;td&gt;Start at 50 emails a day per mailbox, 10 to 20 per hour, 60 to 300 seconds apart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instantly AirMail&lt;/td&gt;
&lt;td&gt;Hard cap of 20 emails a day per mailbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smartlead API guide&lt;/td&gt;
&lt;td&gt;Start at 10 to 15 new leads a day, add 5 to 10 every few days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use the lowest number as your default and scale horizontally: more inboxes, fewer emails each. Instantly, Smartlead and PlusVibe all rotate senders, so you can drain one unhealthy inbox without stopping the campaign.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Monitoring and auto-pause
&lt;/h3&gt;

&lt;p&gt;Weekly checks: bounce rate per inbox, Postmaster Tools spam rate, a placement test, blacklist status, and reply rate per inbox (a sudden drop on one inbox usually means spam placement). Apollo says a bounce rate of 8% or more needs immediate action, so alert lower. Smartlead can auto-pause a campaign at a bounce threshold you set, such as 3% or 5%. PlusVibe can auto-pause on high bounces, and Instantly can pause a mailbox when placement drops or it gets blocklisted (it checks 94 blacklists).&lt;/p&gt;

&lt;p&gt;Verify every list before sending. Bounces are the fastest way to burn a new domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common bugs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Two SPF records on one domain, which makes SPF fail.&lt;/li&gt;
&lt;li&gt;An SPF chain that exceeds 10 lookups.&lt;/li&gt;
&lt;li&gt;Sending from the main domain "just for a test."&lt;/li&gt;
&lt;li&gt;Launching on day one instead of after warmup.&lt;/li&gt;
&lt;li&gt;Raising volume per inbox instead of adding inboxes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tooling
&lt;/h3&gt;

&lt;p&gt;If you are picking a sender, the guide prices three routes: &lt;a href="https://nerdyjoe.com/go/instantly/" rel="noopener noreferrer"&gt;Instantly&lt;/a&gt;, &lt;a href="https://nerdyjoe.com/go/smartlead/" rel="noopener noreferrer"&gt;Smartlead&lt;/a&gt; and &lt;a href="https://nerdyjoe.com/go/plusvibe/" rel="noopener noreferrer"&gt;PlusVibe&lt;/a&gt;, with contact data usually coming from &lt;a href="https://nerdyjoe.com/go/apollo/" rel="noopener noreferrer"&gt;Apollo&lt;/a&gt;. Prices change, so check the &lt;a href="https://nerdyjoe.com/blog/cold-email-infrastructure/" rel="noopener noreferrer"&gt;full guide&lt;/a&gt; for the October 2026 numbers and the cost worked example.&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
