Bookings

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.

ℹ️
Onboarding assistance included

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.

Connection Types

Coachbase supports four ways to bring booking data into the app:

TypeHow it worksBest 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

BookingType — Data Shape

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.

id string required

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 string required

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.

hour string required

Start time of the booking in HH:MM 24-hour format. Example: "09:30", "14:00".

athleteName string optional

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.

email string optional

Athlete email address. Used as a secondary matching signal against athlete profiles. Takes priority over name matching when both are present.

athleteId string optional

If your booking system already knows the Coachbase athlete ID, pass it here and the lookup step is skipped entirely.

athleteLocalId string optional

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.

tags { label: string; value: string }[] optional

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.

Example — Single Booking Object

{
  "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"  }
  ]
}

Example — API Response (Array)

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" }
    ]
  }
]

API Endpoint Configuration

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:

💡
Date range filtering

Your 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.

Excel & JSON Upload Format

Excel Columns

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 nameRequiredNotes
id YesAny unique string per row
date YesDD-MM-YYYY
hour YesHH: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
athleteLocalIdNo 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.

JSON Upload

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 & Filtering

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.

How Tags Create Columns

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.

Common Tag Patterns

labelExample valuesUse 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
💡
Multiple tags per booking

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.

Planning Sort

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.

Athlete Matching

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:

  1. Email match — exact match on email against athlete profiles
  2. Name match — fuzzy match on athleteName against athlete.name
  3. No match — booking appears as unlinked; the coach can manually link it from the booking board

Once 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.

Sync & Deduplication

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.