<?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 Park</title>
    <description>The latest articles on DEV Community by Peter Park (@peterpark_coldmail).</description>
    <link>https://dev.to/peterpark_coldmail</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%2F4199347%2F2e7f79e0-226c-4933-a9c3-1cd77c539a4f.png</url>
      <title>DEV Community: Peter Park</title>
      <link>https://dev.to/peterpark_coldmail</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/peterpark_coldmail"/>
    <language>en</language>
    <item>
      <title>How to Set Up SPF, DKIM, and DMARC for Cold Email in 2026: A Developer's Guide</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Wed, 11 Nov 2026 03:52:33 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/how-to-set-up-spf-dkim-and-dmarc-for-cold-email-in-2026-a-developers-guide-459c</link>
      <guid>https://dev.to/peterpark_coldmail/how-to-set-up-spf-dkim-and-dmarc-for-cold-email-in-2026-a-developers-guide-459c</guid>
      <description>&lt;p&gt;If you're building a SaaS and plan to send emails to users — whether transactional, marketing, or outbound — email authentication is non-negotiable. Without proper SPF, DKIM, and DMARC records, your emails will land in spam or get rejected entirely.&lt;/p&gt;

&lt;p&gt;Here's a practical, no-fluff guide to setting all three up correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Email providers like Gmail and Outlook use authentication records to decide whether your email is legitimate. If you skip this step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your emails go to spam&lt;/li&gt;
&lt;li&gt;Your domain reputation drops&lt;/li&gt;
&lt;li&gt;Automated systems may block your domain entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This applies whether you're sending 10 emails or 10,000.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. SPF (Sender Policy Framework)
&lt;/h2&gt;

&lt;p&gt;SPF tells receiving servers which IP addresses are allowed to send email on behalf of your domain.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;Add a TXT record to your domain's DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the &lt;code&gt;include:&lt;/code&gt; values with your actual email providers. Common ones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;SPF Include&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_spf.google.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sendgrid.net&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mailgun&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mailgun.org&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon SES&lt;/td&gt;
&lt;td&gt;&lt;code&gt;amazonses.com&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Common Mistakes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Having multiple SPF records (only one is allowed per domain)&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;+all&lt;/code&gt; instead of &lt;code&gt;~all&lt;/code&gt; or &lt;code&gt;-all&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Exceeding the 10 DNS lookup limit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. DKIM (DomainKeys Identified Mail)
&lt;/h2&gt;

&lt;p&gt;DKIM adds a cryptographic signature to your outgoing emails. The receiving server checks this signature against a public key in your DNS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;Your email provider generates a DKIM key pair. You add the public key as a TXT record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selector._domainkey.yourdomain.com TXT "v=DKIM1; k=rsa; p=MIIBIjANBg..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most providers (Google Workspace, SendGrid, etc.) walk you through this in their dashboard. The key thing is to make sure the selector matches what your provider expects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;Send a test email to a Gmail account and check the email headers. Look for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dkim=pass header.d=yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. DMARC (Domain-based Message Authentication, Reporting &amp;amp; Conformance)
&lt;/h2&gt;

&lt;p&gt;DMARC ties SPF and DKIM together and tells receiving servers what to do when authentication fails.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;Add a TXT record at &lt;code&gt;_dmarc.yourdomain.com&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com; pct=100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Policy Levels
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Monitor only (start here)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=quarantine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send failures to spam&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=reject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block failures entirely&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with &lt;code&gt;p=none&lt;/code&gt; to collect reports, then gradually move to &lt;code&gt;quarantine&lt;/code&gt; and eventually &lt;code&gt;reject&lt;/code&gt; once you're confident your legitimate emails are passing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verification Tools
&lt;/h2&gt;

&lt;p&gt;Use these free tools to check your setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MXToolbox&lt;/strong&gt; — check SPF, DKIM, DMARC records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Admin Toolbox&lt;/strong&gt; — check MX records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mail-tester.com&lt;/strong&gt; — send a test email and get a score&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Real-World Impact
&lt;/h2&gt;

&lt;p&gt;Proper email authentication directly affects whether your emails reach inboxes. If you're building outbound features or any kind of email-sending functionality, this is foundational infrastructure.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt; to help founders write better cold emails, and the number one question that comes up is deliverability. The answer almost always starts with "Did you set up SPF, DKIM, and DMARC?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] One SPF record with all sending sources&lt;/li&gt;
&lt;li&gt;[ ] DKIM enabled for each sending service&lt;/li&gt;
&lt;li&gt;[ ] DMARC record starting with p=none&lt;/li&gt;
&lt;li&gt;[ ] Test email headers showing pass for all three&lt;/li&gt;
&lt;li&gt;[ ] Monitor DMARC reports for 2-4 weeks before tightening policy&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you're launching a product that sends email, get authentication right from day one. It's much harder to fix a damaged domain reputation than to set it up correctly from the start.&lt;/p&gt;

&lt;p&gt;Questions? Drop them in the comments — happy to help debug specific setups.&lt;/p&gt;

</description>
      <category>startup</category>
    </item>
    <item>
      <title>The Cold Email Deliverability Checklist Every SaaS Founder Needs in 2026</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Mon, 09 Nov 2026 01:07:49 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/the-cold-email-deliverability-checklist-every-saas-founder-needs-in-2026-1iha</link>
      <guid>https://dev.to/peterpark_coldmail/the-cold-email-deliverability-checklist-every-saas-founder-needs-in-2026-1iha</guid>
      <description>&lt;p&gt;You built a great product. You wrote compelling outreach emails. You hit send on 200 emails.&lt;/p&gt;

&lt;p&gt;And 40 of them never reached anyone's inbox.&lt;/p&gt;

&lt;p&gt;This is the reality for most SaaS founders doing cold outreach in 2026. Email providers like Google and Microsoft have tightened their filtering dramatically, and if your email infrastructure isn't set up correctly, your messages go straight to spam — no matter how good the copy is.&lt;/p&gt;

&lt;p&gt;Here's a practical checklist to make sure your emails actually land where they're supposed to.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Set Up SPF (Sender Policy Framework)
&lt;/h2&gt;

&lt;p&gt;SPF tells receiving mail servers which IP addresses are authorized to send email on behalf of your domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a TXT record to your domain's DNS&lt;/li&gt;
&lt;li&gt;Include every service that sends email for you (Google Workspace, SendGrid, Mailchimp, etc.)&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;~all&lt;/code&gt; (soft fail) or &lt;code&gt;-all&lt;/code&gt; (hard fail) at the end&lt;/li&gt;
&lt;li&gt;Don't exceed 10 DNS lookups — SPF has a lookup limit&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Configure DKIM (DomainKeys Identified Mail)
&lt;/h2&gt;

&lt;p&gt;DKIM adds a cryptographic signature to your emails that proves they weren't tampered with in transit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a DKIM key pair (most email providers do this for you)&lt;/li&gt;
&lt;li&gt;Add the public key as a TXT record in your DNS&lt;/li&gt;
&lt;li&gt;Your email provider signs outgoing emails with the private key&lt;/li&gt;
&lt;li&gt;Receiving servers verify the signature against your DNS record&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  3. Publish a DMARC Policy
&lt;/h2&gt;

&lt;p&gt;DMARC ties SPF and DKIM together and tells receiving servers what to do when authentication fails.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@yourdomain.com; pct=100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Start with &lt;code&gt;p=none&lt;/code&gt;&lt;/strong&gt; to monitor without blocking, then move to &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt; once you're confident everything is aligned.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Warm Up New Domains and Mailboxes
&lt;/h2&gt;

&lt;p&gt;Sending 500 emails from a brand-new domain on day one is the fastest way to get blacklisted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warm-up schedule:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Week 1: 10-20 emails/day to engaged contacts&lt;/li&gt;
&lt;li&gt;Week 2: 30-50 emails/day&lt;/li&gt;
&lt;li&gt;Week 3: 50-100 emails/day&lt;/li&gt;
&lt;li&gt;Week 4+: Gradually scale to your target volume&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use a separate domain for cold outreach (e.g., &lt;code&gt;getcompany.com&lt;/code&gt; instead of &lt;code&gt;company.com&lt;/code&gt;) to protect your primary domain's reputation.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Monitor Your Sender Reputation
&lt;/h2&gt;

