A comprehensive subscription management system for Wagtail CMS that provides everything you need to build a SaaS application with subscription billing.
π Read the full documentation
π Complete Subscription Management
- Multiple subscription plans with flexible billing periods
- Feature-based access control
- Trial periods and plan upgrades
- Customer portal and billing management
- Multi-tenant support (auto-detects django-tenant-schemas)
π³ Payment Integration
- Stripe integration (built-in)
- Paddle support
- PayPal integration
- Extensible payment processor architecture
ποΈ Admin Dashboard
- Beautiful Wagtail-integrated admin interface
- Plan and feature management
- Customer overview and analytics
- Payment processor configuration
- Tenant-aware permissions (works in both single/multi-tenant modes)
π¨ Frontend Components
- Responsive pricing tables
- Modern UI with Tailwind CSS
- Customizable templates
- Template tags for easy integration
pip install wagtail-subscriptionsAdd to your INSTALLED_APPS:
INSTALLED_APPS = [
# ... your apps
'wagtail_subscriptions',
]Configure payment processors:
WAGTAIL_SUBSCRIPTIONS = {
'PAYMENT_PROCESSORS': {
'stripe': {
'public_key': 'pk_test_...',
'secret_key': 'sk_test_...',
'webhook_secret': 'whsec_...',
}
}
}from django.urls import path, include
urlpatterns = [
# ... your URLs
path('subscriptions/', include('wagtail_subscriptions.urls')),
]python manage.py migrate
python manage.py setup_subscription_permissions- Go to Wagtail Admin β Subscriptions β Plans
- Create your subscription plans with pricing
- Add modules and features
- Associate features with plans
Use the built-in template tag:
{% load subscription_tags %}
{% price_table %}from wagtail_subscriptions.permissions.decorators import subscription_required, feature_required
@subscription_required
def my_view(request):
return render(request, 'my_template.html')
@feature_required('advanced_analytics')
def analytics_view(request):
return render(request, 'analytics.html'){% load subscription_tags %}
<!-- Works in both single-tenant and multi-tenant modes -->
{% if request|has_feature:'api_access' %}
<a href="/api/">API Documentation</a>
{% endif %}
<!-- Get subscription info -->
{% subscription_info as sub_info %}
<p>Current Plan: {{ sub_info.plan }}</p>
<p>Subscriber: {{ sub_info.name }} ({{ sub_info.type }})</p>- SubscriptionPlan: Define pricing and billing periods
- Module: Organize features into logical groups
- Feature: Individual features with quota support
- PlanFeature: Associate features with plans
- Subscription: User subscriptions and billing
- Customer: Extended customer information
- Create Stripe account
- Get API keys from dashboard
- Add webhook endpoint:
/subscriptions/webhooks/stripe/ - Configure in Django settings
- Create Paddle account
- Get Vendor ID and Auth Code
- Configure webhook URL
- Add to Django settings
{% load subscription_tags %}
<!-- Basic pricing table -->
{% price_table %}
<!-- Custom options -->
{% price_table show_trial=False highlight_plan="pro" %}
<!-- Check feature access -->
{% if subscription|has_feature:"advanced_reports" %}
<!-- Feature content -->
{% endif %}# Set up permissions
python manage.py setup_subscription_permissions
# Create sample data
python manage.py create_sample_plans
# Sync tenant plans (for multi-tenant setups)
python manage.py sync_tenant_planssubscription = request.user.subscriptions.first()
# Check feature access
subscription.has_feature_access('feature_slug')
# Get feature quota
subscription.get_feature_quota('feature_slug')
# Check if active
subscription.is_active
# Check if in trial
subscription.is_trialfrom wagtail_subscriptions.permissions.mixins import (
SubscriptionRequiredMixin,
FeatureRequiredMixin
)
# Works automatically in both single-tenant and multi-tenant modes
class MyView(FeatureRequiredMixin, TemplateView):
required_feature = 'advanced_analytics'
template_name = 'my_template.html'- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
MIT License - see LICENSE file for details.
