Coupons & Group Purchasing¶
Overview¶
Nigall supports event-level coupon codes with percentage discounts and optional group purchasing for multiple tickets in a single checkout—configured on the Event model and honored in payment flows.
Purpose¶
Run promotions and group sales without manual invoice adjustments.
Who should use it¶
- Marketing running discount campaigns
- Organizers selling table packages or group bundles
- Finance auditing discounted orders
Benefits¶
- Single coupon per event (
coupon_code+coupon_discount_percent) - Group purchasing toggle for multi-seat checkout
- Discount applied before platform fee calculation on eligible flows
Navigation path¶
| Action | Path |
|---|---|
| Configure on event | /events/<pk>/<tag>/edit/ → Ticketing section |
| Legacy checkout | /payments/checkout/<event_id>/<tag>/ |
| Ticket review | /payments/tickets/<event_id>/<tag>/review/ |
| Attendee registration | /attendees/register/<pk>/<tag>/ |
Prerequisites¶
- Event with paid tiers or
price > 0 - Coupon fields set on event
- Stripe configured for paid checkout
Step-by-step — Add a coupon¶
- Edit event → Ticketing.
- Enter Coupon code (max 50 chars).
- Set Coupon discount percent (integer 0–100).
- Save event.
- Guests enter code at checkout/review step.
[SCREENSHOT: Coupon fields on edit form]
Step-by-step — Enable group purchasing¶
- Edit event → enable Allow group purchasing.
- Save.
- Checkout UI allows quantity > 1 where supported.
Field descriptions¶
| Field | Type | Description |
|---|---|---|
coupon_code |
CharField(50) | Case-sensitive code guests enter |
coupon_discount_percent |
PositiveInteger | Percent off subtotal |
allow_group_purchasing |
Boolean | Multi-ticket single order |
ticket_types |
TextField | Tier definitions for group lines |
price |
Decimal | Base/legacy single price |
Business rules¶
| Rule | Detail |
|---|---|
| One coupon per event | Single code field — not multi-coupon stack |
| Percent discount | Applied to eligible subtotal |
| Group purchasing | Independent of coupon; enables multi-qty |
| Free events | Coupon irrelevant when is_free=True |
| Platform fee | Calculated on post-discount amount in calculate_payment_split |
Validation rules¶
- Discount percent 0–100
- Code must match exactly at checkout
User permissions¶
| Role | Configure | Apply at checkout |
|---|---|---|
| Host | ✅ | N/A |
| Buyer | ❌ | ✅ |
Workflow¶
flowchart LR
Cart[Select tiers/qty] --> Coupon{Valid code?}
Coupon -->|Yes| Discount[Apply percent off]
Coupon -->|No| Full[Full price]
Discount --> Pay[Stripe checkout]
Full --> Pay
Examples¶
EARLYBIRD 20%: First 100 registrations with code EARLYBIRD.
Team table: Group purchasing enabled, 10 seats one payment.
Best practices¶
- Use memorable single-word codes
- Document coupon in marketing email only (not public page) for exclusivity
- Set registration cap to limit discounted seats
Tips¶
- Test code in Stripe test mode checkout
- Combine with communications blast for code delivery
Common mistakes¶
| Mistake | Result | Fix |
|---|---|---|
| Typo in code | Discount not applied | Copy-paste code to form help text |
| 0% discount | Code useless | Set percent > 0 |
| Group off | One ticket per order | Enable allow_group_purchasing |
FAQs¶
Multiple coupon codes?
Not supported — one coupon_code per event.
Stack with tier sale price?
Discount applies per checkout logic on subtotal.
Troubleshooting¶
| Symptom | Cause | Fix |
|---|---|---|
| Code rejected | Mismatch / typo | Verify event.coupon_code |
| Discount not in email | Email shows pre-discount | Check template |
Related features¶
Screenshot placeholders¶
[SCREENSHOT: Ticket review with coupon field][SCREENSHOT: Group quantity selector]
Administrator notes¶
- No separate Coupon model — fields on Event
- Future: multi-coupon campaigns would need migration
Developer/API notes¶
Coupon validated in payment views during checkout session creation.
Fields in EVENT_CREATE_BASE_FIELDS on event form.
See also: Event Field Reference