Payments, Ticketing & Refunds¶
Overview¶
Nigall uses Stripe for ticket checkout, attendee registration payments, subscription billing, and module payments (exhibitors, vendors, sponsors). Platform fees split revenue between Nigall and organizers based on subscription tier.
Purpose¶
Collect payments securely with transparent fee structure and webhook-confirmed fulfillment.
Who should use it¶
- Organizers selling tickets
- Finance reviewing payouts
- Attendees completing checkout
- Admins configuring Stripe
Benefits¶
- Stripe Checkout sessions
- Platform fee: 5% (Free/Essentials) or 3% (Presenter Pro/Operations Suite)
- Payment history for users
- Webhook idempotency for fulfillment
Navigation path¶
| Action | Path |
|---|---|
| Legacy ticket checkout | /payments/checkout/<event_id>/<tag>/ |
| Ticket review | /payments/tickets/<event_id>/<tag>/review/ |
| Ticket payment | /payments/tickets/<event_id>/<tag>/pay/ |
| Attendee registration pay | /attendees/registrations/<pk>/pay/ |
| Payment success | /payments/success/ |
| My payments | /payments/my-payments/ |
| Subscription checkout | /payments/subscription/checkout/ |
| Stripe webhook | /payments/webhook/ |
| Event orders (host) | /attendees/events/<pk>/<tag>/orders/ |
Prerequisites¶
- Stripe API keys in environment
- Webhook endpoint registered pointing to
/payments/webhook/ - Paid event or tier configured
- Organizer account for fee tier lookup
Step-by-step — Attendee pays for registration¶
- Complete registration form.
- Redirect to
/attendees/registrations/<pk>/payment/. - Click pay → Stripe Checkout (
registration_pay_stripe). - Return to success URL → ticket issued.
- Webhook confirms
Paymentrecord with fee split.
Step-by-step — Organizer views revenue¶
- Open event orders:
/attendees/events/<pk>/<tag>/orders/. - Review payment status, platform fee, organizer payout.
- Cross-check
/payments/my-payments/for buyer history.
Field descriptions¶
| Concept | Description |
|---|---|
calculate_payment_split() |
Computes platform_fee, organizer_payout |
PLATFORM_FEE_RATES |
5% free/basic, 3% plus/pro |
Payment.platform_fee |
Stored on confirmation |
organizer_subscription_plan |
Plan at time of payment |
| Sponsor fees | Separate sponsor_platform_fee_percent on event |
Subscription prices (USD)¶
| Plan | Monthly | Annual |
|---|---|---|
| Free | $0 | $0 |
| Essentials | $29 | $276 |
| Presenter Pro | $79 | $756 |
| Operations Suite | $149 | $1,428 |
Business rules¶
| Rule | Detail |
|---|---|
| Fee tier | Based on organizer subscription_plan at payment time |
| Rounding | Fees rounded half-up to cent |
| Subscriptions | Balance due calculated on plan changes |
| Refunds | Process in Stripe Dashboard; update Nigall records manually/admin |
| Free events | Skip Stripe; is_free=True |
Validation rules¶
- Positive payment amounts
- Valid Stripe session before ticket confirm
User permissions¶
| Role | Pay | View orders | Webhook |
|---|---|---|---|
| Buyer | ✅ | Own | ❌ |
| Host | ❌ | ✅ event | ❌ |
| System | ❌ | ❌ | ✅ Stripe |
Workflow¶
sequenceDiagram
participant User
participant Nigall
participant Stripe
User->>Nigall: Initiate pay
Nigall->>Stripe: Create Checkout Session
Stripe->>User: Payment UI
User->>Stripe: Complete
Stripe->>Nigall: Webhook
Nigall->>Nigall: calculate_payment_split + fulfill ticket
Examples¶
$100 ticket, Essentials organizer: $5 platform fee, $95 organizer payout.
$100 ticket, Pro organizer: $3 platform fee, $97 payout.
Best practices¶
- Test with Stripe test keys first
- Monitor webhook failures in logs
- Document refund policy in
attendee_registration_info
Tips¶
- Subscription upgrade:
/pricing/select/→/payments/subscription/checkout/ - Module payments use app-specific success URLs
Common mistakes¶
| Mistake | Result | Fix |
|---|---|---|
| Webhook not configured | Paid but no ticket | Register webhook URL |
| Wrong Stripe mode | Live/test mismatch | Align keys |
FAQs¶
Where to refund?
Stripe Dashboard primary; sync registration status in Nigall.
Are Stripe fees included?
Platform fee is Nigall's; Stripe processing separate per Stripe pricing.
Troubleshooting¶
| Symptom | Cause | Fix |
|---|---|---|
| Payment success, no ticket | Webhook failed | Replay webhook |
| Wrong fee % | Plan changed mid-day | Fee locked at payment record |
Related features¶
Screenshot placeholders¶
[SCREENSHOT: Stripe checkout][SCREENSHOT: Orders table with fee columns][SCREENSHOT: My payments history]
Administrator notes¶
payments/services.py— fee rates and subscription pricespayments/views.py— webhook handler- Never commit Stripe secrets
Developer/API notes¶
| Function | Location |
|---|---|
calculate_payment_split |
payments/services.py |
| Webhook | POST /payments/webhook/ |
| Metadata | session includes platform_fee, organizer_payout |
See also: Billing & Subscriptions