Projects

PokerCRM

Track players, games, and cashflow

Mayin JoshiAug 2025mayinpoker.com
A quick walkthrough of the CRM.

I love playing poker and meeting new people who play poker. I hate having to manage events, players, and finances when hosting private games at MayinPoker.com (SIGN UP!). I had a Google Sheet for every game where I logged new players, how they paid, and more. It was getting very difficult to keep up, and I felt there was a lot of cool data going to waste that could be turned into fun things like leaderboards. Players also wanted to understand their plus/minus and how they performed over time.

So I created a CRM for it: a full web application that tracks my entire player base, manages and approves new signups, shows me in-depth data on every player, enriches players with information from their LinkedIn, lets me manage new games while keeping the money balanced, and will soon matchmake curated tables based on data from attendees (growth marketers, engineers at labs, and so on) to create the best possible tables. I actively use this on a daily basis, and it is maybe the most useful personal web app I have built for myself.

  • Syncing with the public-facing MayinPoker site to confirm new players: both apps share a player pool in Supabase, so signups flow straight into the CRM for review, deduplication against existing players, and one-click approval.
  • Getting the money right: per-player profit and loss is a generated Postgres column, every rebuy is logged as a transaction, and a game only shows as balanced when total buy-ins and cash-outs reconcile to the cent.
  • Email automation built on Resend and React Email: personalized post-game recaps with each player's results and the table's social links, scheduled Luma invitations, and cron-processed sends with unsubscribe handling.
  • Leaderboards computed only from completed games (total winnings, win rate, games played, average per game), with database triggers keeping lifetime stats consistent.

Built with Next.js 14, TypeScript, and Tailwind on Vercel, with Supabase handling the database, auth, and profile photo storage.

Dashboard: key stats, recent games, and top players.
Dashboard: key stats, recent games, and top players.
Players: a searchable directory with lifetime profit/loss.
Players: a searchable directory with lifetime profit/loss.
Player profile: contact details, stakes, and referral link.
Player profile: contact details, stakes, and referral link.
Games: every session at a glance.
Games: every session at a glance.
Game ledger: buy-ins, cash-outs, and profit/loss.
Game ledger: buy-ins, cash-outs, and profit/loss.
Table view: players seated with live profit/loss.
Table view: players seated with live profit/loss.
Leaderboard: rankings by winnings and win rate.
Leaderboard: rankings by winnings and win rate.
Sign-ups: the pipeline of new player requests.
Sign-ups: the pipeline of new player requests.