Back

Help & workflows

The registrar's field manual, with the trainer basics and the admin set-up jobs at the end.

Three roles use this app. Most of this page is for the registrar, because that is where the judgment calls live. Trainer tasks are short. Admin tasks are the set-up jobs that happen once a season.

RegistrarWorks the outreach list, fixes accounts, answers families. Sections R1–R19.
TrainerTakes attendance on the field, looks up a family. Sections T1–T2.
AdminPrograms, sessions, venues, tags, data fixes. Sections A1–A11.

Navy = the app does it on its ownOrange = you do itGrey = the trainer does it

Every diagram on this page uses those three colours the same way.

Jump to
R1Your two screens R2The worklist loop R3Every queue, decoded R4The trial journey R5Didn't finish signup R6Trained without a credit R7Quiz inquiries R8Renewals, expiries, no-shows R9Texting a family R10Open a family account R11How credits move R12Fix a balance or membership R13Attendance from the desk R14When a family wants out R15Lifecycle stages R16App invite & password links R17The other console views R18Announce a change R19Email a roster or a filtered list T1Take attendance T2Look up a family A1Needs your attention A2Recurring sessions A3Edit or cancel one session A4New camp or league A5Welcome content A6Pull a league roster A7Duplicate, reprice, archive A8Cancel or delete a program A9Add a venue A10Player tags A11Data looks wrong
Registrar · every day
R1Your two screens: phone and desk

You have the same worklist in two shapes. Use whichever matches where you are.

Phone Pipeline stream next to the desktop console with its sidebar and two-pane worklist
Same queues, same data. The phone is for clearing the urgent few between sessions. The desk is for working the whole list and opening any family's account.

On your phone

/app/registrar (the Pipeline tab). One stream, bucketed Do now · Today · This week · Wins. Each card says why the family is there and has one action. Swipe right to email, swipe left to snooze. Tap a card for the family's players, credits and recent activity. The Families tab is a quick lookup.

At the desk

/app/desktop. You land on the Worklist: the same stream on the left, and on the right the reason, the family's credits and last contact, and the drafted email ready to send. The sidebar adds Families, Players, Signups, Inquiries, Sessions, Rosters and the Email log (R17). Logging in on a laptop takes you here automatically.

NoteTwo queues exist only at the desk: quiz inquiries (R7) and birthdays. The phone leaves them out on purpose so the thumb list stays short.

R2The worklist loop: read the why, act once, move on

The whole job is one loop. The app decides who and why. You decide what to say, do it once, and the family clears so you never wonder whether you already reached out.

Flow: the app surfaces a family, you read the why, you take one action, the family clears, and returns after a touch cooldown or a snooze unless marked not a fit
Every action is logged with your name. A touch hides the family for three days and brings them back if they still haven't converted. Snooze hides them until the date you chose. Not a fit removes them until someone reopens the pipeline from the account.

The actions

ButtonWhat it does
EmailThe main verb. At the desk the draft is on screen: Edit it, or Copy text. Pressing the orange button opens the draft in your own mail app to send from there, logs an "emailed" touch, and loads the next family. Same on the phone. See the note below about which address it leaves from.
TextPhone only. A short draft for the academy number. See R9.
DoneClears the family without sending anything (you called, or handled it in person). Counts as a touch: three-day cooldown.
NoteSaves a line to the family's activity ("Left voicemail, wants a June start") and clears the row. Also a touch.
SnoozeThis evening · tomorrow morning · in 3 days · pick a date. Hidden until then, no touch logged.
Not a fitNot interested or Lost. Removes the family from every queue. Reopen later from their account (R10). "Won" is never a button: buying is the win.

Desk shortcuts: E sends, J and K move to the next and previous family. On the phone, clearing actions show an Undo toast for a few seconds instead of asking "are you sure".

How the drafts sound

Every draft is written in the registrar voice: warm, parent-to-parent, about this child by name, logistics up front, signed "Warmly, your first name". Coach Rizzo is mentioned in the third person. Edit freely, but keep those bones. The offer facts inside the drafts (price, session count, address) are maintained in one place by the admin, so never retype a price from memory.

