One conversation per customer

Every text, email, call, voicemail and photo for a customer sits in one thread on their record, in the order it happened.

The operating system for post-frame and barndominium builders.

Part of The Follow-Up Machine
What it is

Contacts is your inbox. Click a person and you see everything they sent you and everything you sent them. Texts, emails, calls, voicemails and photos read as one conversation — not four separate tools. It does not matter which line or which inbox it came down. It lands in the same place. The post-frame & barndominium operating system keeps every word with the customer it belongs to — not on one rep's phone.

Also called: inbox · message history · customer thread · conversation view · communication log

See it, piece by piece
01

Texts, emails, calls and voicemails read as one conversation

Open a person and you get all of it. The email you sent the quote in. The texts that followed. The call they made Tuesday, the voicemail they left Thursday. In the order it happened. Nobody has to remember whether they texted or emailed. Nobody has to check three places to find out what this customer was told.

Conversation
MZMarlin Zook(717) 555-0118Mark read (2)
Your 40×64 post-frame quote
Marlin Zook • Aug 21, 9:14 AM(3 messages)
Opened 2×
Thanks Marcus — the number works. One question about the sidewall height before we...
Can we bump the sidewalls to 16' instead of 14? Want the lift to clear.
Aug 22, 7:48 AM
Yes — 16' adds about $4,100. I'll send the revised quote this afternoon.
Aug 22, 8:03 AM
Voicemail
📞 Voicemail from (717) 555-0118 - 0:24
0:00 / 0:24Voicemail
Transcript
Aug 24, 4:12 PM
ShowTextsEmailsShowing all
One column: a collapsed email thread, two texts, then the voicemail with its player. Real screen · sample data.
Without it

Friday afternoon you are scrolling your phone for the texts and your laptop for the sent mail, trying to work out what you actually promised this customer about the sidewall height.

Why we built it

Rather than flatten everything into identical chat bubbles, each row keeps the shape it arrived in — an email folds up under its subject line, a call carries its own badge — so a scan down the column separates a promise you made from a call you missed. It also opens at the newest message and re-reads itself every ten seconds while you sit there, and a poll that finds nothing hands back the same rows rather than redrawing, so the thread only ever moves when something actually arrived.

02

A call is not a chat bubble

Missed call, incoming call, outbound call, voicemail — four different rows, four different colours, with the arrow pointing the way the call went. Who the call rings, how long it rings for and who takes the message when nobody picks up are phone settings, and they live on what happens when someone calls your number — this page is about where that call ends up written down.

Incoming call
Incoming call
Curtis Hoover
(717) 555-0132
AnswerSilenceDecline
Silence stops the ringing for you — they keep ringing through to voicemail.
An incoming call, badged and coloured, sitting between two texts. Real screen · sample data.
Without it

Eleven grey lines starting with a phone emoji, and no way to tell at a glance which of them is a lead who rang twice and got nothing back.

Why we built it

Direction is read off the wording of the record, not the message's own inbound flag — every call row is written by the carrier webhook as an inbound record whoever dialled, so trusting that flag labelled your own outgoing calls as incoming. Colour and an arrow carry it instead, in the same language the phone dock uses, because telling they rang us from we rang them should not require reading a sentence.

03

Calling is just the third way to reach them

Text, Email and Call sit side by side under the thread, so ringing a customer back no longer means leaving for a dialer and finding them all over again. Press the phone and the softphone comes up over the screen — the call timer, Mute, Speaker, Note, Script, Task and End call live there, not in the thread — and Open conversation brings you back here mid-call, to text or email without hanging up. When a channel is greyed out it tells you which of the two things is missing: your account is not set up for it, or this person has no number on file.

On a call — the timer and six actions
Marlin Zook · 4:12
Call duration
04:12
MuteSpeakerNoteScriptTaskEnd call
Open conversation · Text / Email
Follow-up
After the estimate went out
They have the price. Find out what is in the way.
“Did you get a chance to look at the 40×60 in 3D? Anything you’d move before we lock the price?”
On the call: the timer, six buttons, and the way back to this conversation without hanging up. Real screen · sample data.
Without it

You answer a text with an email because that was the window already open, and the customer, who only ever checks texts, hears nothing back for a week.

Why we built it

