← Back to Skills
Browser

abm-outbound

dru-ca By dru-ca 👁 12 views ▲ 0 votes

Multi-channel ABM automation that turns LinkedIn URLs

GitHub
---
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

| Service | Purpose | Sign Up |
|---------|---------|---------|
| **Apify** | LinkedIn scraping, Skip Trace | [apify.com](https://apify.com) |
| **Apollo** | Email & phone enrichment | [apollo.io](https://apollo.io) |
| **Scribeless** | Handwritten letters | [platform.scribeless.co](https://platform.scribeless.co) |
| **Instantly** *(optional)* | Dedicated cold email | [instantly.ai](https://instantly.ai) |

```bash
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

```csv
linkedin_url
https://linkedin.com/in/johndoe
https://linkedin.com/in/janesmith
```

## Step 2: Scrape LinkedIn Profiles

```bash
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)

```bash
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)

```bash
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)**
```bash
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**
```bash
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": "[email protected]",
    "first_name": "John",
    "last_name": "Doe",
    "company_name": "Acme Corp",
    "personalization": "Saw Acme just expanded to UK"
  }'
```

**Option 3: CSV Upload**
```csv
email,first_name,last_name,company,title,phone,personalization
[email protected],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](https://platform.scribeless.co), then add recipients:

```bash
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](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

```python
# 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

```csv
first_name,last_name,email,phone,company,title,address1,city,state,postal,country,linkedin,mailable
John,Doe,[email protected],555-1234,Acme Corp,VP Marketing,123 Main St,San Francisco,CA,94102,US,linkedin.com/in/johndoe,TRUE
```

## Best Practices

1. **Verify addresses** β€” Skip Trace state should match LinkedIn location
2. **Personalize everything** β€” Company news, job changes, shared connections
3. **Coordinate timing** β€” Letter lands before "did you get my note?" email
4. **Start small** β€” Test with 20-50 prospects before scaling
5. **Track by channel** β€” Know which channel drives replies
browser

Comments

Sign in to leave a comment

Loading comments...