Turn a single LinkedIn post URL into a paused cold email campaign in Instantly. I scrape every commenter, store them in Airtable, find verified emails through Apollo, co-write a 3-email sequence with you, then load it all into Instantly. End to end takes 30-60 minutes, most of it in the email copy. Always paused for your review - I never auto-launch. Use for higher-intent, lower-volume audiences (commenting takes effort).
Scanned 9/19/2026
Install to Claude Code
npx -y skills add gethouston/houston --skill linkedin-comment-to-outreach --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Linkedin Comment To Outreach?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/gethouston-linkedin-comment-to-outreach)More formats (shields.io, HTML) on the badges page.
---
name: linkedin-comment-to-outreach
description: "Turn a single LinkedIn post URL into a paused cold email campaign in Instantly. I scrape every commenter, store them in Airtable, find verified emails through Apollo, co-write a 3-email sequence with you, then load it all into Instantly. End to end takes 30-60 minutes, most of it in the email copy. Always paused for your review - I never auto-launch. Use for higher-intent, lower-volume audiences (commenting takes effort)."
version: 1
category: Outbound
featured: yes
image: envelope-with-arrow
integrations: [apify, airtable, apollo, instantly, linkedin]
x_houston:
created_by: houston
skill_schema: 1
---
# LinkedIn Comment to Outreach
End-to-end orchestrator: LinkedIn post URL in, paused Instantly campaign out. I chain the five sub-skills with a checkpoint between each phase so you stay in control while the heavy lifting happens automatically.
Use this for **commenters** (higher intent, lower volume). For reactors (5-10x more leads, full LinkedIn profiles attached), use `linkedin-reaction-to-outreach` instead.
## When to use
- "Run the LinkedIn pipeline on this post: <URL>".
- "Scrape and email these commenters".
- "Outreach from this LinkedIn post".
- A speaker / competitor / thought-leader posted something that hits your ideal customer profile dead center, and you want to reach every qualified commenter in one motion.
## When NOT to use
- Targeting people who **reacted** to a post - use `linkedin-reaction-to-outreach`. Reactors are 5-10x more numerous and come with richer profile data.
- Just need the commenter list, no outreach - use `linkedin-comment-scraper` directly.
- Just need to enrich an existing list - use `apollo-enrichment` directly.
- Just need cold email copy without a lead source - use `cold-email-sequence` directly.
- Already have a verified list and copy ready - use `instantly-campaign` directly.
## Connections I need
I run external work through Composio. Before this skill runs I check that every category below is linked. Missing → I name the category, ask you to connect it from the Integrations tab, stop.
- **Apify** (scraping) - for the LinkedIn comment actor. Required.
- **Airtable** (database) - for the lead-tracking table. Required.
- **Apollo** (enrichment) - for verified emails + company / title / location. Required.
- **Instantly** (sending platform) - for campaign creation and lead loading. Required.
If any of the four are missing I stop on the first missing one and ask you to connect it. The pipeline does not partially run.
## Information I need
I read your outbound context first. For every required field that's missing I ask ONE plain-language question (best modality: connected app > URL > paste) and wait.
- **The LinkedIn post URL** - Required. Why: it's the input to phase 1. If missing I ask: "Which LinkedIn post should I scrape commenters from?"
- **An Airtable base** - Required. Why: phase 2 creates a new table inside one of your existing bases. If missing I ask: "Which Airtable base should I create the lead table in? I can list the ones you have."
- **Your sender first name + product one-liner + at least one social proof point with real numbers** - Required for phase 4. Why: I write the cold emails in your voice; without a real proof point with real numbers I'd be making things up, and that's a fast way to burn the campaign. If missing I ask in phase 4 (not now), so the first three phases can run in the background.
- **Instantly sending accounts** - Optional. Why: defaults to attaching every connected sending account. If you want only specific ones, tell me upfront.
## The pipeline
```
LinkedIn Post URL
|
v
[1. linkedin-comment-scraper] Apify scrape, dedupe by profile URL
|
v
[2. airtable-lead-loader] Create table, batch load with parallel agents
|
v
[3. apollo-enrichment] Bulk match emails (batches of 10), update Airtable, create Apollo contacts
|
v
[4. cold-email-sequence] Co-write 3 emails with you, one at a time, James Shields framework
|
v
[5. instantly-campaign] Create campaign, sanitize bodies, load leads, attach accounts - PAUSED
|
v
Paused campaign ready for your review
```
## Steps
<!-- houston-workflow:v1 -->
1. **Validate inputs.** Check the URL is a LinkedIn post (not a profile, not an article), confirm the four Composio connections, read `config/context-ledger.json`. Mint a `runId` of the form `{YYYY-MM-DD}-{post-slug}` and create `runs/{runId}/notes.md` for the per-run journal.
2. **Phase 1 - Scrape commenters.** Call `linkedin-comment-scraper` with the post URL. Result lands at `runs/{runId}/scrape.json`. Append summary to `runs/{runId}/notes.md`.
**Checkpoint.** Tell the user: "Scraped {N} unique commenters from {author}'s post. Moving on to Airtable."
3. **Phase 2 - Load to Airtable.** Call `airtable-lead-loader` with `runs/{runId}/scrape.json` and the chosen base ID. The table name is `LinkedIn Commenters - {author} - {YYYY-MM-DD}`. Append summary to `runs/{runId}/notes.md` with the table ID and the load count.
**Checkpoint.** Tell the user: "Loaded {N} records into Airtable. Starting Apollo enrichment."
4. **Phase 3 - Enrich with Apollo.** Call `apollo-enrichment` with the Airtable base + table ID. Result: Airtable rows updated with email + company + title + location, and Apollo contacts created under label `LinkedIn Comments - {author} Post`. Re-fetch the rows that came back with a verified email and save to `runs/{runId}/contacts.json`. Append match-rate summary to `runs/{runId}/notes.md`.
**Checkpoint.** Tell the user: "Found emails for {M} of {N} commenters ({M/N}% match rate). {M} contacts ready for outreach. Moving on to the email sequence."
5. **Phase 4 - Co-write the sequence.** Call `cold-email-sequence`. This is the **interactive phase** - I work with you one email at a time, locking each before moving to the next. Save to `sequences/{runId}-sequence.md`. Append the lock summary to `runs/{runId}/notes.md`.
**Checkpoint.** Tell the user: "Sequence locked. Loading into Instantly."
6. **Phase 5 - Create the Instantly campaign.** Call `instantly-campaign` with `sequences/{runId}-sequence.md` and `runs/{runId}/contacts.json`. The campaign name is `LinkedIn - {author} - {short topic}`. Always paused. Append the Instantly campaign ID and lead-load summary to `runs/{runId}/notes.md`. Append a row to `campaigns.json` with `status: "paused"`.
7. **Final summary.** One short block to the user:
- Campaign name + status (paused).
- Lead count loaded.
- Sending accounts attached.
- Schedule (Mon-Fri, 8-5 in your default timezone).
- "Review in Instantly. Activate when you're ready - I won't do it for you."
## Outputs
- `runs/{runId}/scrape.json` - deduped commenter list from phase 1.
- `runs/{runId}/contacts.json` - Apollo-enriched contacts with verified emails (drives the Instantly load).
- `runs/{runId}/notes.md` - per-run journal with checkpoints, counts, and decisions.
- `sequences/{runId}-sequence.md` - locked 3-email sequence.
- New Airtable table `LinkedIn Commenters - {author} - {date}` populated with the full lead-tracking schema.
- New Apollo contact label `LinkedIn Comments - {author} Post`.
- New Instantly campaign (paused) with all leads loaded and all sending accounts attached.
- `outputs.json` - one row per phase artifact (scrape, airtable-load, enrichment, sequence, campaign).
- `leads.json` - one row per surviving lead (deduped on `profileUrl` across runs).
- `campaigns.json` - one row for the new paused campaign.
## What I never do
- **Launch the campaign.** Always paused at the end of phase 5. You hit Activate.
- **Skip the per-email lock in phase 4.** Each email is reviewed and approved by you before I move to the next. No batch-write of all 3.
- **Push leads without a verified email into Instantly.** Apollo "no match" rows stay in Airtable for you to decide what to do with later.
- **Resume a partially-failed run by guessing.** If phase 3 fails halfway, I stop and tell you exactly which Airtable rows are enriched and which aren't, so you can decide whether to re-run from there or start fresh.
- **Hardcode Apify actor IDs, Airtable base IDs, Apollo labels, or Instantly campaign IDs.** All discovered via Composio at runtime.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!