SuperAPI AI Directory

periodic-sales-performance-review

Marketing & growth

View repository

Updated 10-15 21:54

About this skill

Periodic Sales Performance Review

Pulls rep-level and team-level sales data from whatever system the user tracks performance in, analyzes it over a chosen period, and produces a report that answers the questions a sales leader actually cares about: Are we going to hit the number? Who's carrying the team? Who needs help? Where are the coaching opportunities? Are our forecasts reliable?

Two output modes:

  • Executive summary: 1-page snapshot. Quota attainment, top/bottom performers, red flags, green lights. What a VP Sales reads before the Monday standup.
  • Detailed diagnostic: Full rep-by-rep breakdown, activity analysis, deal progression, win/loss patterns, forecast accuracy, and coaching 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 "sales performance review", "team performance report", "how's the team doing", "rep scorecard"
  • User says "weekly sales review", "monthly performance review", "quarterly sales analysis"
  • User says "who's hitting quota", "quota attainment report", "rep performance"
  • An upstream workflow (Pipeline Ops, management cadence) triggers an end-of-period review
  • User asks about forecast accuracy, rep productivity, or team-level trends

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 deals/pipeline? Salesforce / HubSpot / Pipedrive / Close / Supabase / Google Sheets / CSV / Other crm_tool
How do we access it? API / Export CSV / MCP tools / Direct query access_method
Where do you track activity data? (calls, emails, meetings) Same CRM / Outreach / Salesloft / Gong / Separate tracker / Manual / Not tracked activity_source

Team Structure

Question Purpose Stored As
Who are your sales reps? (names) Rep-level analysis rep_names
Is there a team/pod structure? (e.g., SMB team, Enterprise team, SDR vs AE) Segment analysis team_structure
Who manages each rep? Manager-level rollup managers

Example team structure:

team_structure: {
  "SDR": ["Alex", "Jordan"],
  "AE - SMB": ["Sam", "Casey"],
  "AE - Enterprise": ["Morgan", "Riley"]
}
managers: {
  "SDR": "Taylor",
  "AE - SMB": "Jamie",
  "AE - Enterprise": "Jamie"
}

Quota & Targets

Question Purpose Stored As
What is each rep's quota? (monthly or quarterly) Quota attainment calculation rep_quotas
What quota period do you use? (monthly / quarterly) Normalize attainment quota_period
What is the team-level target? Team rollup team_target
Do you have activity targets? (calls/day, emails/day, meetings/week) Activity benchmarking activity_targets

Example quota config:

rep_quotas: {
  "Sam": 50000,
  "Casey": 50000,
  "Morgan": 150000,
  "Riley": 150000
}
quota_period: "monthly"
team_target: 400000
activity_targets: {
  "SDR": { "calls_per_day": 50, "emails_per_day": 80, "meetings_per_week": 10 },
  "AE": { "calls_per_day": 15, "emails_per_day": 20, "meetings_per_week": 8 }
}

Pipeline Stage Definitions

Question Purpose Stored As
What are your pipeline stages in order? Map data to funnel pipeline_stages
Which stage means "qualified"? Qualification rate qualified_stage
Which stage means "closed won"? Win rate, revenue won_stage
Which stage means "closed lost"? Loss analysis lost_stage
What is your expected sales cycle length? (days) Velocity benchmarking expected_cycle_days

Forecast Config (Optional)

Question Purpose Stored As
Do you track forecasts? (commit, best case, pipeline) Forecast accuracy analysis tracks_forecasts
Where are forecasts recorded? Pull forecast data forecast_source
What forecast categories do you use? Map to standard categories forecast_categories

Store config in: clients/<client-name>/config/periodic-sales-performance-review.json or equivalent.


Step 1: Pull Performance Data

Purpose: Extract deal data, activity data, and (optionally) forecast data for the specified period.

Input Contract

period: {
  type: "weekly" | "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
activity_source: string           # From config
rep_names: string[]               # From config

Process

Pull three categories of data:

A) Deal Data (per rep)

CRM How to Pull
Salesforce SOQL query on Opportunity with Owner filter
HubSpot Deals API filtered by owner
Pipedrive Deals API filtered by owner
Close Leads/Opportunities API by assigned user
Supabase Query deals table with rep filter
CSV User provides file, filter by owner column

