# White glove queue for the VIP customers waiting on you

> Open one board each morning that ranks the high value customers waiting on a reply by the revenue sitting behind their silence.

- Workflow type: app
- Services: Kustomer, Shopify
- Categories: Customer Support, Operations
- Published: 2026-08-24

## What it does

- Builds one morning board of only your highest value customers who have an open conversation where the last word was theirs, using the VIP tags, loyalty tiers or spend attributes already on your customer records.
- Ranks by revenue at risk instead of ticket age alone, combining what each customer has spent with you over their lifetime with how long their newest message has been sitting, and pushing anyone with a stalled or missing shipment further up.
- One button sends an assistant to read the whole conversation history and the order record, then write a short handling brief covering who this person is, what they have spent, what went wrong before, what they are asking for now and the recommended next step.
- Reps work straight from the row: record a reply on the timeline, set status and tags, update someone's VIP attributes, and claim a customer so two people never end up working the same one.

## What you'll need

- A Kustomer account where your best customers are marked in some way, whether that is a VIP tag, a loyalty tier, or a spend field on the customer record
- A Shopify store where those same customers' orders and shipments live, matched by email address
- An agreed definition of high value, since you set the tags, tiers and minimum spend that decide who reaches the board
- Support leads or reps who will work the queue and claim rows as they go

## Prompt

Build me a white glove desk my support leads open every morning that shows only our highest value customers who are currently waiting on us. Today those leads scroll the same shared inbox as everyone else, so a first time buyer with a shipping question and a customer who has spent forty thousand dollars with us look identical on screen. I want one board where every row is a high value customer with at least one open conversation whose last word was theirs, sorted by revenue at risk rather than by ticket age alone.

The app stores its own settings that an admin edits inside it: the Kustomer customer tags that mark someone as VIP (default vip), the loyalty tier values that qualify (for example gold and platinum), the name of the spend attribute on the customer record plus the minimum spend that qualifies, the wait thresholds that colour a row amber and then red (defaults 4 hours and 12 hours), the number of days without shipment movement that counts as stalled (default 5), how many recent orders to show per customer (default 5), and the weighting the ranking uses. Kustomer attribute naming differs per organisation, so the tag names, the tier field and the spend attribute all have to be editable without rebuilding the app.

Build the queue from Kustomer. There is no global conversation list in this API, so every view has to start from the customer. Use Search Customers with the configured criteria, matching any of the VIP tag, a qualifying loyalty tier, or the spend attribute above the threshold rather than requiring all three, to get the qualifying customers. Then call Get Conversations by Customer for each one and keep only conversations that are still open. For each open conversation pull the thread with Get Messages by Conversation and look at the newest message. If the newest message came from the customer, that conversation is waiting on us and belongs on the board, and the wait clock runs from that message timestamp. If the newest message came from an agent, the ball is in the customer's court and the row drops out. Show the wait as a live duration on every row, coloured against the configured thresholds.

Enrich every row from Shopify. Take the email address from the Kustomer customer record, call Search Customers in Shopify with it, then Get Customer Orders for the matched Shopify customer. From that pull their lifetime spend, their total order count, the date and value of their most recent order, and their last few orders for the detail view. When no Shopify customer matches the email, still show the row, mark it clearly as unmatched, rank it on waiting time alone rather than inventing a spend figure, and let the rep search Shopify by a different email address or an order number from inside the row and pin the correct match.

Sort the board by revenue at risk. The default score takes the customer's Shopify lifetime spend and multiplies it by a wait multiplier that grows the longer their newest inbound message sits, then adds a fixed uplift for anyone carrying a stalled or missing fulfillment. Show the score and its inputs on the row so nobody has to trust a mystery number: lifetime spend, hours waiting, and the reason for any uplift. Let the lead re-sort by longest wait, by lifetime spend, or by most recent order value, and filter by claimed status, by owner, by whether a shipment is stalled, and by conversation tag.

Opening a row shows the conversation and the commerce record side by side. On the left, the full thread from Get Messages by Conversation in reading order with each message marked inbound or outbound, the internal notes from Get Notes by Conversation, and the conversation record itself from Get Conversation by ID for status, tags and assignee. On the right, the customer's last few orders from Get Customer Orders with line items pulled by Get Order, and live shipment status for each from List Fulfillments for Order showing carrier, tracking number, current status and the date it last moved.

Flag anyone whose most recent order has a stalled or missing fulfillment even if they have not complained about it yet, because those are the conversations that are about to get much worse. Treat an order as stalled when it has been paid for longer than the configured number of days with no fulfillment record at all, or when a fulfillment exists but is not delivered and its tracking has not moved inside that window. Surface that as a badge on the queue row itself rather than only in the detail view, and give the lead a filter for just those customers.