It leaves from your mailbox, not the academy'sThe worklist drafts the email and hands it to your mail app — it does not send through registration@, and it will not appear in the console's Email log. Set your mail app to send as registration@azsoccerskills.com before you work the list, so families see one address and replies come back to the academy. (Group email from Rosters and Players is different: that one really does send from registration@.)

The touch is logged when you press the buttonNot when the mail actually goes. Close the draft without sending and the family is still marked emailed and cleared for three days. If you back out, use Undo on the phone, or reopen the family and note what happened.

Nevertell a parent to enter a promo code. The intro price applies itself at checkout for any family with no prior paid pack. There is no code box.

R3Every queue, decoded: why a family is here and what to do

Colour is urgency, and it decides the bucket. Red lands in Do now. Yellow is Today or This week. Grey is fine to leave until you have a quiet moment. Green is a win. Queues with red items open themselves.

QueueWhy the family is hereColour ruleWhat to do
Trained without a creditA trainer added a walk-on and the family has no pack on the account.Always red. Do now.Same day: get them a trial, pack or membership. Drops off the moment they buy. R6.
New trials — welcome & convertTrial paid in the last 14 days, not converted yet.Yellow while the session is ahead. Red once it has happened, or if no day is booked.Three beats: welcome, then offer after attendance, or reschedule a no-show. R4.
Didn't finish signupRegistered but never bought a trial.Grey, red after 3 days. Red sooner if they reached the payment page and left.Help them book. The draft offers to hold the exact day they chose. R5.
New inquiries — quiz leadsTook the website quiz, hasn't registered. Desk only.Red if they want to start this month. Yellow for 3 days, then grey.Email invite, then Mark reached out. R7.
Quiet inquiries — no reply yetInvited 3+ days ago, nothing back. Desk only.Yellow, red at 7 days.One nudge, or Close — no response.
Stale trialsTrial bought 14+ days ago, still no purchase.Yellow from 7 days, red from 14.Attended: "How was it?" plus the offer. Never attended: a plain re-book, no pitch.
Low balances — prompt renewalActive family with 2 or fewer paid weekly sessions left.Yellow. Red at zero, which is Do now.Nudge a top-up before they run dry. R8.
Packs nearing expiryUnused sessions expiring within 30 days.Yellow. This week.Get them booked in, or nudge a renewal.
Aging-out playersWithin 30 days of turning 18.Red if they still hold a usable pack.A move-up conversation, not a surprise.
Birthdays this weekA player's birthday in the next 7 days. Desk only.Red on the day, yellow within 2 days.A quick note from the academy.
Frequent no-shows2+ no-shows in the last 60 days.Yellow, red at 3+.A friendly check-in. Something is usually in the way.
Recent conversionsFirst real pack bought in the last 30 days. The wins.Green for 7 days, then grey.Welcome them in and set up the first proper session. R8.

Each row shows the last contact and credits left, so you never double-ping. A family can appear in two queues for two children on purpose: a converted sibling must not hide another child's pending trial.

R4The trial journey: three beats, gated on the trainer's mark

This is the highest-leverage part of the job. The app sends the logistics. You send the human part, and the trainer's attendance mark tells you which beat you're on.

Timeline from trial paid through welcome, reminder, the trainer's mark, then either the intro-pack offer or a reschedule, ending in the win or stale trials
Navy steps happen by themselves. Orange steps are yours. The trainer's mark in the middle is what flips the row from "welcome" to "offer" or "reschedule".

Beat 1 · Welcome and confirm you

The family already has "Trial booked — what to expect" and a set-your-password invite from the app. Your welcome makes it personal: confirm the day and the address, ask them to arrive 15 minutes early so Coach can meet them, and say what to bring. If they never picked a day, the row says so: help them choose one. Do not mention the intro pack yet.

Beat 2 · Offer the intro pack you

