ToolsObservability

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

ParamTypeRequiredDescription
outcomestringyesacceptance | 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).
windowstringnooverall (default) | this_week | last_week | last_2_weeks | this_month - on enrollment date.
sequence_idstring (slug or UUID)noScope the cohort to one sequence. Default: all sequences.
lead_group_idstring (slug or UUID)noScope the cohort to one lead group's enrollments - use when a list carries its own enrichment fields.
fieldsarraynoOmit 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: significant needs n ≥ 50 and p < 0.05 (n ≥ 100 adds strength: strong); n of 20–49 is an early_signal explicitly 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_reply is derived from conversation tags (interested / meeting_requested / meeting_booked / referral) and undercounts while replies are untagged - the response caveats this and reply_tags shows the untagged count. Lead with reply when tagging discipline is unknown.

Statistical suppression is not absence of data: slices under n=20 are named in field_notes with their counts, and the response's recommended_next points to get_sequence(include_stats) for raw per-sequence status breakdowns without gating.

Sample request — sweep

{
  "outcome": "acceptance"
}

Sample request — fields

{
  "outcome": "reply",
  "fields": [
    "selected_angle"
  ]
}

On this page