abm-outbound
Multi-channel ABM automation that turns LinkedIn URLs into coordinated outbound campaigns.
Installation
npx clawhub@latest install abm-outboundView the full skill documentation and source below.
Documentation
ABM Outbound
Turn LinkedIn prospect lists into multi-channel outbound: email sequences, LinkedIn touches, and handwritten letters.
Prerequisites
| Service | Purpose | Sign Up |
| Apify | LinkedIn scraping, Skip Trace | [apify.com]() |
| Apollo | Email & phone enrichment | [apollo.io]() |
| Scribeless | Handwritten letters | [platform.scribeless.co]() |
| Instantly (optional) | Dedicated cold email | [instantly.ai]() |
export APIFY_API_KEY="your_key"
export APOLLO_API_KEY="your_key"
export SCRIBELESS_API_KEY="your_key"
Pipeline
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1. INPUT │───▶│ 2. SCRAPE │───▶│ 3. ENRICH │───▶│ 4. ADDRESS │───▶│ 5. OUTREACH │
│ LinkedIn │ │ Profiles │ │ Email/Phone │ │ Skip Trace │ │ │
│ URLs │ │ │ │ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
Your list Apify Apollo Apify PFI Email +
LinkedIn +
Scribeless
Step 1: Gather LinkedIn URLs
Provide a list of LinkedIn profile URLs from:
- LinkedIn Sales Navigator exports
- LinkedIn search scrapers
- CRM exports
- Manual prospecting
linkedin_url
Step 2: Scrape LinkedIn Profiles
curl -X POST "" \
-H "Authorization: Bearer $APIFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"profileUrls": [
"",
""
]
}'
Returns: First name, last name, company, title, location.
Step 3: Enrich with Apollo (Email & Phone)
curl -X POST "" \
-H "X-Api-Key: $APOLLO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reveal_personal_emails": true,
"reveal_phone_number": true,
"details": [{
"first_name": "John",
"last_name": "Doe",
"organization_name": "Acme Corp",
"linkedin_url": ""
}]
}'
Returns: Work email, phone numbers.
Step 4: Get Mailing Address (Skip Trace)
curl -X POST "" \
-H "Authorization: Bearer $APIFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": ["John Doe"]}'
Returns: Street address, city, state, postal code.
Important: Verify Skip Trace state matches LinkedIn location.
Step 5: Multi-Channel Outreach
5a: Email Sequence
Option 1: Apollo Sequences (Recommended)
curl -X POST "" \
-H "X-Api-Key: $APOLLO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"emailer_campaign_id": "YOUR_SEQUENCE_ID",
"contact_ids": ["CONTACT_ID_1", "CONTACT_ID_2"],
"send_email_from_email_account_id": "YOUR_EMAIL_ACCOUNT_ID"
}'
Option 2: Instantly.ai
curl -X POST "" \
-H "Authorization: Bearer $INSTANTLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"campaign_id": "YOUR_CAMPAIGN_ID",
"email": "john@acme.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "Acme Corp",
"personalization": "Saw Acme just expanded to UK"
}'
Option 3: CSV Upload
email,first_name,last_name,company,title,phone,personalization
john@acme.com,John,Doe,Acme Corp,VP Marketing,555-1234,Saw Acme just expanded to UK
5b: LinkedIn Sequence
- Day 1: View profile
- Day 2: Connection request with personalized note
- Day 4: Follow-up message if connected
- Day 7: Engage with their content
5c: Handwritten Letter (Scribeless)
Create campaign at [platform.scribeless.co](), then add recipients:
curl -X POST "" \
-H "X-API-Key: $SCRIBELESS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"campaignId": "YOUR_CAMPAIGN_ID",
"data": {
"firstName": "John",
"lastName": "Doe",
"company": "Acme Corp",
"address": {
"address1": "123 Main St",
"city": "San Francisco",
"state": "CA",
"postalCode": "94102",
"country": "US"
},
"variables": {
"custom1": "Saw Acme just expanded to the UK — congrats!"
}
}
}'
See references/scribeless-api.md for full API details.
Coordinated Timing
| Day | Letter |
| 1 | — | View profile | Letter sent |
| 3 | — | Connection request | — |
| 5 | "Got my note?" | — | Letter arrives |
| 7 | Value email | Message if connected | — |
| 10 | Case study | — | — |
| 14 | Break-up | Engage content | — |
Complete Workflow
# 1. Start with LinkedIn URLs
linkedin_urls = load_csv("prospects.csv")
# 2. Scrape profiles
profiles = apify_linkedin_scrape(linkedin_urls)
# 3. Enrich with Apollo
for profile in profiles:
enriched = apollo_bulk_match(profile)
profile['email'] = enriched['email']
profile['phone'] = enriched['phone']
# 4. Get mailing addresses
for profile in profiles:
address = skip_trace(profile['name'])
if address['state'] == profile['linkedin_state']:
profile['address'] = address
profile['mailable'] = True
# 5. Push to channels
push_to_email_tool(profiles)
push_to_scribeless(profiles, campaign_id)
export_for_linkedin(profiles)
Output Format
first_name,last_name,email,phone,company,title,address1,city,state,postal,country,linkedin,mailable
John,Doe,john@acme.com,555-1234,Acme Corp,VP Marketing,123 Main St,San Francisco,CA,94102,US,linkedin.com/in/johndoe,TRUE