Product Design: Basketball Program SaaS
Product Design: Basketball Program SaaS
Migrated from Notion (Basketball Program SaaS → Product Design) on 2026-03-07. Updated with full-stack decisions.
Overview
Multi-tenant AAU basketball program management platform. "Run your entire basketball program from one place." Replaces Google Forms + Venmo + group texts + paper clipboards + spreadsheets.
Westside Kings & Queens is the first real client.
demo-team is the test tenant.Tech Stack (decided 2026-03-07)
- Frontend: Svelte (SvelteKit) — coach dashboard, parent portal, admin views
- Backend: FastAPI (Python)
- Database: PostgreSQL
- Multi-tenancy:
tenant_idcolumns, not separate DBs - OAuth onboarding: mcp-remote-auth (client connects their own Gmail/GCal/Notion)
- SDKs: gmail-sdk, gcal-sdk, notion-sdk (all PyPI, all ours)
- Payments: Stripe (Payment Links for now, Checkout Sessions planned)
- Deploy: pal-e cluster via pal-e-services SERVICE_ONBOARDING.md
- Existing landing page: ldraney/west-side-basketball (GitHub Pages + Stripe)
Domain Model
V1 Scope
Registration, payment (Stripe), tryout evaluation, team placement, parent communication (Gmail), expense tracking. No AI in v1.
Registration Form Fields
Parent info:
- Parent's name
- Address
- Phone number
Player info:
- Player full name
- Height
- Position
- Graduating class
- High school
- Where they're from
- Photo
- Local team / travel team / both (dropdown)
Tryout Flow
- Program director creates a season + age groups
- System generates a registration link per age group
- Parent hits link → Stripe checkout → pays tryout fee
- Registration lands in DB with
signup_method: "tryout" | "direct_club" - Automation fires: confirmation email via tenant's Gmail (OAuth)
Day of Tryouts
- Coach opens app on tablet, sees registered kids for their age group
- Check-in (QR or tap name)
- Score each player 1–5: shooting, dribbling, defense, hustle, coachability
- Multiple evaluators score independently
After Tryouts
- Auto-rank players by composite score per age group
- Director sees draft board — top 10 = Team A (travel), next 10 = Team B (local)
- Drag-and-drop adjustments (coach requests, siblings, etc.)
- One click → sends placement emails to all parents
- Parents accept + pay season fee via Stripe
Expense Tracking (new — 2026-03-07)
Context: 34 signups currently, targeting 60+. $200/month per player. Non-profit model.
Revenue Model
- Program fees: $200/month per player (collected via Stripe)
- Tryout fees: $30 walk-up, $200 registration (Stripe Payment Links)
- At 60 players × $200/month = $12,000/month gross revenue
Expense Categories
- Coach pay — 1099 contractors via Stripe Connect
- Gym rental — recurring operational expense
- Player-paid (pass-through):
Marcus Dashboard Features
- Revenue summary (monthly, per-player, per-team)
- Expense tracking by category (coach pay, gym rental, operations)
- Player payment status (who's current, who's behind)
- Tournament fee collection links + status per player
- P&L view (revenue minus expenses)
Rules Engine (Automations)
Each tenant configures: WHEN [trigger] IF [conditions] THEN [action].
- Triggers: Stripe webhooks, cron, manual
- Actions: gmail.send_email, gcal.create_event, notion.add_row
- Action executors: use SDKs directly (gmail-sdk, gcal-sdk, notion-sdk)
- Credentials: stored per tenant per provider (OAuth refresh tokens in DB via mcp-remote-auth)
The Pitch (for Marcus to use)
"You coach. We handle everything else." Registration, payments, communication, roster management, tryout scoring, team placement — all automated. Parents get professional emails from your email. You get a dashboard showing everything. No spreadsheets, no group texts, no Venmo tracking.