Our own ops
Note to Self
I stopped opening the CRM from the truck. Now a screenshot of the text thread writes the note and the task.
I wasn’t going to open the CRM
A seller texts me while I’m driving. Or a partner sends three screenshots from a walkthrough he just did — the real reason they’re stalling, what the roof actually looks like, the number they’d actually take.
To get that into Close I have to pull over, open the app, find the lead, retype what he told me, set a task. So I don’t. I tell myself I’ll do it tonight.
I don’t do it tonight.
Do that for a month and the pipeline is fiction. Opportunity value sitting at zero on a deal I’ve already made an offer on. Stage says “open to sell” when we’re three rounds into negotiating. A contact saved under a name the guy has never once spelled that way. And I don’t find out until I’m building an offer off a record that’s four conversations stale.
So I built the shortest path between the two. Screenshot in, CRM updated.
What it does
Send it the screenshot. It reads the thread — multiple shots get put back in order off the timestamps — and pulls out who’s actually who (a partner walking a unit is recon, not a seller conversation), the condition, any number that got mentioned, what somebody promised to send, and why they’re not moving. That last one it sorts into emotional, price, or timing, because those are three completely different problems.
Then it writes a pinned note on the lead and one follow-up task, due whenever the thread said it was due. “Sending HOA docs this week” becomes a task due Thursday.
<rect x="16" y="52" width="140" height="116" fill="var(--color-xv-bg-tertiary)" stroke="var(--color-xv-border)"/>
<text x="30" y="72" fill="var(--color-xv-text-muted)" letter-spacing="1.4">THE THREAD</text>
<rect x="30" y="84" width="86" height="15" rx="7" fill="var(--color-xv-border)" opacity=".55"/>
<rect x="46" y="105" width="96" height="15" rx="7" fill="var(--color-xv-border)" opacity=".85"/>
<rect x="30" y="126" width="70" height="15" rx="7" fill="var(--color-xv-border)" opacity=".55"/>
<text x="30" y="158" fill="var(--color-xv-text-muted)" font-size="10">3 SCREENSHOTS</text>
<line x1="158" y1="110" x2="206" y2="110" stroke="currentColor" stroke-width="1.2" marker-end="url(#nts-a)"/>
<text x="182" y="101" fill="var(--color-xv-text-muted)" font-size="10" text-anchor="middle">send</text>
<rect x="214" y="26" width="234" height="168" fill="var(--color-xv-bg-tertiary)" stroke="var(--color-xv-border)"/>
<text x="230" y="48" fill="var(--color-xv-accent)" letter-spacing="1.4">READS FOR</text>
<text x="230" y="74" fill="var(--color-xv-text-secondary)">whose side they're on</text>
<text x="230" y="96" fill="var(--color-xv-text-secondary)">condition</text>
<text x="230" y="118" fill="var(--color-xv-text-secondary)">any number said out loud</text>
<text x="230" y="140" fill="var(--color-xv-text-secondary)">what got promised</text>
<text x="230" y="162" fill="var(--color-xv-text-secondary)">obstacle type</text>
<text x="230" y="180" fill="var(--color-xv-text-muted)" font-size="10">emotional / price / timing</text>
<line x1="450" y1="110" x2="498" y2="110" stroke="currentColor" stroke-width="1.2" marker-end="url(#nts-a)"/>
<text x="474" y="101" fill="var(--color-xv-text-muted)" font-size="10" text-anchor="middle">one lead</text>
<polygon points="562,54 626,110 562,166 498,110" fill="var(--color-xv-bg-tertiary)" stroke="var(--color-xv-accent)" stroke-width="1.4"/>
<text x="562" y="106" fill="var(--color-xv-accent)" font-size="10.5" text-anchor="middle" letter-spacing="1">MY LEAD?</text>
<text x="562" y="122" fill="var(--color-xv-text-muted)" font-size="9.5" text-anchor="middle">owner check</text>
<line x1="628" y1="110" x2="676" y2="110" stroke="var(--color-xv-accent-pass)" stroke-width="1.3"/>
<line x1="676" y1="68" x2="676" y2="152" stroke="var(--color-xv-accent-pass)" stroke-width="1.3"/>
<line x1="676" y1="68" x2="700" y2="68" stroke="var(--color-xv-accent-pass)" stroke-width="1.3" marker-end="url(#nts-p)"/>
<line x1="676" y1="152" x2="700" y2="152" stroke="var(--color-xv-accent-pass)" stroke-width="1.3" marker-end="url(#nts-p)"/>
<text x="650" y="101" fill="var(--color-xv-accent-pass)" font-size="10" text-anchor="middle">yes</text>
<rect x="702" y="42" width="238" height="52" fill="var(--color-xv-bg-secondary)" stroke="var(--color-xv-accent-pass)"/>
<text x="718" y="64" fill="var(--color-xv-accent-pass)" letter-spacing="1.2">PINNED NOTE</text>
<text x="718" y="82" fill="var(--color-xv-text-muted)" font-size="10">structured, on the lead</text>
<rect x="702" y="126" width="238" height="52" fill="var(--color-xv-bg-secondary)" stroke="var(--color-xv-accent-pass)"/>
<text x="718" y="148" fill="var(--color-xv-accent-pass)" letter-spacing="1.2">ONE TASK</text>
<text x="718" y="166" fill="var(--color-xv-text-muted)" font-size="10">due when the thread said</text>
<line x1="820" y1="180" x2="820" y2="202" stroke="var(--color-xv-text-muted)" stroke-width="1" stroke-dasharray="3 3"/>
<text x="820" y="216" fill="var(--color-xv-text-muted)" font-size="9.5" text-anchor="middle">unless an open task already covers it</text>
<line x1="562" y1="168" x2="562" y2="244" stroke="var(--color-xv-accent-fail)" stroke-width="1.4" marker-end="url(#nts-f)"/>
<text x="576" y="208" fill="var(--color-xv-accent-fail)" font-size="10">no</text>
<rect x="418" y="248" width="290" height="50" fill="var(--color-xv-bg-secondary)" stroke="var(--color-xv-accent-fail)" stroke-width="1.4"/>
<text x="434" y="270" fill="var(--color-xv-accent-fail)" letter-spacing="1.2">STOPS. WRITES NOTHING.</text>
<text x="434" y="288" fill="var(--color-xv-text-muted)" font-size="10">reports back, touches no record</text>
<path d="M330 196 V 346 H 696" fill="none" stroke="var(--color-xv-text-muted)" stroke-width="1.1" stroke-dasharray="4 4" marker-end="url(#nts-m)"/>
<text x="344" y="338" fill="var(--color-xv-text-muted)" font-size="10">can't prove it →</text>
<rect x="702" y="320" width="290" height="52" fill="var(--color-xv-bg-secondary)" stroke="var(--color-xv-border)" stroke-dasharray="4 4"/>
<text x="718" y="342" fill="var(--color-xv-text-muted)" letter-spacing="1.2">RECOMMENDS ONLY</text>
<text x="718" y="360" fill="var(--color-xv-text-muted)" font-size="10">stage · opportunity value · contact edits</text>
</g>
</svg>
What it won’t do
This is the part I actually care about.
It confirms the lead is mine before it writes a single character. Not mine, it stops and tells me. Doesn’t touch it.
It reads my open tasks first. If something already covers the next move, it won’t stack another one on top — it tells me to sharpen the one I’ve got.
And it won’t change a pipeline stage, an opportunity value, or a contact record on its own. It surfaces them and waits. It will never guess a dollar amount.
I built the guardrails because I’m the one who cleans up the pipeline when it’s wrong. Something that writes confidently to my CRM is worse than nothing.
The part I didn’t plan on
Every thread I log turns into an audit. It’s already comparing what the screenshot says against what the record says, so it just tells me where they disagree. Half of what it flags now has been wrong in there for weeks.
In — what I sentiMessage
Walked the duplex. Roof's newer than the listing says, maybe 4 years. Kitchen's original.
Furnace is shot though. He knows it.
Did he say a number?
Said he'd take 240 but he's weird about it — his mom lived there. Kept bringing her up.
He's sending me the HOA docs this week.
Out — what it wrotepinned note
SOURCE: Partner walkthrough, relayed by text.
CONDITION: Roof ~4 yrs (newer than listing).
Kitchen original. Furnace failed —
owner is aware.
PRICE / TERMS: Owner stated $240K.
** OBSTACLE ** EMOTIONAL — mother lived
in the property; raised repeatedly.
PENDING: HOA docs from partner, this week.
NEXT STEPS: 1) Get HOA docs
2) Approach as sentimental seller,
not a price negotiation
+ TASK FOLLOW UP — HOA docs + sentimental-seller approach
due Thursday · from "this week"
Illustrative — composite, not a real thread
Where it ended up
At least once a day now, between Close and ClickUp. I almost never update tasks in the actual software anymore — I send a screenshot and it’s done.
That’s not what I set out to build. I just wanted to stop losing seller intel in my text messages.
The old version of this was a note to self. This one actually gets written.
Build your own version
None of this is specific to Close, or to real estate. The five slots below are the whole design — mine are filled in, yours are the questions to answer. The order matters: refusals get written before actions, or you’ll spend more time cleaning up than you saved.
The entry point you avoid
Opening Close from the truck to log something a partner just told me.
The screen you know you should open on your phone and never do.
An input you already produce
Screenshots. I was already taking them — they just died in my camera roll.
Whatever you already screenshot, forward, or talk into your phone. Don't invent a new habit.
The output shape, not the output
A fixed note template and a task naming rule: CALL — / TEXT — / OFFER —
The format your records should have had all along. Define it once and it's enforced forever.
Write the refusals first
Not my lead, stop. Open task already covers it, don't duplicate. Never guess a dollar amount.
List the mistakes you'd have to fix by hand. Each one becomes a hard rule before you write a single action.
Let it recommend what it can't prove
Pipeline stage, opportunity value, contact spelling — surfaced every time, changed never.
Anything where being wrong costs more than being slow. That's the recommend pile.