Restrict posts and pages to registered members or specific paid tiers. Stripe handles subscription billing (monthly, yearly) and one-time lifetime payments. A self-service member dashboard lets subscribers manage their own billing.
- Membership tiers - create unlimited plans: free, monthly, yearly, or lifetime
- Stripe subscriptions - Stripe Checkout for recurring billing; Stripe Customer Portal for self-service management
- Lifetime payments - one-time payment tiers use Stripe
mode: payment - Free / registration-wall tiers - require account registration with no payment
- Content access control - restrict any content item to "any paid plan" or a specific tier
- Paywall preview - show N configurable paragraphs to non-members before the paywall appears
- Member dashboard - members can view their plan, billing period, and cancel or manage billing
- Webhook handling - handles
checkout.session.completed,customer.subscription.updated,customer.subscription.deleted,invoice.payment_failed - Member management - admin dashboard with stats, search, filter by status, and per-member detail view
- Welcome email - automatic email sent on membership activation
- Enable the plugin in the admin Plugins panel.
- Go to Membership Plans > Settings and enter your Stripe API keys.
- Create a Stripe webhook pointing to
https://yoursite.com/membership/webhookand add the webhook secret to settings. Subscribe the webhook to:checkout.session.completed,customer.subscription.updated,customer.subscription.deleted,invoice.payment_failed. - Create your membership plans under Membership Plans.
- Link the pricing page (
/membership/pricing) from your navigation.
Go to Content > Content Access Control to search for any content item and assign a membership requirement. You can restrict to "any paid plan" or a specific tier slug, and configure how many paragraphs are shown as a preview.
The paywall is automatically injected into the content body via the contensio/content/body filter — no template changes needed.
The pricing page is served at /membership/pricing by default. Link to it from your navigation or landing page.
To display a subscribe button anywhere in a template:
<a href="{{ route('contensio-membership.public.pricing') }}">Become a member</a>Members can view and manage their membership at /membership/account. This page requires authentication.
AGPL-3.0-or-later. See LICENSE file.