# Spot the clients who stopped rebooking and book them back in

> A standing list of everyone who books with you, ranked by who is overdue for their next session, so you can book them back in without leaving the screen.

- Workflow type: app
- Services: Cal.com, HubSpot
- Categories: Sales, Operations
- Published: 2026-08-16

## What it does

- Builds a list of every client who has ever booked with you, showing how many sessions they have had, when the last one was, and whether anything is on the calendar next
- Works out each person's own normal rhythm, so a monthly client and a weekly client are judged fairly, and floats anyone who is overdue with nothing booked to the top
- Opens a booking panel on any client, shows your real availability for the next two weeks, and books the session in their name, adding a colleague as a guest when one should join
- Shows their CRM record beside the booking panel so you know their deal and lifecycle status before you reach out, and records the rebooking back to the CRM afterwards

## What you'll need

- A Cal.com account where you take your client bookings
- A HubSpot login, so the app can show each client's record and log a note when you rebook them
- A few months of past bookings in Cal.com, since the list is built from your booking history

## Prompt

Build me a client rebooking desk on top of Cal.com and HubSpot. I coach and consult, and most of my income comes from people who book me again and again. The problem is that nobody cancels loudly. A regular just quietly stops rebooking, and I notice months later. I want one screen that shows me everyone who has booked with me before, tells me who is overdue for their next session, and lets me book that session for them without leaving the app.

The main view is a roster of past clients. Build it by paging Cal.com Get All Bookings over the last six months, using take and skip until the pagination metadata says there is no next page, then group the results by attendee email. That email is the identity key for the whole app. For each person show their name, their email, total number of sessions, the date of their most recent session, how many weeks ago that was, and whether they already have a future booking on the calendar. Make the number of months of history a setting the user can change, since a six month window is a starting point and not a rule.

The cadence logic is the heart of the screen, so do not hardcode a fixed number of weeks. For each person, sort their past bookings by date, compute the gaps between consecutive bookings, and take the median gap as their personal normal rhythm. Flag someone as lapsed when the time since their last session exceeds their own median gap by a meaningful margin, around one and a half times, and they have no future booking. A client who books monthly and a client who books weekly must not be judged by the same ruler. Make that multiplier adjustable in settings.

Someone with only one past booking has no rhythm to measure, so do not force them into the lapsed list. Put them in a separate group called something like never returned. Sort the board so lapsed clients sit at the top, ordered by how far past their own rhythm they have drifted, then the never returned group, then everyone who is on track. Someone with a future booking already on the calendar is never lapsed, no matter how long ago their last session was, and should be visually marked as booked.

Clicking a person opens a detail panel. On one side show their booking history, every past session with its date and session type, plus their computed rhythm and how overdue they are. On the other side show their CRM context, fetched with HubSpot Get Contact using the email address as the lookup with the idProperty parameter, falling back to HubSpot Search Contacts on the email when the direct lookup finds nothing. Show lifecycle stage, contact owner, and company. Request the contact's associated deals and pull each one with HubSpot Get Deal to show deal name, stage and amount, so I can see whether this is a live opportunity before I reach out. If the person has no HubSpot record at all, say so plainly and let the rest of the panel keep working.

The same panel is where I book the next session. Populate a session type picker from Cal.com Get All Event Types, which returns the event types for the authenticated user. Do not ask me to paste event type IDs anywhere. Default the picker to the session type this particular person has booked most often in their own history, since that is almost always the one I want, and let me override it. Once a session type is chosen, call Cal.com Get Available Time Slots for that event type across the next fourteen days and show the open times grouped by day. Make the look ahead window configurable.

When I pick a time, call Cal.com Reserve a Slot to hold it so nobody else takes it while I finish, then call Cal.com Create a Booking in the client's name using their email and name from the booking history. Reservations are temporary and expire, so create the booking promptly after I confirm, and handle the case where the hold lapsed while I was deciding by telling me clearly, refreshing the available times, and letting me pick again rather than failing silently or double booking. If a colleague should join, let me add their email and call Cal.com Add Guests to a Booking after the booking exists. That endpoint is rate limited to five requests per minute, so add guests one booking at a time and never in a bulk loop.

After a booking succeeds, write it back to the CRM with HubSpot Create Note, associated to that contact, recording that I rebooked them and the date and time of the new session. Show the result inline in the panel and update the person's row immediately so they now count as having a future booking and drop off the lapsed list. If the HubSpot note fails, the booking still stands, so surface the note failure separately and let me retry it without rebooking.

A few Cal.com API details that matter. Slots endpoints need the header cal-api-version set to 2024-09-04 and bookings endpoints need cal-api-version set to 2026-02-25, and a missing version header shows up as a confusing 404. Get Available Time Slots requires no authentication. Successful responses are wrapped as an object with status and data, so read the payload out of data. The standard rate limit is 120 requests per minute, which is easy to hit when paging months of history on first load, so page sequentially rather than firing every page in parallel, and cache the roster so switching between clients does not refetch the entire history.

Persist the user's settings, meaning the history window, the lapsed multiplier, the default session type and the look ahead window. Add a manual refresh control on the roster so I can pull the latest bookings after I have been working in Cal.com directly. Keep the language throughout the interface about clients and sessions, not about slots or event types, because this is a screen I open between calls and I want it to read like a client list rather than a scheduling tool.

## How to customize

- Change how far back the history goes, the default is the last six months of bookings
- Adjust how overdue someone must be before they count as lapsed, if you want a gentler or stricter cut-off
- Choose which session type the booking panel offers by default, and how far ahead it looks for open times

## FAQ

### How does it know a client is overdue?

It looks at the gaps between that person's own past sessions and works out their normal rhythm. Someone who usually books every four weeks is flagged once they drift well past four weeks with nothing on the calendar, while a weekly client is flagged much sooner. Nobody is measured against a single fixed number of weeks.

### What happens to people who only ever booked once?

They are kept in a separate group of clients who never came back. One booking is not enough to know someone's rhythm, so mixing them into the overdue list would be misleading. They are still worth a nudge, just for a different reason.

### Does it book the session for the client, or just remind me to?

It books it. You pick a time from your real availability, and the app creates the booking in the client's name and holds the time while you confirm, so you are not sending them a link and hoping they act on it.

### Will this work if I do not use HubSpot?

The core list and the booking panel run entirely on your Cal.com history, so the app is still useful on its own. The CRM panel and the note logged after each rebooking are the parts that need a HubSpot login.

### Does it change anything in my calendar without asking?

No. Nothing is booked until you pick a time and confirm it. The main screen is read-only and simply reflects the bookings you already have.

Use this prompt in General Input: https://www.generalinput.com/prompts/spot-the-clients-who-stopped-rebooking-and-book-them-back-in