Once the trainer marks the player Present, the row turns red with a countdown. Send the offer within 24 to 48 hours: the Flex Pack, 6 sessions for $190 instead of $225, and they choose their training days. Explain the why, not just the price: the intro pack is the low-friction next step that shows whether the player is a good fit before membership. After 7 days the row reads "last chance".

Beat 3 · Reschedule a no-show you

Marked Absent? Get a new day booked first. No pitch until the player has been on the field.

The win app

When they buy, the family moves to ACTIVE and shows under Wins for 30 days. Welcome them in and help them book their first real session.

RuleAny email that says "your trial" must match reality. The only source of truth is the trainer's mark. Attended-but-stalled families keep the "how was it" plus offer; never-attended families get a plain re-book.

R5Didn't finish signup, and abandoned checkouts

These families filled in the registration form but never bought a trial. They are not cold leads: they wanted in and something got in the way.

  • Plain incomplete signup. The draft invites them to book a trial. Reach out within three days; the row goes red after that.
  • They picked a day and reached the payment page. The row shows the exact session they wanted, and the draft offers to hold that spot instead of asking "what day works?". If that day has passed, the draft offers to rebook.
  • They told us which days suit them. The row reads "Wants Tue/Thu evenings" and the draft answers with days that fit.

NoteNothing is booked for a family until they pay. A chosen day is remembered so you can hold it, not because a place is taken.

R6Trained without a credit: walk-ons the trainer let on

Nobody is turned away on the field. A trainer can add a walk-on who has no pack, mark them present, and the row is flagged "No credit · flagged for the office". That family lands at the top of Do now the same day.

  1. Email or text the family: great to see the player, here is how to set them up (trial, pack or membership).
  2. The row clears by itself once anything is bought after that session.
  3. A session already trained without a credit is not deducted from a later purchase. If Coach wants it counted, open the family and use Adjust credits (R12).
R7Quiz inquiries: new and quiet

People who finish the website quiz become inquiries. They are not families yet: no account, no player record, just a name, an email and their answers. The desk shows them in two queues and one full book.

  • New inquiries. The pane shows their quiz answers. Email invite opens a draft inviting them to a trial; then Mark reached out. Not a fit closes them.
  • Quiet inquiries. Invited 3+ days ago, nothing back. Email nudge, then "Nudged — check back in 3d". Red at 7 days. Close — no response stops them resurfacing.
  • Inquiries view (sidebar) is the whole book, every status, with filters, for when you want to see everything rather than just what's due.

NoteWhen an inquiry registers, the app links it to the new family automatically. You don't need to close it by hand.

R8Renewals, expiries, aging out, no-shows, birthdays and wins

The rest of the queues are about keeping families, not winning them. Each has one draft and one job.

  • Low balances. Two or fewer paid weekly sessions left. Nudge a top-up while they still have a session to come back for. At zero the row is red and sits in Do now.
  • Packs nearing expiry. Unused sessions with less than 30 days left. Get them booked in; nobody likes losing what they paid for.
  • Aging out. Within 30 days of 18. Start the move-up or re-enroll conversation early.
  • Frequent no-shows. A friendly "everything OK?" usually surfaces the real reason: a schedule clash, a lost interest, a sibling's season.
  • Birthdays this week. Desk only. A two-line note from the academy. It costs nothing and families remember it.
  • Recent conversions (Wins). They just bought their first real pack. Welcome them in, make sure their first session is booked, and add a note if they told you why they said yes.

NoteMembership renewals are automatic through Stripe and send no email yet. If a family asks when they renew, the Stripe dashboard (admin) has the date.

R9Texting a family: academy number only

Texts always come from the academy number, never from a personal phone. Families should recognise one number, and staff numbers should never reach parents.

  1. On the phone, tap Text on a row (the desk worklist is email-only). A short draft appears; edit it if you like.
  2. Copy for Google Voice copies the text and the number. Paste it into Google Voice and send.
  3. If one-tap sending is switched on (the button reads Send text →), it goes out directly and logs itself.

