Quick start
- Open the dashboard and create an account (or log in).
- Use the sidebar to switch between overview, team hub, schedule, roster, and other modules.
- Set your team name in Team hub; switch programs from the Active team menu when you have more than one.
- Use Billing at the top of the dashboard to view your plan and subscribe or manage payment when checkout is available.
Dashboard modules (live)
- Team hub — announcements, staff messages, attendance by event, payment rows (Coach / Organization plans) with optional link to a roster athlete and a payments by family summary, program name.
- Schedule — month calendar, color-coded events per team, RSVP count field; parents use Family hub (see below).
- Performance — manual wellness and load logs.
- Org & revenue — extra teams list, four-team bracket sketch, registrations, revenue totals from payment rows.
- Roster — players for the active team; optional parent/guardian email for the family schedule page.
There is no dedicated parent mobile app — families can use Family hub in a mobile browser. Automated SMS/email reminders to parents are not shipped yet.
Other calendar apps (Google, Apple, Outlook)
- Export .ics — In the dashboard, open Schedule and click Export .ics. Download the file, then use your app’s “Import” (Apple Calendar: File → Import; Google Calendar: Settings → Import; Outlook: File → Open → Import/Export).
- Google only — When you edit an existing event, use Add this event to Google Calendar to pre-fill one event in a new browser tab.
- This is one-way: CoachOS does not read changes back from Google/Apple. After you edit the schedule in CoachOS, export again or use the Google link per event.
- A future option is a subscription URL (always-up-to-date feed in your calendar app) — not available yet.
Family hub (parents)
- Parents and guardians open Family hub and choose Parent or guardian when they sign up (or use an account already created that way). They log in with the same email/password form as coaches.
- Coaches add Parent / guardian email on Roster for each athlete. It must match the email the parent uses to sign in. Parents then only see teams where that email appears on the roster, with that team’s schedule and coach announcements from Team hub.
- Self-hosted Supabase: run
sql/supabase_all.sql once in the SQL editor (full schema, billing, and parent RPCs).
Your data
- When you’re signed in, your teams and program information sync to secure cloud storage tied to your account — other coaches can’t see your data.
- If sync is temporarily unavailable, the app may keep working from browser storage for that session; try again later or refresh after checking your connection.
- On a preview or offline-style session without sign-in, data may stay only on this device until you connect with an account.
- Pending changes are flushed when you leave the tab, so you’re less likely to lose edits by closing quickly.
Plans & billing
- Starter — free tier: one team, up to 30 players; no in-dashboard payment ledger.
- Coach / Organization — paid subscription when enabled; unlocks payment rows, higher limits, multi-team on Organization.
- Your card is charged by the vendor operating this site. “Payment requests” in the app track fees you collect outside CoachOS (cash, other apps, etc.).
If checkout buttons are missing, billing is not enabled in config.js yet — see below.
Go live with Stripe (operator checklist)
Everything below is already implemented in this repository; you wire secrets and flip one flag.
- Run
sql/supabase_all.sql (or your migrations) so coach_billing and RLS exist.
- In Stripe: create products/prices for Coach and Organization annual subscriptions; copy both Price IDs.
- Deploy Edge Functions under
supabase/functions/: create-checkout-session, create-portal-session, stripe-webhook.
- Set function secrets in Supabase (Dashboard → Edge Functions → Secrets):
STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_PRICE_COACH_ANNUAL, STRIPE_PRICE_ORG_ANNUAL, SITE_URL (public site origin, no trailing slash), SUPABASE_SERVICE_ROLE_KEY for the webhook, plus SUPABASE_URL and SUPABASE_ANON_KEY where required.
- In Stripe → Developers → Webhooks, add endpoint
https://<project-ref>.supabase.co/functions/v1/stripe-webhook and subscribe to checkout.session.completed, customer.subscription.updated, customer.subscription.deleted.
- Copy
js/config.example.js to js/config.js, fill Supabase URL + anon key, set BILLING_CHECKOUT_ENABLED to true, and redeploy the static site.
- Test: sign in → Billing → subscribe (test mode) → confirm
coach_billing updates and dashboard limits change.
Full operator steps (Stripe products, webhook URL, CLI deploy): supabase/STRIPE.md in the repository. Secret names are also in comments in js/config.example.js. After checkout, users return to app.html?billing=success and the app refreshes plan data.
Fair-use limits
Enforced in the app: Starter = 1 team / 30 players; Coach = 1 team / unlimited players; Organization = many teams. Enterprise is arranged with sales.
Open dashboard