LinkedIn Outreach
Generates LinkedIn connection request notes, follow-up DMs, and InMails for a list of leads. Adapts delivery method to the configured tool stack: CSV export for Dripify/Expandi, browser automation, or manual copy-paste.
Prerequisites
agency.config.jsonat repo root withtools.linkedin_outreach,outreach, andcase_studiessectionscrm-writerskill for tracking outreach actionsmessage-generatorskill for personalization- Optional: Chrome automation (for browser delivery mode)
Phase 0: Intake
- Read
agency.config.jsonfrom the project root. - Extract:
tools.linkedin_outreach.tool-- the automation tool name (e.g., "dripify", "expandi", "manual")tools.linkedin_outreach.access-- delivery method:"csv_export","browser", or"manual"tools.linkedin_outreach.daily_limit-- max connection requests per day (respect this cap strictly)outreach.tone-- voice and tone guidelines for messagesoutreach.banned_phrases-- phrases that must never appear in any messagecase_studies-- available case studies for social proof references
- Accept parameters:
leads-- array of lead objects, each with:name,title,company,linkedin_url, and optionallyrecent_post,role_change,company_achievementmessage_type-- one of:"connect","dm","inmail", or"all"(default:"connect")
Phase 1: Generate Content
For each lead, generate messages based on message_type. Every message must be checked against outreach.banned_phrases before inclusion. Match the voice from outreach.tone.
Connection Request Note (max 300 characters)
- Include one specific personalization point. Pick from, in priority order:
- Their recent LinkedIn post (if
recent_postprovided) - A role change or promotion (if
role_changeprovided) - A company achievement or news (if
company_achievementprovided) - Their title + company combination (fallback)
- Their recent LinkedIn post (if
- Include one reason to connect: shared industry, mutual interest, or a brief value signal.
- NO pitch in the connection note. Zero selling language. This is a human-to-human connection.
- Keep under 300 characters including spaces. LinkedIn truncates at 300.
Example structure:
Hey {first_name}, saw your post on {topic} -- really resonated.
I work with {industry} brands on {area}. Would love to connect and exchange notes.
Follow-up DM (max 150 words, for accepted connections)
- Reference the connection acceptance: "Thanks for connecting" or similar.
- Share one insight, resource, or observation relevant to their role or company.
- Soft CTA: ask a question, do not pitch. Frame as curiosity or offering help.
- Use a different angle than the connection note. Do not repeat the same personalization point.
Example structure:
Thanks for connecting, {first_name}.
I was looking at {company}'s store and noticed {observation}.
We worked on something similar with {case_study_client} and saw {result}.
Curious -- is {topic} something your team is focused on right now?
InMail (max 200 words, if InMail credits available)
- Subject line: under 40 characters. Make it specific, not generic. Avoid "Quick question" or "Opportunity."
- Lead with value or an insight about their business, not about your agency.
- Reference one case study with a specific metric.
- Soft CTA: propose a brief call or ask a question. Not "Let's schedule a demo."
Example structure:
Subject: {company}'s {specific_page} conversion
Hi {first_name},
I was reviewing {company}'s {specific_area} and noticed {observation}.
We helped {case_study_client} fix a similar issue, which led to a {X%} increase in {metric}.
Would it be worth a 15-minute look at what we found? Happy to share the analysis either way.
{sender_name}
Phase 2: Delivery
Check tools.linkedin_outreach.access to determine delivery method.
CSV Export (access: "csv_export")
For tools like Dripify, Expandi, or LinkedHelper:
Generate a CSV file with these columns:
LinkedIn_URL-- the lead's LinkedIn profile URLFirst_Name-- extracted from lead nameLast_Name-- extracted from lead nameCompany-- lead's companyTitle-- lead's job titleConnection_Note-- the 300-char connection request noteFollow_Up_DM-- the follow-up DM text (used as sequence step 2)
Save to
output/linkedin-outreach-{YYYY-MM-DD}.csvProvide tool-specific import instructions:
- Dripify: "Go to Campaigns > Create Campaign > Import CSV. Map LinkedIn_URL to 'Profile URL', Connection_Note to 'Connection Message', Follow_Up_DM to 'Follow-up Message 1'."
- Expandi: "Go to Campaigns > New > CSV Import. Upload the file. Map columns in the field mapper."
Browser (access: "browser")
Use Chrome automation to send connection requests directly:
- Navigate to each lead's
linkedin_url. - Click the "Connect" button.
- If "Add a note" option appears, paste the
Connection_Note. - Send the request.
- Wait 30-60 seconds between requests (randomized to avoid detection).
- Stop when
daily_limitis reached, even if leads remain. Report how many were sent and how many are queued for tomorrow.
Manual (access: "manual")
For manual copy-paste workflow:
- Display each lead in sequence with:
- Lead name, title, company
- LinkedIn profile URL (clickable)
- Connection note (ready to copy)
- Follow-up DM (for after acceptance)
- Format for easy scanning and quick copy-paste.
Phase 3: Track
After delivery (or generation):
- Log each action to CRM via
crm-writerskill, writing to the outreach_log tab. - For each lead, log:
- Date
- Lead name
- Company
- LinkedIn URL
- Action taken (connection_sent, dm_sent, inmail_sent, csv_exported)
- Message content (condensed)
- Cadence day (Day 1 for new connections)
- Next action (e.g., "Follow-up DM after acceptance" or "Check acceptance in 3 days")
- Respect
daily_limit: if the limit is reached mid-batch, stop and report remaining leads as "queued."
Phase 4: Summary
Present a summary report:
LinkedIn Outreach Summary ({date}):
Connections sent: {N}
DMs sent: {N}
InMails sent: {N}
Daily limit remaining: {N}
CSV exported to: output/linkedin-outreach-{date}.csv (if applicable)
Queued for tomorrow: {N} leads (daily limit reached)
Leads processed:
1. {Name} @ {Company} -- connection note sent
2. {Name} @ {Company} -- DM sent (already connected)
...
Example Usage
Trigger phrases:
- "Send LinkedIn connections to these leads"
- "Generate LinkedIn outreach for this list"
- "Create Dripify CSV for LinkedIn"
- "Draft LinkedIn DMs for accepted connections"
- "Run LinkedIn outreach"
User: Send LinkedIn connections to 10 leads from the signal scanner
Assistant: [reads config, checks daily limit, generates personalized connection notes, delivers via configured method, logs to CRM, reports summary]
User: Create a Dripify CSV for these LinkedIn leads
Assistant: [generates connection notes + follow-up DMs, exports CSV to output/, provides Dripify import instructions]