Using Ghost’s Built‑In Memberships to Monetize a Newsletter
Learn how Ghost’s native membership system stores members, syncs with Stripe, and gates content—plus a step‑by‑step example and the trade‑offs to consider.
05 Sept 2025, 22:56 UTC

Problem: Turning readers into paying members without external tools
Many creators want to run a paid newsletter but face the overhead of integrating separate member databases, payment gateways, and access‑control logic. Ghost’s built‑in memberships aim to solve this by handling member storage, Stripe synchronization, and content gating inside the CMS itself.
Thesis
Ghost’s membership feature provides a complete, low‑friction engineering path for paid newsletters: members live in Ghost’s database, Stripe webhook events keep subscription status current, and simple theme helpers gate posts or pages to specific tiers.
Architecture
When you enable Memberships in Ghost Labs, a members table is added to the underlying MySQL or SQLite database. Each member record stores email, status, and a tier field that references the Stripe product/price ID. Ghost subscribes to Stripe webhooks (customer.subscription.created, customer.subscription.updated, customer.subscription.deleted) and updates the member’s tier accordingly. In a theme, the helper {{#if @member}} checks whether a visitor is logged in, while {{#if @member.tier}} (or the @member.tier value) lets you show content only to members of a particular tier.
Workflow
- Enable Memberships: In Ghost admin go to
Settings → Labsand toggle “Memberships”. - Connect Stripe: Under
Settings → Membershipsadd your Stripe secret and publishable keys. Use test keys while experimenting. - Define tiers: Click “Create a tier”, set a name, price, billing interval, and optional benefits (e.g., access to all posts, exclusive newsletter). Ghost creates a Stripe product and price behind the scenes.
- Gate content: When editing a post or page, open the “Post settings” sidebar, scroll to “Visibility”, and select the tier(s) that should see the full content. Non‑matching visitors see the teaser you write in the excerpt.
Worked Example: $5/Month “Premium” Tier
Assume you have a self‑hosted Ghost instance running locally.
- Run the install command (requires Node.js and mysql or sqlite3):
ghost install local --db sqlite3 - Log into Ghost admin at
http://localhost:2368/ghost, enable Memberships in Labs, and add Stripe test keys (sk_test_…andpk_test_…). - Create a tier named “Premium”, price
5.00, intervalmonth. Save. - Write a tutorial post, set its visibility to “Premium only”, publish.
- In Stripe Dashboard (test mode), use the test card
4242 4242 4242 4242with any future expiry and CVC to subscribe to the price ID that Ghost created. - Ghost receives the
customer.subscription.createdwebhook, updates the member’stierto the Premium ID, and the member appears underMembersin admin. - Log in on the front‑end with that member’s email; the tutorial post displays in full.
- Log out; the same URL shows only the excerpt and an upgrade prompt.
- Cancel the test subscription in Stripe; after the next webhook (
customer.subscription.deleted) Ghost clears the tier, and the member loses access to the post.
Trade‑off / Limitation
The checkout flow is hosted by Stripe; you can adjust colors and text via the Stripe Dashboard, but deep UI customization requires overriding Ghost core or building a custom portal—a task that typically needs a self‑hosted instance with development verification. Additionally, memberships require Ghost 3.0+ (or 4.0+ for improved webhook reliability) and a stable webhook endpoint; if your server is behind a restrictive firewall or the webhook fails, member status may drift until the next successful sync.
Actionable Closing
To try this yourself, spin up a local Ghost install, enable Memberships, connect Stripe test keys, create a tier, gate a post, and verify access with the test card. Monitor the webhook logs in both Stripe and Ghost (ghost log) to confirm synchronization. If you need a fully branded checkout, evaluate whether the hosted Stripe flow meets your brand guidelines or if a custom portal justifies the extra engineering effort.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.