How we use Close CRM as the single source of truth for outbound sales
Close is the memory. Every other tool is a sensor. Here is the setup, the queries, and the two views that lied to me.
Close is where everything lands. Every call, text, email, note, payment and next step goes on the lead. My dashboards read from Close. They never write to it. When a number on a dashboard disagrees with Close, Close wins and the dashboard gets fixed.
That rule sounds obvious. It took me a year of duplicated trackers to actually live by it. Every second store drifted from the first. So now there is one.
This page is the setup I run across ten client campaigns and my own pipeline. The smart views, the cap, the drafts-only rule, and the post-call note. Copy what you need.
The setup, in six steps
- 01
Set up one org per business, one key per org
Until Oct 24, I ran three Close orgs. Now it is all in one. Before that, there was one for Coda's own pipeline. One for every client campaign, with a Client field and a Campaign field on each lead. One for a partner that runs mixed. Each org gets its own API key and nothing else.
The lesson came from a bug. Two of my keys pointed at the same org under different names, a script looped over both, and "eight owed replies" was really six. If you script against Close, dedupe by org id before you count anything.
- 02
Build the cap view: 10 calls or 5 emails, unless they talked to us
Every client has a dial view with the same condition. Keep the lead in the queue while num_calls is 9 or fewer and num_sent_emails is 4 or fewer. Exempt anyone with two-way interaction: an incoming email, or a call with 60 seconds or more of talk time.
The exemption matters. My first version left it out and pulled 39 leads out of one client's queue. Four of them had really engaged. Two details that cost me an afternoon: the email direction value is incoming, not inbound, and inbound matches nothing. And Close has no num_outbound_calls, so a prospect calling us back burns one of their ten. I accepted that trade.
- 03
Sort the coldest lead to the top
All 18 dial views sort by last_communication_date ascending. The lead nobody has touched the longest is first. That is how no live prospect goes more than three days untouched. Do not try to sort by date_activity, it returns a 400.
Pair it with a second view called Worked out, 10 calls or 5 emails. Mine held 62 leads the day I built it. Those go to Nurture on purpose. They never silently drop.
- 04
Use four upcoming views instead of new statuses
Upcoming meeting: status Meeting set or Rescheduling, Meeting Outcome empty, meeting time today or later or not set. Upcoming sign up. Upcoming call back. Close out, date passed, no outcome.
Attended or no-show lives in a Meeting Outcome field, not a status. Callbacks live in a Next dial date custom field, because Close cannot query tasks from lead search. A script writes the field and the task together. "Field is empty" is written as an exists condition with negate set to true.
- 05
Drafts only, and read the query before you trust a count
Every agent output is a draft in Close, from the correct sender. A person clicks send. One draft per purpose, and a rewrite deletes the old one. A sender guard runs every two minutes so nothing leaves from another client's address.
Then the view that lied. My pinned Open drafts view read 8. The truth was 78 drafts on 73 leads across three orgs, because the view was filtering on a hand-stamped field instead of the actual draft status. A view's name is not its query. Open s_query and read it.
- 06
Write the post-call note from the call, then fix the record
"Spoke with {first name} at {company} about {topic}." Then initial reaction, key pain points as bullets using only what they said, interest level, next steps with a real date and time. Five stages only: Meeting set, Qualified, Needs more value, Nurture with a reason and a date, Referral where the referred person becomes their own lead. Gatekeeper, voicemail and wrong number are attempts, not stages.
Then the part everyone skips. A conversation outranks every data vendor. In my first two weeks of checking, 11 of 14 real conversations had a record problem afterward: three title changes, three drafts aimed at the wrong person, five stale statuses. One 90-second call said a man was no longer GM. Ten days later the lead still said GM and a draft was addressed to him. Now the title gets fixed before any draft is written.
What this replaces
With Close set up this way, these go away.
- The spreadsheet of who to call next.
- A second tracker in Notion or Sheets that drifts from the CRM.
- The Slack thread asking whether anyone replied.
- A separate place for client comments on calls. Mine are Close notes with a tag.
Run this today
- Count your orgs and your keys. One key per org, and dedupe by org id in any script.
- Build the cap view on one client. Copy the condition from the box below.
- Set the sort to last_communication_date ascending. Nothing else.
- Build Worked out as the inverse. Route it to Nurture, never delete.
- Add a Meeting Outcome field and a Next dial date field. Build the four upcoming views on them.
- Open every pinned view and read the s_query. Fix the one that lies.
- Paste the note template into your post-call prompt. Fix the contact title before the next draft.
The Close smart-view recipe
The cap condition, the four upcoming views and the post-call note, written the way Close's filter editor reads them.
VIEW "<Client> dial queue" (one per client, same condition)
keep the lead while:
(num_calls <= 9 AND num_sent_emails <= 4)
OR an email exists with direction = "incoming" <- not "inbound". That matches nothing
OR a call exists with duration >= 60 seconds
sort: last_communication_date ascending <- date_activity is not sortable (400)
VIEW "Worked out, 10 calls or 5 emails"
the inverse of the cap with no two-way -> route to Nurture, never delete
VIEW "Upcoming meeting"
status in (Meeting set, Rescheduling) AND Meeting Outcome is empty
AND (Meeting Time >= today OR Meeting Time is empty)
VIEW "Upcoming call back" Next dial date >= today (custom date field. Tasks cannot be queried)
VIEW "Close out, date passed" Meeting Time < today AND Meeting Outcome is empty
"is empty" in Close's query language = {"type": "exists"} with "negate": true
Meeting Outcome values: Meeting showed / No Show / Held - Qualified / Held - Nurture /
Held - Disqualified / Rescheduled
POST-CALL NOTE
Spoke with {first} at {company} about {topic}.
Initial reaction:
Key pain points: (bullets, only what they said)
Interest level:
Next steps: (a real date and time, in their timezone)
Stage: Meeting set | Qualified | Needs more value | Nurture (reason + date) | Referral (who)
Gatekeeper, voicemail, wrong number = attempt, not a stage. Never name the caller.Free Claude prompts for sales.
Prompts for cold calls, objections and cold email, free to copy. They live on Simple AI.
The questions I get on this.
What counts as two-way interaction in the cap?
An incoming email on the lead, or a call with 60 seconds or more of talk time. A voicemail is not two-way. A gatekeeper is not two-way. If they engaged once, the cap never retires them.
Why 10 calls and 5 emails?
Because after that, without a reply, the next touch is noise. My words when I set it: so we don't waste our time. The leads that hit the cap go to Nurture with a date, not to the trash.
Why not make attended and no-show statuses?
Because status is where the lead is in the pipeline, and a no-show is what happened to one meeting. A Meeting Outcome field keeps the two apart, and the upcoming views filter on it.
Does Close send the drafts on its own?
No, and nothing I run is allowed to. Every draft sits on the lead from the right sender until a person clicks send. Free Claude prompts for sales are on Simple AI.
One page per tool.
- The system
- The whole stack in six pieces, and how they fit.
- Claude
- The ten prompts, the org chart, and the model routing.
- Apify
- Who posts, who changed jobs, who already left. The actor and the trap.
- Trestle
- One API call, one field. The drop list and why the score is ignored.
- Prospeo
- The exact filter set, the 10-credit math, and proving it twice.
- Stop wasting time
- Four measured rules, and the numbers that made my own count go down.
Don't see your work here?
Tell me what you do every day, and I'll make guides and prompts for it.
Got it. Thank you. I read every request.