The channel picker sits on the same row as Send because how you reach someone is part of sending, not a decision made somewhere else first. And the two reasons a channel is dead are said out loud rather than both showing as a grey tab — one of them is fixed by adding a phone number to the contact, the other by registering the business with the carriers, and letting a rep type a whole message before finding out which is the version nobody forgives. For the rep, never having to leave the conversation to make a call means never losing his place — and the customer never hears the click-click of somebody hunting for his file.

Sound familiar?“I can't remember if I texted or emailed them”
04

The voicemail where they gave you their budget is on their record

Voicemails, call recordings and photos customers text in are filed onto the contact by themselves. Voicemails sit at the very top, because a message someone left is a person waiting for a call back. Recordings collapse underneath, because they pile up fast. A photo your own crew takes is a different animal — it gets filed against the job and the stage by the jobsite photo system, and never comes near this thread unless you send it.

Voicemails & call recordings
Voicemails (2)1 newMessages they left
Aug 24, 4:12 PM · 0:24
0:00 / 0:24
Transcript
Aug 19, 8:41 AM · 0:11
0:11 / 0:11
Call recordings (4)Conversations
Outbound call · Aug 22, 10:05 AM · 6:38
2:14 / 6:38
Voicemails (2) with one still marked new, above Call recordings (4). Real screen · sample data.
Without it

The customer says he texted you the photo of the rotted post and left his budget on your voicemail, and both are sitting on a phone in somebody else's pocket.

Why we built it

A clip is marked heard on play, not on render — scrolling past a voicemail is not listening to it, and clearing the badge because it appeared on screen hides the one thing still owed a call. Starring pins a clip above the pile after twenty more calls have buried it, and every clip carries a transcript you can read on a noisy site instead of holding a phone to your ear.

05

Every estimate email says what happened after you pressed send

Emails fold up under their subject line and count themselves — (4 messages) — with one word on the header saying what became of the last one. Open it and each message renders the way the customer saw it, tables and all, because a real email read as plain text is gibberish. Reply and Forward sit at the foot of the chain, so a spec question goes to a supplier without leaving the job record.

Conversation — email thread
Your 40×64 post-frame quote
Marlin Zook • Aug 21, 9:14 AM(2 messages)
MFMarcus FeldTo: marlin.zook@demo.invalidDeliveredAug 20, 4:02 PM
Marlin — quote attached for the 40×64 with 14' sidewalls, 29ga painted steel both sides. Price holds 30 days.
MZMarlin ZookTo: Marcus FeldAug 21, 9:14 AM
Thanks Marcus — the number works. One question about the sidewall height before we sign anything.
Reply Forward
The delivery chip on the collapsed quote thread, with Reply and Forward beneath. Real screen · sample data.
Without it

You chase a quote for three weeks thinking they are mulling it over, when the address had a typo in it and the thing never landed at all.

Why we built it

Status rides on the message itself instead of living in a separate report, so "did they even get the quote" is answered in the same place as the quote — and only mail we sent ourselves carries a provider id, so a message that came down a connected CRM shows no status rather than a made-up Sent. A quote that bounced, or that has sat unopened for a week, is chased from where you sent it: review and send goes through what each of those words means and what to do next.

Sound familiar?“the conversation is split between my phone and the CRM”
06

Reading a message on the run does not clear the reminder to answer it

Opening a conversation does not mark it read. Only pressing Mark read does. A rep who glances at a text from the truck still has the badge waiting when he gets to a desk. Texts from numbers nobody has saved are not lost either — they collect in their own Unassigned tab, and one dropdown files the message onto the right person.

Contacts
Import 3 dups
AllUnread (3)SMSEMAILRecentA–Z
MZ
Marlin Zook12m
Sounds good — I'll be out at the site Thursday morning.
$74,300.002
DB
Danielle Beiler3h
Your 40×64 post-frame quote
$68,120.00
CH
Curtis Hoover1d
Voicemail from (717) 555-0132 - 0:24
1
RP
Rosalyn Petersheim2d
Can we move the overhead door to the gable end?
$92,450.00
WF
Wendell Fisher6d
Equipment Storage
Unread counts still lit on the rows, with the Unassigned tab at the end of the filter row. Real screen · sample data.
Without it