Put a "Prep this customer" button on every row that kicks off a background agent. The agent reads the entire conversation history with Get Messages by Conversation and the existing internal notes with Get Notes by Conversation, checks the customer's other open conversations with Get Conversations by Customer, pulls the customer record with Get Customer by ID for their tags, tier and spend attributes, and reads the commerce side with Search Customers, Get Customer Orders, Get Order and List Fulfillments for Order. It then writes a short handling brief: who this person is and what they are worth to us, what they have spent and how often they buy, what has gone wrong for them before, what they are asking for right now, and a recommended next step. Keep it short enough to read before picking the conversation up, roughly one screen. The agent posts the brief back onto the conversation as an internal note with Create Note by Conversation so it is visible to anyone working in Kustomer directly, and the brief also lands back in the app so the row shows it inline and the rep can act on it immediately. It runs in the background, so the row shows a pending state while it works and the lead keeps moving through other rows.

From the row a rep can act without leaving the app. They can record a reply on the conversation timeline with Create Message from Conversation. Be precise about that control in the interface: creating a Kustomer message records an instance on the conversation timeline and does not itself deliver an outbound email or chat to the customer, so label it as recording the reply on the timeline rather than sending it, and lean on internal notes and conversation updates as the primary writes. They can set the conversation status or apply and remove tags with Update Conversation. And they can update the customer's VIP attributes with Update Customer, for example promoting a loyalty tier or adding the VIP tag to someone who clearly qualifies. Resolve every owner and assignee id to a real person's name with Get Users, and cache that list rather than looking it up per row.

Each rep can claim rows so two people do not work the same customer. The claim is stored by the app itself against the customer, and shows the claiming rep's name and the time they claimed it to everyone else. A claimed row stays visible to the whole team rather than disappearing, greyed with the owner's name so a lead can still see the entire queue. Let a rep release their own claim, let a lead take a claim over with the change recorded, and expire stale claims automatically after a configurable number of hours (default 2) so a claim made before lunch does not block the customer all afternoon. Give me a "My claims" filter and a count of what each rep is currently holding.

A few rules for how it behaves. Refresh the board on load and on an explicit refresh, and show the time of the last refresh, because a lead needs to know whether the wait times on screen are real. Kustomer search is paginated and rate limited per minute, and each customer costs another conversations call while each conversation costs another messages call, so page through sensibly, cap the fan out at a configurable number of customers per refresh (default 100), and cache between refreshes rather than refetching everything on every interaction. When a customer qualifies as VIP but has nothing open waiting on us they simply do not appear, and the empty state should say the queue is clear rather than looking broken. Keep the board fast to work top to bottom, because the point is that a lead opens it at nine, sees the most expensive silence in the business sitting at the top, and nobody valuable waits all day.

## How to customize

- Change what qualifies someone as high value: which VIP tag names count, which loyalty tiers qualify, and the minimum lifetime spend that gets someone on the board.
- Tune the wait thresholds that turn a row amber and then red, and how heavily time waiting weighs against lifetime spend in the ranking.
- Set how many days without shipment movement counts as stalled, and how long a claim holds before it expires back to the team.

## FAQ

### How does it decide who counts as a high value customer?

From your own customer records, not a score we invent. You pick which VIP tag names count, which loyalty tiers qualify, and the spend field plus minimum amount that gets someone on the board. Any one of those is enough to qualify, and all of them are editable inside the app because every team names these things differently.

### Does recording a reply actually email the customer?

No. Recording a reply saves it to that customer's conversation timeline for the record, which is not the same as delivering an email or a chat, so your team still sends the actual reply the way it normally does. The internal notes and the status and tag updates are the writes this board really leans on.

### Does the assistant contact customers or decide anything?

Neither. It reads the conversation history, the notes and the order record, then writes a short internal handling brief for whoever picks the customer up. The brief is saved as an internal note and shown in the row. A person still decides what to do and does it.

### What happens if someone's store account uses a different email address?

The row still appears, clearly marked as unmatched, and it ranks on waiting time alone rather than guessing at a spend figure. A rep can search the store by another email or an order number from inside the row and pin the right match.

### How does it stop two reps working the same customer at once?

Reps claim a row, and the claim shows their name and the time they took it to everyone else. Claimed rows stay visible so a lead can still see the whole queue, a rep can release their own claim, a lead can take one over, and stale claims expire automatically so nobody is blocked all afternoon.

Use this prompt in General Input: https://www.generalinput.com/prompts/white-glove-queue-for-the-vip-customers-waiting-on-you