Spot the clients who stopped rebooking and book them back in

By General Input

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.

Integrations

  • Cal.com
  • HubSpot

Type

App

Categories

  • Sales
  • Operations

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.

Related prompts

Explore more prompts
Turn Mailjet email clicks into ranked HubSpot follow-upsiMessage campaign console with pre-flight checks and delivery boardA searchable RFP answer library your bid team drafts fromSee which target accounts just started advertising on LinkedInAccount health board that puts product usage next to your CRMLook up a customer's full chat history mid conversationLusha prospecting workbench with credit-safe revealsWhich companies your LinkedIn ads reach, matched to your CRMLead response desk with a running clock on every new leadApprove Lusha enrichment field by field before HubSpot saves it