Snowball · the outreach + engagement engine

One account, two engines, eight agents, one baton

A tireless version of you on LinkedIn. The engagement engine warms people up so you're a familiar face; the outreach engine reaches out; the Clone holds the conversation in your voice; and a Coordinator supervises all of it. Below: what every agent does, the exact logic it decides on, what happens end to end, and the result you actually get.

At a glance — the spine
Sources
rosters · post-engagers · your content
Warm
likes + comments build familiarity
Reach
connect → opener → follow-ups
Converse
they reply → Clone takes over
You
booked / tricky → handed to you
Coordinator watches all of it — liveness, health, QA, escalation, tuning. Never in the hot path.
Ledger (the truth) → mirrored to Attio (your dashboard). Every agent reads/writes here; nobody talks directly.
Inputs — what feeds it

🎯 Lead sources

Creator + prospect rosters (polled), other-creators' post-engagers, your-post engagers (warmest), Sales Nav intent lists, lookalikes. Groups = manual feed (no API).

📣 The content engine

Your posts make you visible — the 70/30 rule: identical templates get 31% reply from an active profile vs 9% dormant. Content also pulls inbound straight to the Clone.

🧬 Config (per account)

ICP filter · your voice + comment-tone + Doctor Model · the goal (qualify → book) · allowed-facts list. This is what makes it sound like you.

How the two engines go out together — the interlock

The Conductor

One budget, deficit-paced. Splits the day into two pools and floors each so neither starves. Both draw on one account-wide write ceiling — LinkedIn limits the account, not the pool.

▸ ~25% attention warming
▸ ~75% outreach reaching + DMs
⚡ Engagement enginethe "attention" pool · builds familiarity first~25%
Likes
~40/day on creators + prospects
+
Comments
in your voice · substantive footprint
Warmed
≥1 touch in 7d, or co-engagement
🔒 Promoter gate · warm-enough-to-connect — no warming, no reach-out
🚀 Outreach enginethe "outreach" pool · only fires on warmed people~75%
Connect
~14–16/day · no-pitch invite
Opener
give-first, no ask (= acceptances)
Follow-ups
cap 3 · 2nd is the money touch
Email / InMail
2nd channel for non-acceptors
They share one Conductor — the same scheduler hands out both warming and outreach actions each tick, under one account ceiling.
Engagement gates outreach — the Promoter refuses a connect to anyone not warmed first. Warming is the on-ramp.
The Operator executes one action/tick — verify-and-halt: do it, confirm the real effect, only then advance the baton.
Every agent, in full — what it does & the logic it decides on
The Cadence · proactive, cron-paced — finds, warms, reaches out at a human pace
1 · Discoveryfinds & admits the right people
Fires: every tick, budget-paced across the day.
  • Track known rosters (creators → engage, prospects → warm) + Mine new pools: other-creators' post-engagers, your-post engagers, Sales Nav intent, lookalikes.
  • Admit gate: resolve profile → ICP filter (in-niche role, decision-maker, active <30d, real engagement not just a like, not competitor/bot) → score Hot / Warm / Cold → dedup vs Ledger and Attio → enrich.
  • Weights by post relevance + cross-target frequency (repeat signal = higher intent).
Reads: rosters, Unipile profiles  ·  Writes: discovered + type/source/signals
2 · Conductorallocates the day's budget
Fires: every ~5-min tick.
  • Each action type has a daily quota, spread across active hours with jitter. Two pools: attention (~25%) vs outreach (~75%) — neither starves.
  • Pick rule: among types where done < quota AND the jitter-gap elapsed AND an eligible item exists AND in active hours → choose the type with the highest deficit (quota × elapsed-fraction − done), then its top-priority item.
  • If nothing eligible → idle (idleness is safe + human). ×0.5 all quotas on a health flag.
