How it works
Pull connections
Export the full LinkedIn connection list to a Google Sheet. Raw data, no sorting, just every name, title, company, and profile URL in one place.
Filter founders + CEOs
Keep only titles that match the ICP, founder, co-founder, CEO. Everyone else stays out of the funnel.
Manual curation pass
Filtered contacts land on a staging tab for a human sanity check against the ICP definition. A sheet formula derives the LinkedIn slug from each profile URL. Confirmed contacts move to the live list, ready for outreach.
Daily trigger
An n8n schedule fires every day, reads the live sheet, filters rows where status is not Sent, and pulls each contact's LinkedIn profile through Unipile.
GTM research per contact
An OpenAI agent runs a go-to-market briefing on the contact's company website. The output, positioning, ICP, key pains, feeds the next step.
Craft + send 5 messages
A second OpenAI agent breaks the GTM research into 5 tailored messages. Unipile sends them sequentially with a 10 to 30 second wait between each, so the cadence looks human and avoids LinkedIn's spam flags. Sheet row updated, Slack pings on completion.
Why this works
Cold DMs to strangers get ignored. Connections are warmer ground, but a generic template still kills reply rates. Two design choices move the needle here. First, the ICP filter plus manual curation means the workflow only touches contacts who actually fit, no spray and pray. Second, splitting one pitch into 5 short messages, each anchored in real research about the contact's company, reads like a human picking up a thread over a few days. The 10 to 30 second jitter between sends is small but matters, it keeps the pattern off LinkedIn's bot radar.