A question sits four days unanswered because someone opened it at a stoplight, and the count that was supposed to remind you had cleared itself by the time anybody got to a desk.

Why we built it

The unread count is a to-do list, not a record of who looked, so it clears on a deliberate act. The list puts unread threads above everything else and orders both tiers newest-message-first, so an incoming text re-sorts the column live — and the Unassigned pile deliberately offers no "create contact" button, because a stranger's text is not a lead until somebody says it is.

07

The follow-up you write twenty times a week goes out in two clicks

Saved messages, merge fields and your signature live on the account, not in one browser tab — so they are still there next week, and a starter set arrives already carrying your company name. Drop in the customer's first name, their building type or your own name from a list, and see what each one turns into before it goes. Or press the microphone and talk, which is what you want with gloves on. Send splits: a message written at nine at night goes out at eight in the morning, and sits in the thread as a dashed bubble until it does.

Conversation — compose
Subject...
Hi Marlin — revised quote attached with the 16' sidewalls. Everything else is unchanged.
SMSEmail CallSnippets Send
Send Now
Send Later
Schedule for a time
Saved messages and merge fields, open above the compose box. Real screen · sample data.
Without it

The same "we are on for Thursday, weather permitting" note gets retyped from scratch forty times a month, and one in five goes out with the last customer's name still sitting in it.

Why we built it

All of it sits on the compose row itself — no side panel, no library to go and open — because a shortcut that costs you a detour stops being a shortcut, and people quietly go back to typing it out. Snippets are read from the database rather than held in the page, which is the difference between Save as snippet working and only appearing to work until the next refresh.

08

The thread is a count you can trust of what was actually sent

A text sent through a connected CRM exists in two places at once, and the pair collapses into one row. Send the same thing twice on purpose and it still shows twice — nothing is hidden from you. Everything the platform sends is written into the conversation as well as leaving, so unplug the CRM in the integrations tab tomorrow and the record of what you told this customer stays exactly where it is.

Timeline
Timeline

Same audit history as the pipeline card — every stage move and SOP step, with who and when.

In platform
9d 3h
since Aug 17, 2026
Current stage
1d 18h
Create Estimate
To first contact
7h 36m
created → contacted
New Lead2d 4h
Aug 17, 9:02 AM → Aug 19, 1:15 PM · moved here by Marcus Feld
  • Assign an ownerAug 17, 9:04 AM
  • Make first contact — call, text, or emailAug 17, 4:38 PM
Contacted5d 2h
Aug 19, 1:15 PM → Aug 24, 3:20 PM · moved here by Marcus Feld
  • First contact attemptAug 19, 1:31 PM
  • Follow-up 1Aug 21, 8:40 AM
  • Follow-up 2not completed
  • Add to short-term nurture(optional)not completed
Create Estimate· current1d 18h
Aug 24, 3:20 PM → now · moved here by Dale Whitmore
  • Estimate draftedAug 24, 4:02 PM
  • Verify SmartBuild takeoffopen
  • Confirm markup / priceopen
  • Internal review(optional)open
One durable row per thing that actually happened, whichever pipe carried it. Real screen · sample data.
Without it

A rep texts a customer, pulls them up an hour later, finds an empty history and sends the whole thing again — so the customer gets it twice and decides nobody in your office talks to each other.

Why we built it

Both pipes are read rather than one being trusted and the other ignored. Matching on ids alone is not enough — a send through the CRM often comes back with no id at all, which is why every estimate text showed twice — so an outbound row is paired on the same words within five minutes, and the pairing is one-to-one, which is what keeps a deliberate re-send counting as two.

Sound familiar?“customer says they sent me a photo and I can't find it”
09

The message is written down before anyone works out whose it is

A reply is stored first and interpreted after. Who sent it, which contact it belongs to and who gets told are all worked out afterwards, and any of them is allowed to fail without the message going anywhere. A text from a number nobody recognises is still a text. So is a note the customer types on their own project page — this page is about where it comes out on your side.

Settings — Notifications
Notifications
Pick which roles get notified for each event. Project-level assignees (set on each project’s detail page) always receive project notifications regardless of the role toggles here.
Account controls · two switches, applied in order
1 · Account notifications — ONsince 3/14/2026

