Automated pipeline hygiene: stay on top of every deal without a pipeline review
A Claude Code agent reads every customer transcript from the prior day, cross-references it with your CRM, and surfaces deal moves, risk signals, and next-step gaps to Slack. You'll know where every deal is without having to ask.
What you'll have when you're done
A daily Slack ping (or a daily [markdown][12] file, if you don't use Slack) that summarizes the previous day's customer conversations against your pipeline. Three sections:
- Deal moves. Stage changes implied by the conversation but not yet logged in the CRM. The buyer said "let's get legal involved next week"; the CRM still shows Discovery.
- Risk signals. Tone shifts, competitor mentions, decision-maker dropouts, missing budget signals, silences where there used to be enthusiasm.
- Next-step gaps. Deals where the agreed next step wasn't actually scheduled before the call ended.
You don’t need to run pipeline reviews to figure out where things stand. The information you and your team would spend 60 minutes of meeting time trying to put together shows up automatically every day. Best of all: Your forecast stops being inaccurate because the agent reads the actual conversations, not the CRM.
I was the pipeline review
Pipelines die in the gap between what happens on a call and what gets logged. I lived in that gap for years. A rep would tell me deal X was "great, just waiting on procurement" and I'd take it at face value. Three weeks later the deal is lost and the post-mortem says the buyer dropped off after the second call because the demo missed a feature the buyer had asked about three times. Nobody logged that.
I tried what every CEO tries. Tighter pipeline reviews. Mandatory CRM hygiene policies. "Everything in HubSpot by Friday." None of it worked (and it was hard behavior to police). The truth lived in the conversations and the conversations weren't being reviewed by anyone who could act on the signal.
The fix is to make the agent read the conversations, not the CRM. The CRM is a lossy translation of what happened. The transcripts are the source of truth. A Claude Code agent that reads every [Granola][10] transcript from the prior day, cross-references the CRM, and tells me what's actually moving (or not) gives me board-grade pipeline visibility without having to bug anyone on my sales team.
Dave Killeen, a CPO at a $2.6B company, runs a version of this. He sits on 45 enterprise deals without attending a single pipeline review. The conversations come in through Granola. Claude Code reads them, scores them, surfaces signals. Aakash Gupta surfaced the architecture publicly. The shape is exactly what you'd build if you trusted the calls more than the CRM.
What you need first
- The Granola → markdown pipeline already running. This workflow runs on the markdown library that pipeline produces. If you haven't set it up, do [Granola → markdown][1] first. About 30 minutes.
- Claude Code installed and pointed at the folder your Granola transcripts land in. If you already did the [Claude memory workflow][2], you're set.
- A CRM you can query. Salesforce, HubSpot, Pipedrive, Attio, Close, anything with an API you can access.
- A Slack workspace and a bot token (10 minutes to create) OR skip Slack and have the agent write to
~/notes/pipeline-radar.md. Both work. - 45 minutes for the first build. Once it's wired, you spend zero minutes on it per week.
Step-by-step
Step 1Get your CRM into a file Claude can read
Claude Code reads files. So the first move is making your pipeline a file. Two options:
Option A · CSV export (start here). Most CRMs let you export an "Open Opportunities" or "Active Deals" view to CSV. Save it to ~/notes/crm/active-deals.csv. Refresh manually for the first week to confirm the workflow earns its keep before you automate the export.
Option B · API pull (when you're ready). Get Claude to write a small script that hits your CRM API once a night and lands the same CSV. We use HubSpot at Lantern; Claude Code can write the puller for the HubSpot API in 15 minutes if you give it a private-app token and the field names you care about. Pipedrive, Salesforce, Attio, and Close all work the same way.
The columns you need at minimum:
deal_id, account_name, owner, stage, amount, expected_close, last_activity_date, next_step, next_step_date
That's it. Don't try to capture everything. The signal you want lives in the transcripts; the CRM file is the index.
Step 2Write the pipeline-scan prompt
This is the load-bearing block. Save it once so the daily routine can call it.
mkdir -p ~/.claude/prompts
touch ~/.claude/prompts/pipeline-radar.md
Paste this into the file:
You are scanning yesterday's customer-call transcripts against the current pipeline.
Inputs:
- ~/notes/granola/ contains markdown transcripts. Each file has a date in the
filename. Read every transcript dated yesterday.
- ~/notes/crm/active-deals.csv is the current pipeline export.
For each transcript:
1. Identify the account it relates to. Match on the account_name in the CSV,
then on participant email domains, then on participant names. If you can't
match it confidently, skip the call and list it under "unmatched" at the
end of the report.
2. Read the transcript end to end.
3. Compare what was said against the deal's current stage, next_step, and
expected_close.
Output a report in this exact shape:
## Deal moves
Deals where the conversation implies a stage change that isn't yet in the
CRM. Format:
- [{account_name}] · {current_stage} → {implied_stage} · {one-line evidence
with verbatim quote} · owner: {owner}
## Risk signals
Things that worsen win probability. Format:
- [{account_name}] · {signal_type: tone-shift | competitor-mention |
champion-drop | budget-missing | silence | timeline-slip} · {evidence,
verbatim where possible} · owner: {owner}
## Next-step gaps
Deals where no concrete next step was scheduled on the call (no date, no
calendar invite mentioned, no follow-up commitment). Format:
- [{account_name}] · {what the call ended on} · owner: {owner}
## Unmatched
Transcripts I couldn't confidently link to a deal in the CSV. One line each.
Rules:
- Use verbatim quotes when the evidence is verbal. Wrap in quotes.
- Be blunt. If a deal is dying, say so. No softening language.
- Skip deals with no transcript activity yesterday. Don't pad.
- If you're unsure about a signal, leave it out. Quality over coverage.
- One line per item. Scannable.
Step 3Run the first manual scan
Open Claude Code in your notes folder:
cd ~/notes
claude
Paste the prompt from Step 2 directly into the session. The first scan typically takes 30 to 90 seconds depending on how many calls you had yesterday. If you had no customer calls yesterday, run it against the most recent day with calls (the prompt assumes "yesterday" but you can swap in any date during testing).
Read the output end to end. The first scan is your tuning input, not your decision input.
Step 4Tune the prompt over the first three runs
Three things almost always need a pass:
- The matching rule. If the agent is mis-attributing transcripts to the wrong deal (two prospects with similar account names), tighten the matching to require participant email domain match, not just account name.
- The signal sensitivity. First runs over-flag. A buyer saying "we'll need to think about it" isn't a risk signal; a buyer who said "let's move fast" last call and now says "let's think about it" is. Add the comparison rule: "Compare tone against the most recent prior call for the same account."
- The blunt rule. First runs are too polite. Force-add the rule: "If a deal hasn't moved in 14+ days and no next step was scheduled, list it as a risk signal of type 'silence' even if the most recent call was upbeat."
Refine the prompt file, re-run, repeat. After three iterations the prompt stabilizes and you stop touching it.
Step 5Schedule it as a daily routine
Two paths, in order of effort:
Option A · Manual 7am trigger (lowest effort). Open Claude Code each morning, paste the prompt, scan the output. Five minutes a day. Most CEOs can live here for a month before they automate.
Option B · A Claude Code Routine (most automated). Open Claude Code and create a Routine:
Every weekday at 6:45am:
1. Refresh ~/notes/crm/active-deals.csv from the CRM API.
2. Run the prompt at ~/.claude/prompts/pipeline-radar.md.
3. Post the resulting report to my #pipeline-radar channel in Slack.
4. Title the post "Pipeline radar · {date}".
Trigger: scheduled, weekdays 6:45am.
Connectors: Slack workspace, CRM API (HubSpot / Salesforce / etc.)
The Routine handles the refresh and the delivery. You open Slack with coffee and have the signal before the team is online. For the full Routines setup, see the [Claude Code Routines workflow][3].
Step 6Build the weekly forecast review on top
Once the daily radar is running clean, add a weekly summary. Same architecture, longer scan window:
Every Sunday at 6pm:
Read ~/notes/granola/ transcripts from the past 7 days. Read
~/notes/crm/active-deals.csv. Produce a forecast accuracy report:
## Forecast at risk this week
Deals expected to close this week or next where the most recent transcript
shows a risk signal that the CRM doesn't reflect.
## Forecast strengthened this week
Deals expected to close in the next 30 days where transcripts show a
clear positive move (decision-maker confirmed, budget approved, timeline
firmed up) that isn't yet in the CRM.
## Stale deals (no activity 14+ days)
Deals in the active pipeline with no transcript activity in 14+ days.
List with last activity date and amount.
Post to #pipeline-forecast in Slack.
Trigger: weekly, Sundays 6pm.
You open Slack Sunday night and your Monday is already shaped. The forecast meeting on Monday morning becomes optional. Within a month, you cancel it.
Step 7Loop the reps in (or don't)
The architecture works whether or not the reps see the output. Two ways to handle the team:
Option A · CEO-only radar. The Slack channel is private. You see the signals; you raise them in 1:1s with the deal owner. This is the lowest-friction path and works fine until the reps notice you're suspiciously informed.
Option B · Shared radar. The Slack channel is the deal team's. Reps see the signals first, fix the CRM hygiene gaps themselves, and you get a cleaner pipeline as a second-order effect. Tell the team upfront: "An agent reads our call transcripts and flags moves. The agent is on your side; it surfaces things you'd surface yourself if you had time." Most reps treat it as a copilot inside a week.
My read on which to start with: ship Option A first. The signal needs to be trustworthy before you put it in front of the team. Two weeks of solo use, then flip to shared.
How you'll know it's working
Three checks, in order:
- The first scan surfaces a deal move your team hadn't flagged. A buyer told your AE "let's bring in our CFO next week" and the CRM still shows Discovery. The agent caught it; the AE hadn't logged it. First time this happens, you stop questioning whether to run the workflow.
- A risk signal arrives before your VP Sales raises it. Friday afternoon: champion went quiet on a deal you expected to close this quarter. Monday morning the radar flags it. By Tuesday's leadership sync, the VP brings the same deal up; you're already two days ahead.
- You cancel a pipeline review and nothing breaks. The conversation that used to happen in a 60-minute meeting is now happening in your Slack pings. The meeting was producing the report; the report is the thing you actually wanted.
When it breaks
The agent surfaces internal calls as customer calls. Add a filter rule: "Only process transcripts where at least one participant email domain is not in our internal domain list." Maintain the list in
~/notes/crm/internal-domains.txt.The CRM export is stale. The radar matches against a CSV from three days ago and the signals are useless. Either refresh the CSV nightly via API (Option B in Step 1) or set a hard rule: don't run the radar against a CSV older than 24 hours.
Too many false positives on risk signals. Common in the first week. Tighten the prompt: "Only flag a risk signal if the evidence is verbatim from the transcript AND the signal type is one of the five defined. No inferred risks. No 'might be' language."
Transcripts missing for some calls. Usually a Granola export issue. Check that the meeting actually exported to markdown (see [Granola → markdown][4] Step 3). If the transcript is in your meeting library, the agent will find it.
The agent is too gentle. Same fix as the commitment ledger. Force the bluntness: "If a deal is at risk, say the deal name and the days since last contact. No softening. Tone of voice: a board director reviewing a pipeline."
Two prospects with similar account names get conflated. Tighten the match rule to require participant email domain match in addition to account name. If two real accounts share a domain (rare), match on participant first-name + last-name from the deal contact record.
Where this fits in your harness
This is the pipeline visibility layer of your [harness][11]. The [Granola → markdown pipeline][5] made every conversation searchable. The [commitment ledger][6] turned that vault into accountability for what you and your team owe each other. This workflow turns the same vault into accountability for what your buyers are telling you, before the CRM catches up.
Pair it with the [team and investor updates][7] workflow (the same transcript vault drafts your Friday updates) and with [Claude Code Routines][8] (the scheduling engine that runs the daily and weekly scans). All four workflows compound on the same foundation: every conversation becomes structured data, and structured data becomes leverage.
Deals will stop slipping because the silence is louder than it used to be and you’ll know what the heck is going on. See the [Granola pillar][9] for the full pipeline and the workflows that compound on top.
[1]: /workflows/granola-to-markdown [2]: /workflows/claude-memory [3]: /workflows/claude-routines [4]: /workflows/granola-to-markdown [5]: /workflows/granola-to-markdown [6]: /workflows/commitment-ledger [7]: /workflows/team-and-investor-updates [8]: /workflows/claude-routines [9]: /blog/granola-for-ceos-highest-roi-ai-install [10]: /workflows/what-is-granola [11]: /workflows/what-is-a-harness [12]: /articles/what-is-a-markdown-file
Get three workflows like this every Thursday
The Thursday 3 is a free weekly email. Three workflows that put you in the top 1% of CEOs. 90-second read. Every card links back to a step-by-step guide like this one.
Get the newsletter →The architecture behind this workflow.
Two operator's manuals for the same job, run two different ways. OpenCLAW for the always-on agent harness; Claude Code for the focused-work CLI. Pick one, or get the bundle for $149.
Browse the books · $99 each