Use case · Coaching & classes

A term of tennis lessons

A coach with two employees runs morning squads for children aged five to sixteen, private lessons in the afternoon and an adult doubles group on Tuesday nights — on five courts that the public can book whenever the club is not using them. This is that club, built and run in the live system.

COACHES
3
COURTS
5
GROUPS
4 + adults
CLASS SIZE
max 4
TERM
13 weeks
SESSIONS HELD
117 court blocks

A coaching club is not a shop. Almost nothing it does is a purchase: it is a timetable that has to hold, a small number of courts that two different audiences want, and — more than anything — a weekly conversation with a few dozen families about who is coming on Monday.

This page builds one from nothing and then runs a week of it. Every screen is the live system. The children are real user accounts carrying their parents’ phone numbers, the courts are real inventory, and the cancellation you will see was made by tapping Cancel on a parent’s account page.

PART 00

Build the club from nothing

An empty site to a running club, in the order it has to be done: the switches, then the people, then the courts, then the groups, then the rosters. No developer, no support ticket — every screen below is a page in the admin, and each step says what to click, what to type, and what you should see afterwards.

The order matters. Coaches and courts have to exist before a group can use them; a group has to exist before the system can generate sessions; sessions have to exist before a child can be enrolled. Work down the page and nothing will be missing when you need it.

0.1 Switch the class features on

Settings → Rental Settings → Events Settings. Nothing in this guide exists until these are on — with them off there is no group enrolment, no register, no self-cancel and no sessions page. Set four values and press Update at the bottom of the page.

Rental settings showing Enable Member Enroll yes, Enable Class Register yes, Enrollment Cancel Cutoff 4h, Auto-Enroll Horizon 7 days, Notifications Enabled yes, Notification Channels, Session Reminder Hours 24
What to set. Enable Member Enroll → Yes, the master switch. Enable Class Register → Yes, which adds Add-attendee and the Owes/Paid columns to the roster. Enrollment Cancel Cutoff → 4h, how late a family may cancel themselves. Session Reminder Hours → 24, the reminder a day ahead. Leave SMS and WhatsApp unticked to start — notices then go by email, and you can turn the other channels on later without changing anything else.

0.2 Decide when people are reminded

Two settings, on the same screen, because one number was never right for both. A coach wants a couple of hours’ notice so it is still true when they read it; a parent wants a day, so they can rearrange the evening.

Session Reminder Hours — parents24
Session Reminder Hours — coaches2

The parent setting ships at 24 — the day before. Either can be overridden on a single class, so a Saturday morning squad can ask for 48 and an evening adult session for 3. Leave the parent one empty and it inherits the coach value, which is what a club upgrading from an older version keeps.

0.3 Add each coach as a user

Users → Add New User. Fill in a username, the coach’s email and their name. Leave the generated password alone — you are not giving it to them here. Set Role to Customer, and untick Send User Notification unless you want the system to email them straight away. Press Add New User.

Add New User form filled in with username dani.ruiz, an email address, first and last name, a masked generated password, Send User Notification unticked and Role set to Customer
Nothing here says “coach” yet — that is the next step, and it is deliberate. Repeat this once per coach.

0.4 Turn that user into a coach

Open the person you just created (Users → Users → click their name) and scroll to the Employee section. It will say No employee product yet. Press Create employee product.

Employee section of a user profile reading no employee product yet with a Create employee product button
Before: an ordinary account.
The same section after pairing, showing the paired product name with Edit employee product and Unpair buttons
After: paired, and now schedulable.

Why a button and not a role. Being a coach is not a permission, it is a thing that can be booked, scheduled and paid. Pairing creates that thing and links it to the person. It also means you can take a coach off the schedule without touching their login, and pay someone who never logs in at all.

0.5 Give the coach their rates

Press Edit employee product on the same panel. Fill in the two rate fields and press Update.

Employee product showing Is Employee Product yes, the paired user, Employee Hourly Rate 45 and Employee Per-Session Rate 40
Two rates, two purposes. Hourly prices ad-hoc work. Per-session is what one class is worth to that coach — it is the figure that reaches the payout ledger every time they are assigned to a session, so nobody re-types it later.

0.6 Add a court

Products → Add New. Name it Tennis Court 1 and set three things before you publish:

