Find the customer texts that never made it into your CRM

Open one board each week to see every text conversation with no record in your CRM, then file a clean summary against the right customer in a click.

App
LinqHubSpotSalesOperationsData SyncContent Generation
PromptCreate

Build me an internal app my team opens once a week to reconcile our customer text conversations against HubSpot. The problem it solves is that half our relationship history lives in text threads nobody else at the company can see. The people who use it are our sales lead and the reps who do the texting, and the object they work is an unfiled conversation, not an unanswered one, so this is a periodic hygiene pass rather than a live inbox.

Main view. One board listing every Linq conversation with activity in the window, defaulting to the last 14 days. Load conversations with Linq List Chats and, for each one, the recent messages with Linq List Messages. Linq list endpoints paginate with a cursor and a limit that defaults to 50 and maxes at 100, so page until the cursor is exhausted, and cache what you fetch in the app's own storage so the board opens fast instead of refetching everything on every visit. Split the rows into three buckets shown as tabs or sections: matched to a HubSpot contact and already filed, matched to a contact but never filed, and unknown numbers with no CRM record at all.

Matching. Linq handles are E.164 phone numbers or email addresses. For each conversation take the customer handle and look the person up with HubSpot Search Contacts against the phone, mobile phone and email properties. Normalize the number and try a few sensible variants so a contact stored as (555) 123-4567 still matches a handle of +15551234567. Cache the resolved contact id per handle in the app's storage so a later pass does not re-search every thread from scratch.

Filed state lives in the app. Keep a record of every filing: the chat id, the contact id, the timestamp of the last message covered by that filing, and a reference to the note that was posted. Never file the same thread twice. If new messages have arrived since the last filing, show the row as having new activity since it was last filed and offer to file only the new stretch of the conversation rather than the whole thing again.

Every row shows the customer name, or just the number when there is no record, the channel the thread ran on (iMessage, RCS or SMS, since a conversation can span all three), the time and a short preview of the last message, how many messages are in the window, the filed state, and that contact's open deals with amounts from HubSpot Search Deals. Default sort is unfiled conversations first, ordered by the total open deal value sitting behind them, so a thread attached to live pipeline outranks one with somebody we already lost. Let the user change the date window and switch the sort to most recent or longest unfiled.

Summarize and file, powered by a background agent inside the app. On a matched but unfiled row there is a Summarize and file button that kicks off an agent. The agent reads the whole conversation with Linq List Messages, paging until it has the full history, then writes a short factual summary of what was discussed: the commitments made on either side, any dates that were agreed, and the next step. It summarizes rather than transcribes, and it should read like a rep wrote it, plain and specific, with no marketing language and nothing invented that is not in the messages. The summary comes back into the app and is shown to the user in an editable box.

When the user approves the text, the app posts it to the contact's timeline with HubSpot Create Note associated with that contact, and stamps a last texted date on the record with HubSpot Update Contact. Nothing is posted until the user has seen and approved it, and the edit box is never skipped. After a successful post, record the filing in the app's storage, move the row into the filed bucket, and show a link through to the note.

Unknown numbers. On an unknown number row the user can create the person first with HubSpot Create Contact, using a small form pre-filled with whatever the thread reveals, such as a name mentioned in the messages and the phone number itself. Once created, the same summarize and file flow runs against the new contact. Use HubSpot Get Contact to back a detail panel when someone wants to look at the full record before filing anything against it.

Inline actions. From any row the user can fire off a quick reply with Linq Send Message and mark the thread handled with Linq Mark Chat Read, without opening another tool. A reply sent from the board should appear straight away in that row's message list.

Suppression list. The app keeps a list of internal and personal numbers in its own storage, and a suppressed handle never appears in any of the three buckets. Let the user suppress a number straight from a row and manage the whole list from a settings view, including removing one again.

What does this prompt do?

  • Lists every recent text conversation in three groups: already filed against a customer, matched to a customer but never filed, and numbers nobody in the company has a record for.
  • Shows the open deals and amounts sitting behind each conversation, so a thread attached to live pipeline gets dealt with before one with a customer you already lost.
  • Writes a short summary of a whole thread for you, pulling out what was promised, the dates that were agreed and what happens next, which you edit before it lands on the customer record.
  • Lets you send a quick reply, mark a thread handled, or create a brand new customer record without leaving the board.

What do I need to use this?

  • A Linq account with at least one phone number your team texts customers from
  • A HubSpot login with permission to view and update contacts, notes and deals
  • A rough weekly slot to work the list, and the internal or personal numbers you want kept out of it

How can I customize it?

  • Change the default window from the last 14 days to whatever your review rhythm is
  • Change the sort so conversations come up by how recent they are, or by how long they have gone unfiled, instead of by deal value
  • Add internal and personal numbers to the suppression list so they never appear in the review
  • Adjust the house style of the summary, for example always ending with a one line next step

FAQs

Will the same conversation get filed twice?
No. The board remembers every thread it has filed and moves it into the filed group. If new messages arrive after a filing, the row comes back flagged so only the new part of the conversation still needs filing.
Does the summary post to the customer record automatically?
No. The summary is written for you and shown in an editable box first. Nothing reaches the customer record until you have read it, changed anything you want to change and clicked to post.
What happens with numbers nobody in the company recognizes?
They get their own group on the board. You can create the customer record from the board in a few fields, then file the conversation against it exactly like any other.
Does this cover iMessage as well as ordinary texts?
Yes. Every row shows which channel the conversation ran on, whether that was iMessage, RCS or SMS, so you know what you are looking at before you file it.
How do I keep personal and internal numbers out of the review?
There is a suppression list built into the app. Add a number from any row and it stops appearing, and you can manage the whole list from a settings view.

Related templates

Turn Mailjet email clicks into ranked HubSpot follow-ups

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.

Mailjet
HubSpot
Slack Bot
Agentic Task
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App
A searchable RFP answer library your bid team drafts from

Every proposal you have ever submitted in one searchable archive, with the closest past answers lined up against each question in a new RFP.

General Input Storage
General Input Database
Mistral AI
+2
App
See which target accounts just started advertising on LinkedIn

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.

LinkedIn Ad Library
HubSpot
General Input Database
App
Candidate texting desk for your open Greenhouse roles

Open one board each morning to see every candidate by stage, read their full text thread, and reply from your work number instead of your phone.

Linq
Greenhouse
App
Account health board that puts product usage next to your CRM

Your customer success team opens one board where every account's logins, seats and usage trend sit beside its owner, plan and renewal date.

Looker
HubSpot
Slack Bot
App

Stop letting relationship history live in one person's phone.

Set up your weekly review desk and get every text conversation filed against the right customer record.