Reads: pacing counters  ·  Writes: the one chosen action → Operator
3 · Promoterdecides who's warm enough to reach
Fires: when a warming person qualifies to graduate.
  • Sends a connect ONLY if all hold: ICP-qualified & Hot/Warm · warmed (≥1 like/comment in ~7d, or co-engaged a post we commented on, or engaged our content) · dwell 24–48h but promote within ~5 days (warmth decays) · our profile passes the 10-point audit · clean/dedup, not suppressed/Clone-owned · under the weekly cap.
  • No note by default (optimized profile → higher accept). Hot targets get an optional <200-char real-signal note, no pitch.
Reads: Ledger signals + profile audit  ·  Writes: connect_sent (after Operator confirms)
4 · Operatorexecutes one action, safely
Fires: once per tick — the only agent that touches LinkedIn.
  • Pre-flight: re-resolve the target's provider_id (guard wrong-person), re-check status still valid, confirm not already done (idempotency key).
  • Execute one action → verify the real effect (invite shows "Pending", message in thread) → advance the baton only on confirmed success. API-200 ≠ done.
  • On a security checkpoint / auth-drop / 429 → halt-and-alert, set paused_until, never auto-click through. A failed action never corrupts state.
Reads: the queued action  ·  Writes: audit row + status + pacing
The Clone · reactive, webhook, always-on — you, but never asleep
5 · Listenercatches every reply, claims the baton
Fires: the instant a Unipile inbound webhook lands.
  • Match sender → Ledger person. Debounce 30–90s so a multi-message burst is answered as one whole thought.
  • Detects your manual reply — if you answered from your phone, the Clone yields and never talks over you.
  • Claims the baton on the first fragment (replied → in_conversation). "stop / not interested" → suppressed.
Reads: the webhook  ·  Writes: replied/in_conversation, appends the thread
6 · Conversationalistholds the chat as you
Fires: when the Listener signals a real reply.
  • Loads person + full thread + voice files + Doctor Model + the goal (qualify → book) + the allowed-facts list.
  • Replies in your voice, diagnoses like you do, handles objections, proposes the call when warranted. 1–2 min during active hours, holds overnight ones for morning.
  • Pre-send gate re-reads the world: new inbound? now suppressed? you active in the thread? no invented claim, no pricing, on-voice, not a near-dupe → else regenerate once, then escalate.
Reads: voice files + thread  ·  Writes: thread, booked → Attio
7 · Escalatorthe autonomy boundary → you
Fires: on any high-stakes turn.
  • Escalates on: pricing · any commitment/promise · "are you a bot?" · low confidence · negative/emotional sentiment · a high-value prospect at the close.
  • Hands you the thread + a suggested reply on WhatsApp; blocks the auto-send until you respond, then resumes or stands down.
  • Graduated autonomy: weeks 1–2 = draft-and-approve every reply (you watch it be you), then auto-send safe turns, escalate only the hard ones.
Reads: thread + confidence  ·  Writes: escalated + pings you
The safety net = the humanone model runs it all: Kimi K2.6
There is no "escalate to a smarter model." Kimi handles the turn, or you do (via the Escalator). The pre-send Reviewer gate + deterministic guardrails fail closed — when unsure, it holds for a human rather than winging it.
The Coordinator · supervisor, periodic — the boss who never touches a customer
8 · Coordinatorwatches everything, tunes, routes escalations
Fires: periodically + whenever you check in — never message-by-message, never in the hot path.
  • Liveness — cron tick fresh (<10 min), Clone heartbeat alive, webhook still subscribed, queue draining. Clone-down / session-down → wake-now alert.
  • Health — within caps · acceptance ≥ 20% (else throttle — spam signal) · email bounce low · Unipile session authed.
  • QA — samples Clone transcripts: on-voice, grounded, in-bounds, replied to everyone, escalated correctly.
  • Escalation routing — surfaces the escalated queue to you (Attio + WhatsApp + suggested reply) and pushes your decision back.
  • Tuning — reads metrics (reply by hook/segment, acceptance, conversion) → adjusts the Conductor's pool split + the Promoter's targeting. "Fix the weakest number."
Reads: Ledger + Attio metrics  ·  Writes: pause / config / approvals (Attio writes need your OK)
The baton — one owner per person, at all times
discovered warming connect_sent connected opener_sent Cadence owns replied in_conversation baton flips → Clone booked / escalated You went_cold 1 re-engage → Cadence suppressed never again

