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
I run three Close orgs. 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.
Real screenshot goes hereThe Close org switcher with the three orgs listed
-
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.
Real screenshot goes hereThe smart view editor with the cap condition and the two-way exemption
-
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.
Real screenshot goes hereThe dial view sorted by last communication date, oldest on top
-
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.
Real screenshot goes hereThe four upcoming views in the sidebar with their counts
-
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.
Real screenshot goes hereAn unsent draft on a lead, sender and cc visible
-
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.
Real screenshot goes hereA pinned post-call note with the five-line shape
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.
Free
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.