# Pipeline Review

> Early warning system for active deals. Surfaces risks before they become lost deals: stakeholder silence, stalled next steps, competitor threats, deal velocity drops, MEDDPICC qualification gaps. Pulls signals from Attio, Gmail, Granola, and Google Calendar to produce a prioritized risk report with recommended actions. MANDATORY TRIGGERS: Use this skill whenever the user mentions "pipeline review", "deal risk", "deal health", "pipeline risk", "stale deals", "what's at risk", "deal warnings", "pipeline health check", "which deals need attention", "risk report", "deal alerts", or asks about deals that might be slipping, going dark, or losing momentum.

- Skill: `extruct-ai/pipeline-review` (Agent Skill)
- Install (CLI): `npx skillmds@latest add extruct-ai/pipeline-review`
- Raw SKILL.md: https://api.skillmd.com/api/skills/extruct-ai/pipeline-review/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: extruct-ai (https://skillmd.com/u/extruct-ai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/extruct-ai/pipeline-review

---


# Pipeline Review

Surface deal risks as they emerge — before a winnable deal silently becomes a lost one.

## Risk Categories

### 1. Engagement Risk (Stakeholder Silence)

Signals that key contacts have gone quiet:

| Signal | How to detect | Severity |
|--------|--------------|----------|
| No email in 14+ days | Gmail: search for threads with associated contacts, check last message date | HIGH if deal is In Progress/POC |
| No email in 7-13 days | Same as above | MEDIUM |
| No meeting in 21+ days | Granola: `list_meetings` + `query_granola_meetings` for company name | HIGH if In Progress |
| No upcoming meeting scheduled | Google Calendar: `gcal_list_events` searching for company/contact name | MEDIUM |
| One-sided communication | Gmail: check if last 2+ emails are outbound with no reply | HIGH |

### 2. Momentum Risk (Deal Velocity)

Signals that the deal is losing speed:

| Signal | How to detect | Severity |
|--------|--------------|----------|
| Stuck in stage 30+ days | Attio: compare `created_at` or stage change date vs today | HIGH |
| Stuck in stage 14-29 days | Same | MEDIUM |
| No deal value set | Attio: `value` field is empty | MEDIUM if past Lead stage |
| No associated people | Attio: `associated_people` is empty | HIGH |
| Next steps overdue | Attio: check tasks linked to deal with past deadlines | HIGH |

### 3. Competitive Risk

Signals that competition threatens the deal:

| Signal | How to detect | Severity |
|--------|--------------|----------|
| Competitor mentioned | Attio: `meddpicc_competition` field contains named competitors | MEDIUM |
| Build vs buy tension | Attio: `meddpicc_competition` mentions internal build | HIGH |
| "Do nothing" risk flagged | Attio: `meddpicc_competition` mentions "do nothing" | HIGH |
| Competition score 0 | Attio: `meddpicc_competition` starts with "0/4" — unknown landscape | MEDIUM (blind spot) |

### 4. Qualification Risk (MEDDPICC Gaps)

Signals that the deal is under-qualified for its stage:

| Stage | Expected strong (3-4) | Gap = risk if below 2 |
|-------|-----------------------|----------------------|
| POC | Pain, Metrics, Decision Criteria | Any of these below 2 = HIGH |
| In Progress | Pain, Metrics, Criteria, Competition | Any below 2 = HIGH |

| Signal | How to detect | Severity |
|--------|--------------|----------|
| MEDDPICC score = 0 | Attio: `meddpicc_score` is 0 or empty | CRITICAL — deal is unqualified |
| MEDDPICC score < 40 | Attio: `meddpicc_score` < 40 | HIGH |
| Key dimension at 0 for stage | Parse score from `meddpicc_metrics`, `meddpicc_decision_criteria`, `meddpicc_competition` | HIGH |
| No budget discussed | Attio: `meddpicc_budget_total` is empty AND stage is In Progress | MEDIUM |

### 5. Data Risk

Signals that you're flying blind:

| Signal | How to detect | Severity |
|--------|--------------|----------|
| No Granola meetings found | Granola returns empty for company name | MEDIUM |
| No Attio notes on deal | `semantic-search-notes` returns empty | MEDIUM |
| No Gmail threads | Gmail search returns empty | HIGH — no communication trail |
| All three empty | Combined | CRITICAL — ghost deal |

## Workflow

### Step 1: Identify Target Deals

If the user specifies deals, use those. Otherwise:

1. Call `list-records` with `object: "deals"` and filter for active stages (POC, In Progress).
2. Collect all deal record IDs, names, stages, and associated contacts.

### Step 2: Gather Signals (Per Deal)

For each deal, run these checks in parallel where possible:

#### 2a. Attio Deal Data
- `get-records-by-ids` to pull full deal record (MEDDPICC fields, value, stage, confidence, associated people/company, created_at)
- `list-tasks` filtered to the deal to check for overdue tasks
- `list-comments` on the deal for recent activity

#### 2b. Email Activity
- `gmail_search_messages` with the company name or associated contact emails
- Check the date of the most recent message
- Check if the last 2+ messages are outbound-only (no reply)

#### 2c. Meeting Activity
- `query_granola_meetings` with company name to find recent meetings
- `gcal_list_events` searching for company/contact name to check for upcoming meetings

### Step 3: Score Risks

For each deal, evaluate all risk categories and assign:

- **CRITICAL** — Immediate action needed. Deal is at serious risk of being lost.
- **HIGH** — Action needed this week. Multiple warning signs.
- **MEDIUM** — Monitor closely. Early warning signs present.
- **LOW** — On track. No significant risks detected.

Overall deal risk = highest individual risk found.

Count the number of HIGH+ signals to determine urgency ranking across deals.

### Step 4: Generate Risk Report

Present a prioritized report, sorted by risk level (CRITICAL first):

```
## Pipeline Risk Report — {date}

### CRITICAL: {Deal Name}
**Stage:** {stage} | **Value:** {value} | **MEDDPICC:** {score}/100
**Days in stage:** {N}

Risk signals:
- {signal 1 with evidence}
- {signal 2 with evidence}

Recommended actions:
1. {specific action with timeline}
2. {specific action}

---

### HIGH: {Deal Name}
...
```

### Step 5: Offer Actions

After presenting the report, offer:

1. **Re-engage** a specific deal (hand off to `deal-reengagement` skill)
2. **Score a call** for a deal that needs MEDDPICC update (hand off to `meddpicc-post-call` skill)
3. **Prep for a meeting** with an at-risk account (hand off to `meeting-prep` skill)
4. **Draft a follow-up** email to break silence (hand off to `meeting-followup` skill)
5. **Create tasks** in Attio for the recommended actions

## Attio MCP Tool Reference

| Task | Tool | Key parameters |
|------|------|---------------|
| List active deals | `list-records` | `object: "deals"`, filter by stage |
| Get deal details | `get-records-by-ids` | `object: "deals"`, record_ids |
| Check MEDDPICC fields | Already in deal record | Parse from attributes |
| List deal tasks | `list-tasks` | filter by linked deal |
| List deal comments | `list-comments` | `parent_object: "deals"`, parent_record_id |
| Search notes | `semantic-search-notes` | query with company name |

## Gmail MCP Tool Reference

| Task | Tool |
|------|------|
| Search for threads | `gmail_search_messages` (query with company/contact) |
| Read thread content | `gmail_read_thread` (thread_id) |

## Granola MCP Tool Reference

| Task | Tool |
|------|------|
| Find meetings | `query_granola_meetings` (query with company name) |
| List recent meetings | `list_meetings` |

## Google Calendar MCP Tool Reference

| Task | Tool |
|------|------|
| Check upcoming meetings | `gcal_list_events` (search for company/contact) |

## Environment

| Variable | Source | Purpose |
|----------|--------|---------|
| Attio | MCP (Attio connector) | CRM — deals, MEDDPICC, tasks, notes |
| Granola | MCP (Granola connector) | Meeting history |
| Gmail | MCP (Gmail connector) | Email engagement signals |
| Google Calendar | MCP (Google Calendar connector) | Upcoming meeting check |

