Members & Payments
Roe CMS includes a complete membership and payment system that allows you to: - Build an email list with free member signups - Accept one-time payments for premium content access - Gate content behind a paywall with preview snippets - Manage members and their access levels from the admin
The system is designed to be flexible: you can use it for free newsletters only, paid memberships only, or a combination of both. You can even use payments purely for donations/support without gating any content.
Enabling the Members System
- Go to Admin → Settings
- Click “Enable Members”
- Choose how you’d like paid content to be presented on the site
- Finish setup with: “Enable Members”
This creates:
- Your members configuration
- Member pages: signup, signin, upgrade, check-email
Member Pages
When you enable members, Roe generates several pages that you can customize:
- Sign up - Where people create free accounts
- Sign in - Where members sign in with their email
- Upgrade - Where you pitch your paid membership
- Check your email - Confirmation page after requesting a magic link
These are regular markdown pages. You can edit the copy, add images, and customize them however you want.
How Members Sign In (Magic Links)
Roe uses passwordless authentication for free members. When someone signs in:
- They enter their email address
- They receive an email with a “magic link”
- They click the link and are automatically signed in
- The link expires after 24 hours
Paid members can optionally use passwords (generated automatically after payment), but magic links still work for them too.
Setting Up Payments with Stripe
To accept payments, you need to connect your Stripe account:
1. Get Your Stripe Keys
- Create a Stripe account at stripe.com
- Go to Developers → API Keys in your Stripe dashboard
- Copy your Publishable Key and Secret Key
- For testing, use the test mode keys
- For production, use the live mode keys
2. Add Keys to Roe
- Go to Admin → Payments
- Paste your Publishable Key
- Paste your Secret Key
- Click “Save & Test Connection”
If successful, you’ll see a green confirmation message.
3. Set Your Price
- Go to Admin → Settings → members.yml
- Find the
payments:section - Set
enabled: true - Set your
price:(e.g.,49.00for $49)
• Note: Stripe will default to your local currency if set in Stripe - Click “Save Configuration”
When you save, Roe automatically creates a product and price in your Stripe account.
4. Set Up Webhooks
Webhooks tell Roe when a payment succeeds:
- In your Stripe dashboard, go to Developers → Webhooks
- Click “Add endpoint”
- Enter your webhook URL:
https://yoursite.com/webhooks/stripe - Select events:
checkout.session.completed - Copy the Signing Secret
- Add it to your Stripe configuration in Roe
The Payment Flow
Here’s what happens when someone upgrades to paid:
- Member clicks “Upgrade” (on their account page or the upgrade page)
- Redirected to Stripe Checkout (secure payment form)
- Enters payment details (credit card, Apple Pay, etc.)
- Payment processes and Stripe sends webhook to Roe
- Member upgraded automatically to paid tier
- They can now access paid content
The entire process is handled automatically - no manual intervention needed.
Signup Options: Free vs Paid
Your signup page can offer two buttons:
```form
for: signup
button-text: Sign up free
upgrade-button-text: Sign up and become a paid member
```
How it works: - “Sign up free” → Creates free account, sends magic link - “Sign up and become a paid member” → Creates account AND redirects to Stripe for payment
The upgrade button only appears if payments are enabled in your config.
Creating Paywalled Content
To make a post or page premium/paid-only:
1. Set the Audience
Add this to your post’s frontmatter:
---
title: My Premium Article
audience: paid
---
2. Add a Paywall (Optional)
You can control where the paywall appears in your content using a paid_content form block:
This is the free preview that everyone can read. It gives them a taste of what's inside...
```form
for: paid_content
text: This is premium content. Upgrade to continue reading.
button-text: Become a paid member
```
Everything below this point is only visible to paid members. This is where your premium content lives - the analysis, insights, and deep dives that paying members get access to.
How it works:
- ✅ Paid members see the entire post (paywall form is hidden)
- ✅ Free members & guests see everything up to the form, then content stops
- ✅ The form shows an upgrade button linking to /upgrade
In the editor: When editing a post with audience: paid, you’ll see a blue ADD PAYWALL button in the toolbar. Click it to insert the paywall form block instantly.
3. Without a Paywall Form
If you mark a post as audience: paid but don’t add a paywall form, visitors who try to access it will be redirected to your Upgrade page.
Smart Upgrade Buttons
The upgrade page shows different buttons depending on who’s viewing it:
```form
for: checkout
member-button-text: Upgrade Now
non-member-button-text: Sign up as paid member
```
How it works: - Signed-in free members see “Upgrade Now” → goes straight to Stripe - Not signed in see “Sign up as paid member” → goes to signup page - Paid members don’t see the form (they’re already paid)
This creates a seamless experience - everyone sees the right call-to-action for their situation.
Account Management
Members can manage their account at /account:
- View their membership tier (free or paid)
- View their status (active or cancelled)
- Update their name
- Update their email (requires confirmation)
- See when they joined and when they upgraded
Email Change Confirmation
When a member changes their email address:
- New email is saved as “pending”
- Confirmation email sent to new address
- Member clicks confirmation link
- Email is updated
- Original email stays active until confirmed
This prevents accidental or malicious email changes.
Admin: Managing Members
Go to Admin → Members to:
- View all members with search and filtering
- See member details (tier, status, join date, upgrade date)
- Manually upgrade members (for comps, gifts, etc.)
- Cancel memberships (keeps account, revokes access)
- Delete members (removes account entirely)
- Reactivate cancelled members
Manual Upgrades
To give someone free paid access:
- Go to Admin → Members
- Click on the member
- Click “Upgrade to Paid Tier”
- Enter a password or let Roe generate one
- Click “Upgrade”
This is perfect for: - Giving free access to friends/family - Comp subscriptions for reviewers - Converting existing supporters
Payment Models
The system is flexible and supports different business models:
1. Free Newsletter Only
- Don’t enable payments
- Use signups to build your email list
- All content is free
- Send newsletters to all members
2. Paid Membership
- Enable payments
- Mark premium posts with
audience: paid - Use paywall forms to show previews
- Only paid members access full content
3. Support/Donation Model
- Enable payments
- Don’t mark any posts as paid
- All content remains free
- Members pay to support your work
- Edit upgrade page to say “Support” instead of “Unlock Premium”
4. Hybrid Model
- Some posts are free (public)
- Some posts are paid-only
- Some posts show previews to everyone
- Maximum flexibility
Configuration Options
Edit these in Admin → Settings → members.yml:
Non-Members Section
non-members:
show_paid_content: true
show_paid_indicator: true
show_paid_content:
- If
true, non-members can see paywalled posts (with truncation). - If
false, they won’t see paid content on the site at all.
show_paid_indicator - Shows a small lock icon next to paid post titles/links.
Payments Section
payments:
enabled: true
price: "49.00"
enabled - Turn payments on/off. When true, upgrade buttons appear on signup forms.
price - One-time payment amount in your Stripe default currency (e.g., “49.00” for $49).
Email Templates
Member emails are customizable markdown files in site/emails/:
magic_link.md:
- Sent when someone requests to sign in
email_confirmation.md:
- Sent when changing email address
You can edit these templates and use variables like:
-
@member_name- Member’s name -
@site_title- Your site title -
@signin_url- Magic link URL -
@confirmation_url- Email confirmation URL
Collections & Paid Content
Collections automatically respect paid content settings:
Latest Posts
Welcome to Roe
May 31, 2026
How it works:
- ✅ Paid posts show in collections (with lightning bolt if
show_paid_indicator: true) - ✅ Clicking a paid post shows the paywall/preview or redirects based on
show_paid_contentsetting - ✅ Paid members see all posts normally
Webhooks & Security
Roe handles Stripe communicates with Stripe directly.
When a payment succeeds:
- Roe receives event from Stripe
- Verifies it’s legitimate (using signing secret)
- Finds the member by ID in metadata
- Upgrades them to paid tier
The system includes error handling for:
- Missing member IDs
- Deleted members
- Duplicate payments
- Invalid webhooks
Static Site Generation
If you’re using static site generation, member features work differently:
- Paywalled content is properly truncated in generated HTML
- Member pages (signup, signin, etc.) can be generated as static pages
- Magic links and authentication require server-side processing
- ⚠︎ Consider keeping auth pages dynamic even in static mode
Static + members is an advanced feature still in development.
Use Cases & Examples
Newsletter with Premium Tier
- Free signup builds your list
- Weekly newsletter to all members
- Premium posts (deep dives, archives) for paid members
- Use paywalls to show first few paragraphs to everyone
Paid Community
- All content behind paywall
- Single payment for lifetime access
- No free previews (
show_paid_content: false) - Members-only discussion/comments
Donation-Supported Blog
- All content free and public
- Payment enabled as “support”
- Customize upgrade page: “Buy me a coffee” style
- Paid members get satisfaction of supporting
Course or Ebook Access
- Landing page is free (public)
- Course content marked
audience: paid - One-time payment unlocks all lessons
- Lifetime access to materials
Troubleshooting
Payments not working?
- Check Stripe keys are correct (test vs live mode)
- Verify webhook is set up and receiving events
- Check webhook signing secret matches
Paywall not showing?
- Confirm
audience: paidis in frontmatter - Check if you’re logged in as a paid member (paywall hidden for you)
- Verify
show_paid_content: truein members.yml
Magic links not sending?
- Check email configuration in your Rails app
- Verify ActionMailer is set up for production
- Check spam folder
Upgrade button not appearing?
- Confirm
payments.enabled: truein members.yml - Check if Stripe is connected
- Verify you have a price set
Next Steps
- Customize your member pages - Edit the copy in signup.md, upgrade.md, etc.
-
Create your first paid post - Add
audience: paidand a paywall form - Test the full flow - Sign up, upgrade (using Stripe test mode), access content
- Set up webhooks - Make sure payments automatically upgrade members
- Go live - Switch to Stripe live keys when ready
The members system is designed to grow with you - start with free signups, add payments when you’re ready, and customize everything to match your membership/publishing model.