| name | theme-events_ticketing |
| description | Events / ticketing application palette: variants, pages, entities, and flows for building a varied ticketing app. Use when theme_preset is events_ticketing.
|
Events ticketing theme
Domain
Apps that sell limited tickets against an event's capacity. The invariants that
matter โ a seat is sold once, a ticket is valid for one entry, a discount fires
on the right rules, you only see your own tickets โ are exactly where the
interesting exploits live.
Application variants โ pick ONE per lab
Honor any hint in theme_free_text / custom_prompt; otherwise pick one.
- Concert / festival โ general-admission tiers, day passes, add-ons.
- Cinema seating โ showtimes, seat map per screen, concessions.
- Conference passes โ pass tiers, sessions, schedules, attendee badges.
- Sports season tickets โ fixtures, seat sections, season vs single-game.
- RSVP / free events โ capacity-capped registrations, waitlists, check-in.
Roles โ choose the set that fits the variant
- user (attendee) โ browse events, buy/RSVP, view own tickets, transfer.
- service โ capacity/availability sync, hold-expiry jobs where relevant.
- admin (organizer) โ create events, scan tickets, refunds, attendee lists.
Most exploits run as user.
Candidate pages โ select a coherent subset
Size the subset to endpoint_count. Candidates: events list, event detail,
seat/section map, ticket-tier selection, cart & checkout, order confirmation,
my tickets, ticket detail / QR code, transfer or resell a ticket, request a
refund, profile/settings, notifications, organizer events, scanner / check-in,
attendee list, admin refunds.
Candidate entities (seed tables) โ select what the variant needs
- users โ id, email, password_hash, role
- events โ id, title, venue, starts_at, capacity, status, organizer_id
- ticket_tiers โ id, event_id, name, price_cents, quota, remaining
- seats / sections (seated) โ id, event_id, label, section, status
- orders โ id, user_id, event_id, total_cents, status, created_at
- tickets โ id, order_id, tier_id, seat_id?, holder_id, code, status
- holds โ id, user_id, seat_id/tier_id, expires_at
- discounts โ id, code, kind, value, max_uses, used, event_id?
- refunds โ id, ticket_id, amount_cents, status, requested_at
- checkins (organizer) โ id, ticket_id, scanned_at, gate
Seed multiple attendees each with โฅ2 tickets across events so cross-account and
transfer exploits are possible.
Candidate user flows โ select the ones matching chosen pages/features
- Browse events โ open one โ pick a tier/seat โ checkout โ confirmation.
- Select a seat from the map โ it's held, then issued as a ticket.
- Apply a discount code at checkout โ total recomputes.
- Open my tickets โ view the QR / barcode for entry.
- Transfer a ticket to another attendee (or list it for resale).
- Request a refund on an order โ status updates โ ticket voided.
- (organizer) Create an event with tiers โ publish โ watch sales.
- (organizer) Scan a ticket at the gate โ it's marked used; a second scan fails.
Candidate endpoints โ a feature may span several
Endpoints are a shared surface, not owned 1:1 by a feature (a single feature
often spans several, and an endpoint can back multiple features). Pick a coherent
subset alongside the pages above. Grouped by area:
- events โ
GET /api/events, GET /api/events/{id}, GET /api/events/{id}/seats
- checkout โ
POST /api/holds, POST /api/orders, POST /api/orders/{id}/pay, POST /api/orders/{id}/discount
- tickets โ
GET /api/tickets, GET /api/tickets/{id}, GET /api/tickets/{id}/qr, POST /api/tickets/{id}/transfer
- refunds โ
POST /api/orders/{id}/refund, GET /api/refunds/{id}
- organizer โ
GET/POST /api/admin/events, POST /api/admin/events/{id}/publish, GET /api/admin/events/{id}/attendees
- scanner โ
POST /api/admin/checkin, GET /api/admin/checkin/{ticket_code}
Where vulnerabilities fit naturally
- race_condition โ two buyers hold/purchase the last seat or the last unit of a quota concurrently; redeem a single-use discount twice.
- business_logic โ discount past
max_uses, stack/duplicate codes, refund more than paid, buy above the per-order limit, negative quantity.
- idor โ
GET /api/tickets/{id} / /api/tickets/{id}/qr โ read or screenshot another attendee's ticket/QR; transfer someone else's ticket.
- auth_bypass โ reach the organizer scanner or attendee list without a valid organizer session; validate a forged ticket code.
- privilege_escalation โ attendee reaching
/api/admin/... organizer actions.
Diversity guidance
Pick ONE variant and a coherent subset โ a cinema seat-map app and a
free-RSVP app should not share a page list. Size to endpoint_count; let
theme_free_text / custom_prompt bias the variant and naming. Vary venue
types, tier structures, and seating vs GA so two ticketing labs feel like
different platforms.