Growth Signal Icebreaker
Growth signal fires. The right person gets a relevant message. Nobody touched it.
The Problem
I got tired of watching the same cycle: reps get a list of 500 companies, write the same intro email with a name swapped in, and call it "personalized." Meanwhile the companies actually showing growth signals get the same generic outreach as everyone else. I built this to flip the order: detect the signal first, find the decision-maker second, validate the email third, then spend LLM budget on an icebreaker that's actually relevant to what's happening at their company right now. If the email can't be verified, Claude never fires. No budget burned on a message that bounces.
Stack
Walkthrough
How It Works
The execution path
Reads targeting config from Airtable Settings and fires TWO parallel async calls to Pronto simultaneously — hiring signal and growth signal. Both are fire-and-forget.
- ·Read targeting config from Airtable Settings
- ·Fire async: companies posting sales/revenue roles (hiring signal)
- ·Fire async: companies growing headcount above threshold (growth signal)
- → Both calls deliver results to WF2 via webhook
Receives company batches and processes one at a time with a 30-second rate limit. Saves each to Airtable, gets the record ID, then submits an async lead search — passing the Airtable ID forward.
- ·Parse and normalize company payload
- ·Loop one company at a time (30s rate limit)
- ·Enrich via Pronto: LinkedIn URL, headcount, industry
- ·Save to Airtable Companies → receive record ID
- ·Look up persona UUID from Airtable Personas table
- ·Submit async lead search scoped to company domain + persona
- → Pass airtable_company_id with the search request
Filters leads by ICP title before spending enrichment credits. The critical move: passes both airtable_lead_id and airtable_company_id through Pronto's custom field so WF4 can find the right records.
- ·Parse leads array
- ·Filter: CTO, Chief Technology Officer, VP Engineering only
- ·Save qualified leads to Airtable Contacts (linked to company)
- ·Aggregate into bulk enrichment request
- ·Pass airtable_lead_id + airtable_company_id via Pronto custom field
- → Pronto echoes custom field back in enrichment webhook
Merges 3 data layers — lead context, company signal, and product knowledge base — before Claude writes. Email is a hard gate: if no deliverable email, Claude never fires. Zero wasted LLM spend.
- ·Receive enriched contact + custom IDs from Pronto
- ·Fetch lead details from Airtable using airtable_lead_id
- ·Fetch company details from Airtable using airtable_company_id
- ·Fetch knowledge base + LGM audience ID from Airtable Settings
- ·Merge: lead context + company signal + knowledge base
- ·Claude writes icebreaker (1–2 sentences, never starts with "I" or lead name)
- ·Update Airtable: icebreaker saved, Enrichment Status = "Enriched"
- ·POST to LaGrowthMachine: enroll in outbound sequence
- ·Update Airtable: LGM Status = "Enrolled", LGM Enrolled At = today
Key Design Decisions
By The Numbers