Pipeline Review
Pulls deal and meeting data from whatever system the user tracks their pipeline in, analyzes it over a chosen time period, and produces a report that answers the questions a founder, sales leader, or AE actually cares about: Are we booking enough? Are they qualified? Where are deals getting stuck? What's working and what isn't?
Two output modes:
- Executive summary: 1-page snapshot. Numbers, trends, red flags. What a founder reads over morning coffee.
- Detailed diagnostic: Full data tables, stage-by-stage breakdown, source analysis, stuck deal list, and specific recommendations.
Both are always produced. The executive summary sits at the top of the report.
When to Auto-Load
Load this composite when:
- User says "review my pipeline", "pipeline report", "how's our pipeline looking", "deal review"
- User says "1:1 prep", "board meeting prep", "weekly sales review"
- An upstream workflow (Pipeline Ops, daily BDR rhythm) triggers an end-of-period review
- User asks about meeting quality, conversion rates, or pipeline health
Step 0: Configuration (One-Time 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 |
Pipeline Stage Definitions
| 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 |
Example stage mapping:
pipeline_stages: [
"Lead",
"Meeting Booked",
"Meeting Held",
"Qualified (Discovery Done)",
"Proposal Sent",
"Negotiation",
"Closed Won",
"Closed Lost"
]
qualified_stage: "Qualified (Discovery Done)"
won_stage: "Closed Won"
lost_stage: "Closed Lost"
expected_cycle_days: 30
Field Mapping
Different CRMs use different field names. Map the user's fields to standard analysis fields.
| 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", "UTM Source" |
| 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" |
| Meeting date | Meeting analysis | field_meeting_date | "Meeting Date", "Call Date", "Demo Date" |
| Qualification status | Qual rate | field_qual_status | "Qualified", "ICP Fit", "BANT Score" |
| Loss reason | Loss analysis | field_loss_reason | "Loss Reason", "Closed Lost Reason", "Disqualification Reason" |
Not all fields are required. The analysis adapts to whatever data is available. Minimum viable: deal name + stage + created date.
Benchmarks (Optional)
| Question | Purpose | Stored As |
|---|---|---|
| What's your target meeting volume per week/month? | Compare actuals to goals | target_meetings |
| What's your target qualification rate? | Flag if below target | target_qual_rate |
| What's your target win rate? | Flag if below target | target_win_rate |
| What's your target pipeline value? | Revenue gap analysis | target_pipeline_value |
Store config in the current working directory or wherever the user prefers.
Step 1: Pull Pipeline Data
Purpose: Extract deal/meeting data from the configured CRM for the specified time period.
Input Contract
period: {
type: "weekly" | "fortnightly" | "monthly" | "quarterly" | "custom"
start_date: string # ISO date (auto-calculated from type, or user-specified)
end_date: string # ISO date (default: today)
comparison_period: boolean # Include prior period for trend comparison (default: true)
}
crm_tool: string # From config
access_method: string # From config
field_mapping: { ... } # From config
Process
Based on crm_tool and access_method:
| CRM | Access Method | How to Pull |
|---|---|---|
| Salesforce | API / CSV export | SOQL query or user uploads CSV export |
| HubSpot | API / CSV export | Deals API or user uploads CSV export |
| Pipedrive | API / CSV export | Deals API or user uploads CSV export |
| Close | API / CSV export | 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 |
Pull two datasets:
- 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 Standardization
Regardless of source, normalize all data into a standard structure:
deals: [
{
id: string
name: string
company: string
stage: string # Mapped to pipeline_stages
owner: string | null
source: string | null # Lead source / channel
created_date: string # ISO date
close_date: string | null # ISO date
last_activity_date: string | null
meeting_date: string | null
amount: number | null
qualification_status: string | null
loss_reason: string | null
days_in_current_stage: integer # Calculated
total_age_days: integer # Calculated from created_date
}
]
Output Contract
pipeline_data: {
current_period: {
start_date: string
end_date: string
deals: [...] # Standardized deal records
deal_count: integer
}
comparison_period: {
start_date: string
end_date: string
deals: [...]
deal_count: integer
} | null
}
Human Checkpoint
## Data Pulled
Source: [CRM name]
Current period: [start] to [end] — X deals
Comparison period: [start] to [end] — Y deals
Fields available: [list of mapped fields]
Fields missing: [any unmapped fields — analysis will adapt]
Data looks correct? (Y/n)
Step 2: Analyze Pipeline
Purpose: Run the full analysis across seven dimensions. Pure computation + LLM reasoning — inherently tool-agnostic.
Input Contract
pipeline_data: { ... } # From Step 1
pipeline_stages: string[] # From config
qualified_stage: string # From config
won_stage: string # From config
lost_stage: string # From config
expected_cycle_days: integer # From config
benchmarks: { ... } | null # From config (optional)
Analysis Dimensions
Run all seven analyses on the current p