Either way the touch is logged as "texted" and the family clears with the usual cooldown. Guardian phone numbers on any row are tap-to-call.

Registrar · the family account
R10Open a family account: what's in the drawer

Desk: Families in the sidebar, search by family, guardian or player name, click a row. The drawer slides in from the right. Every worklist row and every signup email link opens the same drawer.

The header

Family name, lifecycle stage pill (R15), and an outcome pill if they were marked Not interested or Lost. Buttons: Send app invite (R16), Approve for membership, Archive family, and the pipeline disposition.

Three tabs

OverviewGuardians (tap to call or email; Edit names and contact), players (age, gender, skill, school, medical notes; Edit including date of birth), every pack with credits left, and the account tools (R12).
BookingsUpcoming sessions with Move and Drop, then recent attendance where you can set Present, Absent or Clear (R13).
ActivityOne timeline of everything: your touches and notes, credit adjustments, bookings, membership agreements, app invites. This is where you check "did anyone already reach out?"

Approve for membership

Membership has two locks in front of it: Coach's greenlight and a signed agreement. After a trial the drawer prompts "attended the trial. If it's a fit, approve them for membership". Approving flips the greenlight and sends the approval email. If the drawer shows that email didn't go, tell the family yourself. Revoke membership approval reverses it.

Not interested, Lost, and reopening

A dispositioned family disappears from every queue. Their account stays whole. To bring them back, open the family and click Reopen in pipeline.

R11How credits move: what a booking, a mark and a drop each do

Most balance questions from families come down to this one picture.

Booking spends nothing; a mark spends one credit from membership, then bonus packs, then paid packs; credits return on undo, clear, cancellation or an early drop; a late drop issues a make-up; you adjust by hand
Present and Absent both spend a credit. That is why switching a wrong mark to Absent doesn't refund anything: only Undo, Clear, a cancelled session, or an early drop puts a credit back.
  • Packs belong to the family, so siblings share a balance.
  • The Flex Pack is 6 sessions, good for 12 months. The intro price ($190) applies to a family's first one; $225 every time after.
  • A membership is unlimited weekly sessions: matched at every mark, never counted down.
  • Camp and league packs track attendance for that program only. They never appear in the weekly balance, and they never trigger "running low".
R12Fix a balance, comp a pack, end a membership, move or drop a booking

All of it is buttons in the family drawer. Nothing here needs Stripe or Supabase any more, and every change is logged with who, when and why.

Adjust creditsOn any non-membership pack: set the exact sessions remaining, or step with − / +. Fix a miscount, count a walk-on session, claw one back. Raising a pack above zero reactivates it.
+ Comp a packGrant a free pack at $0: a make-up bonus, flex credits, or a trial. No Stripe charge.
End membershipStops the renewal at the end of the paid period. The pack shows "Ends <date>" and access continues until then. A comped membership (no Stripe subscription) ends immediately.
Move / DropOn an upcoming booking: move the player to another session in the same program, or drop them. No credit moves either way.
Archive player / familySoft-hide a duplicate, a typo account, or a household that left. Nothing is deleted; Restore brings them back. End any active membership first, or the app refuses.

NoteA coach who marked the wrong player doesn't need you: they tap Undo on the roster within 7 days and the credit returns itself. You'll see it in the family's Activity as "Attendance mark undone by staff".

R13Mark or fix attendance from the desk

Marking on the field is the trainer's job (T1). You review, and fix, from two places.

A whole session

  1. Sessions in the sidebar shows the week's coverage. Click a session.
  2. The drawer shows booked, present, absent and unmarked counts, then the roster with Present / Absent per player. Each saves instantly and moves the credit.
  3. Add a walk-on books someone who turned up unbooked. Announce a change is R18.

One family

Open the family → Bookings → recent attendance. Present and Absent spend a credit; Clear returns it and sets the booking back to unmarked.

LockAttendance is editable for 7 days after the session, then it locks. Admins are exempt. If a trainer forgot a session more than a week old, ask an admin.

