This is read-only analytics. It does not touch records. Its job is to make the team smarter about where effort converts.
<the_funnel> The canonical stages and the data behind each. Conversion rate = stage N+1 / stage N. The two most-ignored, most-diagnostic transitions are booked → held (no-show leakage) and held → SQL-accepted (qualification quality).
| Stage | Definition | Source |
|---|---|---|
| Leads | New contacts created in period, with lead source + lifecycle | query_dataset: contacts_created (group by source, lifecycle) |
| Qualified (MQL/SAL) | Passed ICP / power-level qualification | lifecycle normalization in contacts_created; qualify_lead history |
| Demo booked | Handed to an AE / meeting set | ae_handoff records; get_upcoming_meetings; deal created |
| Demo HELD | The meeting actually happened | clari_list_calls / clari_get_call_summary (demo-type calls) |
| SQL-accepted | AE accepted it as a real opportunity | pipeline_open (entered a real stage) / hubspot_search_deals |
| Closed-won | Revenue | query_dataset: deals_closed (outcome = won) + revenue |
| </the_funnel> |
<technical_accuracy>
The numbers are data, but any product/spec claim in the recommendations (e.g.
"lean into Higher Ed lecture-capture") must be spec-checked via
search_product_catalog if it becomes customer-facing. For the analysis itself,
accuracy means SOUND METHOD: state attribution assumptions, show denominators,
flag small samples. QA the output with the data:validate-data skill before
sharing.
</technical_accuracy>
<quick_start> Trigger: "Run yield analysis", "What's converting?", "Where am I leaking?", "Win rate by source". Default cadence: end of quarter, plus monthly pulse.
Inputs:
- Period — default last full quarter; compare to prior quarter. Accepts any range.
- Scope — Tim
87486452by default; pass owner_ids for a rep or the team pool. - Slice — default all four (source, vertical, title/power, rep); narrow on request.
- Fiscal year start — FY2026 default (matches
weekly_brief).
Outputs:
- Excel workbook: Funnel Summary · Yield by Source · Yield by Vertical · Yield by Buyer/Power · Yield by Rep · Leak Map · Reallocation.
- A written reallocation recommendation: top 2 sources/verticals to double down, bottom 2 to cut, the single biggest leak to fix.
- Optional live dashboard via Cowork
create_artifact(or the Artifact tool in Claude Code), re-pullable each quarter — offer it after the workbook. - Sidecar:
~/.claude/skill-analytics/last-outcome-pipeline-yield-analytics-skill.json(see Outcome Sidecar below)
Dependencies (Epiphan-native — Gate D):
mcp__Epiphan_Ai__query_dataset— contacts_created, deals_closed, pipeline_open, rep_activity, revenue (the backbone; deterministic SQL).mcp__Epiphan_Ai__export_query_csv— the source→outcome join when curated datasets can't express it.mcp__Epiphan_Ai__clari_list_calls/clari_get_call_summary— demo-HELD confirmation.mcp__Epiphan_Ai__hubspot_search_deals/ae_drift_detect— opportunity acceptance + ownership.xlsxskill — workbook.data:validate-data— QA pass.data:create-viz/ Coworkcreate_artifact(Artifact tool in Claude Code) — charts / live dashboard. </quick_start>
<lead_sources> Map every lead to its origin so yield is comparable across the team's motions. These match the lead-source router: Greenfield (greenfield-pearl-tracker-skill) · Vertical list (vertical-list-builder) · Inbound (inbound-speed-to-lead-skill) · Paid social (paid-marketing-lead-enrichment — not in this library; map by HubSpot source/campaign) · Displacement (competitive-displacement-finder-skill) · Expansion (install-base-expansion-engine-skill) · Other/unknown. If the HubSpot source field is dirty, infer from the list/campaign membership and FLAG the inference rate in the Summary — attribution quality caps how hard you can lean on the conclusions. </lead_sources>
1. Pull the cohort
query_dataset: contacts_created for the period, grouped by source and
lifecycle. This is the denominator (Leads). Pull the prior period too for the
comparison column.
2. Walk the funnel
For the same cohort, assemble each downstream stage:
- Qualified — lifecycle normalization (MQL/SAL/SQL labels are already normalized by
query_dataset). - Demo booked —
ae_handoffrecords + deals created in period. - Demo HELD —
clari_list_callsfor demo-type calls tied to the cohort domains (booked minus held = no-show leak). - SQL-accepted —
pipeline_openentries /hubspot_search_dealsthat reached a real stage. - Closed-won —
deals_closed(won) andrevenuefor $ yield.
Where a single curated dataset can't join source→outcome, use export_query_csv
with a read-only SELECT and assemble the cohort join yourself.
3. Compute yield
For each slice (source, vertical, buyer power, rep) compute: stage-to-stage conversion %, end-to-end yield (won / leads), $ per lead, and average cycle time where available. Always show the denominator next to the rate — a 50% win rate on 2 deals is noise, not a signal. Compare to prior period.
4. Find the leak
The Leak Map ranks stage transitions by lost volume × value. Typical culprits:
booked→held (no-shows — pair the fix with the epiphan-sdr-toolkit:demo-confirm-and-handoff plugin skill),
held→SQL-accepted (qualification quality — pair with MEDDIC discipline and
orlob-discovery-framework-skill), qualified→booked (speed-to-lead — pair with
inbound-speed-to-lead-skill).
5. Recommend reallocation
Translate the math into a decision. Name the top 2 sources/verticals by yield (double down), the bottom 2 (cut or rework), and the single highest-value leak to fix next. End with specific actions, owners, and a timeline. This is the deliverable that matters — the tables support it, they are not the point.
6. QA + output
Run data:validate-data over the numbers (denominators, double-counting,
attribution). Build the workbook (xlsx). Offer the live create_artifact
dashboard for re-pulling each quarter. Present with present_files (Cowork) or as a file path in Claude Code. Write the
sidecar.
<success_criteria>
- Cohort = contacts created in the period (
query_dataset: contacts_created), with the prior period pulled for comparison - All six funnel stages assembled for the cohort; booked→held confirmed via Clari, SQL-accepted via a real pipeline stage, won via
deals_closed+revenue - Every yield table shows the denominator (
n) beside each rate; cohorts with n < ~20 labeled directional - Four slices delivered (source, vertical, buyer power, rep) unless narrowed on request
- Leak Map ranks stage transitions by lost volume × value and names the paired fix skill
- Reallocation section names top 2 double-down, bottom 2 cut/rework, and the single leak to fix, with owners + timeline
- Method guardrails stated in the Summary (attribution model, inferred-source %, Clari coverage %)
-
data:validate-dataQA pass run before sharing; no records written anywhere (read-only) - Outcome sidecar written (see below) </success_criteria>
Output contract
Workbook tabs: Funnel Summary (full funnel + prior-period delta) · Yield by Source · Yield by Vertical · Yield by Buyer/Power · Yield by Rep · Leak Map (ranked) · Reallocation (the recommendation).
Every yield table shows, per slice: Leads | Qualified | Booked | Held | SQL-Acc | Won | Held% | SQL% | Win% | End-to-end Yield% | $ / Lead | n (denominator).
Method guardrails (state these in the Summary)
- Attribution = lead source at contact creation; multi-touch is not modeled. Flag the % of leads with inferred (dirty) source.
- Demo-held depends on Clari coverage; if a call has no recording, it may undercount held — note coverage %.
- Small cohorts (n < ~20) are directional only; label them.
Cadence
End of each quarter (full retro vs prior quarter) + a lighter monthly pulse on the leak map. Consistent tabs so trends are comparable quarter over quarter.
GTME lens
- GTM motion: shifts the team from activity management to yield management — funding the motions and verticals that actually produce revenue and starving the ones that don't.
- Operational leverage: replaces gut-feel territory effort and manual spreadsheet funnel math with a repeatable, QA'd model; every quarter it redirects finite dials toward the highest-converting source×vertical cells, compounding output without adding headcount.
Roadmap (v1.1+)
- Live
create_artifactdashboard pullingquery_dataseton open, with source/vertical filters. - Cohort retention: re-pull each cohort at +30/+60/+90d to capture late-closing deals.
- Feed yield weights back into vertical-list-builder and install-base-expansion-engine-skill ranking.
- Per-rep coaching tie-in with sdr-call-coaching where a rep's held→SQL rate lags the team.
Outcome Sidecar
Write to ~/.claude/skill-analytics/last-outcome-pipeline-yield-analytics-skill.json (path MUST be outside the repo). The PostToolUse sweep hook ingests it into outcomes.jsonl.
{
"ts": "{ISO-8601 UTC now}",
"skill": "pipeline-yield-analytics-skill",
"version": "1.0.0",
"variant": "default",
"status": "success | partial | error",
"runtime_ms": 0,
"metrics": {
"period": "YYYY-Qn",
"leads": 0,
"qualified": 0,
"booked": 0,
"held": 0,
"sql_accepted": 0,
"won": 0,
"end_to_end_yield_pct": 0,
"inferred_source_pct": 0,
"clari_coverage_pct": 0,
"biggest_leak": "booked_to_held | held_to_sql | qualified_to_booked | ...",
"slices_delivered": 4
},
"error": null,
"session_id": "{session id or null}"
}
- status = "success" when all six stages were populated from live data; "partial" if a stage had to be estimated (e.g. no Clari coverage for demo-held) — fill
errorwith which stage; "error" only if no funnel could be built.