Lead response desk with a running clock on every new lead
Your sales floor works one queue of brand new leads, oldest first, with a response clock on every card and a drafted opening text ready to send.
Build me a lead response desk my sales floor works out of, built around the fact that the first person to reply usually wins the deal. It is an app with two tabs: a live queue of brand new leads that reps work one at a time, and a leaderboard a sales manager watches week over week. There is no schedule and no trigger. People open this app and work it.
The main tab is the queue. Load it from HubSpot Search Contacts, filtered to contacts created in the last 48 hours whose lifecycle stage is still early (lead, subscriber, or marketing qualified lead, and let me configure which stages count). Sort oldest first so the lead who has waited longest sits at the top. Each lead is a card showing the contact's HubSpot properties (name, phone, email, company, job title), the lead source recorded on the contact, any associated deal pulled with HubSpot Search Deals, and the assigned owner resolved to a real person's name through HubSpot List Owners rather than showing a raw owner id.
Every card carries a running response clock, and this is the primary visual element of the whole app. It counts from the moment the contact was created in HubSpot to the moment our first text actually goes out. While a lead is unanswered the clock ticks live on screen: neutral under five minutes, amber at five minutes, red at fifteen. Make the amber and fifteen minute thresholds configurable. Once a first touch has been sent, the clock freezes at the elapsed time and that frozen value is what the leaderboard reports.
A rep claims a lead before working it so two people never text the same person. Claiming stores the rep's identity and a timestamp in the app's own storage, and the claim is visible to everyone else on the board immediately, with the claimer's name on the card. A rep can release a claim if they picked up the wrong lead. Claims are shared state across all viewers, not per-user local state.
The action on each card is a "Draft first touch" button that kicks off a background agent embedded in the app. That agent reads the full HubSpot contact record with Get Contact, looks up the associated deal with HubSpot Search Deals, and pulls any prior conversation with that person using LoopMessage Get Message History for Contact so it knows whether this is genuinely a first contact or a returning lead. It then writes one short personalised opening text and puts the draft back on the card, where the rep edits it inline before sending.
Constrain that drafting agent hard, because a first message to someone who has never texted us has to clear LoopMessage's opt-in flow. Quoting the integration docs: "The initial opt-in message must contain no links, emails, phone numbers, currency amounts, attachments, or marketing copy or it will be rejected." So the opening message must be a short human introduction that invites a reply, with no links, no prices, no marketing language, and no attachments. Put this rule in the agent's instructions and also validate the text the rep is about to send, blocking the send with a clear explanation if the edited version reintroduces a link or a price.
Two rules to bake into the send path. First, always run LoopMessage Check Contact Status before any send, and refuse to send to anyone unsubscribed, showing the reason on the card. Second, let the rep pick which sender the text goes out from, populated by LoopMessage List Senders. The send itself uses LoopMessage Send Message, and because delivery is asynchronous the card shows live delivery state from LoopMessage Get Message Status rather than claiming success the moment the request returns.
Once a text is sent, do two things. Log what actually went out as a note on the HubSpot contact using Create Note, including the message text, who sent it, and the time to first touch, so the CRM timeline stays honest and a manager reading the record in HubSpot sees the same story the app shows. Then move the card into a "waiting on reply" column. Cards in that column poll LoopMessage Get Message History for Contact and surface the lead's inbound response inline when it arrives, so the rep sees the reply without leaving the desk.
The second tab is a simple leaderboard of median time to first touch, broken down by rep and by lead source, over a period I can choose such as this week, last week, or this month. Show the median rather than the average so one lead nobody touched does not distort the number, alongside the count of leads handled and how many breached the fifteen minute mark. This is the number a sales manager actually wants to watch week over week, so keep it readable at a glance rather than dense.
Keep the scope tight. This is a CRM sourced new lead queue ordered by a response clock where the job is first touch. It is deliberately not a general shared inbox and should not drift into thread browsing, bulk messaging, or managing conversations with existing customers.
What does this prompt do?
- Pulls every contact created in your CRM in the last 48 hours at an early lifecycle stage into one queue, sorted oldest first so the lead who has waited longest is always on top
- Puts a live response clock on every card that turns amber at five minutes and red at fifteen, so nobody has to guess which lead is going cold
- Lets a rep claim a lead before working it, and the claim shows on everyone else's board so two people never text the same person
- Drafts a short personal opening text for each lead in the background, which the rep edits and sends, then logs what went out on the CRM record and watches for the reply
What do I need to use this?
- A HubSpot account where new leads land as contacts, with deals and owners set up the way your team already works
- A LoopMessage account with at least one active sender your team texts from
- New contacts that carry a phone number, since the desk texts leads rather than emailing them
- A sales team that works leads from a shared queue rather than each rep having a private list
How can I customize it?
- Change the clock thresholds if five and fifteen minutes are not your team's standard, and widen or narrow the 48 hour window that decides which leads are still fresh
- Adjust which lifecycle stages count as a new lead, so the queue matches how your CRM labels early stage contacts
- Tune the tone and length of the drafted opening text, and set which senders each rep is allowed to text from
- Pick the period the leaderboard covers, such as this week against last week, or the current month
FAQs
Why does the first message have to be so plain?
What stops two reps from texting the same lead?
Does the app send anything on its own?
What exactly does the response clock measure?
Will this work if our leads come from portals rather than our own site?
Related templates
Twice a day we spot the people clicking your pricing and demo pages, create a follow-up task for their owner, and post a ranked recap to Slack.
Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.
Every proposal you have ever submitted in one searchable archive, with the closest past answers lined up against each question in a new RFP.
Open one board each Monday to see which of your target accounts are running LinkedIn ads right now, and which only switched them on this week.
Open one board every morning, see every upcoming appointment with its confirmation status, and text the clients who have not replied yet.
Your customer success team opens one board where every account's logins, seats and usage trend sit beside its owner, plan and renewal date.
The first person to reply usually wins the deal.
Give your sales floor one queue, one clock, and a drafted opening text so no new lead sits waiting.