Acuity client retention console with one-click rebooking

By General Input

See which salon, clinic, or studio clients are drifting away, ranked by their own booking rhythm, then rebook them or draft a win back email without leaving the screen.

Integrations

  • Acuity Scheduling
  • Gmail

Type

App

Categories

  • Operations
  • Sales

Build me a client retention console for Acuity Scheduling that I can sit down with once a week and work through the clients who are drifting away. I run a salon, clinic, or studio, and this is for me as the owner or for my front of house manager. The whole point is answering "who is slipping away and what do I do about it" on one screen, because Acuity itself cannot report on client retention.

The main screen is a sortable client table. Build the roster from Acuity List Clients, then enrich every client with their appointment history from Acuity List Appointments. Pull a long history window, at least the last 18 to 24 months, and match appointments back to clients on email first, falling back to name plus phone. Each row shows the client name, days since last visit, lifetime visit count, lifetime spend, no-show count, cancellation count, and their usual appointment type, meaning the type they have booked most often. Every column is sortable, and there is a search box for finding a specific person by name, email, or phone. Lifetime spend should sum the price on their past appointments, and note that Acuity returns prices as decimal strings rather than numbers, so parse before summing.

Bucket the roster into three tabs, Regulars, At Risk, and Lapsed, based on each client's own booking rhythm rather than one flat cutoff for the whole business. For each client, compute their personal cadence as the median gap in days between consecutive past visits. A client sitting within roughly their normal cadence is a Regular, one who is meaningfully past it is At Risk, and one who is far past it is Lapsed. Use sensible multiples of their own cadence for those two thresholds and expose both as settings I can adjust. Clients with too little history to have a real cadence, meaning fewer than about three visits, fall back to a house default cadence that I can also set. Show each client's cadence in the table or on hover, so it is obvious why someone was flagged, and show the tab counts on the tabs themselves.

Selecting a client opens a detail view. The top is their profile and the same summary numbers from the roster. Below that is their full visit timeline, every past appointment in reverse chronological order with the date, appointment type, price, and status, clearly marking no-shows and cancellations so a pattern of flakiness is visible at a glance.

The detail view also has a rebooking panel that pulls genuinely open slots. Resolve the client's usual appointment type to its id using Acuity List Appointment Types, then use Acuity Get Available Dates to find dates with openings over the next few weeks and Acuity Get Available Times for the slots on a chosen date. Show me the real open times, and let me book the client straight in with Acuity Create Appointment for the selected slot and their usual type. Let me switch the appointment type and the date range before booking, in case they are due for something different. After a successful booking, update the client's row and record the booking in the contact history described below.

As the alternative to booking, let me draft a personal win back email using Gmail Create a Draft. The draft is addressed to the client and written in a warm, personal, first-person voice referencing how long it has been, what they usually book, and a couple of the real open slots from the availability panel. It lands in my Gmail drafts for me to review and send myself. Never send email directly from the app, and after creating a draft, confirm it was created and link me to it.

The app must remember which clients I have already contacted and when, since Acuity has no last contacted field. Store this in the app's own storage: the client, the date and time, whether it was an email draft or a direct booking, and any note I add. Anyone contacted inside a cooldown window, defaulting to 14 days and configurable, drops out of the working queue instead of getting chased twice, so someone I reached out to three days ago is not in front of me again. Do not hide them entirely, show them in a separate Recently contacted view with how many days ago I reached out, and give me a way to clear the flag if I want to follow up sooner.

Give me a per client note field for things like "prefers Thursday evenings" or "moved across town". Save it through Acuity Update Appointment on that client's most recent visit, so the note lives in Acuity where my team will see it, and display any existing note when the detail view opens.

A few practical notes. Acuity limits requests to about 10 per second, so fetch the appointment history in batches with the client roster and cache the assembled result for the session rather than refetching on every tab switch, with a visible refresh button and a last updated timestamp. Acuity list endpoints return plain arrays and page by narrowing the date filter rather than a cursor, so page appointments in ascending order using the last result's datetime as the next start date. Treat the paid field as the string yes or no rather than a boolean. Show a clear loading state on first load since assembling the history takes a moment, and handle clients with no appointment history at all without breaking the table.

Related prompts

Explore more prompts
Win back LiveChat visitors whose chats went unansweredChase the paperwork every new client and vendor still owesFile Gmail attachments into storage with names you can findCandidate rediscovery desk for your archived Lever applicantsLaytime and demurrage claim workspace for chartering opsKajabi customer support console for member access fixesRun your application review round on Jotform submissionsRun your nutrition clients' weekly meal plans from one consoleReplace the dispatch whiteboard with a live production boardJob search command center with a self-filling pipeline board