Skip to main content
skill CX Codex

analytics · apolloio — Claude Code skill: sales analytics on Apollo data

Turns a question about sales performance into a formatted table built from real Apollo data: emails, calls, meetings, tasks, deals.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add apolloio/apollo-mcp-plugin --skill analytics -a claude-code
Open on GitHub

What analytics does

The skill parses your question into query parameters for Apollo analytics. You name the metric, the time window and the breakdown; you get back a table. The metric list is long: emails sent, opened and replied, reply rate, calls and their duration, meetings scheduled and held, overdue tasks, deal and won amounts, win rate, LinkedIn activity, recorded conversations with talk ratio.

Time windows come as presets (last_30_days, current_quarter, all_time and others) or as a custom range_start plus range_end in YYYY-MM-DD. Breakdowns cover time, rep, team, sequence, contact stage, company industry, opportunity stage. Cross-tabs work too: ask for rep and sequence at once and you get one table per metric. Say nothing about time and the skill falls back to last_30_days.

It runs on the Apollo MCP server, so there is no data without that server connected. "My data" maps to filters: { user_ids: ["current"] }; leave the rep out and you get team-wide numbers instead.

What it helps with

  • check how many emails went out this month and how many got replies
  • compare call connect rate across reps for the quarter
  • break pipeline and won amount down by opportunity stage
  • find the sequences with the highest reply rate
  • pull an activity summary per rep: emails, calls, meetings, tasks

Example prompts for the agent

  • /apollo:analytics How many emails did I send last 30 days?
  • /apollo:analytics Show me team call connect rate this quarter by rep
  • /apollo:analytics What's our email reply rate week over week for this year?

How to install analytics

1Skills CLI (Vercel)

npx skills add apolloio/apollo-mcp-plugin --skill analytics -a claude-code

2Manually: put the files in place

~/.claude/skills/analytics/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/analytics/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about analytics

How do I install analytics in Claude?

Run npx skills add apolloio/apollo-mcp-plugin --skill analytics -a claude-code. The skill file lands at ~/.claude/skills/analytics/SKILL.md.

What does the analytics skill do?

It takes a sales performance question, works out the metrics, date range and breakdown, then returns a table with Apollo data.

Which metrics does it cover?

Emails, calls, meetings, tasks, contacts and accounts, opportunities, sequences, conversation intelligence and LinkedIn tasks. Performance metrics come as both raw counts and percentages.

Source text

SKILL.md · MIT
---
name: analytics
description: "Instant sales analytics. Ask any performance question — emails, calls, meetings, tasks, opportunities, sequences, conversation intelligence — and get formatted tables with real Apollo data."
user-invocable: true
argument-hint: [your analytics question]
---

# Analytics

Answer any sales performance question using Apollo's analytics data. The user asks a question via "$ARGUMENTS".

## Examples

- `/apollo:analytics How many emails did I send last 30 days?`
- `/apollo:analytics Show me team call connect rate this quarter by rep`
- `/apollo:analytics What's our email reply rate week over week for this year?`
- `/apollo:analytics Break down pipeline and won amount by opportunity stage all time`
- `/apollo:analytics Which sequences have the highest reply rate in the last 6 months?`
- `/apollo:analytics Show me activity summary — emails, calls, meetings, tasks — for each rep this quarter`
- `/apollo:analytics How are calls trending by day of week over the last 3 months?`
- `/apollo:analytics Show me emails sent vs replied broken down by contact stage and email type`

## Step 1 — Interpret the Question

Parse "$ARGUMENTS" to determine the following parameters:

---

### Metrics

Select 1–15 metrics that match what the user is asking about. Always include the rate/percent version alongside raw counts when the user asks about performance.

**Email**
`num_emails_sent`, `num_emails_delivered`, `num_emails_opened`, `num_emails_clicked`, `num_emails_replied`, `num_emails_bounced`, `num_emails_unsubscribed`, `percent_emails_replied`, `num_contacts_emailed`, `num_contacts_opened`, `num_contacts_replied`

