Analyze outreach
Which angle / sequence / lead group / sender / person or company attribute is actually working: slices an outcome rate (acceptance, reply, or positive_reply) by any dimension and compares each slice against the rest of the cohort with honest evidence tiers - 'significant' needs n>=50 and p<0.05 (n>=100 = strong); n of 20-49 is an 'early_signal' that is NOT strong enough to act on; under 20 no rate is shown.
Tool: analyze_outreach
Omit fields to sweep every dimension ranked winners-first; multiple fields slice INDEPENDENTLY (each vs the rest of the cohort) - never a cross-tab or intersection. positive_reply is derived from conversation tags and reads 0% while replies are untagged - lead with reply and check the reply_tags block. Scope by sequence_id or lead_group_id; custom per-list enrichment fields are addressable via person_attr:/company_attr: ids (see list_analysis_fields). Counting caveats: acceptance, reply, and positive_reply share one funnel base - enrolled minus failed sends (failed listed in cohort.failed_sends); pending and stopped stay in the denominator. acceptance additionally requires a linkedin.accepted gate (else rate_pct null, never a misleading 100%). positive_reply is positively-tagged accepted over that same base (reads 0% while replies are untagged). NOT for: per-step funnels, or a status readout of small/new campaigns → get_sequence with include_stats; this tool compares RATES and suppresses low-volume slices (n<20), which does not mean the underlying campaigns have no data. For send VOLUME over time → get_outreach_volume.
Parameters
| Param | Type | Required | Description |
|---|---|---|---|
outcome | string | yes | acceptance | reply | positive_reply. Denominators are fixed: acceptance = truly-accepted / enrolled on gated sequences (failed sends excluded from the rate, pending + stopped stay in with caveats); reply over total enrolled (funnel view); positive_reply over that same enrolled − failed base (pending + stopped stay in). |
window | string | no | overall (default) | this_week | last_week | last_2_weeks | this_month - on enrollment date. |
sequence_id | string (slug or UUID) | no | Scope the cohort to one sequence. Default: all sequences. |
lead_group_id | string (slug or UUID) | no | Scope the cohort to one lead group's enrollments - use when a list carries its own enrichment fields. |
fields | array | no | Omit to sweep every dimension ranked winners-first. Items are field id strings (selected_angle, sequence, source_group, sender, seniority, industry, company_size, location, first_degree, enrolled_week, years_experience) or {field_id, field_value} objects to pin one value. Custom fields: person_attr:<path> / company_attr:<path> into person/company attributes (numeric values auto-band by quartiles) - discover ids with list_analysis_fields. |
Evidence tiers keep the readout honest:
significantneeds n ≥ 50 and p < 0.05 (n ≥ 100 addsstrength: strong); n of 20–49 is anearly_signalexplicitly not strong enough to act on; under 20 no rate is shown.Each slice is tested against the REST of the cohort (two-proportion z-test, Wilson 95% CI). acceptance is a funnel rate with cohort brackets for pending / failed_sends / stopped; positive_reply shares that same enrolled − failed base - pending and stopped stay in the denominator.
positive_replyis derived from conversation tags (interested / meeting_requested / meeting_booked / referral) and undercounts while replies are untagged - the response caveats this andreply_tagsshows the untagged count. Lead withreplywhen tagging discipline is unknown.Statistical suppression is not absence of data: slices under n=20 are named in
field_noteswith their counts, and the response'srecommended_nextpoints toget_sequence(include_stats)for raw per-sequence status breakdowns without gating.
Sample request — sweep
{
"outcome": "acceptance"
}Sample request — fields
{
"outcome": "reply",
"fields": [
"selected_angle"
]
}