Product data → InventoryManage stock ✓ · Quantity 1
Product Serial Numbers → Is SerialYes
Publish box → Catalog visibilityHidden
Add new product screen with a title typed, the Products menu on the left, the Publish box with catalog visibility, and the Product Serial Numbers panel with the Is Serial toggle
The Add New Product screen. Title at the top, the Publish box top right (with Catalog visibility under it), and the Reservety panels down the page. Repeat until every court exists — this club has five.

Why hidden, and why “is serial” Nobody books “Court 3”; they book a court. Hidden keeps the individual courts out of the shop, and Is Serial is what makes each one countable as a unit. Skip the flag and the listing in the next step counts nothing, its stock stays at zero and it reads fully booked on every date.

0.7 One listing the public books

Add one more product — Tennis Court Booking — and this one stays visible. It is the only court thing a customer ever sees.

Item Types → Is Bookable ProductYes
Use Default Type / TypeNo · Start and End Date and Time
Bookable Pricing → Period / Price1h / 18
Product Serial Numbers → Use SerialsYes
Serialsthe five courts
Serial SelectionRandom
InventoryManage stock ✓ · Quantity 5
Serials field on the parent product listing Tennis Court 1 to 5 with Serial Selection set to Random
Five units behind one listing. A customer books the parent by the hour and the system hands out a free court. When a class holds Court 1 for an hour, this listing simply has four left — it does not go off sale.

0.8 Create a group

Products → Add New again. Name it the way parents will recognise it — Mini Tennis 5-8 · Starter — and in the Item Types panel set Is Event Product to Yes. That one switch is what turns a listing into something with sessions, a register and a check-in.

Item types panel with Is Event Product set to Yes and empty ticket tier and per-event notification override fields below
Is Event Product: Yes. Leave Ticket Tiers and the per-event notification overrides empty — a squad needs neither. Tiers are for a show with adult and child prices; the overrides are for one group that needs a different reminder from the rest.

0.9 Say when it runs, and how many can come

Two fields, on the same product. First the kind of booking, in the Turnover Padding Min Max panel:

Product settings showing Use Default Type set to No and Type set to Start and End Date and Time
Set Use Default Type to No first, then pick Start and End Date and Time. In that order — while Use Default Type is Yes the product quietly follows the site-wide default and the timetable below never binds.

Then the timetable itself, a little further down the same panel. Set Use Default Start Times to No, press Add time slot, and fill in one row.

Start times slot grid with one row: time 09:00, quantity 4, days Monday and Wednesday ticked
One row is the whole class. 09:00, Qty 4, Mon and Wed ticked. The Qty is the class size — four children, not four of something in stock. Press Publish and the term’s sessions generate themselves; you will see them in part 01.

One group, one product. A ten o’clock class for the same age band is a second product, not a second row — it has its own roster, its own coach and its own register. Rows in this grid are for the same group meeting more than once a week, which is why Monday and Wednesday sit on one row here.

0.10 The same timetable, drawn on a calendar

Everything in 0.9 can also be done — and a good deal more of it — in the Event Schedule box further down the same product screen. It is not a second timetable competing with the first. It reads and writes the same rows: open it on the class you have just published and the row is already sitting there.

Event Schedule box on the Mini Tennis product showing one weekly session row with Monday and Wednesday selected, start 09:00 AM, duration 60, max guests 4, and a September calendar with 09:00 x4 chips on every Monday and Wednesday
The grid row from 0.8, as a calendar. Nothing was typed here — Mon and Wed, 09:00, 60 min, 4 places came straight out of the slot grid, and the blue chips show what each day will produce. Edit either view; they are the same timetable.

Two tabs across the top. Recurring weekly is what a class uses. Specific dates is for something that does not repeat — a holiday camp, a tournament — where you click individual days instead of weekdays.

On the left, three things:

On the right, a month, and three brushes above it:

The blue chips on each day (16:00 ×4) are the sessions that day will produce — start time and places. They are the check. If a Friday in term time has no chip on it, no class is going to be generated there.

Event Schedule box configured with season 09/25/2026 to 12/18/2026, a Friday row with start 04:00 PM, duration 45 and max guests 4, and an October calendar shaded green with 16:00 x4 chips on each Friday and 30 October struck through in pink
A whole term in one box. Season 25 Sep → 18 Dec 2026, Friday 16:00 for 45 minutes, 4 places, and the half-term Friday — 30 October — painted out with the Holiday brush. The feed for this class returns twelve Fridays and skips the thirtieth.

