01 — The problem
Tickets already get resold.
Just badly.
A student buys a ticket for a night out and then can’t go. What happens next is a message in a group chat, a screenshot, and a bank transfer to someone they half know.
It works often enough that nobody complains, and fails often enough that everybody has a story. There is no record of the sale, no way to tell a real ticket from a screenshot of one, and no recourse when it goes wrong.
I wanted to know whether that was a business or just an annoyance.
- Can't attend
- →Post in group chat
- →Screenshot & transfer
- →Hope
02 — What I built
A whole product,
on my own.
I had no engineering background when I started. I learned the stack as I went and built every part of it — interface, data model, authentication, payments, moderation tooling and deployment.
- Database tables
- 18 Row-level security on every one
- RLS policies
- 48 Scoped with auth.uid()
- API routes
- 42 Payments, moderation, messaging
- Lines of TypeScript
- 16.8k Across 71 components and 22 pages
Product
- Listings with event, pricing, type and transfer method
- Browse, search, filtering and tag-based discovery
- Buy-now, offers and counter-offers
- A wanted board for buyers to post requests
- Seller dashboard, public profiles and reviews
- In-app messaging and notifications
Engineering
- Next.js App Router, TypeScript, server components
- Postgres via Supabase — 18 tables, RLS on every one
- Cookie-based auth with middleware route protection
- Stripe PaymentIntents and Connect for seller payouts
- OCR plus perceptual hashing for duplicate tickets
- Per-IP rate limiting, error boundaries, transactional email
Judgement
- Field research into how students already resell
- A unit-economics model across price and take rate
- Competitive analysis of the UK ticketing incumbents
- A read of pending UK ticket-resale legislation
- A decision to stop, made on the evidence
03 — The product
Every screen is real.
These are screenshots of the running application, not mockups. Nitepass never had a real listing, so the marketplace screens are genuinely empty — I’ve left them that way.

The landing page. Dark, green, built for a nightlife audience.




04 — Under the hood
What it took
to run.
Everything struck through has since been deleted. The database is gone, the API routes are gone, and the site you are reading is static files on a CDN.
- Next.js App Router
- React 19
- TypeScript
- Tailwind
- Middleware auth
- Rate limiting
- 42 API routes
- Stripe webhooks
- Cron: payout release
- Postgres · 18 tables
- 48 RLS policies
- Object storage
- Stripe Connect
- Resend
- Claude vision OCR
The hardest single problem was proving a ticket was real. I read uploaded tickets with OCR and fingerprinted the images with a perceptual hash, so the same ticket listed twice would collide. It caught duplicates. It could never prove ownership — and that turned out to matter more.
05 — The cold start
Two sides.
Neither arrived.
A marketplace only works when both sides show up at once. Sellers won’t list where there are no buyers; buyers won’t return to an empty page.
Nightlife makes that worse in three specific ways. Demand arrives in a spike, roughly forty-eight hours before one event. Liquidity doesn’t travel — a Leeds user is worth nothing to a Bristol night. And the thing I was competing with is free, instant, already open on their phone, and backed by knowing where the other person lives.
I built for both sides and launched with neither. The empty browse page in the screenshots above is not a placeholder. It is the result.
06 — The economics
Then I did
the arithmetic.
At twenty pounds a ticket the model is ordinary. Processing is a small slice and a five percent fee covers it with room left over. This is roughly where the established resale platforms operate — gigs, festivals, sport.
Halve the ticket and the fixed part of a card fee doesn't halve with it. Break-even climbs to about eight percent — already above what students are used to paying on an original ticket.
This is a normal price for a student club night. To stand still I'd need to charge more than twice the incumbent rate, on a resale rather than an original sale, to an audience with no particular reason to accept it.
Here it stops being a pricing problem and becomes an arithmetic one. Fourteen percent of a five pound ticket is seventy pence. A single chargeback erases about twenty-five of those. No amount of product work moves that number.
My own model on my own assumptions — not published or audited figures. The comparison is deliberately generous to me: an incumbent’s 4% is charged on an original sale, which is a different and easier product than resale.
07 — The decision
So I stopped.
I closed Nitepass after testing the economics and reading where UK ticketing regulation was heading. A cap on resale fees was being drafted, and the fee I would have needed to charge was the exact thing it was designed to prevent.
I could have kept building. The product worked, the code was good, and there was always one more feature that might have changed something. None of them would have moved a seventy pence margin.
That decision was the outcome of the project, not a failure of it. I set out to find whether this was a business. I found out.
08 — What I keep
Four things I took with me.
I answered the questions in the wrong order
I proved I could build it long before I asked whether it should exist. Feasibility is the cheap question. Viability is the expensive one, and it is the one worth asking first.
Fixed costs decide small-ticket businesses
Twenty pence of processing is noise on fifty pounds and fatal on five. Below a certain transaction value the economics are settled before you design anything.
A marketplace has to start on one side
Sellers don't list without buyers and buyers don't browse an empty page. I built both sides well and launched with neither — the empty listings page is the honest result.
Stopping on evidence is a result
I set out to answer whether this was a business. It wasn't. Getting that answer in months rather than years is the return on the work — it cost me tuition instead of a career.
09 — Where it stands
Still here,
switched off.
Nitepass is no longer operational. The database has been deleted and every backend service is disconnected. What remains is the interface, preserved exactly as it shipped and served as static files, so the work can still be looked at.
I started this knowing no code at all. I finished it having designed, built, deployed and shut down a payments-integrated marketplace on my own — and having learned to tell the difference between a product that works and a business that does.