DESK · THEORY
The Workflow · May 22, 2026

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:

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

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:

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:

  1. 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.
  2. 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.
  3. 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

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

The Thursday 3

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 Desk Theory books

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