Academy setup
Work through this once, in order, when you are setting an academy up. Most setup problems are a missing record earlier in the chain, so the order matters more than it looks. For the work you do afterwards, see Running the academy.
How the core records fit together
Most setup problems happen when a required record earlier in the chain is missing. Use this relationship map before creating schedules, enrolling students, or troubleshooting check-in.
A belt system defines rank levels and stripes. A program can link to one belt system so enrolled students can receive ranks in that progression.
Example: New academies start with Adult BJJ (IBJJF Adult) and BJJ Kids (IBJJF Children Full), both with 4 max stripes and rank shared across academies. Adult Gi and Adult No-Gi can both use Adult BJJ; add a custom system only when you need a different progression.
A program is the activity being taught. A recurring schedule must select a program and instructor; it produces dated class instances with rosters and attendance.
Example: The Adult BJJ program has a recurring Monday/Wednesday 7pm schedule. That schedule creates dated class instances such as “Adult BJJ — Mon Mar 3, 7:00pm,” and attendance is recorded on each instance.
Every plan must include at least one program. Those links determine which programs an active plan enrollment grants access to.
Example: A Monthly Unlimited BJJ plan includes Adult Gi and Adult No-Gi. A Kickboxing 1x weekly Add-on plan includes only one Kickboxing class a week. Creating either plan requires those programs to exist first.
Member → Account → Plan enrollment
A member is a person. An account is the billing or household container. Add the member to an account before assigning that person a paid plan.
Example: The Doe Family account includes Jane, John, Joey, and Jill. Jane and John each have Unlimited Adult BJJ; Joey and Jill are in the Kids program; Jane also has a Kickboxing add-on. Everything bills against the Doe Family account, and they can see each plan as a line item on their monthly statement.
Plan enrollment → Program access
An active plan enrollment grants the member access to that plan’s programs. A freeze, cancellation, or payment failure beyond the grace period can remove that access.
Example: Jane’s active Monthly Unlimited BJJ enrollment grants Adult Gi and Adult No-Gi. If that enrollment is frozen, cancelled, or past the payment grace period, she loses access to those programs even though she is still a member of the academy.
Program access → Class check-in
The class program must be in the member’s effective program access. Account state, waiver status, and the academy check-in window must also allow attendance.
Example: Jane can check in to tonight’s Adult Gi class because she has Adult Gi access, her account is not suspended, her waiver is signed, and class is inside the academy’s check-in window. She cannot check in to Kids BJJ because that program is not on her plan.
Link group → Program mapping → Guest check-in
Linked academies share a group. Explicit program mappings tell ControleHQ that Adult Gi at HQ is the same activity as Adult Gi at a satellite. A plan’s link access scope decides which academies a member may visit.
Example: HQ’s Unlimited BJJ plan is set to entire link group. Jane trains at Northside; kiosk search finds her as Guest from HQ if Adult Gi is mapped.
Home academy → Platform billing
When a student is active at more than one linked location, platform billing counts them once at their home (billing) academy.
Example: Jane is billed for ControleHQ at HQ even when she checks in at Northside.
Understand the records before setup
- Member: one student, instructor, staff member, or administrator in the academy. Pending invitees cannot use all enrollment actions until they join.
- Account: an individual or family billing group with members and a primary contact. It is not a login and does not itself attend classes.
- Program: an activity or curriculum such as Adult Gi or Kids BJJ. It connects plans, schedules, ranks, streaks, and attendance.
- Plan: a priced membership product containing one or more programs. Base plans provide core access; add-ons can be configured to require an active base plan in the same account.
- Program enrollment (payment bypass): owner/admin-only legacy access to a program without a paid plan; used for comps. Not managed from the Members table.
- Plan enrollment: a specific member’s subscription to a plan inside an account. Active or in-grace payment_failed grants access; pending_payment does not. Staff can complete, email, or copy a payment link from the plan ⋯ menu.
- Recurring schedule: the weekly template for a program. It generates class instances; attendance is recorded against an instance, not directly against the template.
- Belt system and rank: each academy starts with Adult BJJ and BJJ Kids defaults. A program must link to a belt system before students in that program can track meaningful ranks.
- Link group: a set of academies that can share program mappings, optional shared waivers, and cross-training membership plans. Students still bill and count for platform pricing at one home academy.
Recommended academy setup order
- 1General Settings: set timezone, check-in window, leaderboard, streaks, payment rules, logo, and menu access.
- 2Public page: configure academy contact details, theme, and public-facing content.
- 3Waivers: create a template and publish it as the current waiver.
- 4Belt systems: review the default Adult BJJ and BJJ Kids systems (or add custom ones), then confirm stripe limits.
- 5Rank Advisor: optionally define per-belt promotion formulas (derived stripe/belt steps).
- 6Programs: create programs and link belt systems.
- 7Linked academies (multi-location only): create or join a link group, map programs, copy plans/class templates/waivers, and set plan link access.
- 8Schedule: create recurring weekly class slots.
- 9Plans: create base/add-on memberships, prices, billing intervals, and program access.
- 10Members and Accounts: invite members, create households, and enroll students.
- 11Billing and Stripe Connect: configure platform billing and member payment processing.
- 12Kiosks: configure the staff PIN, behavior, and paired devices.
- 13Text messaging (optional): collect mobile numbers so members and instructors can opt in to class and cover texts.
- 14Class cover (optional): list backup instructors on each recurring class so cover requests have somebody to ask.
Configure general academy settings
- 1Select the gear icon, then General Settings.
- 2Choose the academy timezone before creating schedules.
- 3Set how many minutes before class check-in opens and how long after class it closes.
- 4Choose weekly or per-class streak mode and configure leaderboard visibility.
- 5Configure whether add-on plans require a base plan and set the payment grace period.
- 6Upload the academy logo and save changes.
- 7Review Menu access to choose which tools instructors and staff can see.
Publish the public academy page
- 1Open Public page.
- 2Add the academy description, address, contact details, theme, and other available public information.
- 3Choose which qualified team members and membership plans should appear publicly.
- 4For a plan to appear during public signup, make it an active, non-archived base plan; enable public signup; link programs; synchronize it with Stripe; and select it for the public page.
- 5Preview the academy’s public URL before sharing it. The public schedule renders class days and times in the academy timezone, so set that in General Settings first.
Create and publish a waiver
- 1Open Waivers and create a template with a clear title and complete legal text.
- 2Review the saved version, then mark it as the current waiver.
- 3Decide whether any individual member should be waiver-exempt from the Members page.
- 4When replacing a waiver, understand that the new current version may require every non-exempt member to sign again.
- 5Use revoke signatures only when you intentionally need to force re-signing.
- 6For multi-location groups, copy the current waiver from Linked academies → Copy so sister academies can match text for shared-waiver mode.
Shared waivers across a link group only stay on while every academy’s current waiver text matches. Publishing a different version at one location turns shared mode off until texts match again.
Linked academies
Link groups let members with the right plan check in at other locations. Access is mutual in this release. Guests do not get a member row at the visiting academy. There is no extra platform fee; students count once at their home academy. Cross-academy data export and consolidated analytics beyond the billable roster are not included yet.
- 1Open Organization → Linked academies and create a group, or accept a pending invite. Invite other academies by their public org slug.
- 2Use the Overview checklist: invite a sister academy, map programs, align waivers, and confirm shared-waiver status.
- 3From the Copy tab, choose a direction — copy to a sister academy or from one into this academy — then copy programs (belt systems map by shared IBJJF template when possible), class templates, membership plans, and the current waiver. Source and destination must differ, and your academy must be one of the two. Copied plans arrive as drafts—publish to Stripe on the destination academy before taking payments.
- 4On Program mappings, map each home program to the equivalent program at every visiting academy (for example HQ Adult Gi → Northside Adult Gi).
- 5On each membership plan under Plans, set linked academy access: this academy only, the entire link group, or specific linked academies.
- 6On the consolidated roster, set each student’s home (billable) academy so ControleHQ counts them once for platform billing.
- 7Shared waivers turn on automatically when every academy’s current waiver text matches; turn them off to force per-academy signatures.
- 8Kiosk search includes eligible guests. They appear with a Guest from home academy label and will not show on Members.
- Mutual access: any member with a granting plan can visit any academy in the group (subject to program mappings).
- Guests check in without a local member profile; they show on class rosters and kiosk search only.
- Payment grace and account suspension are evaluated at the home academy; the class check-in window is evaluated at the visiting academy.
- Copied class templates do not copy instructors, facility areas, or generated class instances.
Check-in uses the home academy for payment grace and account state, and the visiting academy for class window and (unless shared) waiver. Students can follow Train at a linked academy.
Create belt systems, programs, and schedules
- 1Open Belt systems. New academies already have Adult BJJ (IBJJF Adult) and BJJ Kids (IBJJF Children Full): 4 max stripes each, with share rank across academies enabled. IBJJF templates include minimum ages per belt (editable). Add custom systems only when you need a different progression.
- 2Create programs such as Adult Gi, Kids BJJ, or Kickboxing and link each to the correct belt system (or leave unlinked for non-ranked programs).
- 3Set the instructor-confirmation requirement on each program: Use academy default, None, or Required. Leaving it on the default means later changes to the academy setting reach the program.
- 4Open Schedule and add recurring weekly slots with program, title, day, time, and duration.
- 5Open generated class instances to manage rosters and attendance.
Defaults appear automatically for new academies and for existing academies the next time Belt systems, Programs, Members, or Rank Advisor is opened—unless a system with the same name or IBJJF template is already present. Enter each member's date of birth (Members detail or Account → Profile) so Rank Advisor can apply age floors.
Configure Rank Advisor formulas
Rank Advisor (Organization → Rank Advisor) tracks progress toward the next stripe or belt. Promotions stay manual — the page never auto-promotes.
- 1Prerequisites: link a belt system to a program (defaults Adult BJJ / BJJ Kids are fine), enroll students, and record an initial rank when needed.
- 2Open Rank Advisor and select the belt system to configure.
- 3Set Almost ready at % (students near the next stripe or belt threshold).
- 4Open Promotion formulas, choose a belt, and build nested AND/OR requirements (time in belt in days, mat hours, regular rounds, competition rounds, or points).
- 5Save. Stripe and next-belt steps are calculated automatically by dividing the belt formula across max stripes + 1 (or stripe-only steps on the highest belt).
- 6Optionally leave the highest belt without a formula when promotion timing should stay fully manual (for example adult black belt).
- One formula covers a full belt cycle (0 stripes through the next belt). With 4 stripes, that is 5 equal steps.
- If max stripes is 0, the whole formula is one step: promote to the next belt.
- Metrics count since the student earned that belt (first promotion onto that belt level), not since the last stripe.
- Only students enrolled in a program that uses the belt system appear on the list.
- List sections: Ready for next stripe/belt, Almost ready, Blocked by age (next belt has a minimum age the student has not reached), In progress, No criteria, and No rank.
- When recording a promotion, choose Now or a custom date. Click the belt start date on a row to edit any promotion dates for that member on the selected belt system.
- Promoting from Rank Advisor or Members creates the same promotion record and notifications.
- Grant Rank Advisor menu access under General Settings → Menu access if instructors cannot see it.
- Date of birth is optional. Without it, age floors are skipped for that student. With it, students waiting on a next-belt age requirement appear under Blocked by age and Promote is disabled.
Example: a White belt formula of 180 days and 40 mat hours with 4 stripes means each stripe (and the step to Blue) needs about 36 days and 8 mat hours of progress since White was awarded. Instructors still decide when to promote.
Create plans and connect program access
- 1Create the programs the plan should unlock before opening Plans.
- 2Open Plans and create a base or add-on plan.
- 3Set the price, billing interval, and at least one included program.
- 4Use a base plan for core membership. Use an add-on for optional access, and check the General Settings rule that may require a base plan in the same account.
- 5Optionally cap how many classes the plan buys: a count and a period, week or month. Leave the count blank for unlimited.
- 6Watch the line under the field while you type it. It says how many members on this plan would already have been blocked this period, because a limit takes effect the moment it is saved and counts classes people have already taken.
- 7Archive obsolete plans instead of using them for new enrollments.
- 8For paid or public signup, connect Stripe and confirm the plan is synchronized before taking payments.
- 9Optional: set linked academy access to this academy only, the entire link group, or specific academies. Copied plans arrive as drafts on the destination and need Publish to Stripe there.
- A week runs Sunday to Saturday and a month is the calendar month, both in the academy timezone. Neither follows the member’s billing date, because “12 a month” is read as the month on the wall.
- Allowances add up across a member’s plans, and one unlimited plan lifts the cap for the whole set. Only plans that already permit check-in contribute — paused, cancelled and unpaid ones grant nothing.
- Usage is counted once against the summed allowance rather than attributed to a particular plan, so nobody has to answer which plan a class was “on”.
- Every check-in spends allowance whatever recorded it, staff-entered ones included, and a visit to a linked academy counts against the home plan that allowed it. Seminars do not count.
- Clearing the count removes the limit. A period with no count is not stored, so a plan cannot read as limited when it is not.
Editing a plan’s program links changes the access that active plan enrollments provide. A plan does not create classes; schedules still need to be created for the linked programs. A class limit applies immediately and looks back over the period that has already happened — setting “3 per week” on a Friday can turn people away that evening, which is what the preview beside the field is for.
Set up text messaging (SMS)
Texts are operational, not marketing: schedule changes and cover requests. Every number goes through a double opt-in, so entering a number never subscribes anybody. ControleHQ sends one confirmation text and nothing further until the recipient opens the link and confirms for themselves.
- 1Members add their own number under Account → Profile and tick the consent box there.
- 2To add a number on someone's behalf, open Members → member detail and use Mobile number. Saving texts them a confirmation link; the button then reads Resend.
- 3When inviting a new member, the optional Mobile number field on the invitation form sends the confirmation link once they accept the invitation.
- 4Watch consent on the Members list: the SMS badge means confirmed, SMS pending means asked but not confirmed, No SMS means they will not be texted.
- 5Unconfirmed links expire after 72 hours; the number is then marked opted out and is not messaged.
- Entering a number for someone is not consent. Only the recipient confirming their own link records it, with the date, time, and IP address.
- A member who replies STOP is blocked at the carrier. Nothing sent from ControleHQ can reach them, so the resend controls are disabled for that member — they must text START, which unblocks and returns a fresh confirmation link.
- START lifts the carrier block but does not restore consent; the returned link still has to be opened.
- The Members list shows consent status only. The number itself is in the member detail modal, so a roster is never a list of everyone's mobile numbers.
- Sending requires the platform's Twilio credentials to be configured. Without them, saving a number reports that SMS is not configured and no confirmation text goes out.
The public SMS messaging and opt-in page describes the whole programme, including the verbatim consent wording and example messages, without needing an account — share it with anyone who asks how consent is collected. The Privacy Policy and Terms of Service cover the same ground. Mobile numbers and consent are never shared with third parties for marketing and are never sold.
Set up class cover
Cover requests ask a fixed pool of backup instructors whether they can teach a class. The pool is per recurring class and is the only source — if it is empty, a cover request has nobody to ask and an admin is alerted instead.
- 1Open Schedule, find the recurring class, and edit it.
- 2Under Backup instructors, tick everyone who could teach that class. Only these people are ever asked.
- 3Heed the warning under an empty list — that class has no cover pool at all.
- 4Set the academy-wide defaults under Organization → General → Instructor cover. Choose the Confirmation mode first: the timings are grouped by when they apply, and the group that only matters when confirmation is required is hidden until it is.
- 5Override any of them on a single program under Programs. An empty box there inherits the academy value, so later changes to the default still reach that program.
- 6Watch the Confirmation column on Schedule → Class instances. A class whose assigned instructor is out and which nobody has picked up is flagged No instructor in red.
- Requests go out in-app and by email to everybody in the pool, and additionally by text to those who have confirmed a mobile number. Text is an accelerant, not the mechanism — a member without SMS is still asked.
- Anyone who has turned off Ask me to cover classes in their profile is left out of the pool entirely.
- The first acceptance wins and closes the request; everyone else is told it is taken. Two simultaneous taps cannot both succeed.
- Accepting sets a cover instructor for that one class and leaves the recurring assignment alone, so the roster reads as covering for the original instructor and the history survives.
- Rescheduling, cancelling, or assigning an instructor by hand closes a request that is in flight and tells the people who were asked, so nobody is left holding a stale message.
- Backup instructors are not copied when you copy a class template to a linked academy.
- Four settings apply only when confirmation is required — when to ask, when the answer is due, when to remind the instructor, and when to close a search that a missed confirmation started. With confirmation set to Not required they are hidden, because tuning a number that does nothing is worse than not seeing it.
- The searching settings always apply. A search still happens with confirmation off: an instructor drops out and the backups are asked, so how long to search, when to stop, and whether to remind the pool all still matter.
- Every timing is expressed against the class: when to ask for confirmation, when the answer is due, and when the search closes. A search started by somebody dropping out instead runs for a fixed length from that moment, because a deadline counted back from class time may already have passed.
- Closer to the class than the floor — thirty minutes by default — no search is started at all. A text will not find anyone in time, and alerting an admin immediately is more use than pretending to look.
- Reminders are off until you set them. There are two, each sent once: one nudging the assigned instructor before their deadline, one nudging the backups before the search closes. Anyone who has already declined is never asked again.
Cover requests reach instructors by text only where consent has been confirmed, which is the practical reason to set up text messaging first. Instructors can see what they are asked and opt out of the rota themselves — see Cover a class for someone else.
Configure security and SSO
- Use Security Policies to configure organization MFA requirements and allowed factors.
- Use SSO to configure supported SAML or OIDC enterprise connections and provisioning.
- Some SSO and security mutations require the Admin role specifically, even when Owner can see the menu.
- Test a new connection with a limited group before broad rollout.
- Keep at least one working owner/admin login outside a new SSO connection until testing is complete.
When a button, member, plan, or class is missing
- Cannot create a plan: create at least one program first because every plan requires one or more included programs.
- Cannot create a recurring class: create an active program and ensure an eligible instructor exists; the schedule needs both.
- Add plan enrollment is disabled: the account needs at least one joined member and an available plan. Pending invitees and admin-role users are not valid billing-account members.
- A member is absent from the plan selector: add that joined member to the account first and confirm they are not an Admin.
- Cannot add an add-on: check whether General Settings requires an active base plan in the same account, then add the base enrollment first.
- Plan is absent from public signup: verify base type, public-signup setting, active/not archived state, linked programs, Stripe synchronization, and public-page selection.
- Student cannot see or check into a class: confirm the schedule generated a class instance, the instance uses a program the student can access, and the current time is inside the check-in window.
- Program enrollment seems ignored: distinguish paid plan access vs payment bypass. Pending payment blocks check-in until paid.
- Complete pending payment: member uses Account → Billing, or staff uses plan ⋯ → Complete payment, Send payment request, or Copy payment link (Members, member detail, or Account detail).
- Send payment request fails: confirm RESEND_API_KEY is set and the billing contact or enrolled member has an email address.
- Access stopped unexpectedly: check cancellation, freeze dates, payment-failed status and grace period, account suspension, and whether the plan still includes the program.
- Rank controls are empty: link a configured belt system to the student’s program and ensure that belt system has levels.
- Rank Advisor list empty or No criteria: enroll the student in a program using that belt system, set an initial rank, and save a promotion formula for their current belt.
- Guest not on Members: expected for linked-academy visitors; they appear on class rosters and kiosk search only.
- Guest check-in denied: map the home program to the visiting class program, and confirm the home plan is not local-only.
- Copied plan cannot take payments: publish it to Stripe on the destination academy.
- Shared waivers turned off after an edit: templates no longer match; copy the waiver or align the text, then try enable.
- Variant cannot be ordered: it is out of stock and its inventory mode blocks selling at zero. Restock, or change the variant to backorder or presale.
- Copy tab shows no entities: the lists always come from the source academy, so check the copy direction and that the source actually has programs, plans, or a current waiver.
- Invitation code rejected: codes expire after 7 days, and repeated failed attempts from one address are throttled. Create a fresh invitation.