LeagueDevelopmental League practices and games are not in this app. Their attendance and availability live in BAND.

R14When a family wants out: who acts and what they get

Four products, four rules. The word on the family side is Drop, never "cancel": there are no refunds, a credit simply comes back or doesn't.

Decision table: a booked session is dropped by the family with a 12-hour rule; camps and leagues are emailed with 7 and 14 day voucher windows; a membership needs 30 days notice and you press End membership
Families self-drop credit-based bookings. Camps, leagues and memberships go through registration@, and you apply the rule.

Vouchers

A camp or league voucher is a credit on the family account for the amount they paid. It never expires and applies at their next checkout. There is no drawer button for it yet: an admin issues it in Supabase (A11). Reply to the family first, then pass it on.

When we cancel

Different rules, because the family did nothing wrong. Cancelling a session returns every credit. Cancelling a whole program emails each family that anything paid can go toward other sessions or programs first, or be refunded on request. Refunds are manual in Stripe by an admin.

R15Lifecycle stages: the pill on every family

The stage pill is a summary the app maintains by itself. You never set it.

LEAD_NEW to TRIAL to ACTIVE to RENEW to LAPSED with the trigger for each move and the queue that watches each stage
LEAD_NEW means "registered, no trial bought yet", not a cold lead. Cold leads are the quiz inquiries in R7.

Stages move at midnight Phoenix (the nightly jobs) and on purchases. The queues don't wait for that: they read packs and bookings directly, so a family can be in "Low balances" the evening before its pill says RENEW.

R16App invite and "set your password" links

A family gets a set-your-password invite automatically the first time they buy. Until a guardian actually signs in, the family's automated emails stay off.

  1. Open the family. In the header, Send app invite (or Resend app invite) sends the primary guardian a fresh link. Repeat sends are fine until they've logged in.
  2. The button is missing when there's no primary guardian email, the family is archived, or someone already signed in. Fix the email first, or point them to /login/forgot.
  3. "Already exists" means the email has a login the app couldn't link. Tell them to use Forgot password on the login page; it works for them.

Admin fallback: Supabase → Authentication → Users → the email → Send password reset.

Registrar · groups and programs
R17The other console views and what each is for
ViewUse it when
OverviewThe morning picture: today's sessions, the size of the base, this week, and what needs a decision. Read-only.
SignupsA feed, newest first, of registrations, trials, purchases and conversions. The academy inbox gets the same events as emails with a link that opens the family here.
InquiriesEvery quiz lead, whatever its status. R7.
FamiliesSearch and open any account. Filters for stage, running low, and archived households.
PlayersFilter by age group, skill, gender or tag. Export CSV for a spreadsheet. Select rows to Email these families or add / remove a tag in bulk (R19).
SessionsWeek-by-week coverage. Click a session for its roster and attendance (R13) or to announce a change (R18).
RostersEnrollment per program. Open one to view, Print roster, or Email roster.
Email logWhat actually went out through Resend and whether it landed. Check here before telling a family "we sent it".

Programs, Reports, the Audit log and Setup are admin-only and don't show in your sidebar.

R18Announce a change: what families see, and how fast

An announcement is for a same-day change on a session that is still happening: a weather call, a time shift, a field swap, a guest coach.

  1. Sessions → click the session → Announce a change. (Admins also have it on /app/admin-sessions.)
  2. Pick a Kind: Info, Schedule, Location, Weather, Cancellation. It colours the chip families see.
  3. Write a short Headline ("Tonight moved to 7 PM"). Add a body if there's more.
  4. Tick Email booked families now if it's time-sensitive. Untick for a gentle in-app heads-up.
  5. Post announcement.
An announcement reaches the family dashboard banner and the session chip instantly, the email in 10 to 30 seconds if ticked, with a retry every 30 minutes if a send failed
Only families booked on that session see it. The email goes to the primary guardian.