The master power switch for this company. While it is on, everything below decides what actually goes out. Switch it off and nothing is sent on any channel to anyone — your team or your customers — and every setting is kept exactly as it is.

2 · The 36 events in the table below — ON
36 events · 21 sending email · 36 showing in the bell.
Only want to quiet your own alerts? Everything on this page applies to the whole company. Your personal notifications are under Settings → My Profile → My Notifications, and turning yours off there leaves everyone else’s exactly as they are.
Alerts sent by your build-stage automations are configured separately under Settings → Stage Automations and are not affected by either switch.
EventsEveryone (by role)
ShowAllInternalTo customersCategoriesSingleMultiple
EventAdminSalesProject ManagerCrew LeadWorkerChannels
Sales Pipeline· 10
Estimates & Orders· 4
Invoicing & Payments· 4
Contracts & Legal· 6
Project Management· 7
Project started
Someone clicked Start Project on an estimate.
In-appEmailSMS
Project stage completed
A build stage was marked complete.
In-appEmailSMS
Project completed
Final stage was marked done.
In-appEmailSMS
Weather advisory (day before)
Tomorrow's forecast may change the plan — heat, cold, wind, storms, rain or mud.
In-appEmailSMS
Crew ran past its figured days
A crew on hourly + shared surplus has worked more days than the job was figured for.
In-appEmailSMS
Shortfall needs a decision
A job finished over budget — decide whether the crew carries it or the company absorbs it.
In-appEmailSMS
Conduct report filed
Someone filed a performance, conduct, safety or attendance report about a team member.
In-appEmailSMS
Teams & Crew· 2
System & Integrations· 3
Notification preferences — the alert is optional, the message is not. Real screen · sample data.
Without it

Notifications are switched off while the office argues about who wants what, and a customer's reply is never seen by anybody because the alert was the only thing carrying it.

Why we built it

Carriers deliver at least once and retry anything slow, so a unique index on the provider's own message id means a retry lands on the same row instead of a second copy of the customer's text. The alert is deliberately downstream of the write and gated on your own opt-in in the notification grid: silence is a delivery preference, not permission to drop mail. And when a reply comes back to a sending domain several builders share, it is held for a human rather than filed on a guess — holding a message is recoverable, dropping it into a competitor's inbox is not.

10

The same conversation is on the lead card

Open a deal on the sales board and the Conversation tab shows the same thread, off the same spine, refreshed on the same ten-second beat. Text or email from there without leaving the deal you are working. It is the short version — no photo gallery, no activity panel — but it can never disagree with the full one.

Card conversation
(717) 555-0…
Send a text
Call
MessagesPaige Kauffman
AllTextsEmails
No messages yet — say hello below.
TextEmail
Subject…
Email Paige…
Send
The deal card's Conversation tab — same thread, smaller frame. Real screen · sample data.
Without it

You are mid-deal on the board, need to answer one question, and end up in a second tab hunting for the same person you already have open.

Why we built it

A light sibling rather than a second copy: both surfaces call the same merge of the two pipes, so there is no chance of one showing a message the other has not got. Its channel buttons are gated on what the company can send, never on the phone number cached in the card — the provider resolves the real address at send time, and a missing one comes back as a plain error instead of a button that mysteriously does nothing.

Sound familiar?“I have to check three places to see what we told this customer”
11

Ringing them back goes on a list, not in your head

There is a button on the conversation header that drops this person's number straight onto the call list. Reading a thread is exactly when someone decides to ring back, and the decision and the list are one press apart. The calls that went unanswered are already on that same list, put there by the missed-call rules.

Phone — Queue
Phone
RecentsContactsKeypadVoicemailQueue3
Clear all (3)
Curtis Hooverurgentmissed call
Missed call · left a voicemail
Wants a price on a 30×40 lean-to before the weekend.
CallDone
Rosalyn Petersheimhigh
Follow up with Rosalyn Petersheim
CallDone
(717) 555-0166missed call
Missed call · no answer
CallDone
The queue the header button adds to — every call still owed. Real screen · sample data.
Without it

You read the voicemail transcript, think "I'll ring him after lunch", and remember at six o'clock on the drive home.

Why we built it

