Coachbase does not provide a booking system. Instead, it integrates with your existing booking platform — pulling appointment data via REST API, or accepting periodic uploads via Excel or JSON. Once connected, bookings appear in your Coachbase dashboard enriched with athlete context and direct session links.
When you onboard, we help configure the connection to virtually any booking platform — from custom in-house systems to commercial gym management tools. If your system can export a JSON or Excel file, or expose an API endpoint, it will work.
Coachbase supports four ways to bring booking data into the app:
| Type | How it works | Best for |
|---|---|---|
api |
Coachbase polls a REST endpoint you configure at a regular interval. Requires an endpoint that returns an array of BookingType objects. | Live or near-real-time sync with any booking system that has an API |
excel |
Upload a .xlsx or .xls file. Columns must match the BookingType field names (case-insensitive). |
Periodic bulk imports, legacy systems without an API |
json |
Upload a .json file containing an array of BookingType objects. |
Custom exports, developer-friendly imports |
manueel |
Bookings entered manually inside the app. No external integration needed. | Small volumes, one-off appointments, testing |
All booking data — whether from an API, Excel, or JSON — is normalized to the BookingType shape before processing. When using the API or JSON connection type, your endpoint or file must return objects that match this shape.
A unique identifier for this booking. Used to detect duplicates during sync. Can be any string — your booking system's native ID is ideal.
Date of the booking in DD-MM-YYYY format. Example: "17-04-2026". This format is required — do not use ISO 8601 or locale-specific formats.
Start time of the booking in HH:MM 24-hour format. Example: "09:30", "14:00".
Full name of the athlete. Displayed in the booking board and used for fuzzy-matching against existing athlete profiles. If a match is found, the booking is automatically linked to the athlete's profile.
Athlete email address. Used as a secondary matching signal against athlete profiles. Takes priority over name matching when both are present.
If your booking system already knows the Coachbase athlete ID, pass it here and the lookup step is skipped entirely.
Your booking system's internal client/member ID. Stored for reference; not used by Coachbase's matching logic unless you configure a custom ID mapping.
An array of label/value pairs that classify this booking. Tags are used to create dynamic columns in the booking board view. See Tags & Filtering below.
{
"id": "booking-abc-001",
"date": "17-04-2026",
"hour": "09:30",
"athleteName": "Alex Müller",
"email": "alex@example.com",
"tags": [
{ "label": "gender", "value": "male" },
{ "label": "location", "value": "amsterdam" },
{ "label": "session-type", "value": "strength" }
]
}
Your API endpoint must return a JSON array at the root level:
[
{
"id": "booking-001",
"date": "17-04-2026",
"hour": "08:00",
"athleteName": "Sara Jansen",
"email": "sara@gym.nl",
"tags": [{ "label": "gender", "value": "female" }]
},
{
"id": "booking-002",
"date": "17-04-2026",
"hour": "09:00",
"athleteName": "Tom de Vries",
"tags": [
{ "label": "gender", "value": "male" },
{ "label": "session-type", "value": "cardio" }
]
}
]
When using the api connection type, you configure an endpoint URL and an optional API key in Team Settings → Booking Integration. Coachbase sends a GET request to your endpoint with the key in the Authorization header:
GET https://your-system.com/api/bookings
Authorization: Bearer YOUR_API_KEY
Your endpoint must:
200 on successContent-Type: application/jsonYour endpoint can optionally support ?from=DD-MM-YYYY&to=DD-MM-YYYY query parameters. Coachbase will append them to limit the response to the relevant date window. If your endpoint ignores them, Coachbase filters the full response client-side — at the cost of a larger payload.
For .xlsx / .xls uploads, the first row must be a header row. Column names are matched case-insensitively to the BookingType field names. The minimal required columns are id, date, and hour.
| Column name | Required | Notes |
|---|---|---|
id | Yes | Any unique string per row |
date | Yes | DD-MM-YYYY |
hour | Yes | HH:MM 24-hour |
athleteName | No | Full name for profile matching |
email | No | Email for profile matching (priority over name) |
athleteId | No | Coachbase athlete ID — skips matching entirely |
athleteLocalId | No | Your system's internal member ID (stored for reference) |
tags | No | JSON string, e.g. [{"label":"gender","value":"male"}] |
If your Excel file uses different column headers, the upload wizard provides a column remapping step before confirming the import.
Upload a .json file containing a root-level array of BookingType objects (see example above). All field names and formats follow the same rules as the API response format.
Tags are the primary mechanism for organizing bookings beyond date and time. Each tag is a { label, value } pair attached to a booking. In the booking board view, all unique tag labels across visible bookings become available filter axes — letting you split the board by gender, location, session type, or any dimension your workflow requires.
When the booking board renders, it collects all distinct tag labels across the visible bookings. Selecting a label as the active filter splits the board into one column per unique value for that label. Bookings that don't carry the selected label appear in an Untagged column.
Example: if some bookings have { "label": "gender", "value": "male" } and others have { "label": "gender", "value": "female" }, activating the gender filter produces two columns: Male and Female.
| label | Example values | Use case |
|---|---|---|
gender |
male, female |
Split board by client gender |
location |
amsterdam, rotterdam, online |
Multi-location gym chains |
session-type |
strength, cardio, rehab |
Filter by type of session booked |
coach |
sarah, mark |
Separate bookings by assigned coach |
membership |
premium, basic |
Tier-based board views |
A single booking can carry tags with different labels simultaneously — for example gender: male and location: amsterdam. You can switch the active filter axis in the board at any time without losing any tag data.
In addition to tag-based column splitting, the booking board always supports a Planning view — which groups bookings chronologically within the current day, independent of any tag filter. This is the default view when no tag filter is active.
When a booking arrives without an explicit athleteId, Coachbase attempts to link it to an existing athlete profile using the following logic, in priority order:
email against athlete profilesathleteName against athlete.nameOnce a booking is linked to an athlete, the coach can open the athlete's profile, view their active program, and navigate directly to the next scheduled training session — all from the booking card.
For API connections, Coachbase polls the configured endpoint at a regular interval (configurable in Team Settings, default: every 15 minutes). The id field is used for deduplication — a booking with the same ID will not be duplicated even if it appears in multiple consecutive poll responses.
If a booking's details change between polls (e.g. the time is rescheduled in the external system), the existing record in Coachbase is updated automatically. Manually assigned athlete links are preserved across updates.