**Calls**
`num_phone_calls`, `num_phone_calls_completed`, `num_phone_calls_connect`, `num_phone_calls_connect_positive`, `num_phone_calls_connect_negative`, `num_phone_calls_connect_neutral`, `percent_phone_calls_connect`, `avg_phone_call_duration`, `num_contacts_called`

Key distinctions:
- `num_phone_calls_completed` = all logged attempts
- `num_phone_calls_connect` = recipient actually answered
- `num_phone_calls_connect_positive/negative/neutral` = connected calls by outcome sentiment

**Meetings**
`num_all_meetings_scheduled`, `num_meetings_held`, `num_all_meetings_rescheduled`, `num_calendar_events_scheduled`, `num_calendar_events_cancelled`, `num_all_meetings_scheduled_via_email`, `num_all_meetings_scheduled_via_call`

Key distinctions:
- `num_all_meetings_scheduled` = includes cancelled
- `num_meetings_held` = actually occurred

**Tasks**
`num_tasks`, `num_tasks_completed`, `num_tasks_scheduled`, `num_tasks_completed_on_time`, `percent_tasks_completed`, `percent_tasks_completed_on_time`, `overdue_tasks`, `unfinished_overdue_tasks`, `percent_unfinished_overdue_tasks`

Key distinctions:
- `overdue_tasks` = all overdue including completed late
- `unfinished_overdue_tasks` = still pending and overdue
- `percent_unfinished_overdue_tasks` = share of scheduled tasks that are overdue and unfinished (vs `num_tasks_scheduled`)

**Contacts & Accounts**
`num_contacts`, `num_accounts`, `num_contacts_touched`, `num_accounts_touched`, `num_net_new_people`, `num_net_new_companies`, `num_contacts_with_job_change`

**Opportunities**
`num_opportunities`, `num_won`, `num_closed`, `deal_amount`, `won_amount`, `pipeline_amount`, `revenue_amount`, `avg_deal_amount`, `avg_won_amount`, `percent_win_rate`, `avg_salescycle_days`

**Sequences**
`num_contacts_added_to_sequence`, `num_contacts_remove_from_sequence`

**Conversation Intelligence**
`num_conversations_recorded`, `num_conversations_listened`, `avg_conversation_duration`, `total_conversation_duration`, `avg_talk_ratio`, `avg_question_rate`, `avg_longest_monologue`, `speaker_switches`

**LinkedIn**
`num_linkedin_tasks_scheduled`, `num_linkedin_tasks_completed`, `num_linkedin_tasks_skipped`, `percent_linkedin_tasks_completed`

---

### Date Range

Map the user's time reference to a preset modality (preferred) or a custom range:

**Presets**: `today`, `yesterday`, `current_week`, `current_month`, `current_quarter`, `current_year`, `last_7_days`, `last_2_weeks`, `last_30_days`, `last_3_months`, `last_6_months`, `last_12_months`, `last_4_quarters`, `last_2_years`, `previous_week`, `previous_month`, `previous_quarter`, `previous_year`, `all_time`

**Custom**: use `range_start` + `range_end` (YYYY-MM-DD) for specific date windows. Do not combine with a modality.

Default to `last_30_days` if no time reference is given.

---

### Breakdown (group_by)

Does the user want data broken down by something? Set `group_by` to one of:

**Time patterns** (for trends and time series)
`smart_datetime_hour`, `smart_datetime_day`, `smart_datetime_week`, `smart_datetime_month`, `smart_datetime_year`
`smart_datetime_hour_of_day`, `smart_datetime_day_of_week`, `smart_datetime_month_of_year`

**People & Teams**
`smart_user_id` (by rep), `smart_subteam_id` (by team)

**Email dimensions**
`emailer_campaign_id` (by sequence), `emailer_template_id` (by template), `emailer_message_type`, `emailer_step_id`, `emailer_touch_id`, `send_from_email`, `send_from_domain`, `email_account_id`

**Calls**
`phone_call_outcome_id`, `phone_call_purpose_id`, `phone_call_sentiment`