One list holds both the calls you meant to make and the calls nobody returned, because a rep working a queue should not have to check two of them — and a text back closes the same debt a call would, so a builder who answers with a message does not read as somebody who ignored the lead.

12

I'll get back to them Thursday, written where Thursday can find it

A reminder button in the thread header opens already knowing who this is. Three presets, because they are the only three things a rep means by I'll get back to them: reply to their last message, call them, or check in if they have not replied. The task carries the contact with it, so it opens back onto this conversation.

New task — reminder
Estimate sent
New task
Marla Zimmerman — 40×64 equipment barn
Due date
Sep 12, 2026 at 9:00 AM
Reminder
At the due time30 min before1 hour before24 hours before
or2.5hoursbefore it’s due
Due: Sat, Sep 12, 9:00 AM
Reminder: Sat, Sep 12, 8:00 AM — 1 hour before
Task
Call to walk it throughAsk about the door packageChase for a decision
Call to walk it through
Notes (optional)
Anything future-you needs to know to do this right…
Assign to
Sheila Nunez — Sales
Priority
High
Repeat
Doesn’t repeat
Remind via
In-appEmailTextPush
They’ll get a notification that you assigned this to them, with the details.
Assign taskCancelDue Sat, Sep 12, 9:00 AM
A follow-up reminder, pre-addressed to the person you are reading. Real screen · sample data.
Without it

You tell yourself you will chase the colour choice on Thursday, and Thursday arrives with nothing anywhere saying so.

Why we built it

The reminder is created where the intention forms — in the middle of reading — instead of on a task screen you have to go to and re-describe the situation on. It is filed as coming from the inbox thread, so a follow-up that was never made can be traced back to the conversation that should have produced it.

13

Hand the job over and the record is the briefing

The thread does not stand alone on the screen. The rail beside it — his number, the job address, what he is having built and where the lead came from — is the contact record, and everything anyone has written about him is in one note stream on the same screen. A rep who has never spoken to this customer opens one screen and knows the job.

Contact Details
Contact Details
MZ
Marlin Zook
Contacted
$74,300.00
Queue call
Pipeline Estimate #990214
Build estimate in 3D Builder
Phone(717) 555-0118
Emailmarlin.zook@demo.invalid
Address1840 Weavertown Rd · Gap, PA · 17527
BuildingBarndominium
SourceFacebook
Lead formSpring Barndo — Lancaster
What are you looking to build?
40×64 barndominium, 14 ft sidewalls
When do you want to start?
Spring 2027
The facts rail beside the conversation, on the same screen. Real screen · sample data.
Without it

The rep who owned this customer is on holiday, and the briefing is a five-minute phone call to him from the truck that leaves out the two things that matter.

Why we built it

The conversation and the facts are kept side by side rather than on separate tabs, because the question a rep actually has is never what did we say or what are they buying on its own — it is both at once, and a tab between them is where the handover breaks down.

How it works
  1. 1Click a customer and their whole history loads in one column.
  2. 2Every row is labelled by how it arrived — a call looks like a call, not a chat bubble.
  3. 3The thread keeps itself current while you read it. No refresh button.
  4. 4Photos open in place. Voicemails play in place. You never leave the record.
  5. 5Reply from the box underneath by text, email or call.
Why we built it

A builder does not think in channels. He thinks about the person who owes him a decision. Messages used to arrive down two different pipes and only one of them was being read. So a rep could text a customer, open that customer's record, and see "No messages yet" — then send the whole thing again. The customer got it twice and the rep looked disorganised. Now every text, email, call and voicemail for a person lands in one thread on their record, whichever pipe carried it.

The problem
  • Message history scattered across a phone, an email client and a CRM
  • No single record of what a customer was told and when
  • Replies arriving on a channel nobody was watching
What you get
One screen answers 'what has happened with this customer'
Handover to another rep needs no verbal briefing
Photos, voicemails and recordings live where the customer lives
One system for the whole post-frame business, so the conversation, the card and the estimate are already linked
What's inside
The same message never shows twice

When you send through a connected CRM, two copies get written — one by the CRM, one here. The copy kept here is deliberate: it is what keeps your history if you ever disconnect. You only ever see one of them. Send the same message twice on purpose and it still shows twice.

Messages from numbers you don't have saved

