Skip to content

2025 · Next.js · Supabase · Stripe Connect

CageList

A marketplace where players book batting cages by the hour and facility owners get paid. It lists thousands of places to train across the country. I built it, launched it, and still run it every day.

The problem

Facility owners had empty cages on weekday afternoons and no way to sell that time. Players had nowhere to look. Both sides were coordinating over text messages and cash.

What I built

A two-sided marketplace: facilities list their cages and hours, players book and pay on the site, and the money moves to the facility through Stripe Connect. Around the cages sit private-lesson coaches with background-check badges, travel teams, leagues, gear guides and facility memberships. Directory-only listings exist for facilities that are not ready to take bookings, and are modelled as a separate state so nobody can book them by accident.

Where it stands

Live and operating. Bookings, payouts, refunds and disputes all run through the system, and I am the one who handles them.

Under the hood

Next.js on Vercel, Postgres and auth on Supabase with row-level security on every table, Stripe Connect for payouts, Checkr for coach background checks, Twilio for booking reminders, Resend for transactional email, Sentry and PostHog for errors and behaviour.