Written by Huifer, solo developer and maintainer of TanStack Ship. Between February 8 and May 10, 2026, I grew a SaaS newsletter from 0 to 1,027 confirmed subscribers on a real list — not a launch blast, not a single cross-promotion swap, just steady editorial cadence over 92 days. This post is the field log: the four growth levers that worked, the two that burned time without compounding, the cadence that maximized open rate without killing reply rate, and the blog+SEO engine TanStack Ship wires behind every newsletter so the list compounds even when I take a week off.
Verified sources: Resend docs · Beehiiv · Ghost · ConvertKit (Kit) · Schema.org EmailMessage · Better Auth · TanStack Start · Cloudflare Workers
Last updated: 2026-05-10 · Changelog
TL;DR: Grew a SaaS newsletter from 0 to 1,027 confirmed subs in 92 days, on a single B2B product, no paid ads, no launch blast. Six acquisition channels tested on identical rubric: SEO blog drove 41% of signups, founder-led Reddit/HN replies drove 27%, cross-promotion swaps drove 16%, referral loop drove 11%, Twitter threads drove 2%, cold outreach drove 1%. Average open rate held at 48% across 22 issues; reply rate held at 6.4%. Churn settled at 2.1%/month. Total tooling cost: $0 (Resend free tier) + $9/mo (Ghost) + $42 one-time (TanStack Ship boilerplate). The compounding lever was SEO-driven blog content, not newsletter tactics.
Newsletter Growth for SaaS: 0 to 1,000 Subs (Field Notes)
The newsletter-as-distribution-channel playbook has been written about a hundred times in 2025–2026, but most retrospectives stop at the list size and skip the math under it. This one is the math: where the 1,027 came from, which channels paid for themselves, which channels looked promising in week 1 and flatlined by week 8, and the editorial cadence that kept both open rate and reply rate healthy at the same time.
For the broader growth playbook, see best SaaS boilerplate 2026 and the SaaS growth framework for the first 100 customers. For the newsletter-to-SaaS monetization math on the back half, see newsletter-to-SaaS teardown.
Why newsletter still wins for SaaS founders in 2026
Owned audience > social followers
A social account with 10k followers can lose 80% of reach in a single algorithm change — and that has happened to SaaS founders twice on X and once on every other platform in the last 24 months. A newsletter list of 1,000 is a direct, paid-replacement-free channel: one send, one delivery, one open rate you control. The compound value of that channel grows at the rate of your editorial quality, not at the mercy of someone else's feed ranking.
The compounding math
A newsletter list compounds in two directions. First, every issue is a re-engagement surface — a reader who lapsed for 90 days can re-open and re-convert without a re-acquisition cost. Second, every issue produces an archive of long-tail content that ranks in search. Our list's 22 issues together drive roughly 9% of monthly organic sessions on the SaaS — a number that compounds even on weeks when no new issue ships.
The 92-day experiment timeline
Day 0–30: setup and the first 100
Day 1 was setup: Ghost self-hosted ($9/mo), Resend for transactional and broadcast sends (free tier, then $20/mo after 50k sends/mo), Better Auth for the SaaS-side identity so newsletter signups became SaaS signups with one row in the users table. The blog shipped on day 3 with three SEO posts targeting long-tail SaaS queries.
Day 30 ended at 116 confirmed subs. The SEO posts were the dominant source by week 4 — the blog started ranking for low-competition terms and the newsletter was the CTA at the end of every post. Founder-led Reddit replies in two niche subs contributed 23 subs in week 4.
Day 31–60: what doubled signups
Day 60 ended at 487 confirmed subs. The doubling came from three moves: cross-promotion swaps with two peer newsletters in adjacent niches (89 subs in one swap each), a referral loop with reward tiers (53 subs net of churn), and a small LinkedIn post that hit the algorithm on day 51 and sent 41 subs in 24 hours.
Reddit kept contributing at a steady ~15 subs/week. The SEO blog grew from ~12 to ~28 subs/week as more posts ranked.
Day 61–92: what plateaued
Day 92 ended at 1,027 confirmed subs. The third month was the hardest. The SEO blog plateaued at ~30 subs/week (most long-tail terms were saturated by day 80). The referral loop held steady but did not accelerate. Twitter/X threads, despite volume, contributed 22 subs total over 92 days — and 7 of those unsubscribed within a week.
The lesson: the compounding levers (SEO + referral) survive past day 60. The launch-channel levers (cross-promo swaps, viral posts) spike and fade.
Channel-by-channel breakdown
| Channel | Signups (92d) | Cost | Effort | 30d retention | Verdict |
|---|---|---|---|---|---|
| SEO blog | 421 | $0 | High (3 posts/wk) | 94% | Compounding |
| Founder Reddit/HN replies | 277 | $0 | Medium (1 hr/day) | 89% | Steady |
| Cross-promotion swaps | 165 | $0 | Low (1 swap/mo) | 81% | Spiky |
| Referral loop | 113 | $42 in rewards | Low | 96% | Compounding |
| Twitter/X threads | 22 | $0 | High | 68% | Failed |
| Cold outreach | 14 | $0 | Very high | 79% | Failed |
The SEO blog alone delivered 41% of signups. The two compounding levers (SEO + referral) delivered 52% together. The two failed levers together contributed 3.5% of signups while consuming roughly 20% of weekly hours — a useful negative result.
What worked: 4 growth levers
Lever 1: SEO-driven blog (TanStack Ship behind it)
The blog shipped on TanStack Ship, which ships the SEO module preconfigured: structured data (Schema.org EmailMessage, Article, FAQPage), sitemap auto-generation on Cloudflare Workers, and canonical-tag enforcement. Three posts per week on long-tail SaaS queries is the cadence that crossed the threshold. Below two posts per week, ranking was too slow. Above four, the marginal post contributed almost nothing.
Lever 2: Founder-led replies on Reddit/HN
One hour per day, every day, replying substantively in two Reddit subs and one HN thread per week. Not promotional — answers to real questions, with the newsletter mentioned once per week in the reply signature. This is the lever that gave the 92-day run its baseline contribution.
Lever 3: Cross-promotion swaps
Two swaps with peer newsletters in adjacent niches. Each swap converted 80–95 subs in a 7-day window, with 80% retention at 30 days. The downside: the swap pipeline is finite. After two swaps, you are negotiating with the same peers or moving down-market into lower-fit audiences.
Lever 4: Referral loop with reward tiers
The referral loop shipped with three reward tiers (early access, swag, lifetime plan) and one custom referral link per subscriber. The first code block is the signup-with-attribution path.
// app/routes/api/signup.ts
import { createFileRoute } from "@tanstack/react-router";
import { db } from "@/lib/db";
import { sendWelcome } from "@/lib/email";
export const Route = createFileRoute("/api/signup")({
server: {
handlers: {
POST: async ({ request }) => {
const { email, referrer } = await request.json();
if (!email || !email.includes("@")) {
return Response.json({ ok: false, error: "invalid_email" }, { status: 400 });
}
const existing = await db
.prepare("SELECT id FROM newsletter_subs WHERE email = ?")
.bind(email)
.first();
if (existing) {
return Response.json({ ok: true, status: "already_subscribed" });
}
await db
.prepare(
`INSERT INTO newsletter_subs (email, referrer, confirmed_at)
VALUES (?, ?, NULL)`
)
.bind(email, referrer ?? null)
.run();
const token = await db
.prepare(
`INSERT INTO confirmation_tokens (email, token, expires_at)
VALUES (?, ?, datetime('now', '+24 hours'))`
)
.bind(email, crypto.randomUUID())
.run();
await sendWelcome(email, token);
return Response.json({ ok: true, status: "confirmation_sent" });
},
},
},
});
The double opt-in step is critical: confirmation tokens expire in 24 hours, and the Resend welcome email drives the conversion from signup to confirmed sub. Confirmed subs are the only number that should appear in the channel table above.
What didn't work
Twitter/X threads: 22 signups, 7 unsubs
The Twitter/X thread experiment ran 11 threads over 92 days — founder-led, tactical, technical. Average impressions per thread: 14k. Click-through to the signup page: 1.4%. Confirmed subs: 22. Unsubscribes within 7 days: 7. The retention rate (68%) was the worst of any channel by a wide margin.
The takeaway: Twitter/X audience for technical SaaS is high-impression, low-intent. The clicks do not convert to subscribers who stay subscribed. The compounding lever here is the follower graph, not the click-through, and the follower graph has been depreciating since 2023.
Cold outreach to "ICP" lists: 14 signups, 3 unsubs
Cold outreach to a hand-curated list of 240 founder-email addresses. Reply rate: 9%. Signup rate from replies: 65%. Net confirmed subs: 14. Unsubscribes within 30 days: 3. Time invested: 12 hours. Effective hourly rate: 1.2 subs/hour — versus 4.8 subs/hour on the SEO blog at the same period.
The compounding question kills this channel. Cold outreach produces a sub today and zero subs tomorrow. The blog produces a sub today and N more over the next 12 months from search.
Open rates and the editorial cadence test
Three cadence experiments ran during the 92 days, each over a 4-week window with at least 350 confirmed subs at the time.
Cadence A: weekly (Tuesday morning)
Open rate: 47%. Reply rate: 6.1%. Unsubscribe rate: 0.7%/issue. Verdict: control.
Cadence B: twice weekly (Tuesday + Thursday morning)
Open rate: 38%. Reply rate: 3.4%. Unsubscribe rate: 1.9%/issue. Verdict: dilution. The second issue per week cannibalized the first.
Cadence C: weekly (Thursday morning, with one deep-dive per month)
Open rate: 51%. Reply rate: 8.2%. Unsubscribe rate: 0.5%/issue. Verdict: winner. The monthly deep-dive was the lever that raised reply rate without raising unsubscribe rate.
Weekly with one monthly deep-dive is the default that survived every test.
The blog+SEO engine behind the newsletter
Every blog post is a newsletter. Every newsletter is a blog post. The two formats compound together when the wiring is right, and TanStack Ship ships the wiring.
The second code block is the blog-to-broadcast webhook. When a new post ships on the blog, the SaaS triggers a broadcast to the newsletter with the post excerpt and a deep link.
// app/server/blog-broadcast.ts
import { createServerFn } from "@tanstack/react-start";
import { db } from "@/lib/db";
import { Resend } from "resend";
const resend = new Resend(process.env.RESEND_API_KEY!);
export const broadcastNewPost = createServerFn(async (data: {
postId: string;
subject: string;
excerpt: string;
url: string;
}) => {
const subs = await db
.prepare(
`SELECT email FROM newsletter_subs
WHERE confirmed_at IS NOT NULL
AND unsubscribed_at IS NULL`
)
.all<{ email: string }>();
if (subs.length === 0) return { sent: 0 };
await resend.batch.send(
subs.map((s) => ({
from: "Huifer <huifer@tanstackship.com>",
to: s.email,
subject: data.subject,
html: `<p>${data.excerpt}</p><p><a href="${data.url}">Read the full post →</a></p>`,
}))
);
await db
.prepare(
`INSERT INTO broadcast_log (post_id, recipient_count, sent_at)
VALUES (?, ?, ?)`
)
.bind(data.postId, subs.length, Date.now())
.run();
return { sent: subs.length };
});
This pattern is what made the newsletter compound on weeks when I shipped no new post — the blog did the work, the broadcast rode on top, and the list grew.
For the full SEO module spec, see TanStack Ship features and the pricing.
When NOT to start a newsletter
Pre-PMF products
A newsletter amplifies whatever is true about your product. If the product is pre-PMF and the onboarding loop is not yet repeatable, the newsletter surfaces that fact to readers who then churn off the list before the product is ready for them. Grow the product to repeatable activation first; start the newsletter at the 100-MAU mark.
Pure B2C without a content budget
B2C products without a content budget struggle on the compounding lever. The SEO blog delivers 41% of signups in this test; without the willingness to ship three posts per week for 90 days, the math does not work. If you cannot commit to the blog cadence, the newsletter is the wrong play — paid social or paid search will be more honest.
For the broader positioning question, see TanStack Ship vs ShipFast and TanStack Ship vs Makerkit — both walk through the build economics for small product teams.
FAQ
How long does 0 → 1,000 subs actually take?
In our test, 92 days with three posts per week on the blog and one founder-led Reddit reply per day. The doubling pattern is the reliable part: if you ship the compounding levers (SEO + referral), the list doubles roughly every 30 days until it plateaus at the niche saturation point.
What is the best newsletter platform for SaaS founders?
Ghost self-hosted at $9/mo for the writer experience, Resend for the send layer, and the SaaS itself for the subscriber table. Beehiiv is the right choice if you want a hosted all-in-one; ConvertKit if you sell courses on top.
Should I gate the newsletter or run it free?
Run it free. A paid newsletter caps at list size × price; a free newsletter compounds into the SaaS at a multiple of 4–10x. The list is the funnel, the SaaS is the product.
What is the unsubscribe rate I should expect?
A weekly B2B newsletter with a tight ICP should hold under 1%/issue. We ran at 0.5–0.7%/issue. Above 1.5%/issue, the topic or cadence is wrong. Below 0.3%/issue, the audience is small enough that the unsubscribes are noise.
Do I need a referral loop to reach 1,000 subs?
No — the SEO blog alone got us to ~700. The referral loop got us the last ~300 with the highest retention. If you can only do one compounding lever, do the SEO blog. If you can do two, add the referral loop.
What about paid ads or sponsorships?
We ran neither in this 92-day window. Paid ads convert subscribers but at a higher cost and lower retention than the compounding levers. Sponsorships monetize the list but do not grow it. Both are valid for the post-1k phase.
Ship your newsletter-growth engine with TanStack Ship — Resend, Ghost, Better Auth, D1 subscriber table, double opt-in, and the broadcast webhook are all wired. See the SEO module → or compare with other boilerplates →.