A message from an unknown number is still kept. Because it belongs to nobody yet, it would show up on nobody's record — so it goes to an Unassigned tab instead. You see the number, the message, any photo, and a search box to pick the person it belongs to.

Unread stays unread until you say so

You decide when a message is dealt with, not the act of looking at it. The unread badge survives opening the thread. It clears when you press Mark read at the top, and not before.

Threads open on the newest message

The thread starts at the bottom every time — on open, on refresh, and when you switch customers. Scroll up to read back through the history and it stops following you. A jump button returns you to the newest message.

Text, email or call from the same box

The reply box is pinned under the conversation. Text and Email are two buttons; Call is the third, and it rings that customer without leaving the screen. A greyed-out channel says which of two things is missing — your account is not set up for it, or this person has no number or address on file.

Saved messages, templates and your signature

Three things, one list. A saved message is reusable wording. A template is a saved message that carries its own subject line. A signature adds itself to the bottom. A starter set — quote follow-up, build update, payment reminder, estimate email, welcome email — arrives already written with your company name in it, and you can edit or delete any of them.

Drop the customer's own details into a message

A picker beside the reply box lists everything you can drop in. Each one shows what it will actually say for the customer you are looking at, before you send. The same list works in your saved messages and in the automatic customer updates.

Talk instead of type

A microphone button beside the reply box. Talk and the words appear as you speak. Stop, type a correction, then talk again — the two mix freely. The listening happens on your own device, so no audio is sent anywhere and there is nothing per-minute to pay. On a browser that cannot do it, the button is not there at all.

Forward a customer's email to someone else

Every email in the thread has Reply and Forward. Forward shows you the original, a To box and a note box. What goes out is your note on top, the original underneath, marked as a forwarded message the way anyone would expect.

What happened to the email after you sent it

A small chip on each email you sent, showing the furthest it is known to have got. Open it and you get the honest version: hard facts (delivered, bounced, complained), a real signal (they clicked a link), and a soft one (opened). It also tells you when the customer's mail provider fetched the message on its own — because after that, a genuine open can no longer be seen.

Emails look the way the customer sees them

Emails are shown as the sender built them. A supplier quote or a formatted newsletter keeps its layout and reads in place, in the thread.

Photos customers text you, filed automatically

Photos that arrive by text are gathered into a Photos block on the contact, as well as showing in the thread where they landed. Open one and swipe through every photo that customer ever sent. A picture whose file has expired at the other end drops out rather than sitting there as a broken tile.

Voicemails and call recordings, filed on the customer

Audio on a customer's thread is sorted into two lists on their record. Voicemails sit at the very top and open by themselves, because a message someone left is a person waiting on a call back. Recordings sit underneath, folded away, because they stack up fast. Every clip shows whether anyone has listened to it, and you can star the one that matters.

Calls read as calls in the conversation

Every call lands in the customer's thread as its own kind of row. Answered incoming with how long it lasted. Missed, with the reason. Outbound, with what came of it. Voicemail, with a player on it. Green for incoming, red for missed, your brand colour for outgoing — plus an arrow showing the direction.

Customer replies actually reach you

The receiving half of a two-way conversation. The message is saved before anything else happens. Working out who sent it, telling the team, filing it on a record — all of that comes after, and none of it can throw the message away. A text from a number nobody recognises is still a text.

CUSTOMER COMMUNICATIONS

See one conversation per customer
on one of your own jobs.

Twenty minutes, your building, your numbers. Bring the job where “I can't remember if I texted or emailed them” — we will show you exactly where that stops.

leads2build.com
Conversation
MZMarlin Zook(717) 555-0118Mark read (2)
Your 40×64 post-frame quote
Marlin Zook • Aug 21, 9:14 AM(3 messages)
Opened 2×
Thanks Marcus — the number works. One question about the sidewall height before we...
Can we bump the sidewalls to 16' instead of 14? Want the lift to clear.
Aug 22, 7:48 AM
Yes — 16' adds about $4,100. I'll send the revised quote this afternoon.
Aug 22, 8:03 AM
Voicemail
📞 Voicemail from (717) 555-0118 - 0:24
0:00 / 0:24Voicemail
Transcript
Aug 24, 4:12 PM
ShowTextsEmailsShowing all
Contractor Communication Software: One Thread per Customer