- name
- sales-coaching
- version
- 1.0.0
- description
- AI sales coach composite. Analyzes all available sales data — email campaigns, call recordings/transcripts, reply patterns, pipeline outcomes — to identify what the user does well, where they struggle, and how to improve. Finds patterns in top-performing emails, winning call techniques, successful objection handles, and deal progression. Produces personalized coaching recommendations based on their specific product, market, and selling style. Tool-agnostic.
- tags
- ["research"]
# Sales Coaching
An AI coach that studies everything you do in sales — your emails, your calls, your deals — finds the patterns in what works and what doesn't, and gives you specific, actionable coaching to get better.
This isn't generic sales advice ("always be closing"). It's coaching derived from YOUR data: your top-performing emails, your winning calls, your successful deal patterns, your most common objection fumbles, and your specific product's market.
**What makes this different from `sequence-performance`:**
| Composite | Focus | Output |
|-----------|-------|--------|
| `sequence-performance` | How is this campaign doing? | Campaign metrics + copy diagnosis |
| `sales-coaching` | How can THIS person sell better? | Personal skill assessment + coaching plan |
The other composite analyzes the work. This one coaches the worker.
## When to Auto-Load
Load this composite when:
- User says "how can I improve my sales", "coach me", "what am I doing wrong", "sales coaching", "help me sell better"
- User says "review my selling style", "analyze my calls", "what patterns do you see in my sales"
- User asks "why am I losing deals", "why aren't people responding", "what are my best emails doing differently"
- After a bad quarter/month and the user wants to diagnose personal performance
- As a periodic (monthly/quarterly) self-improvement exercise
---
## Step 0: Configuration (One-Time Setup)
### User Profile
| Question | Purpose | Stored As |
|----------|---------|-----------|
| What is your role? | Calibrate coaching level | `user_role` |
| How long have you been in sales? | Experience-appropriate advice | `experience_level` |
| What do you sell? (product/service, 2-3 sentences) | Context for all analysis | `product_description` |
| What's your average deal size? | Calibrate what matters | `avg_deal_size` |
| What's your typical sales cycle? | Calibrate velocity expectations | `sales_cycle_days` |
| What do you think your biggest weakness is? | Starting point for coaching | `self_assessed_weakness` |
**Role options:**
- `"sdr"` — Focus on prospecting, outreach, qualification, meeting booking
- `"ae"` — Focus on discovery, demos, negotiation, closing
- `"founder"` — Focus on everything (wearing multiple hats)
- `"sales_leader"` — Focus on team patterns, not just individual
### Data Sources
| Question | Options | Stored As |
|----------|---------|-----------|
| Where are your email campaigns? | Smartlead / Instantly / Outreach / CSV | `email_tool` |
| Where are your call recordings/transcripts? | Gong / Chorus / Fireflies / Otter / local files / none | `call_tool` |
| Where is your pipeline? | Salesforce / HubSpot / Pipedrive / Close / Supabase | `crm_tool` |
| Do you have call transcripts available? | Yes (path or tool) / No | `transcripts_available` |
| How far back should we analyze? | 30 / 60 / 90 / 180 days | `analysis_window` |
**Store config** in the current working directory or wherever the user prefers.
---
## Step 1: Collect Sales Data
**Purpose:** Pull all available sales data for analysis. The more data types available, the richer the coaching. But the system works with whatever is available.
### Input Contract
```
data_sources: { ... } # From config
analysis_window: integer # Days to look back
user_role: string # From config
```
### Data Collection Matrix
| Data Type | What to Pull | What It Reveals |
|-----------|-------------|----------------|
| **Email campaigns** | All campaigns in window — copy, metrics, replies | Writing quality, messaging effectiveness, personalization skill |
| **Email replies** | Full reply text, classification | Objection handling, how prospects respond to you |
| **Call recordings/transcripts** | Full transcripts or recordings | Talk-to-listen ratio, discovery skill, objection handling, closing technique |
| **Pipeline deals** | All deals in window — stage, outcome, timeline | Deal management, velocity, where deals stall or die |
| **Meeting notes** | Post-call notes (if available) | Follow-through, note-taking discipline |
| **Calendar** | Meetings booked, held, no-shows | Time management, meeting quality |
**Pull from each configured source:**
#### Email Data
```
email_data: {
campaigns: [
{
name: string
date_range: { start: string, end: string }
sequence: [
{
touch: integer
subject: string
body: string
sent: integer
opens: integer
replies: integer
}
]
replies: [
{
sender: string
sender_title: string
reply_text: string
category: string # positive, objection, not interested, etc.
touch_triggered: integer
}
]
}
]
total_campaigns: integer
total_emails_sent: integer
total_replies: integer
overall_reply_rate: percentage
}
```
#### Call Data
```
call_data: {
calls: [
{
date: string
prospect_name: string
prospect_company: string
call_type: string # discovery, demo, follow-up, negotiation
duration_minutes: integer
transcript: string | null # Full transcript if available
recording_url: string | null # Recording link if available
outcome: string # "next step agreed", "no next step", "closed won", "closed lost"
notes: string | null # Post-call notes
}
]
total_calls: integer
avg_duration: float
outcome_distribution: { ... }
}
```
#### Pipeline Data
```
pipeline_data: {
deals: [
{
name: string
company: string
stage: string
created_date: string
close_date: string | null
outcome: "open" | "won" | "lost"
loss_reason: string | null
amount: number | null
days_in_pipeline: integer
source: string | null # How the deal originated
touches_before_close: integer | null
}
]
total_deals: integer
win_rate: percentage
avg_cycle_days: float
avg_deal_size: number | null
}
```
### Output Contract
```
collected_data: {
email_data: { ... } | null
call_data: { ... } | null
pipeline_data: { ... } | null
data_richness: "full" | "partial" | "minimal"
data_summary: string # "Analyzing X campaigns, Y calls, Z deals over N days"
}
```
### Human Checkpoint
```
## Data Collected
| Source | Available | Volume |
|--------|-----------|--------|
| Email campaigns | Yes | X campaigns, Y emails sent, Z replies |
| Call transcripts | Yes/No | X calls, Y hours |
| Pipeline deals | Yes | X deals (W won, L lost, O open) |
Analysis window: [start] to [end]
Data richness: [full/partial/minimal]
Proceed with analysis? (Y/n)
```
---
## Step 2: Analyze Email Performance Patterns
**Purpose:** Go beyond campaign-level metrics. Find patterns in what makes YOUR best emails work and YOUR worst emails fail. Pure LLM reasoning.
### Process
#### A) Identify Top-Performing Emails
Across all campaigns, find:
- **Highest reply-rate subject lines** — What do they have in common?
- **Highest reply-rate email bodies** — What patterns exist?
- **Emails that generated positive replies** — What specifically triggered interest?
- **Emails that generated meetings** — The gold standard. What did these say?
For each top performer, extract:
| Pattern Element | What to Look For |
|----------------|-----------------|
| Subject line structure | Signal-reference? Question? Peer-framing? Length? |
| Opening line | Lead with them or with you? Signal reference? Question? Statement? |
| Body structure | How many paragraphs? Proof point placement? Length? |
| Personalization depth | Tier 1/2/3? What was personalized? |
| CTA type | Specific ask? Open-ended? Time-bound? |
| Tone | Casual? Professional? Provocative? Empathetic? |
| Framework used | PAS? BAB? Signal-Proof-Ask? AIDA? |
| Proof point type | Customer name? Metric? Case study? |
#### B) Identify Worst-Performing Emails
Same analysis on the bottom performers:
- What do low-reply emails have in common?
- Are there anti-patterns? (Long emails, generic openers, weak CTAs, no proof)
- Is there a consistent flaw across campaigns?
#### C) Compare Winners vs. Losers
| Dimension | Top 20% Emails | Bottom 20% Emails | Gap |
|-----------|---------------|-------------------|-----|
| Avg word count | [X] | [Y] | [shorter/longer] |
| Subject line length | [X chars] | [Y chars] | [delta] |
| Opens with "I" or "We" | [X%] | [Y%] | [self-focused vs. prospect-focused] |
| Contains proof point | [X%] | [Y%] | [proof usage gap] |
| Personalization tier | [avg tier] | [avg tier] | [personalization gap] |
| CTA clarity | [assessment] | [assessment] | [delta] |
| Has signal reference | [X%] | [Y%] | [signal usage gap] |
#### D) Objection Pattern Analysis
Across all replies classified as objections:
| Analysis | What It Reveals |
|----------|----------------|
| Most common objection | What you're running into most often |
| Objection by campaign/audience | Is targeting driving objections? |
| How you handle each objection (from follow-up emails) | Are your handles effective? |
| Objections that lead to meetings vs. dead ends | Which objections are actually handleable? |
| Objection language patterns | Exact words prospects use (copy these into your messaging) |
#### E) Reply Sentiment Analysis
| Category | Count | % | Trend |
|----------|-------|---|-------|
| Positive interest | X | Y% | +/- vs. earlier campaigns |
| Warm / curious | X | Y% | |
| Objection (handleable) | X | Y% | |
| Objection (terminal) | X | Y% | |
| Not interested | X | Y% | |
| Auto-reply | X | Y% | |
**Key question:** Is the ratio of positive-to-negative replies improving over time? Are you getting better at writing emails that generate interest, or are you stagnating?
### Output Contract
```
email_patterns: {
top_performers: {
common_patterns: string[]
best_subject_lines: [ { subject: string, reply_rate: percentage, pattern: string } ]
best_openers: [ { opener: string, campaign: string, why_it_works: string } ]
winning_proof_points: string[]
winning_ctas: string[]
winning_tone: string
winning_framework: string
}
bottom_performers: {
common_anti_patterns: string[]
worst_subject_lines: [ { subject: string, reply_rate: percentage, issue: string } ]
common_mistakes: string[]
}
winner_vs_loser: {
dimensions: [ { dimension: string, winners: string, losers: string, gap: string } ]
biggest_differentiator: string
}
objection_patterns: {
most_common: { objection: string, count: integer, handle_effectiveness: string }
handleable_objections: [ { objection: string, best_handle: string, conversion_rate: string } ]
terminal_objections: [ { objection: string, implication: string } ]
}
sentiment_trend: {
direction: "improving" | "stable" | "declining"
evidence: string
}
email_skill_grade: "A" | "B" | "C" | "D" | "F"
email_skill_summary: string
}
```
---
## Step 3: Analyze Call Performance Patterns
**Purpose:** If call transcripts or recordings are available, analyze how the user performs on calls. If no call data exists, skip this step.
### Process
#### A) Structural Analysis (From Transcripts)
For each call transcript, measure:
| Metric | How to Calculate | What It Reveals |
|--------|-----------------|----------------|
| **Talk-to-listen ratio** | Word count (you) / word count (prospect) | >60% talking = talking too much. Best reps are 40-50% talk. |
| **Longest monologue** | Longest uninterrupted stretch by the seller | >90 seconds = you're lecturing, not selling. Keep it under 60s. |
| **Question count** | Number of questions asked | Discovery calls should have 10-15 questions. <5 = not discovering. |
View on GitHub