Niche Guides·7 min read·

Setting up a paid subscriber paywall in VeloCMS

Complete guide to enabling the membership system, connecting Stripe, setting pricing tiers, and paywalling posts so only paid subscribers can read full content.

VeloCMS's membership system lets you charge readers for access to premium content — individual posts, entire categories, or your full archive. Payments are processed by Stripe using your own Stripe account (BYOK — Bring Your Own Key), so you keep 100% of revenue with no platform fee beyond Stripe's standard rate.

Step 1 — Create a Stripe account and get your API keys

If you do not have a Stripe account, create one at stripe.com. After onboarding, go to the Stripe Dashboard > Developers > API Keys. You will need two keys: the Secret Key (starts with sk_live_ or sk_test_) and the Publishable Key (starts with pk_live_ or pk_test_). Keep the Secret Key private — it should never appear in client-side code.

Use sk_test_ and pk_test_ keys during setup to avoid real charges. Switch to live keys only when you are ready to accept real payments. You can safely test the full checkout flow with test card number 4242 4242 4242 4242.

Step 2 — Configure Stripe in VeloCMS

Go to Admin > Settings > Membership. Toggle Enable Membership to on. Paste your Stripe Secret Key and Publishable Key into the respective fields. VeloCMS encrypts your secret key at rest using AES-256-GCM — it is never stored in plain text. Click Save. VeloCMS will automatically create a Stripe Product and two Price records (monthly and yearly) based on the pricing you set in the next step.

Step 3 — Set your subscription pricing

Still in Admin > Settings > Membership, set the following: Free Tier Name (default: Free), Paid Tier Name (default: Member), Monthly Price in your currency, Yearly Price (typically 10× the monthly price to offer a two-month discount), and the currency code (USD, GBP, EUR, etc.). Add 3–5 membership benefit strings — these appear on the upgrade CTA modal shown to free readers who hit a paywalled post.

  • Example monthly price: $7 (newsletter standard), $10 (blog + archive), $15 (premium community)
  • Example yearly price: $70 (two months free vs monthly), $100, $150
  • Benefit strings: 'Full access to every post', 'Monthly Q&A with the author', 'Discord community access', 'Ad-free reading'

Step 4 — Set up the Stripe webhook

VeloCMS needs to know when a Stripe subscription is created, renewed, or cancelled. Go to Stripe Dashboard > Webhooks > Add Endpoint. Set the endpoint URL to https://yourblog.velocms.org/api/member-webhook. Enable the events: customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, invoice.payment_failed, and checkout.session.completed. Copy the webhook signing secret and paste it into Admin > Settings > Membership > Webhook Secret.

Step 5 — Paywall your first post

Create a new post (Admin > Posts > New Post). In the Settings panel on the right, find the Who Can Read This section. Set visibility to Paid subscribers. Publish the post. Now visit the post URL while logged out — you will see the first 200 words of the post followed by a subscriber upgrade modal. Free members see the same paywall. Only paid subscribers see the full content.

Step 6 — The subscriber checkout flow

When a reader clicks the upgrade CTA, they are redirected to /member/subscribe where they choose monthly or yearly billing. The checkout opens in a Stripe-hosted payment page. On success, they are redirected back to the original post, now unlocked. The entire flow takes under 60 seconds for a first-time subscriber.

Step 7 — Managing subscribers

All subscribers appear in Admin > Members. The Members list shows email, tier (free / paid), subscription status (active / cancelled / past_due), and the date they subscribed. You can manually grant or revoke paid access from this page — useful for complimentary subscriptions, refunds, or customer service escalations. The newsletter campaign composer segments your audience by tier — send exclusive content only to paid subscribers.

Once configured, the paywall is fully automatic — Stripe handles renewals, failed payment retries, and subscription cancellations. You receive an email when a new paid subscriber joins and another when a subscription lapses.

Sending newsletter campaigns to paid subscribers only

Once you have paid subscribers, you can send newsletter campaigns exclusively to them. Go to Admin > Newsletter > New Campaign. In the Audience section, choose 'Paid subscribers' from the audience dropdown. The campaign will be sent only to members with an active paid subscription. Use this to deliver premium content — deep-dives, early access, or community updates — that reinforces the value of the paid tier. Free subscribers who receive the regular newsletter will continue to get campaigns targeted at 'All' or 'Free' audiences.