Billing & Subscriptions¶
Overview¶
Nigall platform subscriptions unlock Tools hub modules. Plans include Free, Essentials (basic), Presenter Pro (plus), Operations Suite (pro), and Planner Pro (planner_pro). Enterprise adds Exhibitors via sales. Billing is processed through Stripe.
Purpose¶
Align subscription tier with operational needs while keeping free event hosting available.
Who should use it¶
- Organizers upgrading for modules
- Finance approving SaaS spend
- Admins assigning plans
Benefits¶
- Clear tool matrix per tier
- Monthly and annual billing cycles
- Balance-due calculation on upgrades
- Lower transaction fees on higher tiers (3% vs 5%)
Navigation path¶
| Action | Path |
|---|---|
| Pricing page | /pricing/ |
| Subscription pricing | /pricing/subscription/ |
| Select plan | /pricing/select/ |
| Stripe checkout | /payments/subscription/checkout/ |
| Success | /payments/subscription/success/ |
| Tools hub | /events/tools/ |
Prerequisites¶
- Authenticated user
- Stripe customer flow configured
- Understanding of required tool keys
Plan comparison¶
| Plan | Code | Monthly | Annual | Unlocked tools |
|---|---|---|---|---|
| Free | free |
$0 | $0 | Event hosting only |
| Essentials | basic |
$29 | $276 | Attendees, Program, Communications |
| Presenter Pro | plus |
$79 | $756 | + Speakers, Talent, Venues |
| Operations Suite | pro |
$149 | $1,428 | + Volunteers, Vendors, Sponsors |
| Planner Pro | planner_pro |
$49 | $468 | Operations Suite + Event Planner CRM |
| Enterprise | contact | Custom | Custom | + Exhibitors |
Transaction fees (ticket revenue)¶
| Plan | Platform fee |
|---|---|
| Free, Essentials | 5% |
| Presenter Pro, Operations Suite, Planner Pro | 3% |
Function: calculate_payment_split() in payments/services.py.
Step-by-step — Upgrade plan¶
- Visit
/pricing/. - Click Select on target plan →
/pricing/select/. - Choose billing cycle (monthly/annual).
- Proceed to
/payments/subscription/checkout/. - Complete Stripe payment.
- On success,
subscription_planandsubscription_billing_cycleupdated on user.
[SCREENSHOT: Pricing comparison table]
Step-by-step — Downgrade to Free¶
- Select Free plan at
/pricing/select/. - System applies plan change with no balance due if downgrading.
- Module toggles on events may become locked on next edit.
Field descriptions¶
| Field | Description |
|---|---|
subscription_plan |
free / basic / plus / pro / planner_pro |
subscription_billing_cycle |
monthly / annual / per_event |
PLAN_UPGRADE_FOR_TOOL |
Maps tool key → minimum plan |
EVENT_FORM_FIELD_TOOL_KEYS |
Maps event toggles → tool keys |
Business rules¶
| Rule | Detail |
|---|---|
| Free hosting | Always allowed |
| Paid tools | Require PAID_SUBSCRIPTION_PLANS |
| Exhibitors | Enterprise label — not in PLAN_TOOL_KEYS |
| Upgrade balance | calculate_subscription_balance — no negative due |
| Staff | Bypass user_has_tool_access checks |
| Per-event billing | Enum exists; prices $0 in current price table |
Validation rules¶
- Invalid plan name rejected at checkout
- Cannot checkout Free via Stripe session
User permissions¶
| Role | Change own plan | Assign others |
|---|---|---|
| User | ✅ via Stripe | ❌ |
| Admin | ✅ | ✅ via admin |
Workflow¶
flowchart LR
Pricing --> Select --> Checkout[Stripe checkout]
Checkout --> Webhook[Payment success]
Webhook --> PlanUpdate[user.subscription_plan]
PlanUpdate --> Tools[Tools unlocked]
Examples¶
Meetup organizer: Essentials annual for Attendees + email blasts.
Festival producer: Operations Suite for vendors, sponsors, volunteers.
Best practices¶
- Annual plan for 20%+ savings vs monthly
- Upgrade before enabling gated module toggles
- Review transaction fee tier when selling high-volume tickets
Tips¶
user_has_paid_tools_subscription()for feature flags- Hub display order:
HUB_TOOLS_DISPLAY_ORDER
Common mistakes¶
| Mistake | Result | Fix |
|---|---|---|
| Enable exhibitors on Pro | Toggle locked | Enterprise sales |
| Expect refund on downgrade | Policy-dependent | Contact support |
FAQs¶
Do attendees pay subscription?
No — organizers pay; attendees pay tickets.
Essentials vs Basic?
Same plan — display name Essentials, code basic.
Troubleshooting¶
| Symptom | Cause | Fix |
|---|---|---|
| Tools still locked | Webhook delay | Refresh; check payment success |
| Wrong plan after pay | Session error | Verify subscription_success view |
Related features¶
Screenshot placeholders¶
[SCREENSHOT: Pricing page three tiers][SCREENSHOT: Tools hub locked vs unlocked cards][SCREENSHOT: Subscription checkout]
Administrator notes¶
- Manually set plan in Django admin for comps
SUBSCRIPTION_PLAN_PRICESin payments/services.py
Developer/API notes¶
| Item | Location |
|---|---|
| Plan constants | users.models.CustomUser |
| Tool matrix | users/subscription_plans.py |
| Checkout | payments/views.create_subscription_checkout_session |
See also: Platform Overview