> For the complete documentation index, see [llms.txt](https://docs.kula.digital/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.kula.digital/your-data-sources/gymmaster.md).

# GymMaster

Connect GymMaster to bring in members, classes, attendance, and memberships — read-only.

GymMaster brings the core of your studio — **members, staff, clubs, classes, attendance, and memberships** — into Kula Intelligence.

## What we read — and what we don't

* **We read:** your members and the staff and clubs they belong to, your class schedule and class attendance, and membership detail — read-only.
* **We don't:** book, cancel, charge, or change anything in GymMaster.

## What you'll need

GymMaster splits access across **two API keys**, so you'll enter both:

* Your GymMaster **base URL** — the web address you log in at, e.g. `https://yourgym.gymmasteronline.com`.
* A **Staff (high-permission) API key** — used to read members, staff, and clubs.
* A **Member (general) API key** — used to read the class schedule, attendance, and per-member detail.
* Optionally, your studio's **timezone** (e.g. `Australia/Sydney`). GymMaster returns class times in local time; setting this keeps them stored correctly. If you leave it blank we use your studio's timezone.

Both keys live under **Settings → Integrations** in GymMaster, and are stored AES-256-encrypted in your own Kula database — you can revoke them in GymMaster at any time.

## How to connect

1. In GymMaster, open **Settings → Integrations** and copy both API keys — the Staff (high-permission) key and the Member (general) key. Note your base URL too.
2. In Kula, open **Connectors → GymMaster**, paste the base URL and both keys (and your timezone if you have it), and click **Test**. We do a quick read against your studio to confirm both keys work — if it fails, the message tells you which key to check.
3. Click **Connect**, then start the **import** to land your history.
4. When the import finishes, click **Process** to turn it into the tidy members, attendance, and memberships the AI reads.

## Good to know

* **Two keys, two jobs.** If the test fails, it names which key didn't work — the high-permission key reads members/staff/clubs, the general key reads classes and attendance. Re-check that one in **Settings → Integrations**.
* **GymMaster rate-limits hard.** Its API is slow to pull from, so a busy studio's first import takes a while and runs in the background, oldest first. It resumes where it left off if interrupted, so you can close the tab.
* **Attendees come through as names.** GymMaster returns class attendance by attendee name rather than a stable member ID, so we match those names back to your members. The occasional name that can't be matched is expected; it doesn't hold up the rest of your data.
* **Deactivating a member in GymMaster loses their history at the source.** GymMaster drops a deactivated member's past detail, so keep members active there until after the import if you can.
* Re-running the import only fills gaps; **Process** is safe to repeat.

## If it stops working

The usual cause is a rotated or revoked API key. Generate a fresh key under **Settings → Integrations**, re-enter it on the connector's page, and re-test. See [Keeping your connectors healthy](/your-data-sources/operating.md).