Duration is real. Set 45 and the session runs 16:00–16:45: the court is held for forty-five minutes, not an hour, and the next lesson can start at quarter to five. Until this guide was written that field was honoured on one screen and ignored on the two others that matter — the calendar and the coach’s board — so a 45-minute class showed as an hour everywhere a human would look. It is fixed; leave it blank and a slot is an hour, as before.

Below the calendar sits Session resources — the courts / machines / rooms this event normally uses. Search a court and it becomes this class’s default. Then two buttons, and the difference between them matters:

Session resources panel with Tennis Court 5 attached, a search box, and an Apply to sessions next 90 days button reading Applied to 11 sessions
Save stores, Apply acts. The line under the button says it outright: Saving stores these as defaults only — nothing is blocked until you press Apply. Apply to sessions walks the next ninety days and attaches the court to every session it finds — here 11 of the term’s 12 Fridays, because the last one falls outside the ninety-day window. Press it again nearer the time, or attach that one from the calendar as in part 01.

Which one should a club use. Both, and for different classes. The slot grid in 0.9 is faster for a plain weekly group: one row and you are done. The Event Schedule editor is what you want the moment a class has a term, a half-term, a fixed court, or a length that is not an hour. Whatever you set in one appears in the other, so there is nothing to keep in step by hand — but the box is the whole timetable, so what it shows when you press Save schedule is what the class becomes.

0.11 Make a roster for each group

Users → User Groups. Type the group’s name and press Add New User Group. Do it once per squad, plus one for the adult members.

User Groups admin page with the Add New User Group form on the left and the existing groups listed on the right with member counts
A group does three jobs at once. It is the roster, it is what one-click term enrolment reads, and a child who is in no group at all never sees a sessions page in their account. The Count column on the right is the roster size.
User Groups admin listing five groups: the four squads and Club members adults, with member counts
What the finished club looks like. Four squads and the adults. The adult group matters as much as the others — the Tuesday-night doubles players are enrolled exactly like the children.

0.12 Decide what a session costs

Money in a coaching club does not look like a shop. Nobody checks out. A parent hands a coach cash in a car park in September and the child then turns up to twelve sessions of varying length until Christmas. So each child gets a wallet: a running balance that goes down when they are checked in and up when they pay.

Settings → Rental Settings → Rental Setup. Turn Class Wallet: Enabled on and set a default hourly rate.

Rental settings showing Class Wallet Enabled set to Yes, a default hourly rate of 15.00 per hour, and Charge No-Shows set to No
A rate per hour, not per session. The system already knows how long each class runs, so a 90-minute session at 15.00 costs 22.50 and a 45-minute one costs 11.25. Charge No-Shows stays off: no check-in, no charge, so a child away for three weeks is billed nothing. Turn it on only if you charge for the held place.

That is the club default. A squad that costs more or less sets its own rate on its own product, in the Class Wallet: Hourly Rate field that appears once Is Event Product is on.

Product settings showing Is Event Product set to Yes and Class Wallet Hourly Rate set to 12.00 per hour
Mini Tennis is 12.00/h, not the club’s 15. Leave it empty to inherit. And a single child can have their own rate on their user profile — a sibling discount, a scholarship — which beats both.

Three levels, most specific wins. Child, then class, then the club default. Empty means inherit, but 0 is a real rate and means that child or that class plays free — it does not fall back to the default. The roster always shows which level a price came from, so a stray per-child override is visible rather than silently winning.

This is not the coach’s rate. What you charge a child and what you owe a coach are different numbers that happen to both be per hour. The coach’s rate stays on their employee product (0.5) and feeds the payout ledger. A club does not charge a parent more because the head coach covered that week.

At this point you have a club. Three coaches who can be scheduled and paid, five courts, one public listing that hands them out, four groups with a timetable, and five empty rosters. Nothing has been booked yet and no child exists. Everything from here is running it, not building it.

PART 01

Block the week

The club’s hardest recurring job: hold the right courts at the right hours, put the right coach on each one, and do it for a whole term without touching thirteen weeks one at a time.

1.1 The timetable generates itself

Four weekly slots produce every session in the month. Nothing here was created by hand.

Events Calendar showing September 2026 with four class sessions on Mondays to Thursdays and a Tuesday evening club doubles session
September, generated from four slots. Mornings carry the squads; the Tuesday 7pm block is the adult doubles group. Drag a session to move it, click one to open it.