When in doubt

  • Same-day change? Tick the email box. A banner alone won't reach a parent who isn't in the app.
  • Inside two hours? Tick the box and text (R9). Parents mid-commute read texts, not email.
  • Next week's heads-up? Banner is enough. The automatic day-before reminder repeats it.
  • Session won't happen at all? Ask an admin to Cancel it (A3). That releases the bookings, keeps every credit, and always emails with a rebook link.

Forgot to tick the email box? Post a second announcement with it ticked. Each announcement is its own row, so a family who dismissed the first still sees the second.

R19Email a roster or a filtered list, print a roster

Targeted group email goes out from registration@ to a list you pulled. This is the source of truth, not a marketing tool: keep it to the families concerned.

A program's roster

  1. Rosters → click the program.
  2. Email roster opens a compose box addressed to every registered family. Subject and sign-off are prefilled.
  3. Print roster (or Cmd+P) gives # · Player · Age · Gender · Skill · Guardian · Phone · Notes, with a blank tick column for paper.

A filtered group of players

  1. Players → filter by age group, skill, gender and tag.
  2. Tick the rows (or all), then Email these families. One email per family, not per child.
  3. Or Export CSV to work in a spreadsheet.

TagsThe same selection can Add tag or Remove tag across everyone ticked. Tags show on the trainer's roster, so "Goalkeeper" or "Tryout invite" reaches the field.

Trainers
T1Take attendance on the field

/app/trainer. Every trainer sees every session: whoever is on the field opens it and marks it. Today's sessions come first, then the next ten days; recent ones sit under Earlier.

Four steps: the session opens itself, find or filter the roster, tap Present or Absent, Save
Built for one hand in the sun. Nothing is charged until you press Save.
  1. The running session opens itself 15 minutes before kickoff. Earlier, tap the card.
  2. Find box: type a name to filter every age group at once. All / To mark switches to just the players still unmarked.
  3. Tap Present or Absent. Rows stay put until you save, so a mistap never vanishes under your thumb.
  4. Save sticks to the bottom with the unsaved count. If players are still unmarked it asks once: Mark N absent and save, or Save only what I marked.

Walk-ons

Type the name in the same find box. Anyone in the player list who isn't on the roster is offered as a walk-on; tap to add, preset to Present. No credit on the account? They're still added and marked, the row shows No credit, and the office follows up (R6). Wrong name? Remove works while the row is unmarked.

Undo, not the other button

Present and Absent both spend a credit. Marked the wrong player? Tap Undo next to the "✓ saved" tag: the row goes back to unmarked and the family's credit returns. Switching to Absent instead just relabels a credit that's already gone. Undo works for 7 days; after that the session locks and only an admin can change it.

Two trainers, one roster

Every saved mark carries a name and time ("✓ Maya · 5:41 PM"). The roster refreshes when you come back to the app and every 45 seconds while open, so the other trainer's marks slide in. Your unsaved taps are never overwritten. Once the session has started, Close out attendance lets a second trainer mark the remaining no-shows without re-marking anyone.

LeagueDevelopmental League practices and games don't appear here. Their attendance lives in BAND.

T2Look up a family from the field

The Families tab (/app/families) is every staff member's read-only lookup. Search by family or player name, tap for the detail sheet.

  • Players first: age chip, gender and skill, school, medical notes, recent coach notes.
  • Guardians: tap the phone to call, the email to write.
  • Credits and packs: what's left at a glance.

It is deliberately view-only. Outreach, credit fixes and membership changes are the registrar's (R10–R12).

Admin · set-up jobs
A1What "Needs your attention" on the Admin home means

The top of /app/admin lists set-up gaps only you can fix. Empty means "Everything's set up." Three things can appear:

  • A program has no upcoming session. An active program with nothing on the schedule doesn't show on the catalog. Add sessions in /app/admin-programs, or archive it if it's done.
  • Draft sessions not published. Only published sessions are bookable. Drafts show a grey Draft pill in /app/admin-sessions: tap Publish, or Cancel if they shouldn't exist.
  • Sessions at capacity. A session hit its soft cap. Add capacity or open another.

