Event ticketing with member pricing
An in-house ticketing system for a members’ club venue, built instead of paying a ticketing platform. Guests buy online, members get a discount checked against the real membership list, and a PDF ticket with a QR code arrives by email only once the payment has cleared. Door staff scan tickets in the staff iPhone app.
Why build it
Ticketing platforms take a cut of every ticket, and none of them know who the venue’s members are. So a member discount means a shared code that gets posted in a group chat by the end of the week.
Rules it enforces
- Member price needs a valid member number and surname with an unexpired membership — up to five member-price tickets per member per event, so a member can bring guests.
- At the door, the member’s card is scanned once and unlocks their whole order. A borrowed member number gets nobody in, because the real member has to be standing there with the card.
- Each QR scans once; a second scan shows already used, with the time and who scanned it. A two-night weekend ticket admits once per night.
- Free tickets, like an adult at a children’s party, can only be bought alongside a paid one.
- Refunds only if the event is cancelled; a refunded or disputed payment voids the QR automatically.
How it’s secured
- Prices are set on the server. Anything the browser says about money is ignored.
- Tickets are created only when the payment provider’s signed webhook confirms payment, and capacity is held during checkout so an event can’t oversell.
- Wrong member-number attempts are rate-limited, so numbers can’t be guessed until one works. Checkout runs through Stripe with 3D Secure, and the buying page sits behind Cloudflare Turnstile bot protection, so scripts can’t hammer it to hold seats or test stolen cards.
- Scanning is staff-only, inside the staff app behind its existing login, reusing its camera scanner rather than building a second one.
Tested with real money
Before the first event went on sale, a real ticket was bought, the PDF arrived, the payment was refunded — and the door scanner showed TICKET CANCELLED on the refunded QR, with the right sound.