1.2 A court, genuinely held

Clicking a session opens it. Attaching a court writes a real block against that court for that hour — the blocked pill is not decoration, it means the public cannot book that court then.

Session panel for Mini Tennis showing Tennis Court 1 attached and marked blocked, with a search listing all five tennis courts
One session, one court. The search now finds hidden court products: because the courts are hidden (0.6), typing “Tennis” used to return nothing at all — fixed while building this guide. Stock is shown beside each candidate so the operator can see why something is or is not offered.

1.3 Once, or for the rest of the term

The question every recurring class raises is asked in the page, with a real way out. Choosing the series applies the court to this session and every future one at that weekday and time, skipping any that clash rather than double-booking them.

In-page dialog asking whether to attach Tennis Court 4 to every Monday at 09:00 or to this session only, with a cancel link
Three answers, not two. This used to be a browser confirm box, where Escape silently meant “this session only”. Dismissing now attaches nothing.

What the club actually did. Nine clicks — one per group per weekday — produced 117 court blocks across the term. Courts 4 and 5 were never held, so they stay open to the public all week.

1.4 One week is different

Court 1 is resurfaced on the fifth of October, so that Monday’s Mini Tennis moves to Court 4 — one session, not the series. The report line says exactly what happened.

Session panel showing Tennis Court 4 attached and blocked with the status line Applied to 1 session
Applied to 1 session. Keep this week in mind: it reappears on the parents’ own page in part 03, as the one row that does not look like the others.

1.5 Who is teaching

Coaches are assigned on the board by dragging them onto a session, and the same series question is asked. Every assignment writes a hold on that coach’s own calendar, so the afternoon private-lesson picker will not offer a coach who is teaching a squad.

Assignment board for Monday 14 September showing Martina Reyes with two back to back classes and a load of 4
Martina’s Monday. Two back-to-back squads at 9 and 10. Load counts the week, which is how the club sees who is carrying it.
Needs a person tray listing club doubles as unstaffed and every squad session as staffed once
“Needs a person”. Every squad reads staffed ×1. The one session sitting in the tray is the adult doubles group — unstaffed on purpose, which part 06 explains.
PART 02

The children

The club’s own rule: the child is the member, the parent is the contact. One account per child, carrying a parent’s phone number and email.

2.1 A coach never opens the user editor

A new child joins the Wednesday juniors. The coach does not create an account, set a password or send an invitation — they type a name and a phone number into the bottom row of the register they already have open.

Check-in register with three children listed and the Add attendee row filled in with the name Elif Yilmaz and phone +44 7700 900115
Two fields. The name is the child’s. The number is whoever answers when the club rings — a parent. Nothing else is asked for, because nothing else is needed.
The same register a moment later, now listing four children including Elif Yilmaz
One click later she is on the roster, in the right place alphabetically, with her own check-in control and her own money column. The account was created on the way past.
The new user account showing Phone +44 7700 900115 and Email address elif-yilmaz@attendee.invalid
What it wrote. A real WordPress account — login elif-yilmaz, role Subscriber — carrying the parent’s phone number. No email was given, so it holds a deliberately non-routable @attendee.invalid address: the account can never be mailed by accident. Give the parent’s email instead and it goes there.

Type the same name next term. The name box is a type-ahead over children the club already has. Typing “Eli” offers Elif Yilmaz — +44 7700 900115, so picking her re-uses the existing account and her parent’s number rather than creating a second Elif. That matching is scoped to class attendees, so a customer with a similar name can never be turned into a pupil by accident.

Why a real account. Capacity, tickets, check-in, reminders, the waiting list and the parent’s own page all key off a user. Inventing a lighter “guest attendee” would need a second path through every one of them. These accounts never log in unless the family wants them to, and never get a welcome email.

2.2 Put each child in their group

The rosters were created empty back in 0.9. Fill them from Users → Users Insights: tick the children, then Add to group. This is the step that makes the next one possible, and the one that gives a child their own sessions page.

2.3 A whole term in one click

On the register, Bulk enroll group → Enroll group into series puts every member of the squad into every remaining session of that weekday and time.

Measured on the demo. Mini Tennis’s Monday series: 48 enrolments in 15 seconds, with the four children already added by hand correctly reported as skipped. The Wednesday series added 52 more. Each one is a real $0 order, reservation and ticket, which is why the batch is capped — 300 for an administrator, 100 for a coach.