&lt;p&gt;Use these free tools regularly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Postmaster Tools&lt;/strong&gt; — shows your domain reputation with Gmail&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MXToolbox&lt;/strong&gt; — checks blacklists and DNS configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mail Tester&lt;/strong&gt; (mail-tester.com) — scores individual emails on spam likelihood&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Keep Your Lists Clean
&lt;/h2&gt;

&lt;p&gt;High bounce rates destroy sender reputation fast.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove hard bounces immediately&lt;/li&gt;
&lt;li&gt;Re-verify email lists every 30 days&lt;/li&gt;
&lt;li&gt;Use email verification services before sending to new lists&lt;/li&gt;
&lt;li&gt;Aim for a bounce rate under 2%&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Write Like a Human
&lt;/h2&gt;

&lt;p&gt;Spam filters in 2026 are sophisticated enough to detect templated, mass-produced emails. A few patterns that trigger filters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ALL CAPS in subject lines&lt;/li&gt;
&lt;li&gt;Excessive exclamation marks!!!&lt;/li&gt;
&lt;li&gt;Image-heavy emails with minimal text&lt;/li&gt;
&lt;li&gt;URL shorteners (bit.ly, etc.)&lt;/li&gt;
&lt;li&gt;Too many links in a single email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best-performing cold emails tend to be short, plain-text, and conversational.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;p&gt;Before you send your next outreach campaign, run through this checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] SPF record configured and under 10 lookups&lt;/li&gt;
&lt;li&gt;[ ] DKIM signing enabled and verified&lt;/li&gt;
&lt;li&gt;[ ] DMARC policy published (at least &lt;code&gt;p=none&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Sending domain warmed up (2+ weeks of gradual volume)&lt;/li&gt;
&lt;li&gt;[ ] Google Postmaster Tools connected&lt;/li&gt;
&lt;li&gt;[ ] Email list verified within last 30 days&lt;/li&gt;
&lt;li&gt;[ ] Test email scores 9+ on Mail Tester&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Getting emails delivered is a prerequisite, not a bonus. No amount of copywriting skill matters if your emails never reach the inbox.&lt;/p&gt;




&lt;p&gt;If you're looking for a tool that helps with cold email creation while keeping deliverability in mind, check out &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt; — it's designed to help SaaS founders write effective cold emails without the guesswork.&lt;/p&gt;

&lt;p&gt;What deliverability issues have you run into? Drop them in the comments.&lt;/p&gt;

</description>
      <category>emailsaasstartupproductivity</category>
    </item>
    <item>
      <title>Email Authentication 101: SPF, DKIM, and DMARC Explained for SaaS Founders</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Fri, 06 Nov 2026 02:27:11 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/email-authentication-101-spf-dkim-and-dmarc-explained-for-saas-founders-12j9</link>
      <guid>https://dev.to/peterpark_coldmail/email-authentication-101-spf-dkim-and-dmarc-explained-for-saas-founders-12j9</guid>
      <description>&lt;p&gt;If you're a SaaS founder sending transactional or outbound emails, there's a good chance your messages are landing in spam folders without you even knowing it. The culprit? Missing or misconfigured email authentication records.&lt;/p&gt;

&lt;p&gt;In this guide, I'll break down the three pillars of email authentication: &lt;strong&gt;SPF&lt;/strong&gt;, &lt;strong&gt;DKIM&lt;/strong&gt;, and &lt;strong&gt;DMARC&lt;/strong&gt;. No fluff, just what you need to know as a developer or technical founder to get your domain's email reputation right from day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Email Authentication Matters
&lt;/h2&gt;

&lt;p&gt;Every time your server sends an email, the receiving mail server asks three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Is this sender allowed to send on behalf of this domain?&lt;/strong&gt; (SPF)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Was this message tampered with in transit?&lt;/strong&gt; (DKIM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What should I do if SPF or DKIM fails?&lt;/strong&gt; (DMARC)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you can't answer these questions with properly configured DNS records, inbox providers like Gmail, Outlook, and Yahoo are increasingly likely to reject or quarantine your messages.&lt;/p&gt;

&lt;p&gt;According to Google's 2024 sender guidelines, bulk senders (5,000+ messages/day to Gmail) are now &lt;strong&gt;required&lt;/strong&gt; to have SPF, DKIM, and DMARC configured. Yahoo has adopted similar requirements. This isn't optional anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  SPF: Sender Policy Framework
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What It Does
&lt;/h3&gt;

&lt;p&gt;SPF lets you declare which mail servers are authorized to send email on behalf of your domain. It's a DNS TXT record that receiving servers check against the IP address of the sending server.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Set It Up
&lt;/h3&gt;

&lt;p&gt;Add a TXT record to your domain's DNS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type:  TXT
Host:  @
Value: v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Breaking this down:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=spf1&lt;/code&gt; declares this is an SPF record&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include:_spf.google.com&lt;/code&gt; authorizes Google Workspace servers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include:sendgrid.net&lt;/code&gt; authorizes SendGrid's servers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~all&lt;/code&gt; soft-fails anything not listed (use &lt;code&gt;-all&lt;/code&gt; for hard-fail once you're confident)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Constraints
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You can only have &lt;strong&gt;one SPF record&lt;/strong&gt; per domain. Multiple records will cause validation failures.&lt;/li&gt;
&lt;li&gt;SPF has a &lt;strong&gt;10 DNS lookup limit&lt;/strong&gt;. Each &lt;code&gt;include:&lt;/code&gt; counts as a lookup. Nested includes count too. Exceeding this limit silently breaks your SPF.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  DKIM: DomainKeys Identified Mail
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What It Does
&lt;/h3&gt;

&lt;p&gt;DKIM adds a cryptographic signature to every outgoing email. The receiving server can verify this signature using a public key published in your DNS. This proves the message hasn't been altered in transit and that it originated from an authorized sender.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Set It Up
&lt;/h3&gt;

&lt;p&gt;Your email service provider (ESP) will generate a DKIM key pair. You publish the public key as a DNS TXT record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type:  TXT
Host:  selector1._domainkey
Value: v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFA...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Breaking this down:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;selector1._domainkey&lt;/code&gt; is the selector name (provided by your ESP) plus the fixed &lt;code&gt;_domainkey&lt;/code&gt; suffix&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v=DKIM1&lt;/code&gt; is the DKIM version&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;k=rsa&lt;/code&gt; is the key type&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=...&lt;/code&gt; is your public key (the long base64 string your ESP gives you)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Verify
&lt;/h3&gt;

&lt;p&gt;Send a test email to a Gmail address and open the original message headers. Look for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;Authentication-Results&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt;
  dkim=pass header.d=yourdomain.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use command-line tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT selector1._domainkey.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  DMARC: Domain-based Message Authentication, Reporting &amp;amp; Conformance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What It Does
&lt;/h3&gt;

&lt;p&gt;DMARC ties SPF and DKIM together with a policy. It tells receiving servers what to do when authentication fails, and where to send reports about it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Set It Up
&lt;/h3&gt;

&lt;p&gt;Add a TXT record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type:  TXT
Host:  _dmarc
Value: v=DMARC1; p=none; rua=mailto:dmarc-reports@yourdomain.com; pct=100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Breaking this down:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;v=DMARC1&lt;/code&gt; is the DMARC version&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=none&lt;/code&gt; is the policy (monitor only, no action on failures)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rua=mailto:...&lt;/code&gt; is where aggregate reports get sent&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pct=100&lt;/code&gt; applies the policy to 100% of messages&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Three Policy Levels
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;When to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=none&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Monitor only, deliver everything&lt;/td&gt;
&lt;td&gt;Starting out, collecting data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=quarantine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Send failures to spam&lt;/td&gt;
&lt;td&gt;After reviewing reports, confident in setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p=reject&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block failures entirely&lt;/td&gt;
&lt;td&gt;Full confidence, all legitimate sources covered&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Recommended rollout:&lt;/strong&gt; Start with &lt;code&gt;p=none&lt;/code&gt; for 2-4 weeks while reviewing reports. Move to &lt;code&gt;p=quarantine&lt;/code&gt;, then &lt;code&gt;p=reject&lt;/code&gt; once you're sure all legitimate sending sources are authenticated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes to Avoid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Multiple SPF Records
&lt;/h3&gt;

&lt;p&gt;Adding a second SPF TXT record instead of merging &lt;code&gt;include:&lt;/code&gt; statements into one record. DNS returns both, and validators may reject them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com ~all
v=spf1 include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Right:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Exceeding the SPF Lookup Limit
&lt;/h3&gt;

&lt;p&gt;Every &lt;code&gt;include:&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;mx&lt;/code&gt;, and &lt;code&gt;redirect&lt;/code&gt; mechanism counts toward the 10-lookup cap. If you use multiple ESPs, CRM tools, and support desk platforms, you can easily exceed this. Use an SPF flattening tool or consolidate your sending infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Skipping DMARC Entirely
&lt;/h3&gt;

&lt;p&gt;SPF and DKIM alone aren't enough. Without DMARC, there's no policy for what happens on failure, and you won't receive reporting data. Even &lt;code&gt;p=none&lt;/code&gt; is better than no DMARC record at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Setting p=reject Too Early
&lt;/h3&gt;

&lt;p&gt;Jumping straight to a reject policy before auditing all sending sources (marketing tools, transactional email, CRM, support platforms) will cause legitimate emails to bounce.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Forgetting Subdomains
&lt;/h3&gt;

&lt;p&gt;If you send from &lt;code&gt;mail.yourdomain.com&lt;/code&gt; or &lt;code&gt;news.yourdomain.com&lt;/code&gt;, those subdomains need their own SPF and DKIM records. DMARC on the root domain can cover subdomains with the &lt;code&gt;sp=&lt;/code&gt; tag, but SPF and DKIM don't inherit automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Verification Checklist
&lt;/h2&gt;

&lt;p&gt;Once you've set everything up, validate your configuration:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;MXToolbox&lt;/strong&gt; (mxtoolbox.com/spf.aspx) for SPF syntax and lookup count&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mail-tester&lt;/strong&gt; (mail-tester.com) for a test email deliverability score&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gmail headers&lt;/strong&gt; by sending to Gmail, clicking "Show original," and checking Authentication-Results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DMARC reports&lt;/strong&gt; by waiting 24-48 hours after setup and reviewing aggregate XML reports at your &lt;code&gt;rua&lt;/code&gt; address&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Simplifying the Setup
&lt;/h2&gt;

&lt;p&gt;If you're building a SaaS that sends cold outreach or transactional email, getting authentication right is table stakes. But it's also the kind of infrastructure work that eats into time you'd rather spend on product.&lt;/p&gt;

&lt;p&gt;That's one of the reasons I built &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMail&lt;/a&gt;. It handles email infrastructure concerns like domain warm-up guidance and deliverability so founders can focus on writing emails that actually convert, rather than debugging DNS records.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Record Type&lt;/th&gt;
&lt;th&gt;Key Thing to Remember&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SPF&lt;/td&gt;
&lt;td&gt;Authorize sending servers&lt;/td&gt;
&lt;td&gt;TXT on &lt;code&gt;@&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;One record only, 10 lookup limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DKIM&lt;/td&gt;
&lt;td&gt;Verify message integrity&lt;/td&gt;
&lt;td&gt;TXT on &lt;code&gt;selector._domainkey&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Get keys from your ESP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC&lt;/td&gt;
&lt;td&gt;Set failure policy + reporting&lt;/td&gt;
&lt;td&gt;TXT on &lt;code&gt;_dmarc&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Start with &lt;code&gt;p=none&lt;/code&gt;, graduate up&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Set up all three. Monitor your DMARC reports. Graduate your policy. Your deliverability will thank you.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about email authentication or cold email infrastructure? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>email</category>
      <category>saas</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Build a Prospect Research Pipeline for Cold Email</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Thu, 05 Nov 2026 01:04:16 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/how-to-build-a-prospect-research-pipeline-for-cold-email-ep9</link>
      <guid>https://dev.to/peterpark_coldmail/how-to-build-a-prospect-research-pipeline-for-cold-email-ep9</guid>
      <description>&lt;p&gt;Cold email gets a bad reputation, and honestly, most of it is deserved. The biggest reason? People skip the research step entirely.&lt;/p&gt;

&lt;p&gt;Sending a well-researched, relevant email to the right person beats blasting hundreds of generic templates every time. In this post, I'll walk through a practical prospect research pipeline that any developer can build or adapt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with "Spray and Pray"
&lt;/h2&gt;

&lt;p&gt;Most cold email workflows look like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Buy a list of emails&lt;/li&gt;
&lt;li&gt;Write one template&lt;/li&gt;
&lt;li&gt;Send to everyone&lt;/li&gt;
&lt;li&gt;Wonder why the reply rate is near zero&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The missing step is &lt;strong&gt;research&lt;/strong&gt;. Understanding who you're emailing and why they should care is what separates effective outreach from spam.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Research Pipeline
&lt;/h2&gt;

&lt;p&gt;Here's a framework you can implement:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define Your Ideal Customer Profile (ICP)
&lt;/h3&gt;

&lt;p&gt;Before writing a single email, document:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Industry&lt;/strong&gt;: Which sectors benefit most from your product?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Company size&lt;/strong&gt;: Startup? Mid-market? Enterprise?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Role&lt;/strong&gt;: Who is the actual decision-maker?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pain point&lt;/strong&gt;: What specific problem does your product solve for them?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Find and Validate Contacts
&lt;/h3&gt;

&lt;p&gt;Use publicly available data sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Company websites (team pages, about pages)&lt;/li&gt;
&lt;li&gt;LinkedIn profiles (public information)&lt;/li&gt;
&lt;li&gt;Business directories and databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always validate email addresses before sending. A high bounce rate damages your sender reputation and can get your domain blacklisted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Research Each Prospect
&lt;/h3&gt;

&lt;p&gt;For each contact, spend 2-3 minutes gathering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Their recent posts or articles&lt;/li&gt;
&lt;li&gt;Company news or announcements&lt;/li&gt;
&lt;li&gt;Shared connections or interests&lt;/li&gt;
&lt;li&gt;Specific challenges their company might face&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This research becomes your personalization layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Write Contextual Emails
&lt;/h3&gt;

&lt;p&gt;Structure your email around what you learned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Subject: [Something specific to their situation]

Hi [Name],

[Reference something specific - a post they wrote, a company milestone, etc.]

[Connect that to the problem you solve - one sentence]

[Your value proposition - keep it brief]

[Clear, low-friction CTA]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Track and Iterate
&lt;/h3&gt;

&lt;p&gt;Monitor these metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bounce rate&lt;/strong&gt;: Should be under 2%. Higher means your data is bad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open rate&lt;/strong&gt;: Subject line effectiveness indicator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reply rate&lt;/strong&gt;: Content relevance indicator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Positive reply rate&lt;/strong&gt;: The metric that actually matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Implementation Notes
&lt;/h2&gt;

&lt;p&gt;If you're building this as a developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email validation&lt;/strong&gt;: Use DNS MX record checks + SMTP verification. Libraries like &lt;code&gt;email-validator&lt;/code&gt; handle the basics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limiting&lt;/strong&gt;: Respect sending limits. Major providers flag accounts that spike volume suddenly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt;: Set up SPF, DKIM, and DMARC records. These are non-negotiable for deliverability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warm-up&lt;/strong&gt;: New domains need gradual volume increases over 2-4 weeks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why We Built ColdMailAI
&lt;/h2&gt;

&lt;p&gt;This research pipeline is exactly the thinking behind &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt;. We wanted to make prospect research and personalized email generation accessible without requiring a massive sales team or expensive tools.&lt;/p&gt;

&lt;p&gt;The tool helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate research-backed email drafts&lt;/li&gt;
&lt;li&gt;Maintain personalization at scale&lt;/li&gt;
&lt;li&gt;Follow deliverability best practices automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're interested, check it out at &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;getcoldmail.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Research before you write. Always.&lt;/li&gt;
&lt;li&gt;Quality over quantity. 50 well-researched emails outperform 500 generic ones.&lt;/li&gt;
&lt;li&gt;Validate everything. Bad data costs you more than no data.&lt;/li&gt;
&lt;li&gt;Track metrics and iterate. What works changes over time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Cold email done right is just helpful communication between people who might benefit from working together. The research step is what makes it helpful instead of annoying.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your approach to cold email research? Drop your tips in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>emailsaaswebdevproductivity</category>
    </item>
    <item>
      <title>Email Deliverability Checklist for Developers: SPF, DKIM, DMARC, and Beyond</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Wed, 04 Nov 2026 01:58:13 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/email-deliverability-checklist-for-developers-spf-dkim-dmarc-and-beyond-2cc3</link>
      <guid>https://dev.to/peterpark_coldmail/email-deliverability-checklist-for-developers-spf-dkim-dmarc-and-beyond-2cc3</guid>
      <description>&lt;p&gt;If you're building any tool that sends email — whether it's transactional notifications, marketing campaigns, or cold outreach — deliverability is the invisible layer that determines whether your emails actually reach inboxes.&lt;/p&gt;

&lt;p&gt;Here's a practical checklist for developers who want to get email delivery right from the start.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Set Up SPF (Sender Policy Framework)
&lt;/h2&gt;

&lt;p&gt;SPF tells receiving mail servers which IP addresses are authorized to send email on behalf of your domain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a TXT record to your domain's DNS&lt;/li&gt;
&lt;li&gt;Include all services that send email for you (ESP, transactional provider, etc.)&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;~all&lt;/code&gt; (soft fail) or &lt;code&gt;-all&lt;/code&gt; (hard fail) at the end&lt;/li&gt;
&lt;li&gt;Keep your SPF record under 10 DNS lookups — exceeding this silently breaks validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Configure DKIM (DomainKeys Identified Mail)
&lt;/h2&gt;

&lt;p&gt;DKIM adds a cryptographic signature to your email headers, letting receivers verify the message wasn't altered in transit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selector._domainkey.yourdomain.com  TXT  "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3..."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key points:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate a public/private key pair (most ESPs provide this)&lt;/li&gt;
&lt;li&gt;Publish the public key as a DNS TXT record&lt;/li&gt;
&lt;li&gt;The private key signs outgoing messages automatically&lt;/li&gt;
&lt;li&gt;Rotate keys periodically (every 6-12 months is reasonable)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Publish a DMARC Policy
&lt;/h2&gt;

&lt;p&gt;DMARC ties SPF and DKIM together and tells receivers what to do when authentication fails.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_dmarc.yourdomain.com  TXT  "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@yourdomain.com; pct=100"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Policy options:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;p=none&lt;/code&gt; — Monitor only (start here)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=quarantine&lt;/code&gt; — Send failures to spam&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=reject&lt;/code&gt; — Block failures entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with &lt;code&gt;p=none&lt;/code&gt; to collect reports, then gradually tighten.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Warm Up New Domains and IPs
&lt;/h2&gt;

&lt;p&gt;Sending a large volume from a brand new domain or IP is the fastest way to get flagged as spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warming strategy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Week 1: 20-50 emails/day to engaged recipients&lt;/li&gt;
&lt;li&gt;Week 2: Double the volume&lt;/li&gt;
&lt;li&gt;Week 3-4: Continue scaling gradually&lt;/li&gt;
&lt;li&gt;Monitor bounce rates and spam complaints at each step&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Monitor Your Sender Reputation
&lt;/h2&gt;

&lt;p&gt;Use free tools to check your domain and IP reputation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Postmaster Tools&lt;/strong&gt; — Shows domain reputation, spam rate, authentication results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MXToolbox&lt;/strong&gt; — DNS record validation and blacklist monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mail-tester.com&lt;/strong&gt; — Send a test email and get a deliverability score&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Handle Bounces and Complaints
&lt;/h2&gt;

&lt;p&gt;Hard bounces (invalid addresses) and spam complaints directly damage your sender reputation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example: webhook handler for bounce processing&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/webhook/bounce&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;bounceType&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bounceType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Immediately remove from all lists&lt;/span&gt;
    &lt;span class="nf"&gt;removeFromMailingList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bounceType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;soft&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Retry up to 3 times, then remove&lt;/span&gt;
    &lt;span class="nf"&gt;incrementRetryCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Content Best Practices
&lt;/h2&gt;

&lt;p&gt;Even with perfect authentication, poor content triggers spam filters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid ALL CAPS subjects and excessive punctuation&lt;/li&gt;
&lt;li&gt;Include a plain-text version alongside HTML&lt;/li&gt;
&lt;li&gt;Keep your text-to-image ratio reasonable (not image-only emails)&lt;/li&gt;
&lt;li&gt;Always include an unsubscribe link&lt;/li&gt;
&lt;li&gt;Use a consistent "From" name and address&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters for SaaS Builders
&lt;/h2&gt;

&lt;p&gt;When we built &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt;, one of the core design decisions was to generate emails that follow these deliverability principles by default — proper structure, natural language patterns, and no spam trigger words. The tool doesn't send emails itself; it generates content designed to work well with whatever sending infrastructure you already have.&lt;/p&gt;

&lt;p&gt;Deliverability isn't a one-time setup. It's an ongoing practice. Get the foundation right, and your emails will actually reach the people you're writing to.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://postmaster.google.com/" rel="noopener noreferrer"&gt;Google Postmaster Tools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mxtoolbox.com/SuperTool.aspx" rel="noopener noreferrer"&gt;MXToolbox SuperTool&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dmarcanalyzer.com/" rel="noopener noreferrer"&gt;DMARC Analyzer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>emailwebdevsaastutorial</category>
    </item>
    <item>
      <title>The Anatomy of a High-Converting Cold Email Subject Line: A Technical Breakdown</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Tue, 03 Nov 2026 01:16:17 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/the-anatomy-of-a-high-converting-cold-email-subject-line-a-technical-breakdown-4ep7</link>
      <guid>https://dev.to/peterpark_coldmail/the-anatomy-of-a-high-converting-cold-email-subject-line-a-technical-breakdown-4ep7</guid>
      <description>&lt;p&gt;If you've ever sent cold emails, you know the feeling: you spend an hour crafting the perfect pitch, hit send, and... crickets. The problem usually isn't your email body. It's your subject line.&lt;/p&gt;

&lt;p&gt;Your subject line is the gatekeeper. If it doesn't earn the open, nothing else matters. Let's break down the technical anatomy of what makes cold email subject lines actually work, with frameworks you can apply today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3-Second Window
&lt;/h2&gt;

&lt;p&gt;Email clients display subject lines differently. Gmail on desktop shows roughly 70 characters. On mobile, you get about 35-40. Outlook varies depending on the preview pane. &lt;/p&gt;

&lt;p&gt;This means your most important words need to land in the first 35 characters. Anything after that is a bonus, not a requirement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Character limits by client (approximate visible characters)
Gmail Desktop:   ~70 chars
Gmail Mobile:    ~35-40 chars
Outlook Desktop: ~55-60 chars
Apple Mail:      ~50-60 chars
Yahoo:           ~45 chars
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Takeaway:&lt;/strong&gt; Front-load your value proposition. If your subject line reads well when cut at 40 characters, it works everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Framework 1: The Relevance Hook
&lt;/h2&gt;

&lt;p&gt;The most reliable cold email subject lines pass what I call the "why me, why now" test. The recipient should immediately understand why they're getting this email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern:&lt;/strong&gt; &lt;code&gt;[Specific Reference] + [Value Hint]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Quick question about your checkout flow"&lt;/li&gt;
&lt;li&gt;"Idea for [Company]'s onboarding sequence"&lt;/li&gt;
&lt;li&gt;"Noticed your team is hiring SDRs"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What makes these work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They reference something &lt;strong&gt;specific&lt;/strong&gt; about the recipient&lt;/li&gt;
&lt;li&gt;They imply you did your research&lt;/li&gt;
&lt;li&gt;They don't try to sell anything in the subject line itself&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Framework 2: The Curiosity Gap
&lt;/h2&gt;

&lt;p&gt;This technique creates a small gap between what the recipient knows and what they want to know. It's not clickbait. It's selective omission.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern:&lt;/strong&gt; &lt;code&gt;[Partial Information] + [Implied Completion Inside]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Two things I noticed on your site"&lt;/li&gt;
&lt;li&gt;"A thought about your recent launch"&lt;/li&gt;
&lt;li&gt;"Question about your approach to [topic]"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is specificity. "I have an idea" is spam. "I have an idea about your pricing page" is curiosity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Framework 3: The Direct Ask
&lt;/h2&gt;

&lt;p&gt;Sometimes the best approach is being straightforward. No tricks, no hooks. Just clarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern:&lt;/strong&gt; &lt;code&gt;[Clear Intent] + [Time Expectation]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"15 min chat about cold outreach?"&lt;/li&gt;
&lt;li&gt;"Worth a conversation?"&lt;/li&gt;
&lt;li&gt;"Quick feedback request"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Direct subject lines work best when your sender reputation is established or when targeting senior decision-makers who respect their own time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Side: What to Avoid
&lt;/h2&gt;

&lt;p&gt;Beyond frameworks, there are technical factors that affect deliverability before a human ever sees your subject line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Spam Trigger Patterns
&lt;/h3&gt;

&lt;p&gt;Certain patterns consistently trigger spam filters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ALL CAPS&lt;/strong&gt; words (one is fine, a whole subject in caps is not)&lt;/li&gt;
&lt;li&gt;Excessive punctuation (!!!, ???, or $$$)&lt;/li&gt;
&lt;li&gt;Known spam phrases: "act now," "limited time," "free money," "guaranteed"&lt;/li&gt;
&lt;li&gt;Emoji overuse in B2B contexts&lt;/li&gt;
&lt;li&gt;RE: or FW: prefixes on first-touch emails (dishonest and detectable)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Character Encoding Issues
&lt;/h3&gt;

&lt;p&gt;If you're building email tools or templates, watch out for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Common encoding pitfalls
"Smart quotes" &amp;gt; Use straight quotes in subject lines
Em dashes &amp;gt; Some clients render these as ???
Non-ASCII characters &amp;gt; Test across clients before sending
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Preview Text Interaction
&lt;/h3&gt;

&lt;p&gt;Modern email clients show preview text alongside the subject line. This is technically the first line of your email body (or a hidden preheader). Your subject line and preview text should work as a pair, not repeat each other.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Subject: "Quick question about your onboarding"
Preview: "I signed up for a trial last week and..."

// vs.

Subject: "Quick question about your onboarding"  
Preview: "Quick question about your onboarding flow..."  // Redundant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A Simple Testing Approach
&lt;/h2&gt;

&lt;p&gt;Before sending any cold email campaign, run your subject lines through this checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The 40-character test&lt;/strong&gt; - Does it read well when truncated?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The "why me" test&lt;/strong&gt; - Would the recipient know why they got this?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The inbox scan test&lt;/strong&gt; - Read it among 20 other subject lines. Does it stand out without being loud?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The spam word check&lt;/strong&gt; - Run it through a basic spam word list&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The honesty test&lt;/strong&gt; - Does the email body deliver what the subject promises?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Building These Into Your Workflow
&lt;/h2&gt;

&lt;p&gt;When I built &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMail&lt;/a&gt;, one of the core design decisions was keeping email generation client-side in the browser. No emails stored on a server, no subject line data collected. This matters because subject lines are where most personalization lives, and personalization data should stay with the sender.&lt;/p&gt;

&lt;p&gt;Whether you use a tool or write manually, the principles are the same: specificity beats cleverness, clarity beats creativity, and relevance beats everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Cold email subject lines aren't about being clever. They're about being relevant and clear within a tight technical constraint: a few dozen characters, filtered by algorithms, scanned by humans in under three seconds.&lt;/p&gt;

&lt;p&gt;Master the frameworks, respect the technical limits, and always test before you scale.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What subject line patterns have worked best in your outreach? Drop them in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>saas</category>
      <category>webdev</category>
      <category>coldemail</category>
    </item>
    <item>
      <title>How I Built a Cold Email Generator Without Storing a Single Email</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Mon, 02 Nov 2026 01:12:10 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/how-i-built-a-cold-email-generator-without-storing-a-single-email-2i54</link>
      <guid>https://dev.to/peterpark_coldmail/how-i-built-a-cold-email-generator-without-storing-a-single-email-2i54</guid>
      <description>&lt;p&gt;When I started building &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt;, one of the first architectural decisions I had to make was: should I store user emails?&lt;/p&gt;

&lt;p&gt;The answer was no. Here's why, and how the system works without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Privacy-First Approach
&lt;/h2&gt;

&lt;p&gt;Most email tools store your generated emails, contacts, and campaign data on their servers. That's fine for full-blown CRM platforms, but for a tool that generates cold email copy, it's unnecessary overhead and a liability.&lt;/p&gt;

&lt;p&gt;ColdMailAI generates personalized cold emails using AI, but it doesn't need to remember what it generated. The user provides context (who they're reaching out to, what they're selling, the tone they want), the AI generates the email, and the user copies it. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;Here's what powers the app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; on Vercel for the frontend and API routes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI API&lt;/strong&gt; for email generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayPal&lt;/strong&gt; for subscription payments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel Blob&lt;/strong&gt; for minimal asset storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No database&lt;/strong&gt; for user-generated content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lack of a traditional database for email content keeps things simple. No migrations, no backup strategy for PII, no GDPR data deletion requests to handle.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Generation Works
&lt;/h2&gt;

&lt;p&gt;The flow is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User fills in the form (recipient info, product/service description, desired tone)&lt;/li&gt;
&lt;li&gt;Frontend sends a POST request to an API route&lt;/li&gt;
&lt;li&gt;API route calls OpenAI with a carefully crafted system prompt&lt;/li&gt;
&lt;li&gt;Response streams back to the user&lt;/li&gt;
&lt;li&gt;User copies the result - nothing is stored server-side&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lessons From Building It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Start with the simplest architecture that works.&lt;/strong&gt;&lt;br&gt;
I could have built a full platform with saved drafts, campaign management, and A/B testing. Instead, I shipped a focused tool that does one thing well: generate cold email copy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Streaming responses matter for UX.&lt;/strong&gt;&lt;br&gt;
Nobody wants to stare at a loading spinner for 5 seconds. Streaming the AI response token-by-token makes the app feel fast and responsive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cost management is everything with AI products.&lt;/strong&gt;&lt;br&gt;
Using gpt-4o-mini instead of gpt-4o for email generation cut costs significantly while maintaining quality. For structured, shorter outputs like emails, the smaller model performs well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The landing page matters more than the product (initially).&lt;/strong&gt;&lt;br&gt;
I spent way too long perfecting the generation logic and not enough time on the landing page copy. The conversion rate improved once I rewrote the hero section to focus on the user's pain point rather than the technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm working on adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple email variations in a single generation&lt;/li&gt;
&lt;li&gt;Industry-specific templates&lt;/li&gt;
&lt;li&gt;Follow-up sequence suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building an AI-powered tool and debating architecture, consider whether you actually need to store the output. Sometimes the simplest approach is the right one.&lt;/p&gt;

&lt;p&gt;Check it out at &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;getcoldmail.com&lt;/a&gt; - feedback welcome.&lt;/p&gt;

</description>
      <category>coldemail</category>
    </item>
    <item>
      <title>How I Handle 10,000 Email Generations per Day on a Shoestring Budget</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Fri, 30 Oct 2026 01:04:44 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/how-i-handle-10000-email-generations-per-day-on-a-shoestring-budget-1f8h</link>
      <guid>https://dev.to/peterpark_coldmail/how-i-handle-10000-email-generations-per-day-on-a-shoestring-budget-1f8h</guid>
      <description>&lt;p&gt;When I launched &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt;, I had one goal: keep the price at $9/month and still handle serious volume. Six months later, we're generating over 10,000 personalized cold emails per day. Here's the exact technical playbook that makes it possible without burning through cash.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: AI APIs Are Expensive at Scale
&lt;/h2&gt;

&lt;p&gt;Let's do the math. If you're calling GPT-4 for every email generation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Average prompt: ~800 tokens&lt;/li&gt;
&lt;li&gt;Average completion: ~200 tokens&lt;/li&gt;
&lt;li&gt;Cost per email: ~$0.01-0.03&lt;/li&gt;
&lt;li&gt;10,000 emails/day = $100-300/day&lt;/li&gt;
&lt;li&gt;Monthly: $3,000-9,000&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At $9/month per user, you'd need &lt;strong&gt;333-1,000 paying users&lt;/strong&gt; just to cover API costs. That's before servers, domains, or your coffee budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 1: Intelligent Model Routing
&lt;/h2&gt;

&lt;p&gt;Not every email needs GPT-4-level intelligence. I built a routing layer that classifies generation requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;routeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;complexity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;analyzeComplexity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;complexity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requiresResearch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;        &lt;span class="c1"&gt;// Deep personalization&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;complexity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hasTemplate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// Template variation&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// Simple generation&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; 70% of requests go to cheaper models. Average cost dropped from $0.02 to $0.004 per email.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 2: Aggressive Caching with Semantic Matching
&lt;/h2&gt;

&lt;p&gt;Here's what most people miss: cold emails to similar prospects in the same industry follow similar patterns. I built a semantic cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateWithCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getEmbedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;vectorDB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.92&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Modify cached result slightly instead of full generation&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;cheapVariation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cached&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fullGeneration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;vectorDB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cache hit rate after 2 weeks of operation: &lt;strong&gt;~40%&lt;/strong&gt;. Those hits cost almost nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 3: Batch Processing with Queue Management
&lt;/h2&gt;

&lt;p&gt;Instead of processing emails one-by-one with individual API calls, I batch similar requests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Request -&amp;gt; Redis Queue -&amp;gt; Batch Aggregator (every 30s)
                                    |
                            Group by industry/template
                                    |
                            Single API call per batch
                                    |
                            Distribute results back
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Batching similar prompts reduced my API calls by &lt;strong&gt;60%&lt;/strong&gt; while maintaining personalization quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 4: The Infrastructure Stack
&lt;/h2&gt;

&lt;p&gt;Here's what runs ColdMailAI in production:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hosting&lt;/td&gt;
&lt;td&gt;Vercel (serverless)&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Supabase (free tier + $25 pro)&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector DB&lt;/td&gt;
&lt;td&gt;Pinecone (starter)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queue&lt;/td&gt;
&lt;td&gt;Upstash Redis&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI APIs&lt;/td&gt;
&lt;td&gt;OpenAI (with routing)&lt;/td&gt;
&lt;td&gt;~$400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email verification&lt;/td&gt;
&lt;td&gt;ZeroBounce&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain/DNS&lt;/td&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring&lt;/td&gt;
&lt;td&gt;Sentry (free tier)&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$505/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At $9/user with 200+ users, the margins actually work. The key is that costs scale sub-linearly because of caching and batching.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution 5: Progressive Generation
&lt;/h2&gt;

&lt;p&gt;This was the biggest unlock. Instead of generating a perfect email in one shot, I break it into stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stage 1 (instant):&lt;/strong&gt; Generate email structure + hook using cached patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 2 (background):&lt;/strong&gt; Enrich with prospect-specific research&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stage 3 (on-demand):&lt;/strong&gt; Polish and personalize when user reviews&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Users see Stage 1 results in under 2 seconds. Stages 2-3 run asynchronously, which spreads the computational load and lets me use cheaper batch processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers After 6 Months
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost per email generated:&lt;/strong&gt; $0.003 (down from $0.02)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average response time:&lt;/strong&gt; 1.8 seconds for first draft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache hit rate:&lt;/strong&gt; 42%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API cost as % of revenue:&lt;/strong&gt; 28% (healthy for SaaS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uptime:&lt;/strong&gt; 99.7%&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with caching from day one.&lt;/strong&gt; I added it in month 3 and kicked myself for not doing it earlier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't over-optimize early.&lt;/strong&gt; I spent a week building a custom model fine-tune that saved $30/month. Not worth it at that scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor cost per request religiously.&lt;/strong&gt; I have a Grafana dashboard that alerts me if cost-per-email exceeds $0.005.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;You don't need massive infrastructure funding to run an AI product at scale. Smart routing, aggressive caching, and batch processing got me from "this will bankrupt me" to "this is a real business" in about 3 months.&lt;/p&gt;

&lt;p&gt;If you're building something similar, I'm happy to answer questions in the comments. And if you want to see the end result, check out &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt; - it's $9/month because I actually figured out how to make that price work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building in public. Follow me for more technical deep dives on running an AI SaaS on a shoestring budget.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>webdev</category>
      <category>startup</category>
    </item>
    <item>
      <title>Building a Cold Email SaaS: Lessons from 6 Months of Solo Development</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Thu, 29 Oct 2026 01:06:50 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/building-a-cold-email-saas-lessons-from-6-months-of-solo-development-4pa3</link>
      <guid>https://dev.to/peterpark_coldmail/building-a-cold-email-saas-lessons-from-6-months-of-solo-development-4pa3</guid>
      <description>&lt;p&gt;Six months ago, I was manually writing cold emails for my consulting business. Every single one. Copy-pasting templates, swapping names, tweaking the opening line, hoping it didn't sound robotic.&lt;/p&gt;

&lt;p&gt;It was painful. So I built something to fix it.&lt;/p&gt;

&lt;p&gt;Today, &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt; is live, serving real users, and generating revenue. Here's everything I learned building it solo.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem That Started It All
&lt;/h2&gt;

&lt;p&gt;I was sending 50+ cold emails a week. My process looked like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find a prospect on LinkedIn&lt;/li&gt;
&lt;li&gt;Open a Google Doc template&lt;/li&gt;
&lt;li&gt;Manually personalize the first 2 lines&lt;/li&gt;
&lt;li&gt;Pray it didn't land in spam&lt;/li&gt;
&lt;li&gt;Forget to follow up&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The personalization was the bottleneck. Generic templates got ignored. Truly personalized emails got replies — but took 10-15 minutes each.&lt;/p&gt;

&lt;p&gt;I needed a tool that could write emails that &lt;em&gt;sounded&lt;/em&gt; like me but didn't require me to write each one from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack Decisions
&lt;/h2&gt;

&lt;p&gt;Here's what I landed on and why:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js + Vercel&lt;/strong&gt;&lt;br&gt;
I wanted to ship fast. Next.js gave me SSR for the landing page (SEO matters for SaaS), API routes for the backend, and Vercel made deployment a non-issue. Zero DevOps overhead.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// My project structure is dead simple
├── app/
│   ├── page.tsx          // Landing page
│   ├── dashboard/        // User dashboard
│   ├── api/
│   │   ├── generate/     // Email generation endpoint
│   │   ├── webhook/      // PayPal webhooks
│   │   └── auth/         // Auth routes
├── lib/
│   ├── openai.ts         // AI service layer
│   ├── prompts.ts        // Prompt templates
│   └── paypal.ts         // Payment logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;OpenAI API (GPT-4o-mini)&lt;/strong&gt;&lt;br&gt;
I started with GPT-4 but the cost per email was too high for a $9/month product. GPT-4o-mini gave me 95% of the quality at roughly 1/10th the cost. The key insight: the &lt;em&gt;prompt engineering&lt;/em&gt; matters more than the model size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PayPal for Payments&lt;/strong&gt;&lt;br&gt;
Stripe would have been my first choice, but I needed something that worked globally without a US business entity. PayPal subscriptions were straightforward to set up.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Hardest Technical Challenge: Prompt Engineering
&lt;/h2&gt;

&lt;p&gt;This is where I spent 60% of my development time. Getting an LLM to write cold emails that don't sound like they were written by AI is &lt;em&gt;hard&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;My first attempt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// v1: Naive approach — terrible results&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;`Write a cold email to &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{prospect.name} 
at &lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{prospect.company} about our product.&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output was generic, salesy, and screamed "AI wrote this." Nobody would reply to it.&lt;/p&gt;

&lt;p&gt;After weeks of iteration, I landed on a multi-step approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// v2: Context-enriched generation&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Step 1: Analyze the prospect's context&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;analysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;analyzeProspect&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;recentActivity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;linkedinSummary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Step 2: Generate with structured context&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;buildSystemPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writingStyle&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;buildUserPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;analysis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;parseEmailResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key lessons on prompt engineering for cold emails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Feeding context beats clever instructions.&lt;/strong&gt; Instead of telling the AI "write a personalized email," I feed it the prospect's LinkedIn summary, recent posts, and company news. The AI naturally weaves in relevant details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Temperature 0.7 is the sweet spot.&lt;/strong&gt; Lower = too formulaic. Higher = too random and sometimes nonsensical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Few-shot examples from the user's own sent emails&lt;/strong&gt; dramatically improve tone matching. I let users paste 3-5 of their best emails during onboarding, and use them as style references.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Handling Rate Limits
&lt;/h2&gt;

&lt;p&gt;When a user generates 50 emails in a batch, you hit OpenAI rate limits fast. My solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simple but effective rate limiter&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailQueue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;maxConcurrent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delayMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxConcurrent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;maxConcurrent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delayMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;delayMs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxConcurrent&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Rate limited — back off and retry&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unshift&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;active&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;delayMs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing fancy. A queue with exponential backoff on 429s. It handles 95% of cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Email Preview System
&lt;/h2&gt;

&lt;p&gt;Users want to see and edit emails before sending. This sounds simple, but the UX details matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time preview&lt;/strong&gt; as the AI generates (streaming SSE responses)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline editing&lt;/strong&gt; without losing the AI-generated structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tone adjustment&lt;/strong&gt; slider (formal ↔ casual) that regenerates specific sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subject line variants&lt;/strong&gt; — I generate 3 options and let the user pick&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The streaming preview was the most satisfying feature to build. Users see the email "writing itself" in real-time, which also builds trust in the AI output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned About Solo SaaS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Ship ugly, iterate fast.&lt;/strong&gt;&lt;br&gt;
My v1 looked terrible. I used basic Tailwind components, no fancy animations. But it worked. The first paying user didn't care about the UI — they cared that the emails got replies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Talk to users constantly.&lt;/strong&gt;&lt;br&gt;
I added Tawk.to live chat on day one. Every conversation taught me something. Users asked for features I never would have thought of (like the tone slider).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Pricing is emotional, not logical.&lt;/strong&gt;&lt;br&gt;
I agonized over pricing. $9/month for 100 AI-generated emails felt too cheap. But as a solo builder, I'd rather have 100 users at $9 than 10 at $49. Volume validates faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The marketing is harder than the code.&lt;/strong&gt;&lt;br&gt;
Building the product took 2 months. Getting the first 10 users took 3 months. SEO, content marketing, Reddit, Product Hunt — it's a different skill set entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current State
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live at&lt;/strong&gt; &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;getcoldmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing:&lt;/strong&gt; $9/month (100 emails), $29/month (500 emails)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack:&lt;/strong&gt; Next.js, Vercel, OpenAI, PayPal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Users:&lt;/strong&gt; Growing steadily through organic search and word of mouth&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team collaboration&lt;/strong&gt; — shared templates, team analytics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRM integration&lt;/strong&gt; — HubSpot and Pipedrive first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email tracking&lt;/strong&gt; — open rates, reply detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A/B testing&lt;/strong&gt; — automatically test different email variants&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Building a SaaS solo is equal parts exhilarating and exhausting. There are days when everything breaks and you question why you didn't just keep using Gmail templates.&lt;/p&gt;

&lt;p&gt;But then a user messages you: "I got 3 meetings from the emails your tool generated this week."&lt;/p&gt;

&lt;p&gt;That makes it worth it.&lt;/p&gt;




&lt;p&gt;If you're struggling with cold outreach, check it out at &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;getcoldmail.com&lt;/a&gt;. And if you're building something solo — keep shipping. The hardest part isn't the code, it's staying consistent.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your biggest challenge with cold email? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>coldmail</category>
      <category>saas</category>
      <category>buildinpublic</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Replaced My Cold Email Templates with AI - Here's My 30-Day Data</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Wed, 28 Oct 2026 02:05:25 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/i-replaced-my-cold-email-templates-with-ai-heres-my-30-day-data-j0l</link>
      <guid>https://dev.to/peterpark_coldmail/i-replaced-my-cold-email-templates-with-ai-heres-my-30-day-data-j0l</guid>
      <description>&lt;p&gt;As a developer who built a SaaS product, I needed to do my own outbound sales. Here's what happened when I stopped using templates and switched to AI-assisted cold emails.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I was sending 15-20 cold emails per day using templates. My reply rate was stuck at 2-3%. That meant maybe 1 reply every 2 days. Not enough to sustain a bootstrapped SaaS.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt; - an AI tool that generates personalized cold emails based on prospect data. Instead of filling in template blanks, the AI writes a fresh email for each prospect.&lt;/p&gt;

&lt;p&gt;I tracked everything for 30 days:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Templates&lt;/th&gt;
&lt;th&gt;AI-Assisted&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Emails/day&lt;/td&gt;
&lt;td&gt;15-20&lt;/td&gt;
&lt;td&gt;25-30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time per email&lt;/td&gt;
&lt;td&gt;8-12 min&lt;/td&gt;
&lt;td&gt;1-2 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open rate&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reply rate&lt;/td&gt;
&lt;td&gt;2.3%&lt;/td&gt;
&lt;td&gt;8.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Meetings booked&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Made the Difference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Speed&lt;/strong&gt;: AI drafts took 10 seconds instead of 10 minutes. I spent that saved time on better prospect research.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Personalization at scale&lt;/strong&gt;: Each email referenced something specific about the prospect's company. Not a generic "I love what you're doing at [Company]" but actual details about their recent product launch or blog post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: Templates get stale. You start cutting corners by email #10. AI generates fresh copy every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;For anyone curious, ColdMailAI is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js&lt;/strong&gt; for the frontend and API routes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI API&lt;/strong&gt; for email generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; for hosting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PayPal&lt;/strong&gt; for payments ($9/month subscription)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons for Developer-Founders
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your first marketing channel should be outbound&lt;/strong&gt;. SEO takes months. Ads cost money. Cold email costs time, which you have more of than cash.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build the tool you need&lt;/strong&gt;. I built ColdMailAI because I needed it. The best SaaS products solve the founder's own problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Track everything&lt;/strong&gt;. Without data, you're guessing. With data, you're iterating.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI is a multiplier, not a replacement&lt;/strong&gt;. The AI writes the draft, but I still review and personalize every email before sending.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you're doing outbound and want to test AI-assisted cold emails, check out &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt;. It's $9/month, and the free tier lets you generate 5 emails per day.&lt;/p&gt;

&lt;p&gt;What's your cold email workflow? Drop a comment - I'd love to compare notes.&lt;/p&gt;

</description>
      <category>coldemailaisaasbuildinpublic</category>
    </item>
    <item>
      <title>Why I Chose $9/month Pricing for My AI SaaS (And Would Do It Again)</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Sat, 24 Oct 2026 07:28:40 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/why-i-chose-9month-pricing-for-my-ai-saas-and-would-do-it-again-7km</link>
      <guid>https://dev.to/peterpark_coldmail/why-i-chose-9month-pricing-for-my-ai-saas-and-would-do-it-again-7km</guid>
      <description>&lt;p&gt;Every SaaS founder faces the pricing question early. $29/month? $49? Maybe a free tier with upsells?&lt;/p&gt;

&lt;p&gt;I went with $9/month for &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt;, my AI-powered cold email writer. Here's why, and what I've learned since launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem I Was Solving
&lt;/h2&gt;

&lt;p&gt;Writing cold emails is painful. You stare at a blank screen, try to sound personal without being creepy, and end up sending the same template to 200 people. The result? 2% reply rates and a lot of wasted time.&lt;/p&gt;

&lt;p&gt;I built ColdMailAI to fix this. You describe your offer, paste a prospect's details, and the AI writes a personalized cold email in seconds. Not a template with merge tags. An actually unique email.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not $29/month?
&lt;/h2&gt;

&lt;p&gt;Most AI SaaS tools price at $29-$49/month. The logic makes sense on paper: fewer customers needed to hit revenue targets, "premium" positioning, higher LTV.&lt;/p&gt;

&lt;p&gt;But here's what I noticed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The $29 price creates decision friction.&lt;/strong&gt;&lt;br&gt;
At $29/month, people want demos. They want to "evaluate" the tool. They compare you against 5 alternatives. The sales cycle goes from "impulse buy" to "committee decision."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. My target users are individual SDRs and founders.&lt;/strong&gt;&lt;br&gt;
These aren't enterprise teams with software budgets. They're solo founders sending cold emails at 11pm, or junior SDRs trying to hit quota. $9/month is lunch money. $29/month requires justification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The product is simple on purpose.&lt;/strong&gt;&lt;br&gt;
ColdMailAI does one thing: writes cold emails. It doesn't manage campaigns, track opens, or integrate with your CRM. One feature = simple pricing.&lt;/p&gt;
&lt;h2&gt;
  
  
  The $9 Math
&lt;/h2&gt;

&lt;p&gt;Here's my actual cost structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Vercel free tier (Next.js)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt;: OpenAI API, roughly $0.002 per email generated&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain + misc&lt;/strong&gt;: ~$15/year&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At $9/month per user:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 users = $900/month&lt;/li&gt;
&lt;li&gt;500 users = $4,500/month&lt;/li&gt;
&lt;li&gt;1,000 users = $9,000/month&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even at 100 users, it's profitable. The margins are excellent because the infrastructure cost is near zero.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I'd Tell Other Founders
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Price for adoption speed, not revenue optimization.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're at zero users, the most important thing isn't maximizing revenue per customer. It's getting people to actually use the product. Every user who signs up is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A potential word-of-mouth referral&lt;/li&gt;
&lt;li&gt;A source of feedback&lt;/li&gt;
&lt;li&gt;Social proof&lt;/li&gt;
&lt;li&gt;A future upsell candidate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A $9/month product with 500 users beats a $29/month product with 50 users. Not just in revenue, but in momentum.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Technical Stack
&lt;/h2&gt;

&lt;p&gt;For anyone curious about the build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Framework: Next.js 14
AI: OpenAI GPT-4 API
Auth: None (simple, no signup needed)
Payments: PayPal subscriptions
Hosting: Vercel (free tier)
Total build time: 1 weekend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The entire app is one page. You fill in your offer details, add prospect info, and click generate. No onboarding flow, no dashboard, no settings page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Would I Do It Again?
&lt;/h2&gt;

&lt;p&gt;Yes. The $9 price point removed so much friction that users try the product without overthinking it. And once they see the output quality, they stick around.&lt;/p&gt;

&lt;p&gt;If you're building a simple tool that solves one specific problem, consider pricing it low enough that the decision is instant. You can always add premium tiers later.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try ColdMailAI free&lt;/strong&gt;: &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;getcoldmail.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It writes personalized cold emails in seconds. No signup required to try it.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>ai</category>
      <category>webdev</category>
      <category>saas</category>
    </item>
    <item>
      <title>How I Built an AI Cold Email Generator with Next.js and OpenAI</title>
      <dc:creator>Peter Park</dc:creator>
      <pubDate>Fri, 23 Oct 2026 01:09:27 +0000</pubDate>
      <link>https://dev.to/peterpark_coldmail/how-i-built-an-ai-cold-email-generator-with-nextjs-and-openai-13kj</link>
      <guid>https://dev.to/peterpark_coldmail/how-i-built-an-ai-cold-email-generator-with-nextjs-and-openai-13kj</guid>
      <description>&lt;p&gt;Last weekend, I sat down with a simple idea: build an AI tool that writes personalized cold emails. By Sunday night, I had a working SaaS product deployed on Vercel. Here's the entire technical journey, what worked, what didn't, and what I'd do differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I've been doing B2B outreach for a while now. The biggest pain point? Writing cold emails that don't sound like templates. You know the ones:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hi {firstName}, I noticed your company {companyName} is doing great things in {industry}..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These emails get ignored. Everyone knows they're automated. But writing truly personalized emails takes forever. I was spending 3-4 hours a day just crafting outreach messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;Here's what I chose and why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 14&lt;/strong&gt; (App Router) - Server components for the AI processing, client components for the form UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI API&lt;/strong&gt; (GPT-4o-mini) - Good enough quality at a fraction of GPT-4 cost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; - Fast styling without leaving the editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; - Deploy in seconds, zero DevOps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; - Payment processing with webhook handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total monthly infrastructure cost: &lt;strong&gt;under $5&lt;/strong&gt; (OpenAI usage is the main variable).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;The app is surprisingly simple. Here's the core flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Input -&amp;gt; API Route -&amp;gt; OpenAI Completion -&amp;gt; Formatted Email -&amp;gt; Display
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API route handles the heavy lifting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/api/generate/route.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;prospect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tone&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;completion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a cold email expert. Write a personalized cold email that is concise, relevant to the prospect, and has a clear CTA.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write a cold email for: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;prospect&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; Context: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt; Tone: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;tone&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;completion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; 
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Technical Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why GPT-4o-mini over GPT-4?
&lt;/h3&gt;

&lt;p&gt;Cost. GPT-4o-mini is roughly 15x cheaper than GPT-4 for input tokens. For cold emails (short input, short output), the quality difference is negligible. My users are generating hundreds of emails. At GPT-4 prices, the margins would be razor thin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Server Components?
&lt;/h3&gt;

&lt;p&gt;The generation form is a client component (needs interactivity), but everything else is server-rendered. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast initial page load&lt;/li&gt;
&lt;li&gt;SEO-friendly landing page&lt;/li&gt;
&lt;li&gt;Less JavaScript shipped to the browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prompt Engineering Was 80% of the Work
&lt;/h3&gt;

&lt;p&gt;This surprised me. The actual Next.js code took maybe 4 hours. Getting the prompts right took the entire rest of the weekend.&lt;/p&gt;

&lt;p&gt;The key insight: &lt;strong&gt;constraints produce better emails.&lt;/strong&gt; When I told the AI "write a cold email," I got generic garbage. When I said "write a 3-sentence email that references their latest blog post and asks one specific question," the output was dramatically better.&lt;/p&gt;

&lt;p&gt;I ended up with a prompt template that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Word count limits (under 75 words)&lt;/li&gt;
&lt;li&gt;Structure requirements (hook, value prop, CTA)&lt;/li&gt;
&lt;li&gt;Anti-patterns to avoid ("I hope this finds you well")&lt;/li&gt;
&lt;li&gt;Tone matching based on industry&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stripe Integration in 30 Minutes
&lt;/h3&gt;

&lt;p&gt;Stripe's Next.js integration is ridiculously smooth now. The checkout flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User clicks "Subscribe" &lt;/li&gt;
&lt;li&gt;Redirect to Stripe Checkout&lt;/li&gt;
&lt;li&gt;Webhook fires on successful payment&lt;/li&gt;
&lt;li&gt;Update user status in the database&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I Shipped
&lt;/h2&gt;

&lt;p&gt;The MVP has three features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single email generation&lt;/strong&gt; - Paste prospect info, get an email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch generation&lt;/strong&gt; - Upload a CSV, get emails for all prospects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tone control&lt;/strong&gt; - Professional, casual, or direct&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. No email sending. No CRM integration. No analytics dashboard. Just the core value: generate good cold emails fast.&lt;/p&gt;

&lt;p&gt;I priced it at &lt;strong&gt;$9/month&lt;/strong&gt; with unlimited generations. Low enough that any SDR or founder would try it without needing approval from their boss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Deploy on day one.&lt;/strong&gt; I pushed to Vercel after the first 2 hours, before the AI even worked. Having a live URL kept me motivated and let me test on mobile early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Don't build auth from scratch.&lt;/strong&gt; I initially tried rolling my own auth. Wasted 3 hours. Switched to a simple email magic link flow and saved my sanity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Rate limiting is essential.&lt;/strong&gt; Without it, one user could burn through your entire OpenAI budget in minutes. I added a simple token-bucket rate limiter in the API route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Error handling for AI is different.&lt;/strong&gt; Sometimes the AI returns garbage. Sometimes it times out. Sometimes it ignores your constraints. You need graceful fallbacks and retry logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Numbers
&lt;/h2&gt;

&lt;p&gt;It's been a few weeks since launch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Around 50 signups on the free tier&lt;/li&gt;
&lt;li&gt;A handful of paid subscribers&lt;/li&gt;
&lt;li&gt;Average generation time: 2-3 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not viral numbers, but the product works and people are using it. The focus now is distribution, not features.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email sequence generation (not just single emails)
&lt;/li&gt;
&lt;li&gt;Better prospect research integration&lt;/li&gt;
&lt;li&gt;A Chrome extension for LinkedIn prospecting&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;If you're doing any kind of cold outreach, give it a shot: &lt;a href="https://getcoldmail.com" rel="noopener noreferrer"&gt;ColdMailAI&lt;/a&gt;. The free tier lets you generate emails without signing up.&lt;/p&gt;

&lt;p&gt;I'm building this in public, so I'll be sharing more updates here. Happy to answer any technical questions in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your experience with AI-generated emails? Have you found a sweet spot between automation and personalization? Let me know below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>saas</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