Note"Sessions with no trainer" is deliberately not flagged. Trainers aren't assigned per session in this app.

A2Schedule a batch of recurring sessions
  1. Open /app/admin-programs and open the weekly program (or create it: type, name, location).
  2. In its Sessions panel pick the day(s), a Starts date and repeat for N weeks.
  3. Set start and end time. The preview lists every date: click on a holiday to skip it.
  4. Leave Publish ticked and tap Add sessions.

SaturdaySaturday Skills & Scrimmages starts at 8:00 AM through the Fall 2026 block (to December) and 8:30 AM from the Winter 2027 block. It is built as one program per season block, so each block carries its own start time.

A3Edit, announce or cancel a single session

Fastest: /app/admin-sessions, every upcoming session grouped by day with a booked count. Filter by program or date. The same buttons live under each program in /app/admin-programs.

  • Edit: change the date or time for that one day.
  • Announce: a banner for booked families, with an optional immediate email. Full detail in R18.
  • Cancel: releases every booking with no credit spent. Add a reason and leave Email booked families now ticked: they get an email saying it's cancelled, that their credit is intact, with a link to rebook.

A cancelled session can't be un-cancelled. Add a fresh date and rebook the families by hand.

A4Add a new camp or league end-to-end

Same flow for both. The Type you pick drives the welcome email and the pack label. A program is Draft → Live → Archived: families see nothing until you publish.

  1. /app/admin-programsNew program.
  2. Type: Camp or League (or + New type and pick its behaviour).
  3. Name: follow the convention — Summer Camp 2026 — Week 2 (Jun 16–20). Tap Naming guide under the field for the pattern and examples. Under the box you type in, a live preview shows what families browsing will actually see, which is the series plus a small pill: the year and the dates are for the receipt and for Stripe, and get dropped on the schedule.
  4. Location: the anchor venue. Shown once on the checkout page; per-session field changes for leagues stay in BAND.
  5. Description: the welcome content. It renders on the checkout page and in the welcome email (A5).
  6. Schedule: days, Starts date, number of weeks, times. ✕ any holiday.
  7. Early bird: a lower price and the date it ends, suggested at three weeks before the first day. Families see both prices; checkout charges whichever applies that day.
  8. Price per player, or on a camp How families pay: Fixed dates (one price, every day booked) or Flexible (bundles of 4 / 8 / 12 sessions; families pick their nights after registering). A bundle can carry its own early bird price, and can be marked "this bundle is the discount" so sibling and member discounts don't stack on it and promo codes are refused.
  9. Order options: registration opens / closes, pre-registration only, ages and skill (catalog filters, never blockers), capacity, the roster you're aiming for, divisions for leagues.
  10. Save draft, then open it. The readiness list at the top shows ✗ for anything that blocks and ! for anything worth knowing. Fix, then Publish: that creates the Stripe prices, makes every session bookable and puts the program on the catalog.

Description is load-bearingLeave it blank and the family sees name, date and price with no context, on the page and in the email.

Odd dayA Friday that runs long? Create at the common time, then Edit the one session.

A5Edit the welcome content for a running program

The Description renders in two places: the checkout page above "Pick which players to register", and the welcome email after purchase.

Put in

  • A one-line welcome. Action items for now: gear, joining BAND, the volunteer form.
  • How the week works (Wed = trainer sessions, Sat = games). Division split and format if relevant.
  • Links: they auto-link in both places. Plain text with line breaks is fine.

Leave out

  • The schedule and the location. Both already render below and above it.
  • Per-session news. That's an announcement (R18).

Mid-season edits reach new registrations immediately. Already-registered families are not re-emailed; use an announcement for anything material. Keep a season template in a notes app and swap the dates.

A6Pull a league roster for division and team building

Printable roster (fastest)

/app/desktopRosters → the league → Print roster. Columns: # · Player · Age · Gender · Skill · Guardian · Phone · Status · Notes, with a blank tick column on paper. The registrar can do this too (R19).