PART 03

Can you come?

The part the club cares about most. Everything above is preparation; this is the weekly conversation with twenty families.

3.1 What a parent sees

The child’s own account page carries the term: which squad, when it runs, who takes it, which court, and a button per session.

My Sessions page grouped by class with a header reading Mondays and Wednesdays 09:00, Martina Reyes, Tennis Court 1 and a list of dated sessions each with a cancel button
Grouped by class. The header states the pattern, the coach and the court once; the rows underneath are just dates. The fifth of October carries its own line, because that week is on Court 4 — the swap made back in 1.4.

This page was a flat list until this build. Twenty-six identical rows, no coach, no court. Grouping it, and saying out loud which week is different, is the change that makes it worth a parent opening.

3.2 “She can’t make Monday”

Cancelling is one tap, so it asks first — quoting the class and the date, with Keep my place as the safe answer.

In-page confirmation asking whether to cancel a named session, with buttons yes cancel it and keep my place
Confirmed in the page. The place is given up immediately, which is the point: the coach sees it straight away.

3.3 “Actually, she can”

An answer that only says no is half an answer. Cancelled sessions that have not started yet sit in their own section with a Rejoin button, and rejoining is honest: it fails if somebody else has taken the place.

Cancelled section of the sessions page listing two cancelled sessions each with a rejoin button
Both answers, on one page. Before this build, cancelling was a one-way door for any club that does not sell credit passes.
PART 04

At the net

Monday, nine o’clock. The coach opens one screen on a phone and works from it.

4.1 The phone the coach actually uses

There is a real app for this — installed on the coach’s home screen, full screen, no browser bar, and it keeps working when the court has no signal. It ships switched off, so the club turns it on once.

Settings → Rental Settings → Rental Setup, and set Mobile Staff App: Enabled to Yes. A second field appears underneath: Home shortcuts, which decides what the app’s home screen offers. Tick nothing and staff get all nine tiles. The club ticked two.

Rental settings showing Mobile Staff App Enabled set to Yes and the Home shortcuts checkbox list with Today's check-ins and Appointments ticked and the other seven tiles unticked
Two tiles, not nine. A coach needs today’s register and the appointment diary; Orders, Logistics and the reports belong to whoever runs the office. Press Update at the top of the settings page.

Each coach then opens yourclub.com/bb-app/ on their phone once, signs in with their own account, and adds it to the home screen — Add to Home Screen on an iPhone, Install app on Android. From then on it is an app.

The mobile staff app home screen on a phone, dark theme, with a search box and two tiles: Today's check-ins and Appointments
Home. Two tiles, and a tab bar along the bottom. A coach who is not also a shop manager gets the one tile they can use and nothing else.
The app check-in screen on a phone showing the date 09/21/2026, a session dropdown reading 09:00 Mini Tennis 5-8 Starter 4 Tennis Court 1, a Scan button, the bulk enroll panel, and four children each with a plus one button
Today’s check-ins. The date, then the session — each one named with the number enrolled and the court it holds. Under it, the four children.
The same phone roster after three taps: Emma Novak, Luca Ferrari and Noah Becker struck through with DONE badges and Undo buttons, Sofia Marin still to arrive
One tap each. Three in, one still to come. Every row can be undone, and the money column on the right is the same register the office sees.

The Scan button and the code box next to it are for a club that issues barcoded tickets — point the camera at a family’s phone and the child is checked in. A coaching squad of four rarely needs it. A holiday camp with a hundred children does, and it is the same screen.

A coach is not an administrator. Building this part turned up three things that assumed otherwise. The app’s home screen refused anyone without shop-manager rights, so a coach signing in was told they had no access and had to type the check-in address by hand. A Move to session button was drawn on every roster row that the server would always refuse. And two labels on the register — Bulk enroll group and Add attendee — came out white on white against the app’s dark theme, because that screen was styled for the white admin. All three are fixed, and what is above is the result.

4.2 The register knows what happened

The session picker names the court. Emma’s row is red and says Cancelled — the club was told on Friday, and the place is free.

Check-in screen for 14 September showing Tennis Court 1, a bulk enroll control, Emma Novak marked cancelled with a 48.00 in credit balance, and Luca Ferrari checked in with 12.00 owing
Red, and it says why. A cancelled child used to look exactly like a broken ticket; the word was added while building this guide. Each row also carries that child’s running balance and what this session costs them — $12.00 · 60 min — which is part 4.4.

