I recently migrated my newsletter off Ghost and built a custom stack from scratch. Not because Ghost is bad, it's actually great for a lot of things, but because I hit a wall with growth. Ghost forces double opt-in on all signups, and you can't turn it off. It may be the best practice, but I don’t want my platform to make that decision for me. Since migrating to Beehiiv, I’ve seen over 50% higher conversions, and that’s after a gazillion seamless bot checks.
I also run other newsletters on Beehiiv and wanted to cross-promote across them. And Beehiiv has a built-in ad network, which means I can start monetizing without manually selling sponsorships from day one.
So, I rebuilt everything. Here's the stack I landed on and how it all works.
The Stack
Next.js for the frontend, Payload CMS for content management, Beehiiv for the newsletter side, Vercel for hosting, and Resend for transactional email. Payload runs embedded inside the same Next.js deployment, so it's one codebase and one deployment rather than two separate services talking to each other. Media and file uploads go to Vercel Blob.
Subscribing
When someone enters their email on the site, it hits a rate-limited API route with origin validation before anything happens. There's also a honeypot field on the form that catches bots early. The route checks Beehiiv, creates the subscriber if they're new, or reactivates them if they signed up before and went inactive.
A session cookie is then set in the browser with their Beehiiv subscription ID. Beehiiv fires a webhook back to the site to sync the subscriber into the local database, but Beehiiv is the source of truth throughout. The database is just a copy.
Logging in
Returning subscribers don't use a password. They enter their email, the site confirms it exists in Beehiiv, and sends a magic link via Resend. The link expires in ten minutes and can only be used once since the token gets deleted the moment it's clicked. A fresh session cookie gets set, and they're in. This feature is not at all necessary, but I wanted to have a soft paywall on articles to urge people to subscribe, and needed it to feel native.
Paywalling
Some articles on the site are paywalled. Each article also has a text-to-speech audio version that gets generated via OpenAI and sits in an audio player at the top of the post.
Both the article content and the audio player respect the paywall. For the content, you can drop a PaywallBreak block anywhere in the editor and that becomes the split point between what's free and what's gated. If there's no break block, the system cuts automatically at one-third of the article. Non-subscribers see the free portion with a blurred overlay below it and a prompt to subscribe or sign in. The audio player shows a lock icon for the same people.
Subscribers get everything. On each request, the site reads the session cookie, calls Beehiiv to confirm the subscription is still active, and serves the full content. There's also a bypass URL parameter for testing or sharing drafts without going through the whole flow.
What you have to rebuild that Ghost handled quietly.
This is the part nobody warns you about. Ghost handles a lot of things in the background that you only notice once they're gone. RSS feeds, XML sitemaps, schema.org markup on every article, redirects from old URLs so you don't lose SEO equity, reading time estimates, draft previews, scheduled publishing, and a role system where contributors can write but not publish. All of it needs to be built manually.
None of it is complicated, but it's a long list, and it probably added two weeks to the project that I didn't account for up front.
Going custom also means thinking about things Ghost never made you think about. Connection pooling so the database doesn't choke under load. Cold start latency on serverless functions. Webhook signature verification. Cookie security flags. Small things individually, but they add up.
Is it worth it?
If growth tooling matters to you but you still want the flexibility and quality of a custom build, yes. Cross-promotion, referral programs, monetization, and beehiiv ad network, no double opt-in friction PLUS a custom theme with killer SEO and full flexibility.
If you just want to write and publish without thinking about infrastructure, beehiiv (on its own), Substack or Ghost are still excellent, and you should probably stay on them. The custom stack gives you more control, but you're signing up to maintain it. For me, it was the right call. For a lot of people, it won't be.