For each rep, pull:

  • All deals closed (won + lost) in the period
  • All deals created in the period
  • All deals currently open (active pipeline)
  • Deal amounts, stages, close dates, sources, loss reasons

B) Activity Data (per rep)

Source How to Pull
Salesforce Tasks + Events objects by owner
HubSpot Engagements API by owner
Outreach/Salesloft Activity metrics API
Gong Call logs and meeting data
Manual/CSV User provides activity log

For each rep, pull:

  • Calls made (count, duration if available)
  • Emails sent (count, reply rate if available)
  • Meetings held (count, no-shows if available)
  • Proposals/demos delivered
  • LinkedIn touches (if tracked)

C) Forecast Data (if tracked)

Pull the forecast submitted at the start of the period for comparison to actuals:

  • Commit forecast per rep
  • Best case forecast per rep
  • Pipeline forecast per rep

Data Standardization

Normalize all data into a standard structure:

performance_data: {
  current_period: {
    start_date: string
    end_date: string
    reps: [
      {
        name: string
        team: string | null
        manager: string | null
        quota: number

        revenue: {
          closed_won: number
          closed_lost_value: number
          deals_won: integer
          deals_lost: integer
          avg_deal_size: number | null
          largest_deal: { name: string, amount: number } | null
        }

        pipeline: {
          deals_created: integer
          pipeline_value_created: number | null
          open_deals: integer
          open_pipeline_value: number | null
          weighted_pipeline: number | null
        }

        activity: {
          calls: integer | null
          emails_sent: integer | null
          meetings_held: integer | null
          meetings_booked: integer | null
          proposals_sent: integer | null
          no_shows: integer | null
        } | null

        velocity: {
          avg_days_to_close: float | null
          avg_days_in_stage: { stage: string, days: float }[] | null
        } | null

        qualification: {
          meetings_to_qualified_rate: percentage | null
          qualified_deals: integer | null
        } | null

        deals_closed: [
          {
            name: string
            company: string
            amount: number
            stage: string            # won or lost
            close_date: string
            days_to_close: integer | null
            source: string | null
            loss_reason: string | null
          }
        ]

        forecast: {
          commit: number
          best_case: number
          pipeline: number
        } | null
      }
    ]
  }
  comparison_period: { ... } | null    # Same structure for prior period
}

Human Checkpoint

## Performance Data Pulled

Source: [CRM name]
Activity source: [Activity tool name]
Current period: [start] to [end]
Comparison period: [start] to [end]

Reps found: [list of rep names]
Deals closed in period: X won, Y lost
Activity data available: [yes/partial/no]
Forecast data available: [yes/no]

Data looks correct? (Y/n)

Step 2: Analyze Performance

Purpose: Run the full analysis across six dimensions. Pure computation + LLM reasoning.

Input Contract

performance_data: { ... }           # From Step 1
rep_quotas: { ... }                 # From config
team_target: number                 # From config
activity_targets: { ... } | null    # From config
pipeline_stages: string[]           # From config
expected_cycle_days: integer        # From config

Analysis Dimensions

Run all six analyses on the current period data. Where comparison period exists, calculate period-over-period trends.


Analysis 1: Quota Attainment

Questions answered: Are we going to hit the number? Who's on track and who isn't?

Metric How to Calculate
Team revenue closed Sum of all reps' closed won
Team attainment Team revenue / team target
Rep attainment Each rep's closed won / their quota
Attainment distribution How many reps at >100%, 80-100%, 50-80%, <50%
Run rate projection (Revenue closed / days elapsed) × days in period
Gap to target Team target - closed won - weighted pipeline
Rep ranking Ordered by attainment %
vs. Prior period Compare attainment percentages

Output:

quota_attainment: {
  team: {
    target: number
    closed: number
    attainment_pct: percentage
    run_rate_projection: number
    projected_attainment_pct: percentage
    gap_to_target: number
    vs_prior_period: percentage_change | null
  }
  by_rep: [
    {
      name: string
      team: string | null
      quota: number
      closed: number
      attainment_pct: percentage
      run_rate_projection: number
      gap_to_quota: number
      rank: integer
      vs_prior_period: percentage_change | null
      status: "crushing" | "on_track" | "behind" | "at_risk"
    }
  ]
  distribution: {
    above_100: integer
    pct_80_to_100: integer
    pct_50_to_80: integer
    below_50: integer
  }
}