4.3 Fill the place, mark the register

The coach types the first letters of the next child’s name; she is offered with her parent’s number already attached, because she was entered once before. Then attendance: one tap each.

Register showing Mia Kowalski and Noah Becker checked in, Sofia Marin flagged as a no-show at her own 8.00 per hour rate, and the Add attendee box below
Mia took the freed place. She was typed in by name, and the account was created behind her. Sofia never arrived, so the row says No-show — and note her session reads $8.00 where everyone else reads $12.00, because she has her own rate. Every row can be undone.

4.4 Send the week out

A club builds next week over a few days — a court moved, a coach swapped, a class cancelled — and only then is it worth telling anyone. So the schedule goes out when the admin says so, from a button on the Events Calendar.

Send the schedule control with from and to dates, Preview and Send buttons, a note that coaches get their roster and parents never see another child's name, a preview result reading 10 sessions 4 families 3 coaches, and a line recording the last send
Preview first, always. Send stays disabled until you have previewed, and changing the dates disarms it again — the figures on screen would no longer describe what goes out. The line underneath records the last send, so “did I already do this?” has an answer.

One message per person, covering their whole week. A child in two squads gets one email, not two; a coach with ten sessions gets one, not ten. And the two audiences get deliberately different things.

Coach email reading Updated dash Your schedule 21 to 27 September, four sessions listed with date, time, class, court, coach and the children in each
The coach gets the roster. Date, time, class, court — and who is in it. An empty class says nobody enrolled yet rather than going quiet.
Parent email reading Updated dash Your sessions 21 to 27 September with two lines showing date, time, class, court and coach, and no other child named
The parent gets their own child’s sessions. Never another child’s name — there is no setting for that, deliberately. A switch that can leak children’s names is a switch somebody eventually ticks.

Rain on wednesday. Move a court, press the button again. The second copy is headed Updated — so a parent does not read it as a duplicate and ignore the very change that prompted it.

The same message, other channels. Email always goes. If WhatsApp or SMS are switched on in Notification Channels, the same message follows on those — the plain-text version of the very same template, so nobody maintains two that drift apart. WhatsApp needs the gateway connected; SMS needs WPNotif.

PART 05

The books

Everything the club has to be able to answer on a Sunday evening: who owes money, who has been turning up, and what each coach is holding.

5.1 The money, without an invoice

Emma’s mother hands Martina $60 at the start of half-term. The coach taps Take payment on Emma’s row, types 60, leaves it on cash, and that is the whole transaction. No order, no checkout, no invoice.

Then the class is checked in, and each child’s wallet is charged for the session automatically. Tapping the balance opens that child’s ledger.

Phone check-in roster with Emma Novak checked in and 48.00 in credit, her ledger expanded below showing a 12.00 session charge on 21 September and a 60.00 cash payment to Martina Reyes on 17 September
Two rows, and both questions answered. −$12.00 · Session · 60 min @ $12.00/h is what tonight cost and how it was worked out. +$60.00 · Paid · cash · to Martina Reyes is when they last paid and who took it — the thing a club can never reconstruct afterwards. $60 in, $12 out, $48.00 in credit.

A balance is allowed to go below zero, and that is the point: it is how a club actually runs. Luca and Noah were checked in without paying, so each owes $12.00. Sofia did not come, so she was charged nothing at all.

A parent pays what they have. The amount box prefills whatever would clear the balance, and accepts anything above zero. Less leaves the rest owing; more becomes credit. Nothing caps a prepayment — paying a term up front is the case the wallet exists for.

5.2 The parent gets a receipt

Cash handed to a coach in a car park leaves the payer with nothing in their hand. So a payment — and only a payment — sends one.

Email reading Payment received 24.00, we have recorded 24.00 received on 17 September by Reservety Admin, your balance is now 24.00 in credit
Amount, date, who took it, new balance. Naming the person is the point — it is the thing a club can never reconstruct three weeks later. A balance is stated in words, so an amount owed reads $12.00 owing rather than a minus sign a parent has to interpret.

Only payments. A message for every session charge would be noise a club switches off within a week, and the running balance is already on the parent’s own account page. Nothing else in the wallet notifies.

5.3 Sunday evening, in one screen

