| name | ABM Outbound |
| description | Multi-channel ABM automation that turns LinkedIn URLs into coordinated outbound campaigns. Scrapes profiles, enriches with Apollo (email + phone), gets mailing addresses via Skip Trace, then orchestrates email sequences, LinkedIn touches, and handwritten letters via Scribeless. The secret weapon for standing out in crowded inboxes. |
ABM Outbound
Turn LinkedIn prospect lists into multi-channel outbound: email sequences, LinkedIn touches, and handwritten letters.
Prerequisites
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
https://linkedin.com/in/johndoe
https://linkedin.com/in/janesmith
Step 2: Scrape LinkedIn Profiles
curl -X POST "https://api.apify.com/v2/acts/harvestapi~linkedin-profile-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"profileUrls": [
"https://linkedin.com/in/johndoe",
"https://linkedin.com/in/janesmith"
]
}'
Returns: First name, last name, company, title, location.
Step 3: Enrich with Apollo (Email & Phone)
curl -X POST "https://api.apollo.io/api/v1/people/bulk_match" \
-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": "https://linkedin.com/in/johndoe"
}]
}'
Returns: Work email, phone numbers.
Step 4: Get Mailing Address (Skip Trace)
curl -X POST "https://api.apify.com/v2/acts/one-api~skip-trace/run-sync-get-dataset-items" \
-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 "https://api.apollo.io/api/v1/emailer_campaigns/add_contact_ids" \
-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 "https://api.instantly.ai/api/v1/lead/add" \
-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 "https://platform.scribeless.co/api/recipients" \
-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 | Email | LinkedIn | 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 | โ |
The play: Letter lands โ Email references it โ LinkedIn reinforces.
Complete Workflow
linkedin_urls = load_csv("prospects.csv")
profiles = apify_linkedin_scrape(linkedin_urls)
for profile in profiles:
enriched = apollo_bulk_match(profile)
profile['email'] = enriched['email']
profile['phone'] = enriched['phone']
for profile in profiles:
address = skip_trace(profile['name'])
if address['state'] == profile['linkedin_state']:
profile['address'] = address
profile['mailable'] = True
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
Best Practices
- Verify addresses โ Skip Trace state should match LinkedIn location
- Personalize everything โ Company news, job changes, shared connections
- Coordinate timing โ Letter lands before "did you get my note?" email
- Start small โ Test with 20-50 prospects before scaling
- Track by channel โ Know which channel drives replies