Sending a newsletter to people who already know you is the easy half: a Markdown editor, a confirmed subscriber table, batches through Amazon SES at about $0.10 per 1,000 emails, an archive and an RSS feed fit in a weekend. What a build cannot copy is what beehiiv sells above its free tier: a recommendation network and ad marketplace that only work because other publishers are on it, and a sending reputation that keeps mail out of spam folders. If your readers come from elsewhere, a personal sender is enough; if growth is the point, the platform is the product.
Before you buildbeehiiv Free covers up to 2,500 subscribers with unlimited sends. If you are under that and don't need paid subscriptions or automations, staying costs nothing.
Build me a self-hosted newsletter tool to replace beehiiv. Requirements: - Node.js 22 + TypeScript: a Fastify server with server-rendered pages (Eta templates) and no front-end framework. `npm start` serves on http://localhost:4300. - Storage: better-sqlite3 in ./data/news.db: subscribers (email, status pending / active / unsubscribed, token, created_at), issues (slug, subject, markdown, status), sends (issue, subscriber, state, sent_at) and links (issue, url, clicks). - Writing: a Markdown editor with live preview (`marked`), saved as drafts; email HTML is produced with one template and inlined CSS (`juice`). "Send test to me" before any send. - Sending: SMTP through nodemailer, credentials in .env (Amazon SES SMTP or Resend). Send in batches at SEND_RATE per second; write each recipient's state before sending so a crash and restart never mails anyone twice. Only active subscribers receive issues. - Signup: POST /subscribe with double opt-in (confirmation email, 48-hour token). Every issue carries an unsubscribe link plus List-Unsubscribe and List-Unsubscribe-Post one-click headers. - Public side: /archive and /p/<slug> for sent issues, and /feed.xml (RSS). Links in emails go through /r/<id> so clicks are counted per link; no open-tracking pixel. - Admin: one password in .env (signed cookie), CSV import and export of subscribers. - Single user. No accounts, no telemetry, local-first. Only SMTP and the signup page are exposed. - Out of scope: paid subscriptions, ad network, recommendations, automations, bounce webhooks. - README: where the data lives, how to back it up, and the SPF, DKIM and DMARC records to add; warn that a new SES account starts in the sandbox and needs a production-access request.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own beehiiv.
Add a beehiiv importer to the newsletter tool in this folder. Requirements: - A command `news import-beehiiv --subscribers subs.csv --posts posts.csv` that reads the two CSV files from beehiiv's Export Data page. - Map subscriber status to pending / active / unsubscribed; never re-activate an unsubscribed address, and skip duplicates so running it twice is safe. - Create one issue per post with its original publish date and slug; draft and archived posts come in as drafts. Convert the HTML body to Markdown with `turndown`. - Print a summary of imported, skipped and unparseable rows before writing anything, and ask for confirmation unless --yes is passed. - Update the README with the two export steps.
Add bounce and complaint handling to the newsletter tool in this folder. Requirements: - An endpoint POST /hooks/ses that accepts Amazon SNS messages for SES delivery events; verify the SNS signature and confirm the subscription message automatically. - Hard bounces and complaints set the subscriber to suppressed immediately; soft bounces are counted and suppress after three in a row. - Pause a send automatically when bounces pass 2% or complaints pass 0.1% of the batch. - Show suppressed addresses and the reason in the admin page, with a manual restore button. - Update the README with the SNS topic and SES configuration-set steps.
Add a paid tier to the newsletter tool in this folder. Requirements: - Stripe Checkout (`stripe` library) for one monthly and one yearly price, with the keys and price ids in .env; start in Stripe test mode and say so in the README. - A webhook for checkout.session.completed, invoice.paid and customer.subscription.deleted that flips the subscriber's tier; verify the webhook signature. - Mark each issue free or paid; paid issues show only an excerpt in the archive and RSS, and the full email goes to paid subscribers only. - A "manage billing" link that opens Stripe's customer portal. - Out of scope: tax handling, invoices, coupons. - Update the README with the webhook URL to register.
Add a welcome sequence to the newsletter tool in this folder. Requirements: - When a subscriber confirms, schedule three emails at +0, +2 and +5 days, written in Markdown files under ./welcome/ with a subject in the front matter. - A scheduler loop in the same process that sends due emails through the existing SMTP path, once per subscriber, and stops for anyone who unsubscribes. - A page listing each subscriber's progress through the series. - Update the README.
Writers pay for growth tooling more than for sending. Recommendations, sponsor slots and paid tiers all depend on a crowd of publishers on one platform, and the list of Gmail and Outlook inboxes that trust the sending domain took someone else's volume to build.
Estimate · A small VPS (about $5) plus Amazon SES at $0.10 per 1,000 emails: a weekly issue to 1,000 readers is roughly $0.40 of sending a month, to 25,000 readers about $10. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Free | $0 | $0 | Up to 2,500 subscribers, unlimited sends, 1 publication, 1 team seat, 1 guest author, 30 days of analytics. |
| Lite | $59 | $49 | Up to 100,000 subscribers, 3 publications, 2 team seats, 3 guest authors, 12 months of analytics, automations, A/B tests, polls, paid subscriptions and ad monetization. |
| Pro | $109 | $95 | Up to 250,000 subscribers, 10 publications, 10 team seats, unlimited guest authors and analytics history, beehiiv branding removed, webhooks, advanced analytics, webinars and coaching, 24/7 priority support. |
| Enterprise | custom | — | Custom subscriber limits, SSO/SAML, dedicated IPs, a customer success manager and concierge onboarding. |
Free covers up to 2,500 subscribers with unlimited sends, one publication and one seat.
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: The recommendation network and ad marketplace, which need other publishers, Paid subscriptions with Stripe checkout and a 0% platform fee.
About $59 a month on the Lite plan, $708 a year (checked 2026-10-14).
The recommendation network and ad marketplace, which need other publishers; Paid subscriptions with Stripe checkout and a 0% platform fee; Automations, polls and A/B tests on subject lines; The built-in website, podcast and digital-product tools; Delivery on shared sending infrastructure with an established reputation. If any of those matter to you, keep paying.
Yes: Ghost (open source), listmonk (open source), Keila (open source).