**Contact attributes**
`contact_stage_id`, `contact_label_ids`, `contact_owner_id`, `persona`, `person_title_unanalyzed`, `person_seniority`, `person_location_country`, `person_location_state`, `person_location_city`

**Account & company attributes**
`account_id`, `account_stage_id`, `account_label_ids`, `account_owner_id`, `organization_industries`, `organization_num_current_employees`, `organization_hq_location_country`, `organization_hq_location_state`, `organization_hq_location_city`, `organization_latest_funding_stage_cd`, `organization_current_technologies`

**Opportunities**
`opportunity_stage_id`, `opportunity_owner_id`, `opportunity_pipeline_id`, `forecast_category`, `lead_source`, `opportunity_deal_source`

**Tasks**
`task_type`, `task_status`

**Conversations**
`conversation_state`, `conversation_type`, `tracker_names_unanalyzed`, `calendar_event_setting_type`

Omit `group_by` entirely for a flat summary (single row of totals).

---

### Pivot (pivot_group_by)

If the user wants a cross-tab (e.g. "by rep AND by sequence", "broken down by stage vs email type"), set `group_by` to the primary dimension and `pivot_group_by` to the secondary. The tool returns one table per metric when a pivot is used. Prefer low-cardinality dimensions (e.g. `emailer_message_type`, `contact_stage_id`, `phone_call_sentiment`) as the pivot.

---

### Filters

- "my data" / "for me" / "my performance" → `filters: { user_ids: ["current"] }`
- Specific user by Apollo user ID → `filters: { user_ids: ["<user_id>"] }` (can combine: `["current", "user_id_1"]`)
- "team" / no user mention → omit filters entirely (returns team-wide data)
- Filter by team/subteam → `filters: { team_ids: ["<subteam_id>"] }`
- Filter by sequence name → first call `mcp__claude_ai_Apollo_MCP__apollo_emailer_campaigns_search` to resolve the name to an ID, then pass `filters: { emailer_campaign_ids: ["<id>"] }`

---

### Sort

If the user asks "who has the most...", "ranked by...", or "top reps by...", set:
```
sort: { metric: "<metric_name>", asc: false }
```
Use `asc: true` for "lowest first" or "worst performing" queries.

Two constraints:
- Sort only applies when `group_by` is set — it has no effect on flat queries
- The sort metric must be included in the `metrics` array

---

## Step 2 — Call the Analytics Tool

Use `mcp__claude_ai_Apollo_MCP__apollo_analytics_sync_report` with the parameters determined above.

If the question spans multiple independent dimensions (e.g. "show me email metrics by rep AND separately by sequence"), make two sequential calls.

If the question is ambiguous, make a reasonable default call first, then offer to refine.

---

## Step 3 — Present the Results

**Flat response** (no group_by): Present as a clean two-column summary table — metric name and value.

**Grouped response** (group_by only): Present as a table with the dimension as the first column and metrics as subsequent columns. Highlight notable outliers (top performer, lowest rate, biggest gap).

**Pivot response** (group_by + pivot_group_by): Present each metric as a separate labeled table. Add a brief summary sentence per table.

Always:
- Convert decimals to readable percentages (e.g. `0.14` → `14%`)
- Format large numbers with commas
- If the response says "Showing first N of M rows", mention the total count and offer to refine
- Add 1–2 sentences of insight after the data (e.g. "Tuesday has the highest call volume at 355 calls", "Sarah Flores leads reply rate at 14%")

---

## Step 4 — Offer Follow-up Actions

After presenting results, suggest 2–3 relevant next steps:

1. **Drill deeper** — break down by another dimension (e.g. "want to see this by rep?")
2. **Change date range** — compare with a different time period
3. **Add more metrics** — "want to add meetings or tasks to this view?"
4. **Pivot view** — "want to cross-tab this — e.g. by rep × sequence?"
5. **Export** — format as CSV-style table for copy-paste

© apolloio · MIT · apolloio/apollo-mcp-plugin

Similar skills

All skills for Agent setup: memory, context, orchestration →

analytics by other authors comes first.

From the same set2

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor