Pad Thai Padel Academy — product plan
Written 16 September 2026. Companion files in this folder: SETPOINT-AUDIT-2026-09-16.md (30-row feature audit of Setpoint's Academy module, with file paths) and PHASE-1-SPEC.md (the build spec for the next prompt).
1. The straight answer on "forking"
Dashboll, PadeLock and CourtSync are closed SaaS products. None publishes source code, a public API, or a repository. There is nothing to fork. What can be forked is their feature set, which is documented below, and what can be extended is the codebase you already own.
| Reference | What it is | Modules | Pricing |
|---|---|---|---|
| Dashboll (dashboll.com) | Spanish academy platform, white-label iOS/Android app | Agenda (classes, courts, coaches, drag to reschedule) · Payments (Stripe, SEPA, wallet, recurring) · CRM with AI (leads from Instagram/web/WhatsApp) · 1:1 and group messages with push · Player evolution (technical profile, attendance, ranking) | Academy €89 (100 players, 1 head coach) · PLUS €129 (200 players) · PRO €189 (300 players, branded app) · MAX €399 (unlimited) · CUSTOM. All shown at −50% for 3 months |
| PadeLock (padelock.com) | Spanish academy web app, ~30 academies | Digital attendance · coach schedules · waitlist with automatic substitution · automatic level assignment · makeups · payment and rate control · WhatsApp + email notifications · multi-club · reports | Not published (demo-led) |
| CourtSync (courtsync.io) | Racquet-sport academy platform (tennis first, padel supported) | Terms, camps, private-lesson packages · calendar with templates · waitlist with timed claim · makeup credits with compatibility rules · Stripe Connect payouts · guardian and student accounts · public academy page · SMS on higher tiers · Xero/QuickBooks | Starter $23 (100 students) · Professional $79 (unlimited, Stripe, 300 SMS) · Enterprise $199, billed annually |
Open-source candidates checked on GitHub:
| Repo | Fit | Blocker |
|---|---|---|
| adamsherif123/ThePadelAcademyy | Padel academy, Supabase + Expo + Vite, strong backend tests, pushed 13 Sep 2026 | No licence (all rights reserved by default), apps still run on mock data, Cairo timezone baked in. Cannot be forked legally without the author's permission |
| debueb/pro-padel | German padel club software, Java/Spring | No licence, last push June 2022, court booking not academy |
| tkrebs/ep3-bs | MIT, 215 stars, PHP | Court booking only, no academy concepts |
2. What you already own
Setpoint (superstack-digital/setpoint, Next.js + Supabase, production live for Pad Thai Padel) has an Academy module. Audited against the 30 features the three references sell:
- HAVE (12): class templates, coach assignment with availability conflicts, court auto-booking, student register with packages and sessions left, attendance/check-in (admin panel and coach PWA QR), coach feedback (structured, AI-drafted, video analysis), packages with subscription vs session bank and billing anchor day, automatic monthly billing (dormant: every package is still
billing_mode='manual'), POS bridge, reports with targets, coach PWA, multi-academy. - PARTIAL (12): recurring scheduling (group only), planning calendar (no drag and drop), groups (roster + free-text level, not linked to schedule), player cancellation (courts only, no lesson lane), level history (current value only), payment reminders (email real, WhatsApp = wa.me manual lane by design, Cloud API stub waiting on a Meta decision), reconciliation (booking events and POS only), CRM (customers, segments, campaigns, but no lead entity), messaging (email campaigns, no push, no 1:1), student web (browse, buy, join; cannot cancel or see progress), roles (owner/admin/manager/coach, no approval workflow), audit trail (money and sessions only).
- MISSING (6): waitlist for full groups, makeup credits, player-visible progress, proration of a package charge, attendance-vs-payment cross-check, CSV export from the academy.
Full evidence per row: SETPOINT-AUDIT-2026-09-16.md.
3. Recommendation
Fork base = Setpoint's Academy module. It already covers 24 of 30 reference features, it is multi-tenant (so it is the sellable product, not a one-club tool), and every alternative either cannot be forked or duplicates it.
Option B, standalone app: only if you want a product that is yours independently of Setpoint's roadmap and Nestor's review. Cost: rebuilding ~24 features that exist (6 to 10 weeks of agent work), a second database of the same students, and the "fourth tool" you said you did not want. Not recommended unless the answer to the question at the end is "separate business".
Not rebuilt, ever: WhatsApp reminder queue (exists, academy-payments-reminder-panel.tsx, wa.me manual lane with sent_manual status), POS bridge, CRM, reports, check-in, coach feedback.
Cut as Dashboll envy at 60 students: AI CRM, push notification app, SEPA, white-label app, drag-and-drop planning.
Honest scope statement: the whole thing cannot be built in one prompt with no failure. Eight modules in a live production repo with mandatory Playwright, docs-sync and CTO review breaks on scope, not on skill. The plan is four prompts, one PR each, read-only first, each fully specified before it runs. Phase 1 is specified now.
4. The build, four steps
| Step | Name | What it adds | Data changes | Gate before it starts | Effort |
|---|---|---|---|---|---|
| 1 | Academy Health (next prompt) | Read-only page: Training without paying · Payments to verify · Next 1st worklist with PROPOSED bridge amounts and PRORATE tier. CSV export per tab. | None (no migration, no view) | Nestor has seen this plan | about 8 h agent + review (13 build steps) |
| 2 | Makeups + waitlist | lesson_waitlist with timed claim on cancellation; makeup credit as a ledger reason on package_session_transactions, facility-flagged, default OFF |
2 migrations | Step 1 merged; makeup rule decided | 4–6 h + review |
| 3 | Proration in billing | process-package-billing computes the bridge for mid-cycle starts, writes it on the payment_request, labelled with the PRORATE tier; behind academy_payment_settings flag |
1 migration + edge function | One real cycle (1 Oct) validated against Step 1's proposed amounts | 4–6 h + review |
| 4 | Player progress | me/progress route exposing reviewed coach feedback; level history table; academy progress page in apps/web |
1 migration | Jose confirms what players may see | 4–6 h + review |
Later, separately decided: WhatsApp Cloud API (needs a Meta business account, a sending number, approved templates; the free 24h reply window ends 1 Oct 2026), a lead entity in the CRM fed by the website Sheet, player self-cancellation for lessons.
Step 1 in detail
See PHASE-1-SPEC.md. Summary: one GET route api/admin/academy-health, one page [facility]/academy/health with three tabs and summary tiles, owner/admin/manager only, no writes, no migration, one Playwright spec seeding each flagged case and asserting rendered rows, docs-sync entries, PR with demo GIF.
Rules encoded in Step 1:
- Group session =
classes.class_type='group'OR class name contains "Group" ("Group Coaching 90 Mins" is stored as private). - Session banks (Starter, Pro) are never prorated and nothing is due on the 1st.
- Bridge = round(price × min(floor(days_to_next_1st / 7), 4) / 4). Tiers: 3 weeks PRORATE75, 2 PRORATE50, 1 PRORATE25, 4+ full, ≤7 days wait for the 1st.
- A proposed amount is a number on a screen. The page never creates a payment request or a charge.
- Identity is
user_id; same-name accounts are flagged, never merged. requireFacilityAccessadmits coaches, so the route adds an explicit owner/admin/manager check.- Month boundaries come from the facility-local date helpers in
packages/common/src/datetime.ts, nevernew Date(). - Test
tc-284-academy-health.e2e.ts: seven seeded cases (Group Coaching name rule, null-expiry package must not flag, duplicate pair, cash row hidden).
5. Rules for every PR
- Written proposal first: this document goes to Nestor before any code. The agent has no reviewer on your side; all review cost lands on him, so scope stays small.
- Branch
feature/<name>, one feature = one PR,git fetch origin main && git merge origin/mainbefore opening. - Local only:
supabase starton the shared local stack, Stripe test keys, no--linkedwrites, no deploys, no.env.production. - Migrations only where the step table says so; authored with
supabase migration new; never re-run an applied one. - Playwright in the foreground,
data-testidselectors, no skips, assert rendered values, seed inbeforeAll, clean inafterAll. - Docs-sync:
versions.ts,feature-matrix.ts,api-reference.ts, anac-<feature>.tsfile, adecisions.tsentry; build both docs apps. - Self-review the full diff, attach a demo GIF, PR description with TLDR / root cause / files / reasoning / agent-context.
- Roles in Setpoint: Alvaro = owner, Jose = admin, Abby = manager, coaches = coach. Setpoint has no per-action approval workflow, so the autonomy rule is enforced by process: AUTO (the page computes and flags), STANDING RULE (Abby sends exactly what the worklist shows), DECISION (Alvaro for any amount not on the list, Jose for any roster or level change), NEVER (the software takes or refunds money, deletes, or messages an opt-out).
6. Before the next prompt
colima statusshows running;supabase --version≥ 2.116. Supabase takes ports 54321–54327 and only one local stack (setpoint, openrally or padel-backend) can run at a time; Setpoint admin is port 3000.cd ~/cowork/setpoint && git statusclean onmain;git fetch origin main.supabase startsucceeds;select count(*) from pg_tables where schemaname='public'> 100.gh auth statusshows the account you want on the PR.- Nestor has the link to this plan.
Prompt to paste:
Build Step 1 "Academy Health" in ~/cowork/setpoint exactly as specified in
~/Desktop/cowork/ptp-academy-product/PHASE-1-SPEC.md. Read that file and
SETPOINT-AUDIT-2026-09-16.md first. Pre-flight: colima + supabase start,
git fetch/merge origin/main, branch feature/academy-health. No migrations,
no writes, no prod contact. Run the Playwright spec in the foreground,
do the docs-sync checklist, self-review the full diff, open the PR with a
demo GIF, and report the PR link and the test output.
7. Risks and defaults
| Risk | Mitigation |
|---|---|
| PR lands unasked on the CTO's repo | Proposal first; read-only Step 1; one PR; demo attached |
| Wrong bridge amount reaches a student | Step 1 proposes only; amounts checked against the 10 Sep control-panel fixture (ptp-academy-control/outputs/academy-control-data.json) before Step 3 |
| Local Supabase reset wipes another session | One session at a time; verify table count after any reset |
| Docs-sync stalls the session | Checklist is explicit in the spec; budgeted |
| Student PII on public pages | Nothing in this plan deploys outside Setpoint's authenticated admin |
| WhatsApp automation expected | Not promised; wa.me manual lane stays until Meta decisions are made |
Open decisions, with the default the plan assumes:
- Internal fix for Pad Thai Padel or a product Setpoint sells to other academies? Default: internal now, built consumer-agnostic so it is sellable later.
- Extend Setpoint or build standalone? Default: extend Setpoint.
- Makeups: on or off? Default: off (fixed slot, missed session is lost; recovery visits remain Proposed).
- Abby's Setpoint role? Default: manager.
- Which GitHub account opens the PRs? Default: the one
gh auth statusshows; confirm it is yours. - Stripe import for reconciliation (Step 3)? Default: the control panel's restricted read-only key, never a live secret key.
Sources: dashboll.com and dashboll.com/precios; padelock.com; courtsync.io/pricing and courtsync.io/features; github.com/adamsherif123/ThePadelAcademyy; github.com/debueb/pro-padel; github.com/tkrebs/ep3-bs; ~/cowork/setpoint (audit 16 Sep 2026); ~/Desktop/cowork/ptp-academy-control/SETPOINT-PORT.md.