Status thresholds (adjusted for time elapsed in period):

  • Crushing: >110% attainment (pace-adjusted)
  • On track: 90-110% attainment (pace-adjusted)
  • Behind: 60-90% attainment (pace-adjusted)
  • At risk: <60% attainment (pace-adjusted)

Analysis 2: Activity Metrics

Questions answered: Are reps putting in the work? Who's active and who's coasting?

Metric How to Calculate
Calls per day (by rep) Total calls / business days in period
Emails per day (by rep) Total emails / business days in period
Meetings per week (by rep) Total meetings / weeks in period
Proposals sent (by rep) Count in period
Activity-to-meeting conversion Meetings booked / (calls + emails)
Meeting-to-opportunity conversion Qualified deals / meetings held
No-show rate No-shows / meetings booked
vs. Targets Compare to activity_targets
vs. Prior period Compare activity volumes
Activity efficiency Revenue closed per activity unit (calls, emails, meetings)

Output:

activity_analysis: {
  by_rep: [
    {
      name: string
      team: string | null
      calls_per_day: float | null
      emails_per_day: float | null
      meetings_per_week: float | null
      proposals_sent: integer | null
      activity_to_meeting_rate: percentage | null
      meeting_to_opp_rate: percentage | null
      no_show_rate: percentage | null
      revenue_per_meeting: number | null
      vs_targets: {
        calls: "above" | "at" | "below" | null
        emails: "above" | "at" | "below" | null
        meetings: "above" | "at" | "below" | null
      } | null
      vs_prior_period: {
        calls_change: percentage | null
        emails_change: percentage | null
        meetings_change: percentage | null
      } | null
      activity_grade: "high" | "adequate" | "low" | "critical"
    }
  ]
  team_averages: {
    avg_calls_per_day: float | null
    avg_emails_per_day: float | null
    avg_meetings_per_week: float | null
    avg_revenue_per_meeting: number | null
  }
  efficiency_leaders: {
    most_efficient_rep: string         # Highest revenue per activity
    most_active_rep: string            # Highest total activity volume
    best_conversion_rep: string        # Highest meeting-to-opp rate
  }
}

Activity grade thresholds (relative to targets or team average):

  • High: >120% of target/average
  • Adequate: 80-120%
  • Low: 50-80%
  • Critical: <50%

Analysis 3: Deal Progression & Velocity

Questions answered: How fast are deals moving? Are deals progressing or stalling?

Metric How to Calculate
Avg days to close (by rep) Mean days from created to closed won
Avg days to close (team) Team-level mean
Stage velocity by rep Avg days in each stage per rep
Deals progressed this period Deals that moved forward at least one stage
Deals stalled Deals with no stage change in period
Pipeline creation rate New pipeline value created / target (should be 3x+)
Pipeline coverage by rep Open weighted pipeline / remaining quota
Fastest deal Shortest time from created to closed won
vs. Expected cycle Compare avg days to close vs. expected_cycle_days
vs. Prior period Compare velocity metrics

Output:

deal_progression: {
  by_rep: [
    {
      name: string
      avg_days_to_close: float | null
      deals_progressed: integer
      deals_stalled: integer
      pipeline_created: number | null
      pipeline_coverage: float | null
      coverage_assessment: "healthy" | "adequate" | "at_risk" | "critical"
      fastest_deal: { name: string, days: integer } | null
      slowest_stage: { stage: string, avg_days: float } | null
    }
  ]
  team: {
    avg_days_to_close: float | null
    vs_expected_cycle: string
    total_pipeline_created: number | null
    total_pipeline_coverage: float | null
    deals_progressed: integer
    deals_stalled: integer
    stall_rate: percentage
    vs_prior_period: {
      velocity_change: string | null
      stall_rate_change: percentage_change | null
    } | null
  }
}

Pipeline coverage thresholds:

  • Healthy: 3x+ remaining quota
  • Adequate: 2-3x
  • At risk: 1-2x
  • Critical: <1x

