HubSpot + CourtReserve integration
CourtReserve holds the members, court bookings and programme registrations a racquet club runs on, behind a key rated for sixty calls a minute.
Built by us
CourtReserve HubSpot - Into HubSpot
Is there a native CourtReserve + HubSpot integration?
No. There is no CourtReserve app in the HubSpot App Marketplace as of September 2026, so a club that wants its members in HubSpot is looking at a build. A scheduled service that reads each club and upserts members, reservations, events, memberships and transactions is the route that works. It pays for itself fastest for operators running more than one location.
- Recommended route
- Custom middleware
- Build effort
- 70 to 150 hours
- In the HubSpot App Marketplace?
- No listed app
- Typical elapsed time
- 4 to 8 weeks
Marketplace checked September 2026.
Why teams connect CourtReserve to HubSpot
Racquet clubs grow by noticing things. A member who booked twice a week all spring and has not booked since June is a cancellation waiting to happen. A guest who played four times on someone else’s court is a membership nobody has asked for. Both facts sit in the booking platform, and neither of them reaches the person whose job is to make the call.
Multi location operators feel this hardest. Each club is a separate account with its own key, its own members and its own events, so the head office view is a folder of exports. Nobody can say how many people play at more than one site, which locations share a customer base, or whether a campaign that filled courts in one city did anything in the next. The question gets answered once a quarter by hand, which means it gets answered late.
There is a revenue side too. Leagues, clinics and junior programmes sell out unevenly, and the difference between a full programme and a half empty one is usually a reminder sent to the right forty people. That list is a query over reservations and registrations, and it cannot be built in a system that has no reservation data in it. Clubs ask for this integration when they want lapsed players, programme prospects and membership renewals to behave like ordinary marketing and sales work rather than a manual project.
What syncs
Six object types cover the club. Members become contacts, memberships, reservations, events and registrations become custom objects, and transactions become deals. Transactions are the only thing that belongs in a pipeline, because they are the only object with money and a close date attached.
Every key is compound: the organization identifier plus the record identifier from that club. Identifiers repeat across clubs, so a bare booking id will collide the moment a second location is added, and the collision looks like a member cancelling a booking they never made. Contacts are the exception. HubSpot allows one contact per email address, so the same person at two clubs is one record, and a multi select property records every club they belong to. That property is merged on each run rather than replaced, or the last club to sync wins and the others disappear.
Everything travels one way. The booking platform stays the system of record for courts and money, and HubSpot is where the conversation happens.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Member | Contact | Into HubSpot | Organization id plus email, falling back to the member id | HubSpot enforces one contact per email, so a member at two clubs is one record. |
| Membership | Custom object | Into HubSpot | Organization id plus membership id | Tier and fee live here, not on the contact, because a member can change tier. |
| Reservation | Custom object | Into HubSpot | Organization id plus reservation id | Cancellations arrive on a separate list and must be read in the same run. |
| Event | Custom object | Into HubSpot | Organization id plus event id | |
| Event registration | Custom object | Into HubSpot | Organization id plus registration id, associated to the member and the event | |
| Transaction | Deal | Into HubSpot | Organization id plus transaction id | Transactions are the only object that belongs in a pipeline. |
Architecture
The pattern is polling with a watermark. A nightly job walks each club in turn, reads a short window of members, reservations, events, registrations, memberships and transactions, and writes to HubSpot with batch upserts keyed on the compound identifier, followed by an associations pass that links registrations to both the member and the event. HubSpot API paths are pinned to version 2026-03.
Clubs are processed sequentially rather than in parallel. The documented limit is 60 calls per minute per API key, and running several clubs at once turns a predictable nightly window into a queue of retries. Checkpoint state per club means an interrupted run resumes at the club it stopped on, not at the start.
The write side has to expect conflict. A batch create can fail because the email already exists on a contact created by another club, so the handler requeries the record, merges the club list, and patches rather than discarding the row.
What the API allows
- API style
- REST
- Authentication
- Basic authentication
- Webhooks
- Unknown
- Changed-since filter
- Partial
- Sandbox
- Unknown
- Rate limit
- 60 calls per minute per API key, with a 429 and a Retry-After header above it
Developer documentation api.courtreserve.com
Three ways to connect
There is no app, so the choice is between a service and an automation platform. Volume and identity decide it. One club, members only, a few hundred records a month: an automation platform will do, and the club will outgrow it the day it wants reservations. Several clubs, six object types and members who appear in more than one of them: you need somewhere to keep a watermark, somewhere to throttle, and a conflict handler that knows a duplicate email is an expected event rather than an error, which is a service you own rather than rent.
-
Custom middleware
RecommendedReading six object types across several clubs inside a 60 call per minute budget needs checkpoints, throttling and a conflict handler for shared members, which is a service rather than a configuration.
-
Automation platform
PossibleOne club with modest volume can push new members into HubSpot with an automation platform, as long as nobody expects reservations, cancelled bookings or cross club identity to come with them.
-
Native app
AvoidA marketplace search for CourtReserve returns no app published under that name, so there is nothing to install.
What breaks and how we prevent it
The rate limit, the date window, shared members and cancellations are what go wrong on a club sync, and all four are predictable.
Sixty calls a minute per key
Sixty calls a minute per key is a small budget for a club with years of history, and the first full backfill is where teams discover it. The defence is a minimum interval between requests, a retry that honours the Retry-After header, and one club at a time rather than many.
Reads bounded by a date window
Reads are bounded by a maximum date window, so a backfill has to be cut into chunks and a nightly run has to overlap its own window slightly. An exact, non overlapping window drops records that arrive during the run itself.
Members shared between clubs
The same email across clubs produces a conflict on create, and the naive fix, overwriting the record, erases the other club’s data. The defence is merge before compare: read the existing record, union the club list, then decide whether anything actually changed.
Cancelled bookings on a separate list
Active and cancelled bookings arrive on separate lists, and reading only the first leaves HubSpot with bookings that quietly never happened. The defence is to read both lists in the same run and mark the record rather than delete it, so the history stays intact.
Our approach
- Scope. We confirm which plan the club is on, because API access starts at the Advance tier, then agree how much history to load and which object types actually get used.
- Architect. We fix the compound keys, the custom object model and the consent design before any code, since all three are expensive to change after a load.
- Build. Batch upserts keyed on the compound identifier, a separate associations pass, throttling at the documented limit, and checkpoints per club from the first run.
- Validate. Everything runs against a sandbox portal behind a fail closed portal allowlist, and the production cutover is a token swap.
- Operate. Each run writes counts per club, reconciliation compares them against the source, and a backfill script stands ready for the day a club adds a location.
Common questions
Does CourtReserve have a HubSpot app?
A HubSpot App Marketplace search for CourtReserve turns up four results that merely mention the word, with nothing published under the name. Connecting the two systems is a build, sized by how many locations you run and how much history you want loaded.
What does the CourtReserve API let you read?
The vendor documents an organization level API covering memberships, members, families, events, reservations and transactions. Multi location data is described as an Enterprise plan feature. API access itself is limited to the Advance, Momentum and Enterprise plans, so a club on a lower tier has no programmatic route at all.
How is the CourtReserve API authenticated and how hard is the rate limit?
Keys are created in the club's settings and presented with basic authentication on each request. The documented limit is 60 calls per minute per API key, and going over it returns a 429 with a Retry-After header. That ceiling, not HubSpot, is what decides how long a nightly run takes.
How do you handle a member who belongs to two CourtReserve clubs?
HubSpot allows one contact per email address, so the same person at two clubs is one record. We keep a multi select property listing every club the person belongs to, set the primary club only when the contact is created, and merge the list on every later run rather than overwriting it.
How fresh is CourtReserve data once it reaches HubSpot?
One night behind. The sync runs nightly, outside club hours, because 60 calls per minute per key does not leave room for a frequent poll across several locations. A booking made this morning reaches the portal overnight. If a club needs a same day view, that is a smaller, separate job over members alone.
How do cancelled bookings and registrations reach HubSpot?
They come from a separate list, read in the same run as the active one. If you read only the active list, a cancellation looks like a record that simply stopped being updated, and the club's occupancy numbers drift upward every week until somebody notices.
Does a CourtReserve sync create marketing consent problems?
It can, which is why consent is designed before the first load. The platform records a marketing opt out per member, and we carry that into a property on the contact and into the legal basis field. Marketable status itself cannot be set through the HubSpot API, so a list and a workflow do the last step.
How long does a multi club CourtReserve build take?
Six object types across several locations, including the association passes and the backfill scripts, put discovery at ten to twenty hours and the build at seventy to a hundred and fifty. A single club with members and transactions only sits at the bottom of that range.
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Scope a CourtReserve integration
Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.
Thanks, we will reply within one business day
Prash or Sean reads every one of these and comes back with a scope, or with the one question we need answered first.
Where these facts come from
- Understanding the CourtReserve API help.courtreserve.com
- Set up API Access Integration | CourtReserve Help Center help.courtreserve.com
- CourtReserve - Reserve & Play api.courtreserve.com
- Pickleball & Tennis Club Management Software | CourtReserve courtreserve.com