| Tool | Purpose | Required |
|---|---|---|
| Salesforce / HubSpot / Pipedrive / Close | Pull deal and pipeline data via API or CSV export | No (one required) |
| Supabase | Query deals or outreach tables directly | No (optional) |
| Google Sheets | Read pipeline data from a spreadsheet | No (optional) |
| Notion MCP | Query a Notion pipeline database | No (optional) |
Setup
On first run, collect and store these preferences. Skip on subsequent runs. Data Source Config| Question | Options | Stored As |
|---|---|---|
| Where do you track your pipeline? | Salesforce / HubSpot / Pipedrive / Close / Supabase / Google Sheets / CSV / Notion / Other | crm_tool |
| How do we access it? | API / Export CSV / MCP tools / Direct query | access_method |
| What object represents a “deal” in your system? | Opportunity / Deal / Lead / Meeting / Custom | deal_object |
| Question | Purpose | Stored As |
|---|---|---|
| What are your pipeline stages in order? | Map data to a standard funnel | pipeline_stages |
| Which stage means “qualified”? | Qualification rate calculation | qualified_stage |
| Which stage means “closed won”? | Win rate calculation | won_stage |
| Which stage means “closed lost”? | Loss analysis | lost_stage |
| What is your expected sales cycle length? (days) | Identify stuck deals | expected_cycle_days |
| Standard Field | Purpose | Stored As | Examples |
|---|---|---|---|
| Deal name | Identification | field_deal_name | ”Name”, “Deal Name”, “Opportunity Name” |
| Company | Account grouping | field_company | ”Company”, “Account”, “Organization” |
| Stage | Funnel position | field_stage | ”Stage”, “Pipeline Stage”, “Status” |
| Owner | Rep-level analysis | field_owner | ”Owner”, “Assigned To”, “Rep” |
| Source | Channel attribution | field_source | ”Lead Source”, “Source”, “Channel” |
| Created date | Period filtering | field_created_date | ”Created Date”, “Created At”, “Date Added” |
| Close date | Velocity tracking | field_close_date | ”Close Date”, “Expected Close”, “Closed At” |
| Amount | Revenue analysis | field_amount | ”Amount”, “Deal Value”, “ARR”, “MRR” |
| Last activity date | Stale deal detection | field_last_activity | ”Last Activity”, “Last Modified”, “Last Touched” |
| Loss reason | Loss analysis | field_loss_reason | ”Loss Reason”, “Closed Lost Reason” |
| Question | Purpose | Stored As |
|---|---|---|
| Target meeting volume per week/month? | Compare actuals to goals | target_meetings |
| Target qualification rate? | Flag if below target | target_qual_rate |
| Target win rate? | Flag if below target | target_win_rate |
| Target pipeline value? | Revenue gap analysis | target_pipeline_value |
clients/<client-name>/config/pipeline-review.json or equivalent.
Do not ask again in future runs.
Step 1: Pull Pipeline Data
Pull deal and meeting data from the configured CRM for the specified time period. Ask the user for the review period if not provided:“What period should I analyze? Options: last 7 days, last 14 days, last 30 days, last 90 days, or a custom date range.”Based on
crm_tool and access_method, pull data as follows:
| CRM | Access Method | How to Pull |
|---|---|---|
| Salesforce | API / CSV | SOQL query or user uploads CSV export |
| HubSpot | API / CSV | Deals API or user uploads CSV export |
| Pipedrive | API / CSV | Deals API or CSV export |
| Close | API / CSV | Leads/Opportunities API or CSV |
| Supabase | Direct query | Query deals/outreach_log tables |
| Google Sheets | Sheets API / CSV | Read sheet or user exports CSV |
| Notion | Notion MCP | Query database |
| CSV | File read | User provides file path |
- Current period: All deals created or active within the specified date range
- Comparison period: Same-length prior period (e.g., if reviewing last 2 weeks, also pull the 2 weeks before that)
“Data Pulled Source: [CRM name] Current period: [start] to [end] — [N] deals Comparison period: [start] to [end] — [N] deals Fields available: [list] Fields missing: [list — analysis will adapt] Data looks correct? (Y/n)“
Step 2: Analyze Pipeline
Run all seven analyses on the current period data. Where comparison period exists, calculate period-over-period trends. Analysis 1 — Volume Metrics Calculate: total deals created, meetings booked, meetings held, no-show rate, weekly run rate, period-over-period change, vs.target_meetings.
Analysis 2 — Qualification Breakdown
Calculate: qualified deals, unqualified deals, pending qualification, qualification rate, top disqualification reasons, vs. prior period, vs. target_qual_rate.
A deal is qualified if it reached or passed qualified_stage. A deal is unqualified if it was closed lost before reaching qualified_stage.
Analysis 3 — Source Attribution
Group by field_source: count deals, meetings, qualified deals, won deals. Calculate qualification rate and win rate per source. Flag if any single source drives more than 60% of pipeline.
Analysis 4 — Stage Distribution and Velocity
Group active deals by stage. Calculate deal count, revenue, weighted revenue, average days in stage, and stage-to-stage conversion rates.
Use these stage probability defaults unless actual data is available:
| Stage | Probability |
|---|---|
| Lead | 5% |
| Meeting Booked | 10% |
| Meeting Held | 20% |
| Qualified | 40% |
| Proposal Sent | 60% |
| Negotiation | 80% |
| Closed Won | 100% |
| Closed Lost | 0% |
days_in_current_stage exceeds 2× the average for that stage, or exceeds expected_cycle_days total.
Default stuck thresholds (use if stage-average data is insufficient):
| Stage | Expected Max Days |
|---|---|
| Lead | 3 |
| Meeting Booked | 7 |
| Meeting Held | 5 |
| Qualified | 10 |
| Proposal Sent | 14 |
| Negotiation | 14 |
total_age_days > 1.5× expected_cycle_days; any single deal > 30% of total pipeline value.
Analysis 6 — Win/Loss Analysis
Calculate: win rate overall, win rate by source, win rate by owner, average deal size (won), average days to close, top loss reasons, loss stage distribution.
Analysis 7 — Forecast and Coverage
Only run if target_pipeline_value or revenue targets are configured.
Calculate: pipeline coverage ratio (weighted pipeline / remaining quota), commit forecast (Negotiation + Proposal stage deals), best case forecast (commit + Qualified deals × historical win rate), gap to target, required deals and meetings to close the gap.
Coverage assessment:
| Coverage | Assessment |
|---|---|
| 3x+ | Healthy |
| 2–3x | Adequate |
| <2x | At risk |
| <1x | Critical |
Step 3: Generate Report
Generate two formats from the analysis output. Executive Summary — one page, numbers and trends, what a founder reads in 60 seconds:| Pattern | Recommendation |
|---|---|
| Qualification rate <40% | Tighten ICP targeting — top DQ reason is [X] |
| No-show rate >20% | Implement confirmation reminders 24h and 1h before meetings |
| One source >60% of pipeline | Diversify — if this channel underperforms, pipeline collapses |
| High-quality source with low volume | Scale it — [source] has [X]% qual rate but only [Y]% of volume |
| Deals stuck in a specific stage | Unblock [stage] — [N] deals averaging [Y] days (2× normal) |
| Win rate declining | Win rate dropped from [X]% to [Y]% — top loss reason is now [Z] |
| Pipeline coverage <2x | Need [Z] more qualified deals — requires [W] meetings at current rates |
| Cycle lengthening | Bottleneck at [stage] — deals [X] days slower vs prior period |
“[Executive Summary rendered]
Full detailed diagnostic is also available. Actions from this review:Stuck deals requiring immediate attention:
- [High priority recommendation]
- [High priority recommendation]
- [Medium priority recommendation]
Want to see the full diagnostic? Or take action on any of these recommendations?”
Deal Company Stage Days Stuck Action
Step 4: Export and Share
Save or share the report based on user preference:| Destination | How |
|---|---|
| Markdown file | Save to clients/<client>/reports/pipeline-review-[date].md |
| Google Sheets | Export data tables (metrics, deal list, source breakdown) |
| Notion | Push to a Notion database page via Notion MCP |
| Slack | Send executive summary to a specified channel |
| Send via agentmail | |
| Display only | Render inline (default) |
Output Format
Pipeline Review — [Period Type]: [Start] to [End] Snapshot
| Metric | This Period | Prior Period | Change |
|---|---|---|---|
| Meetings booked | [N] | [N] | [+/-Z%] |
| Meetings held | [N] | [N] | [+/-Z%] |
| Qualification rate | [X%] | [Y%] | [+/-Z pts] |
| Win rate | [X%] | [Y%] | [+/-Z pts] |
| Pipeline value | $[X] | $[Y] | [+/-Z%] |
| Avg deal size | $[X] | $[Y] | [+/-Z%] |
| Avg days to close | [X] | [Y] | [+/-Z] |
- [Action]
- [Action]
- [Action]
| Deal | Company | Stage | Days Stuck | Owner | Action |
|---|
Edge Cases
- Missing amount field: Skip revenue metrics, weighted pipeline, and forecast. Volume and stage analysis still run.
- Missing source field: Skip source attribution (Analysis 3). All other analyses still run.
- Missing loss reason field: Skip loss reason breakdown. Win/loss rate still calculates.
- Missing last activity date: Skip no-activity deal detection. Stuck deals are still detected via stage duration.
- No comparison period data: Run single-period analysis only. Omit all period-over-period trend columns.
- No targets configured: Skip forecast and coverage analysis (Analysis 7). Note in output that targets are not set.
- Loss reasons mostly blank or “Other”: Flag data hygiene issue in recommendations. Note that loss analysis is unreliable until reps fill in reasons consistently.
- CRM not connected or CSV not provided: Ask the user to either connect the CRM via MCP or upload a CSV export before proceeding.