Analysis 4: Win/Loss Patterns

Questions answered: Why are we winning? Why are we losing? Are there patterns by rep?

Metric How to Calculate
Win rate (by rep) Won / (Won + Lost)
Win rate (team) Team-level
Avg deal size won (by rep) Mean amount of won deals per rep
Win rate by source (by rep) Cross-reference source and outcome per rep
Top loss reasons (by rep) Group loss_reason per rep
Top loss reasons (team) Aggregate
Loss stage distribution At which stage do deals die, per rep
Competitive losses Deals lost to specific competitors
vs. Prior period Compare win rates

Output:

win_loss: {
  team: {
    win_rate: percentage
    deals_won: integer
    deals_lost: integer
    avg_deal_size_won: number | null
    total_revenue_lost: number | null
    vs_prior_period: percentage_change | null
    top_loss_reasons: [
      { reason: string, count: integer, percentage: percentage }
    ]
    loss_by_stage: [
      { stage: string, count: integer, percentage: percentage }
    ]
    competitive_losses: [
      { competitor: string, count: integer, deals: string[] }
    ] | null
  }
  by_rep: [
    {
      name: string
      win_rate: percentage
      deals_won: integer
      deals_lost: integer
      avg_deal_size_won: number | null
      vs_prior_period: percentage_change | null
      top_loss_reason: string | null
      loss_stage: string | null          # Stage where most losses occur
      notable_wins: [ { deal: string, amount: number } ] | null
    }
  ]
}

Analysis 5: Rep Benchmarking & Coaching Priorities

Questions answered: How do reps compare to each other? Where does each rep need help?

Metric How to Calculate
Composite performance score Weighted: attainment (40%) + activity grade (20%) + win rate (20%) + pipeline coverage (20%)
Strength/weakness profile per rep Best and worst metrics relative to team
Coaching priority ranking Reps sorted by gap between potential and performance
Skill gaps Inferred from data patterns (see below)

Skill gap inference logic:

Pattern Inferred Gap Coaching Focus
High activity + low meetings Messaging/targeting issue Refine outreach copy, review ICP targeting
High meetings + low qualification rate Discovery skills gap Coach on discovery questions, qualification framework
High qualification + low win rate Closing skills gap Coach on negotiation, objection handling, proposals
Low activity + decent conversion Activity discipline Coach on daily rhythm, accountability, pipeline generation
High win rate + small deal sizes Upsell/expansion gap Coach on multi-threading, selling to value, expansion motions
Long cycle times vs. team avg Deal management gap Coach on next-step discipline, stakeholder mapping, urgency creation
High loss to competitors Competitive positioning gap Provide battlecards, coach on differentiation and displacement tactics
High no-show rate Meeting confirmation process Implement confirmation sequences, calendar management

Output:

rep_benchmarking: {
  rankings: [
    {
      name: string
      composite_score: float               # 0-100
      rank: integer
      attainment_pct: percentage
      activity_grade: string
      win_rate: percentage
      pipeline_coverage: float
      trend: "improving" | "stable" | "declining" | null
    }
  ]
  coaching_priorities: [
    {
      rep_name: string
      priority: "urgent" | "high" | "medium" | "low"
      primary_gap: string                  # e.g., "discovery skills"
      evidence: string                     # The data pattern that reveals this gap
      recommended_coaching: string         # Specific action for their manager
      secondary_gaps: string[] | null
    }
  ]
  team_strengths: string[]                 # What the team does well
  team_weaknesses: string[]                # Systemic issues across multiple reps
}

Coaching priority logic:

  • Urgent: Rep is <50% attainment AND activity is low — needs immediate intervention
  • High: Rep is <80% attainment with identifiable skill gap — coaching can move the needle
  • Medium: Rep is on track but has a specific area significantly below team average
  • Low: Rep is performing well — coach to maintain and stretch

Analysis 6: Forecast Accuracy (if forecast data available)

Questions answered: How reliable are our forecasts? Who sandags? Who over-commits?