WooCommerce → Class Money. Who owes, how much, when they last paid and to whom — and what each coach is holding.

Class Money admin screen showing collected 60.00, owed to the club 24.00 and held in credit 48.00, a who-owes-money table listing Luca Ferrari and Noah Becker at 12.00 each with last paid never, and a coach cash-up table
Three numbers and two tables. Last paid: never is a real and useful answer. The cash-up shows Martina holding $60.00 of the club’s money.

That last column is not a separate report. Cash a coach collects is money they are holding for the club, so it is deducted from what the club owes them — on the coach’s own payout ledger, next to the sessions they taught.

Martina Reyes payout ledger showing four assignment lines at 40 each and one manual line reading Cash collected minus Emma Novak at minus 60
Where the two ledgers meet. Teaching earns +40 a session; the cash she took reads −60. Settle up is the sum. Collect more than you have earned and it goes negative — the coach owes the club, and the screen says so rather than clamping at zero.

What this is not. These amounts are a club ledger, not shop revenue. They never touch orders, deposits or the Transactions report, which is what keeps cash at the net from disturbing the rest of the system — and what a club’s accountant needs to know before relying on it.

5.4 Who has actually been turning up

WooCommerce → Attendance, over any date range. Sorted worst first, because the child quietly drifting away is the one you want at the top — not buried alphabetically.

Attendance screen showing 11 sessions, 12 of 25 attended, 48 percent turnout, and a by-child table led by Sofia Marin at 0 of 3 with 3 missed in a row in red
Three in a row, in red. That is the number a club acts on. Last seen: never is a real and useful answer, and the turnout figure turns red under 70%.

And the same range session by session — the answer to “who was actually there on the fourteenth?”

By-session attendance table listing date, class, court, coach, present count and the names of who was missing for each session
Every session, and who was missing by name. A short session is flagged; a full one is not. Export CSV covers both tables, because attendance is what gets shown to a parent or a funder.

A cancellation is not an absence. A child who told the club in time is dropped from expected entirely, not counted as a no-show. Counting it against them would make the one honest thing a family can do look identical to not turning up. Attendance also only exists from the day a club starts checking people in — there is no history before that, and the screen says so.

PART 06

The courts nobody coaches

Five courts, two audiences. The club has to hold what it needs and sell the rest — and the adults who play every Tuesday need no coach at all.

6.1 Three ways to take a court off the market

They differ in what they can tell you afterwards, which is the only thing that matters when choosing between them.

A coach-less sessionwho has it, who came
A slot-quantity rulehow many are left
A plain blocknothing

The club’s regular adult four is the first case: Club Doubles · Tuesday Night is an ordinary session with a capacity of four and Tennis Court 3 attached to the whole series — and no coach. Because it is a session it inherits everything sessions get: it appears on the calendar and the board, the four players are enrolled and can cancel themselves, reminders go out, the court is genuinely held, and there is a register.

Why not just block the court. A block takes the court off the market and tells you nothing: not who has it, not whether they came, not whether a fifth player could join. Keep blocks for the cases with nobody to track — resurfacing, a storm, a corporate hire.

6.2 Private lessons pick a coach, not a court

Private Lesson (1–2 players) runs 16:00–19:00 Monday to Friday at $45 an hour, three at a time — one per coach. The customer either chooses their coach or lets the club decide, and a coach teaching a squad at that hour is not offered, because the class assignment already holds their time.

Provider settings on the private lesson product: Provider Mode set to Both, Provider Pool listing Martina Reyes, Tomas Klein and Priya Nair
Provider Mode: Both. “Both” means the customer may pick a coach or express no preference, in which case the club assigns one. The pool is simply the three employee records from 0.2 — the same people the board schedules and the ledger pays.

6.3 Anyone can book a free court

The public books Tennis Court Booking by the hour at $18. It never names a court: five units sit behind it and a free one is handed out. A class holding Court 1 removes one unit from that pool for that hour — it does not take the product off sale.

Public tennis court booking page showing pricing per hour and a date and time picker
One listing, five courts. Monday at nine, with two squads running, three courts are still on sale.

What this proves

Screenshots are of the running system, unretouched, captured on a live demo club.

Start Your Rental Business the Right Way

Reservety handles your website, bookings, inventory, and payments — so you can focus on growing your business.

Start Free Trial View Pricing
Free 14-day trial No credit card required Zero commission