Who paid, when

/app/admin-reportsAcquisition: leads → trials → attended → paid per source; the Funnel tab shows views → checkouts → conversions per program.

Raw export

For a spreadsheet, Players → filter → Export CSV covers most needs. For a per-program pull with guardian contact, run this in the Supabase SQL Editor (the project with the families table):

select
  p.first_name, p.last_name, p.date_of_birth, p.gender, p.skill_level,
  p.notes as medical_notes, s.name as school,
  f.display_name as family,
  g.email, g.phone,
  pk.created_at as registered_at
from packs pk
join families f on f.id = pk.family_id
join guardians g on g.family_id = f.id and g.is_primary_contact = true
join bookings b on b.pack_id = pk.id
join players p on p.id = b.player_id
left join schools s on s.id = p.school_id
where pk.program_id = 'PROGRAM_ID_HERE'
group by p.id, f.id, g.id, s.name, pk.created_at
order by p.date_of_birth;

Replace PROGRAM_ID_HERE with the program's UUID from the /app/admin-programs URL. Export → CSV in the editor toolbar.

A7Run last season again, change a price, archive

Duplicate

  1. /app/admin-programs → open last season's program (tick Show archived if retired).
  2. Duplicate… → first day of the new run and how many in a row (a four-week camp = 4).
  3. Preview shows suggested names (year bumped, Week 1…N, new dates). Edit any. Create N drafts.
  4. Each draft carries description, photo, price or bundles, early bird distance, ages, skill, capacity, roster target and divisions. Publish each when ready.

Change a price on a live program

Edit Price per playerSave details. You're told how many families already registered; they keep what they paid. Stripe gets a new price behind the same key automatically. Renaming pushes the new name to Stripe too.

Season over

Archive keeps history and hides it from families. Cancel program is for calling one off (A8).

A8Cancel or delete a whole program

Three intents, three tools, all in the program's edit pane.

Delete this programA mistake nobody booked. Erases the program and its sessions and archives the Stripe product. Refused if even one booking exists.
Cancel program…Calling off a season people registered for. Archives it, cancels every upcoming session, releases every booking with no credit spent, archives the Stripe product, and (if ticked) emails each family once with your reason: paid amounts go toward other sessions or programs first, or a refund on request. Refunds stay manual in Stripe.
Untick ActiveSimply done for the season. Hides it and stops sales; sessions and history untouched.
A9Add a venue
  1. /app/admin-locations
  2. Name, address, indoor / outdoor. Indoor drives the "sneakers, not cleats" copy families see.
  3. Public notes for families ("Enter via south gate, park in lot B"). Internal notes for staff (gate codes, weather plan).
  4. Add. Retire with Deactivate: history keeps it, new sessions can't use it.
A10Add or rename a player tag

Tags are short labels on a player (Goalkeeper, Left-foot, Returning camper, Tryout invite) that show on the trainer roster.

  1. /app/admin-tags → type a name → Add tag.
  2. Rename propagates everywhere the tag is used. Deactivate hides it from pickers but keeps it where applied.

Assign tags in bulk from the console's Players view (R19).

A11If something looks wrong in the data

First, the drawer. Free session, balance fix, end a membership, move or drop a booking, archive, restore: all buttons in Families → Account (R12), logged automatically. Reach for Supabase only for what's below.

  • Issue a voucher by hand: insert into family_credits with kind=issuance, amount_cents, reason, family_id.
  • Attendance older than 7 days: admins can still edit it in the trainer app or the console. Only if that fails, update the booking row and record it in the audit log.
  • A purchase made no pack: Stripe → Webhooks → did the event return 200? Then the Cloudflare log for /api/stripe/webhook.
  • An email "never arrived": the console's Email log shows what Resend sent and whether it was delivered.

Two Supabase projectsThe SQL editor opens whichever you used last. This app's project has a families table. Check before running anything.

Arizona Soccer Skills Academy