Metric How to Calculate
Team forecast accuracy Actual closed / commit forecast
Rep forecast accuracy Per-rep actual vs. commit
Over-commit rate How often reps forecast more than they close
Sandbag rate How often reps close significantly more than forecast
Best case realization Actual / best case forecast
Forecast trend Is accuracy improving or declining over time?

Output:

forecast_accuracy: {
  team: {
    commit_forecast: number
    best_case_forecast: number
    actual_closed: number
    commit_accuracy: percentage           # Actual / commit
    best_case_realization: percentage
    accuracy_grade: "reliable" | "optimistic" | "conservative" | "unreliable"
  }
  by_rep: [
    {
      name: string
      commit_forecast: number
      actual_closed: number
      accuracy: percentage
      pattern: "accurate" | "over_commits" | "sandbags" | "volatile"
      deviation: number                   # Actual - commit
    }
  ]
  insights: string[]                      # Patterns observed
} | null

Accuracy grades:

  • Reliable: Team closes within 90-110% of commit
  • Optimistic: Team consistently closes <90% of commit
  • Conservative: Team consistently closes >110% of commit (sandbagging)
  • Unreliable: Wide variance, no consistent pattern

Output Contract (Full Analysis)

analysis: {
  period: { type, start_date, end_date }
  quota_attainment: { ... }
  activity_analysis: { ... }
  deal_progression: { ... }
  win_loss: { ... }
  rep_benchmarking: { ... }
  forecast_accuracy: { ... } | null
}

No human checkpoint after this step — the analysis feeds directly into report generation.


Step 3: Generate Report

Purpose: Transform the raw analysis into two report formats: an executive summary and a detailed diagnostic with rep-level coaching notes. Pure LLM reasoning.

Input Contract

analysis: { ... }                     # From Step 2
rep_quotas: { ... }                   # From config
team_target: number                   # From config
activity_targets: { ... } | null      # From config

Executive Summary Format

One page. Numbers and rankings. What a VP Sales needs to see in 60 seconds.

# Sales Performance Review — [Period Type]: [Start Date] to [End Date]

## Team Snapshot
| Metric | This Period | Prior Period | Change |
|--------|------------|-------------|--------|
| Revenue closed | $X | $Y | +/-Z% |
| Team attainment | X% | Y% | +/-Z pts |
| Deals won | X | Y | +/-Z |
| Avg deal size | $X | $Y | +/-Z% |
| Win rate | X% | Y% | +/-Z pts |
| Avg days to close | X | Y | +/-Z |
| Pipeline coverage | Xx | Yx | +/-Z |

## Rep Attainment Leaderboard
| Rank | Rep | Closed | Quota | Attainment | Status |
|------|-----|--------|-------|------------|--------|
| 1 | [Name] | $X | $Y | Z% | Crushing |
| 2 | [Name] | $X | $Y | Z% | On track |
| ... | ... | ... | ... | ... | ... |

## Red Flags
- [Any rep below 50% attainment — names and specifics]
- [Activity metrics below target]
- [Pipeline coverage below 2x for any rep]
- [Win rate declining]
- [Forecast accuracy deteriorating]

## Green Lights
- [Reps exceeding quota]
- [Metrics trending up]
- [Pipeline coverage healthy]
- [Wins against key competitors]

## Top 3 Actions
1. [Most impactful thing to do this week — e.g., "Coach [rep] on discovery — 8 meetings but 0 qualified deals"]
2. [Second most impactful]
3. [Third most impactful]

Detailed Diagnostic Format

Full rep-by-rep breakdown with coaching recommendations.

# Sales Performance Diagnostic — [Period]

