Verification pending. This write-up describes what was built and how it works. It contains no performance figures, and it will be updated with measured results once they are verified.
Challenge
A contracting company collects hundreds of text conversations that simply stop: an inspection that never got scheduled, a proposal that never got an answer, a happy customer nobody asked for a referral. Each one is a warm relationship going cold.
Existing workflow
Nothing — which is the usual answer. Following up on old threads by hand is exactly the work that loses to whatever is urgent today.
What we built
- Targeting over an analyzed export of past conversations: segments (missed inspection, open proposal, past client), exclusions (opt-outs, group chats, live conversations, anything hostile) and a priority score.
- Drafting with a language model that writes two or three variants in the owner’s own voice, grounded in that specific thread.
- An approval queue — nothing sends until the owner approves it.
- Paced sending from the owner’s own number inside the existing thread: business hours only, a daily cap, and a maximum of three touches per person.
- A reply watcher that stops the sequence the moment someone answers and flags the thread as hot.
Human involvement
Approval is on by default. Warranty issues and unhappy-customer threads are never messaged automatically; they become tasks for the owner.
Result
The program is running for Certified Contracting and homeowners are replying. We are not publishing rates from a pilot this small; we will add measured numbers when the sample is large enough to mean something.
Lessons learned
- Exclusions matter more than targeting. The most important work was deciding who not to message.
- The thread is the context. Messages grounded in the actual last conversation read as personal because they are.
- Personal-number sending has limits. Sending from a personal account carries spam-filtering risk, so volume is capped deliberately.