Skip to content
BlackNode App
Sign in Start workspace

LinkedIn outreach

End-to-end LinkedIn lead-gen: Sales Navigator search → ICP filter → personalized InMail drafted with Claude Haiku → Unipile send → 2-touch follow-up cadence. Built to respect rate limits and survive Premium account flags.

Pipeline

SN search → ICP filter (title / company size / region)
         → Claude Haiku drafts InMail (90/10 rule)
         → Unipile send (max 20/day per account)
         → wait 3 days → follow-up 1
         → wait 5 days → follow-up 2
         → mark as cold

Quickstart

claude
# > "find 30 SaaS founders in Berlin (10-50 employees),
#    draft InMails about our AI agent platform, save drafts to
#    /workspace/li-drafts.json — don't send yet"

Run with --send when you've reviewed the drafts.

Environment variables

UNIPILE_API_KEY=...
UNIPILE_ACCOUNT_ID=...      # the LinkedIn account ID inside Unipile
CLAUDE_API_KEY=...          # BYOK for personalization
DAILY_INMAIL_CAP=20         # never raise above 25 unsupervised

The 3-error rule

Don't disable Premium on a single 403. Disable only after three consecutive 403 errors. LinkedIn occasionally throws spurious 403s on otherwise-healthy accounts; killing the worker on a single error churns through paying customers.

Personalization rules

  • Never lead with the product. First sentence is about them — a recent post, a hire, a launch.
  • Subject line ≤ 60 characters, no em-dashes (em-dash is the #1 AI fingerprint).
  • Body ≤ 600 characters. InMail UI clips longer.
  • Single CTA: 15-minute call, calendar link.

Known limits

  • Free LinkedIn accounts: 5 connection requests / day (use that, not InMail).
  • Premium: 25 InMail credits / month (use Sales Navigator instead).
  • Sales Navigator: 50 InMails / month, unlimited search. This is the target tier.
  • If your Unipile account disconnects, you have ~6 hours of 401s before it auto-flags — see Troubleshooting.
Last updated 2026-05-21 Edit on GitHub soon