## 1. Quota Attainment
[Team attainment summary]
[Rep-by-rep attainment table]
[Run rate projections]
[Gap analysis — what's needed to hit the number]
[Commentary: are we going to make it? What needs to happen?]

## 2. Activity Analysis
[Team activity averages vs. targets]
[Rep-by-rep activity table]
[Efficiency metrics — revenue per meeting, conversion rates]
[Commentary: who's doing the work? Who's efficient vs. just busy?]

## 3. Deal Progression & Velocity
[Pipeline creation and coverage by rep]
[Velocity metrics — avg days to close, stage duration]
[Stalled deals by rep]
[Commentary: is the pipeline healthy? Where are bottlenecks?]

## 4. Win/Loss Analysis
[Team win rate and trends]
[Rep-by-rep win rates]
[Loss reasons — team-level and rep-level patterns]
[Competitive loss analysis]
[Commentary: why are we losing? Any rep-specific patterns?]

## 5. Rep Scorecards
[For each rep, a mini-scorecard]:

### [Rep Name] — [Status: Crushing / On Track / Behind / At Risk]
| Metric | Value | vs. Target | vs. Team Avg | Trend |
|--------|-------|-----------|-------------|-------|
| Attainment | X% | [+/-] | [+/-] | [up/down/flat] |
| Activity | [grade] | [+/-] | [+/-] | [up/down/flat] |
| Win rate | X% | — | [+/-] | [up/down/flat] |
| Avg deal size | $X | — | [+/-] | [up/down/flat] |
| Pipeline coverage | Xx | [+/-] | [+/-] | [up/down/flat] |

**Strengths:** [What this rep does well, with data]
**Gaps:** [Where they need improvement, with data]
**Coaching recommendation:** [Specific action for their manager]

## 6. Forecast Accuracy (if available)
[Team forecast accuracy]
[Rep-by-rep accuracy table]
[Patterns: who sandbags, who over-commits]
[Commentary: can we trust the forecast?]

## 7. Recommendations
[Numbered list of specific, actionable recommendations.
 Each recommendation cites the data point that drives it.]

### Urgent (This Week)
1. [Action — data point — expected impact]

### High Priority (This Month)
2. [Action — data point — expected impact]
3. [Action — data point — expected impact]

### Systemic (Ongoing)
4. [Process or tooling change — data point — expected impact]

Recommendations Logic

Generate recommendations based on patterns found in the analysis:

Pattern Recommendation
>50% of reps below 80% attainment "This is a systemic issue, not individual. Review: targets too high? Market shifted? Product gaps? Pipeline generation insufficient?"
One rep significantly underperforming "[Rep] is at X% attainment with [specific gap]. Schedule a 1:1 this week to [specific coaching action]."
Team activity below targets "Activity is X% below target across the team. Re-establish daily rhythm: [specific cadence]. Consider shared accountability (leaderboard, daily standups)."
High activity + low conversion "Activity volume is there but conversion is low. This is a skills issue, not an effort issue. Focus coaching on [discovery/closing/qualification] — the bottleneck is at [stage]."
Win rate declining period-over-period "Win rate dropped from X% to Y%. Top new loss reason: [Z]. Investigate: competitor move? Product gap? Positioning drift?"
Pipeline coverage <2x for multiple reps "X reps have <2x pipeline coverage. They will not hit quota without immediate pipeline generation. Activate [outbound/referral/event] campaigns this week."
Forecast accuracy below 80% "Forecast accuracy is [X%]. [Pattern: over-commit/sandbagging]. Implement: [weekly commit review / staged forecasting / deal inspection criteria]."
One rep crushing while others struggle "[Rep] is at X% attainment. Study what they're doing differently: [observation from data]. Consider peer coaching or ride-alongs."
High competitive loss rate "Lost X deals to [competitor] this period. Distribute updated battlecards. Run a team session on competitive positioning."
Long average cycle length "Deals are taking X days to close vs. Y expected. Bottleneck is [stage]. Coach reps on [multi-threading / next-step discipline / urgency creation]."

Output Contract

report: {
  executive_summary: string           # Markdown formatted
  detailed_diagnostic: string         # Markdown formatted
  rep_scorecards: [
    {
      rep_name: string
      status: "crushing" | "on_track" | "behind" | "at_risk"
      strengths: string[]
      gaps: string[]
      coaching_action: string
    }
  ]
  recommendations: [
    {
      priority: "urgent" | "high" | "medium" | "systemic"
      area: string
      recommendation: string
      data_point: string
      expected_impact: string
    }
  ]
}

Human Checkpoint

Present the executive summary first, then offer the detailed diagnostic:

[Executive Summary rendered]

---

Full detailed diagnostic is also available with:
- Rep-by-rep scorecards with strengths, gaps, and coaching recommendations
- Deal-level analysis (progression, stalled deals, velocity)
- Win/loss deep dive with competitive analysis
- Forecast accuracy breakdown

Coaching priorities this period:
| Rep | Priority | Gap | Recommended Action |
|-----|----------|-----|--------------------|
| ... | ... | ... | ... |

Want to see the full diagnostic? Or drill into a specific rep's scorecard?

Step 4: Export & Share (Optional)

Purpose: Save the report and optionally push it to the user's preferred location.

Process

Based on user preference:

Destination How
Markdown file Save to clients/<client>/reports/sales-performance-review-{date}.md
Google Sheets Export data tables (attainment, activity, win/loss)
Notion Push to a Notion database page via Notion MCP
Slack Send executive summary to a channel
Email Send via agentmail
stdout Just display it (default)

Execution Summary

Step Tool Dependency Human Checkpoint Typical Time
0. Config None First run only 5 min (once)
1. Pull Data Configurable (CRM API, CSV, Supabase, etc.) Verify data looks correct 2-3 min
2. Analyze None (computation + LLM reasoning) None — feeds directly to report Automatic
3. Generate Report None (LLM reasoning) Review executive summary, drill into reps 10-15 min
4. Export Configurable (file, Sheets, Notion, etc.) Optional 1 min

Total human review time: ~15-20 minutes for a full sales performance review that would normally take 1-2 hours of CRM digging and spreadsheet building.


Adapting to Data Availability

Not every team tracks every metric. The analysis degrades gracefully:

Missing Data What Gets Skipped Report Still Useful?
activity data Activity analysis (Analysis 2), activity-based coaching Yes — quota attainment, win/loss, pipeline analysis still run
deal amounts Revenue metrics, quota attainment, deal size analysis Partially — deal count analysis and win/loss still work
forecast data Forecast accuracy (Analysis 6) Yes — everything else still runs
loss reasons Loss reason breakdown Yes — win/loss rate and stage analysis still work
source data Source-level win rate analysis Yes — aggregate metrics still run
comparison period Period-over-period trends, trend arrows Yes — single period analysis still produces full report
activity targets vs. target comparisons Yes — rep-to-rep benchmarking still works

Minimum viable data for a useful report: Rep names + deals closed (with amounts) + quota targets. Everything else enriches but isn't required.


Cadence Guide

Review Type Period Audience Focus
Weekly standup Last 7 days Sales team Activity, deal updates, stuck deals, this week's priorities
Monthly review Last 30 days Sales leader Full diagnostic: attainment, activity, coaching priorities
Quarterly review Last 90 days VP Sales / Founder Trends, forecast accuracy, team composition, strategic decisions
Annual review Last 12 months Leadership Rep performance trajectories, hiring/firing decisions, quota planning

The report depth automatically scales with the period length. A weekly review emphasizes activity and deal movement. A quarterly review emphasizes attainment trends, coaching ROI, and forecast reliability.


Tips

  • Run this on a consistent cadence. The value compounds. A monthly review reveals trends. A quarterly review reveals who's improving and who's plateauing. Without consistency, you're always flying blind.
  • Don't just look at quota attainment. A rep hitting quota through one large deal is different from a rep hitting quota through consistent execution. The underlying metrics tell you who is sustainably performing.
  • Activity metrics without conversion context are useless. "Jordan made 500 calls" sounds impressive until you see 0 meetings booked. Always pair activity with outcomes.
  • The coaching section is the ROI. The numbers tell you WHAT is happening. The coaching priorities tell you WHAT TO DO about it. A performance review without coaching actions is just a report card.
  • Watch for the "middle" reps. Top performers and bottom performers get attention. The reps at 70-90% attainment often have the highest coaching ROI — they're close enough that fixing one skill gap puts them over the line.
  • Forecast accuracy is a team discipline, not individual talent. If everyone's forecasts are off, it's a process problem. Implement deal inspection criteria: "What has to be true for this deal to close this period?"
  • Compare rep performance within segments, not across them. An SMB AE closing $40K/month and an Enterprise AE closing $40K/month are having very different quarters. Always normalize for role and territory.
  • Use the trend data. A rep at 60% attainment who was at 40% last month is improving. A rep at 90% who was at 120% last month is declining. Trajectory matters more than a single snapshot.