Skip to the story
NitepassClosed · 2026

Built solo.Closed onthe numbers.

I taught myself to build software, shipped a complete student ticket marketplace, then closed it when the arithmetic didn’t hold up. The product is still here. So is the reasoning.

Built by Jack BarrettSolo · Leeds, UK2026

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.

nitepass.co.uk
The Nitepass landing page: a dark hero headlined 'Buy and sell student tickets safely' with waitlist and listing calls to action.

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

nitepass.co.uk/listings/new
The listing creation form showing event, date, resale and face-value price, ticket type, transfer method, restrictions and a proof-of-ticket upload.
Creating a listing. Face value alongside resale price, transfer method, restrictions and a required proof-of-ticket upload before anything went live.
nitepass.co.uk/analytics
The seller analytics dashboard showing revenue, a conversion funnel, response metrics and ticket type performance, all reading zero.
Seller analytics. Revenue, a conversion funnel, response times and projections. Every figure reads zero, because every figure was zero.
nitepass.co.uk/admin
The moderation dashboard with tabs for listings, reports, disputes, verifications and users.
Moderation. Listings were held for approval rather than auto-published, with queues for reports, disputes and verifications.
nitepass.co.uk/connect-demo
A Stripe Connect integration page describing connected account onboarding, product creation and a storefront using destination charges.
Payments. Stripe Connect with connected seller accounts, destination charges and webhook handling.

Explore the archived product


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.

Client
  • Next.js App Router
  • React 19
  • TypeScript
  • Tailwind
Edge
  • Middleware auth
  • Rate limiting
Server
  • 42 API routes
  • Stripe webhooks
  • Cron: payout release
Data
  • Postgres · 18 tables
  • 48 RLS policies
  • Object storage
Third party
  • 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.

£20

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.

£10

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.

£8

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.

£5

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.

Break-even take rate£20 ticket
≈5%needed just to break even
What Nitepass needed≈5%
Incumbent, on an original sale≈4%

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.

01

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.

02

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.

03

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.

04

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.

  • Next.js
  • React
  • TypeScript
  • Tailwind
  • Postgres
  • Supabase
  • Stripe Connect
  • Vercel

Explore the archived product