A row-level lock means exactly one agent owns a person at a time — no double-message, ever. The moment they reply, Cadence stops; suppressed overrides everything.

The brain — where the truth lives

📒 Ledger

Operational truth. people · actions (audit) · pacing · conversations. Authoritative for the baton + suppression. The engine keeps running on this alone if Attio is down.

📊 Attio

System of record + your dashboard. Qualified people, pipeline stage (mapped from status), summary, outcome. Outbox-pattern mirror; your do-not-contact overrides flow back and win.

🧭 Coordinator

Reads health + metrics from both, writes pause/config/approvals. The one agent allowed to change the dials — and only within the guardrails below.

The guardrails — what keeps the account alive

🛡 Hard rules, non-negotiable

The whole thing is built to look human and never get restricted. These wrap every agent's every action.
🔒 One owner, one human
Row-level baton lock — never two touches at once. Dedup on provider_id across Ledger + Attio: one person, one account.
📉 Rate ceilings
~80–100 connects/wk hard cap (rolling 7-day). Warm-up ramp 5→20/day. One account-wide write ceiling above per-type quotas.
✋ Acceptance floor
Soften <30% · throttle ×0.5 <25% · hard-stop new connects <20% (LinkedIn's restriction trigger). Read in the hot path.
🚧 Halt-and-alert
Any checkpoint / "action blocked" / dropped session → freeze the account's sending, alert you. Never auto-click through.
🕒 Human pace
Inter-action floors, log-normal jitter, active-hours only in the account's timezone, weekend/holiday rest, overnight hold on all sends.
🧯 Isolation + kill-switch
Every counter keyed by account — one going yellow pauses only itself. A master kill-switch freezes the fleet instantly.
🧠 Clone safety
Inbound = untrusted data, never instructions. Soft-no → nurture, never "overcome." Emotional / "are you a bot?" → escalate.
🆔 Identity gate
Existing clients, competitors, journalists, recruiters, legal senders are never run through the prospect Clone — handed to a human.
👤 The human is the net
One model (Kimi K2.6). Hard turns → you. The pre-send gate fails closed → holds for a human.
What essentially happens — one prospect, start to finish
1
Discovery spots an ICP prospect engaging your tail creators, filters + scores them, and admits them → discovered.
2
Engagement engine likes + comments (in your voice) on their posts and the creators they follow → they keep seeing you → warming.
3
Promoter checks they're warm enough → Operator sends a no-pitch connect, verifies it landed → connect_sent.
4
They accept → the Operator sends a give-first opener (no ask) → opener_sent. Non-acceptors get opened on email / InMail instead.
5
They reply → Listener flips the baton → Conversationalist holds the chat in your voice, diagnoses, and proposes a call.
6
Pricing, a commitment, "are you a bot?", or anything delicate → Escalator hands you the thread + a suggested reply on WhatsApp.
7
It books the call → written to Attio → handed to you warm. If it goes quiet, one re-engage, then suppressed (never bothered again).
8
Coordinator watches the whole run — the Ledger is the single source of truth, mirrored to Attio, which is what you actually open.
The end result

Booked, qualified meetings on your calendar — without you prospecting.

Every real lead lands in Attio as one clean record, merged across channels (LinkedIn, email, ads → one human), with the conversation, the stage, and the outcome attached. You don't find people, warm them, connect, open, or chase — the engine does. You just take the warm calls and step in for the moments that need a human. And because the Coordinator reads every reply, acceptance, and booking back into the Conductor + Promoter, the engine sharpens itself every week — the distribution compounds.

Per profile
~$50–85/mo all-in at the heavy 50-new-people/day load (Kimi K2.6 + a ~$5 always-on box).
At fleet scale
× profiles — ~10 profiles ≈ $500–850/mo. Per-profile budget caps contain any spike.
The moat
One voice file, one model, one Ledger — the account manager can leave and the system stays. Distribution as software.