Setting up a paid subscriber paywall in VeloCMS
Enable the membership system, connect Stripe, set pricing tiers, and paywall posts so only paid subscribers can read the full content.
VeloCMS's membership system lets you charge readers for access to premium content. Every post has a visibility setting — public, free members, or paid subscribers — so you can paywall any individual post while keeping the rest of the site open. 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. Turn on Accept reader subscriptions (free + paid). 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: 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 shown to free readers who hit a paywalled post. You can also define up to five paid tiers with their own pricing and benefits if a single tier is not enough.
- 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/yourblog — the exact URL for your site, including your tenant slug at the end, is displayed in Admin > Settings > Membership. Enable the events: checkout.session.completed, customer.subscription.updated, customer.subscription.deleted, and invoice.payment_failed. Copy the webhook signing secret and paste it into the Webhook Secret field in Admin > Settings > Membership.
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 it to Paid subscribers. Publish the post. Now visit the post URL while logged out — you will see the post's excerpt (its first 300 characters) followed by a subscriber upgrade prompt. 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.
Step 7 — Managing subscribers
All subscribers appear in Admin > Members. The Members list shows each member's email, subscription status, and when they joined, and you can import members in bulk or export the list from the same section. The newsletter campaign composer segments your audience — you can send a campaign to everyone, to free subscribers only, or to paid subscribers only.
Once configured, the paywall is fully automatic — Stripe handles renewals, failed payment retries, and subscription cancellations, and the webhook keeps each member's access in sync with their Stripe subscription.
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.