Customers & Automation
Concierge Actions & Backfill
Last updated 19 May 2026
Concierge Actions & Backfill
Every Concierge action in detail: the 14 action types, what triggers each, who can approve them, how audience preview and cost work, and how the backfill ranking system picks the right client when there's an open slot to fill.
Where to find them — Web: Concierge actions appear inline in
/app/[slug]/conciergechat. Approval queue lives at/concierge/pending. Mobile: Concierge tab → chat surface. Pending review sheet on long-press of any pending action card.
TL;DR
- 14 action types across 7 families (gap-fill, reconnect, retention, scheduling, feedback, inbox, automation setup).
- Three risk tiers: Navigate (one-click route, no send), Draft (review and Send), Approval required (queued for Owner or Manager).
- Audiences over 50 recipients require a hold-to-confirm gesture. Win-back queues for a 30-second cancel window. Single-client outreach is direct, no cancel.
- Backfill ranks eligible clients on six weighted factors. Top 20 candidates returned; up to 5 used per gap-fill batch.
The 14 action types
Gap fill family
Flash deal
- Trigger: empty slot, "gap", "fill", "tomorrow" in chat.
- Risk: Draft.
- Roles: Owner / Manager / Staff.
- What executes: creates a real Flash Deal via the standard flash-deal flow; returns a shareable URL you can post anywhere (Instagram, your booking link, a one-off SMS).
- Send UX: no audience: it's a URL you share manually.
Service spotlight
- Trigger: "promote", "spotlight", "push my service".
- Risk: Approval required.
- Roles: Owner / Manager.
- What executes: drafts a promotional SMS for a specific service, sent to a cohort you pick (similar to cohort outreach but promo-focused).
Reconnect family
Win-back campaign
- Trigger: "lapsed", "win-back", "reconnect", "rebooking dropped".
- Risk: Approval required.
- Roles: Owner / Manager.
- What executes: batch SMS to lapsed clients (60+ days inactive by default). Honours opt-out, blocked, recently-messaged dedup (30-day cooldown), and a 90-day per-wave cap (clients sent this wave in the last 90 days are excluded). Stamps
lastReconnectSentAton each recipient. - Send UX: audience preview with window picker (30 / 60 / 90 / 180 days), sample names, cost on Send button. Hold-to-confirm if 50+ recipients. Queues for 30 seconds with a Cancel button.
Client outreach (single-client)
- Trigger: "text Sarah", "message client", "reach out to" — and the Concierge must have just looked the client up via
lookup_clientso the link is in recent context. - Risk: Draft for Owner; Approval required for Manager and Staff (approval skipped on solo venues).
- Roles: Owner / Manager / Staff (staff can only message their own clients).
- What executes: one SMS to a single named client. Stamps
lastCampaignSentAtonly (notlastReconnectSentAt, so the client remains eligible for future win-back). - Send UX: instant. No cancel window — small blast radius. No hold-to-confirm (single recipient).
Cohort outreach
- Trigger: "send to VIPs", "message top spenders", "text new clients", "reach out to regulars".
- Risk: Approval required.
- Roles: Owner / Manager.
- What executes: batch SMS to a non-lapsed cohort (VIPs, top spenders, regulars, new this month). The cohort is resolved at preview time so the count is live. Recently-messaged dedup applies.
Retention family
Birthday outreach
- Trigger: "birthday", "wish".
- Risk: Draft.
- Roles: Owner / Manager / Staff.
- What executes: SMS to clients with a birthday today or this week (operator picks the window).
- Send UX: audience preview, sample names, cost on Send.
Share storefront link
- Trigger: "send my booking link", "share my storefront".
- Risk: Draft.
- Roles: Owner / Manager / Staff.
- What executes: one SMS to a client (or a small group) containing your storefront URL.
Filter clients (navigate)
- Trigger: "show me my VIPs", "filter clients by", "client cohort".
- Risk: Navigate.
- Roles: Owner / Manager.
- What executes: opens the Clients page (
/clients). Cohort-aware query parameters are a follow-up.
Scheduling family
Booking reschedule
- Trigger: "reschedule", "move appointment".
- Risk: Approval required.
- Roles: Owner / Manager / Staff.
- What executes: finds open slots near the original time and proposes a reschedule. On approve, the booking moves and the customer is notified via the standard reschedule path.
Feedback family
Review request
- Trigger: "review", "feedback", "Google review".
- Risk: Draft.
- Roles: Owner / Manager.
- What executes: batch SMS to today's completed bookings asking for a review. Stamps
booking.reviewRequestSentAtso the same client isn't re-asked.
No-show follow-up
- Trigger: "no-show", "missed appointment", "didn't show".
- Risk: Approval required.
- Roles: Owner / Manager.
- What executes: per-target SMS to today's no-show clients with a rebook nudge.
Inbox family
Inbox reply
- Trigger: "reply", "respond", "inbox", "client asked".
- Risk: Draft.
- Roles: Owner / Manager / Staff.
- What executes: drafts a reply to a single inbox conversation. On Send, the message goes out via the standard inbox path (visible in the customer's conversation thread).
Automation setup family
Enable reconnect automation
- Trigger: surfaces automatically when reconnect automation is off and the venue has lapsed clients. No regex.
- Risk: Navigate.
- Roles: Owner / Manager.
- What executes: opens
/settings/reconnectto configure the automation.
Set up rebooking prompt
- Trigger: "rebook prompt", "next visit nudge", "checkout rebook".
- Risk: Navigate.
- Roles: Owner / Manager.
- What executes: opens
/automationsto configure the post-visit rebook nudge.
Risk tiers in detail
Navigate
The card is a labelled one-click route to a settings page. No draft, no Send, no Sparks beyond the chat turn. Useful for steering you to a setting the Concierge would otherwise have to explain in text.
Draft
The Concierge writes a draft (1 Spark for the selector + 1 for the draft). You review it, optionally refine (1 Spark each, up to 3 refines), then tap Send. On Send, the action executes inline.
Approval required
Same as Draft but the Send button creates a pending row instead. An Owner or Manager must open the approval queue (/concierge/pending or the mobile review sheet) and tap Approve.
Bypass rules:
- Owner bypasses approval for actions they originated themselves. If you're the owner and you triggered the action in your chat, Send fires it directly.
- Solo venues bypass approval entirely. A venue with a single staff member and
solopreneuronboarding intent skips the queue for everyone.
Approval-required actions expire after 24 hours. Plain drafts expire after 7 days.
Audience preview + cost
Any action that sends to multiple clients shows an audience-preview card before Send. The preview is live: any toggle you change (e.g. the win-back window picker) re-queries instantly.
| Field | What it shows |
|---|---|
| Count | Total eligible recipients in the cohort. |
| Sendable | Sub-count after opt-out, blocked, recently-messaged dedup, no-contact filters. |
| Window picker (win-back only) | 30 / 60 / 90 / 180-day inactivity windows. |
| Sample names | Up to 5 first names with "and N more…". Useful for sanity-checking the audience. |
| Cost | Lives inside the Send button: Send to 47 clients · A$3.40. NZ shows zero (email-only — see SMS allocation and limits). |
| Wallet warning | "Wallet balance is short, top up before sending" disables Send until you top up. |
Hold-to-confirm Send
When the recipient count is over 50, the Send button becomes a press-and-hold gesture:
- Press and hold for ~600ms.
- The fill bar progresses; release after completion to send.
- A brief tap shows a "Hold to send" hint instead. Helpful for accidental taps.
- Cmd/Ctrl-Enter focuses the hold button rather than bypassing the gesture.
- Reduced-motion users see a static 50% fill bar.
The same hold-to-confirm component is shared by web and mobile, so the gesture is identical on both surfaces.
Scheduled-sends queue (win-back)
Win-back campaigns are the only action type currently using the server-side scheduled-sends queue:
- You approve and tap Send.
- The row enters
conciergeScheduledSendswithscheduled_for = now + 30 seconds. - The card shows a countdown with a Cancel button.
- Cancel before the timer fires → status flips to cancelled, no SMS sent.
- After 30 seconds (capped at 5 minutes), the cron worker picks it up and fires.
Dual-path delivery: the client also runs a local setTimeout. If your tab stays open, the in-page timer fires first (snappy). If you close the tab or background the mobile app, the cron worker is the safety net. Race tolerance: the eligible-customer filter runs again at fire time, so anyone who rebooks between queue and fire is silently dropped from the audience — no double-send risk.
DND quiet hours pause the worker (it retries on the next tick rather than failing).
Backfill ranking system (gap fill)
When the Concierge identifies an open slot worth filling, it runs the backfill ranking system to find the best client to offer it to. Pure SQL scoring against the waitlist and recent client history. No LLM in this step.
The six factors
| Factor | Weight | What it measures |
|---|---|---|
| Cadence proximity | 35% | How close the open slot is to the client's usual booking cadence. A client who comes every 6 weeks scores highest 5–7 weeks after their last visit. |
| Service fit | 20% | Whether the offered service is one the client books regularly. |
| Weekday preference | 15% | Does the slot fall on the client's most-booked day? |
| Time-band preference | 10% | Does the slot fall in their preferred time band (morning / afternoon / evening)? |
| Provider affinity | 10% | Is the offered staff member someone they've booked with before, ideally repeatedly? |
| Lead-time fit | 10% | Does the lead time (hours between now and slot) match what this client typically books with? Some clients only ever book days out; others tolerate same-day. |
Eligibility filters
Before scoring, candidates must pass:
- 3+ completed bookings in the last 12 months and 3+ lifetime visits
- Not blocked
- Not opted out of SMS (AU/GB) or email (NZ)
- Valid contact details for the relevant channel
- No outbound contact in the last 24 hours (cooldown)
Output
- Top 20 candidates returned, sorted by score descending.
- The Concierge selects up to 5 per gap-fill batch.
- Confidence bands: 70+ high (Concierge flags these as strong matches), 40–69 medium, <40 low (rarely surfaced).
Audit trail
| Where to look | What it shows |
|---|---|
| Engage Activity Feed | Every batch send, with recipient count, channel, timestamp. |
| Customer conversation thread | Single-client outreach and inbox replies appear in the client's thread. |
| Approval queue history | Pending and approved actions visible to Owner / Manager; records who approved and when. |
| Server-side audit | All Concierge state changes (suggest, accept, send, success, failed, discarded, refine, cancel) write to conciergePendingActions and PostHog telemetry. Not currently surfaced in the UI, but preserved for support. |
Role access summary
| Action family | Owner | Manager | Staff |
|---|---|---|---|
| Flash deal | Direct | Direct | Direct |
| Service spotlight | Direct (own) | Approval | — |
| Win-back campaign | Direct (own) | Approval | — |
| Client outreach | Direct (own) | Approval | Approval (own clients) |
| Cohort outreach | Direct (own) | Approval | — |
| Birthday / Storefront link | Direct | Direct | Direct |
| Filter clients (navigate) | Yes | Yes | — |
| Booking reschedule | Direct (own) | Approval | Approval (own bookings) |
| Review request | Direct | Direct | — |
| No-show follow-up | Direct (own) | Approval | — |
| Inbox reply | Direct | Direct | Direct |
| Automation setup (navigate) | Yes | Yes | — |
Direct (own) means the Owner skips the approval queue for actions they originated themselves; Manager-originated approval-required actions still queue. Solo venues (single staff, solopreneur intent) bypass approval for everyone.
Common mistakes
| Problem | What to check |
|---|---|
Action card appears with requires_approval but you can't see the approve button |
You're not Owner or Manager. Ask one of them to approve from the queue. |
| Win-back keeps surfacing the same client | Recently-messaged dedup excludes anyone sent this wave in the last 90 days. If the client was sent ~85 days ago, they're still excluded for a few more days. |
| Send button shows "Wallet balance is short" | Total cost exceeds your wallet balance. Top up from Settings → Billing or reduce the audience (use a tighter win-back window). |
| Refine button does nothing | You've hit the 3-refine cap. Discard the draft and trigger again. |
| Scheduled win-back went out even though I closed the tab | That's by design. The cron worker is the safety net. To cancel, use the in-app Cancel button within the 30-second window. |
| The same client outreach action is suggested twice | The Concierge requires the client to be in recent chat context. If you mentioned them in two recent turns, the action may resurface. Once you send (or discard), it won't reappear without a fresh client reference. |
| Backfill suggestions look wrong | Check the candidate's eligibility (3+ bookings, valid contact, opted in) and recent cadence. The ranker doesn't know about gaps that already exist on the client's side (holidays, illness). |
FAQ
Why isn't an action being suggested when I ask for one?
Most actions have data gates. Win-back needs lapsed clients (60+ days inactive); review requests need today's completed bookings; no-show follow-up needs today's no-shows. If the gate isn't met, the Concierge won't propose the action even on direct request. Conversation keywords also matter: 'gap', 'fill', 'win-back', 'review', 'birthday' all trigger different action families.
What happens to a pending action if I don't approve it in time?
Approval-required actions expire after 24 hours. Draft actions expire after 7 days. Once expired, they can't be sent. Re-trigger from a new chat turn if you still want to send.
How does the backfill ranking system score customers?
Six weighted factors: cadence proximity (35%), service fit (20%), weekday preference (15%), time-band preference (10%), provider affinity (10%), and lead-time fit (10%). The top 20 candidates are returned; the Concierge picks up to 5 per batch.
Who bypasses the approval workflow?
Owners always bypass approval for actions they originated themselves. Solo venues (single staff, solopreneur onboarding intent) bypass approval entirely. Everyone else hits the approval queue.
Is there an audit trail of what was sent and approved?
Yes. Every batch send writes to the Engage Activity Feed (visible in the app). Approval-queue history is server-side, recording who approved and when. Single-client outreach appears in that client's conversation thread. Server-side audit isn't currently surfaced in the UI but is preserved for support.
Why does a win-back exclude clients who look perfectly eligible?
Three filters that aren't always obvious: recently-messaged dedup (any outbound in last 30 days), the 90-day per-wave cap (anyone sent this wave in the last 90 days), and the 24-hour contact cooldown. Run the audience-preview window picker (30 / 60 / 90 / 180) to see the count change as filters relax or tighten.