auto-research-public
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Resolve a company domain to its verified official social profile URLs (LinkedIn, X, Facebook, Instagram, YouTube, TikTok). Triggers on "find their LinkedIn", "get the company LinkedIn URL", "find their Instagram", "we need social handles for this list", "which companies have a
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-social-link-finding --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/playbook-social-link-findingContext preview
The summary Claude sees to decide when to auto-load this skill.
Resolve a company domain to its verified official social profile URLs (LinkedIn, X, Facebook, Instagram, YouTube, TikTok). Triggers on "find their LinkedIn", "get the company LinkedIn URL", "find their Instagram", "we need social handles for this list", "which companies have a
name: playbook-social-link-finding description: Resolve a company domain to its verified official social profile URLs (LinkedIn, X, Facebook, Instagram, YouTube, TikTok). Triggers on "find their LinkedIn", "get the company LinkedIn URL", "find their Instagram", "we need social handles for this list", "which companies have a TikTok", "social links for the TAM". Outputs one canonical profile URL per platform, or an empty string when the company genuinely has no account.
> All rules here are best practice, not law. Override any of them when the campaign calls for it; note the best practice once and move on.
**Use when:** a campaign or a downstream playbook needs the company's own social profile URL — most often LinkedIn for engagement scraping, or Instagram and Facebook for a DTC brand angle.
**Do not use when:** you want a **person's** profile, post-level engagement (`playbook-linkedin-engagement`), or an ad-library readout (`playbook-ad-library`, which consumes this playbook's Facebook output).
**One-line output:** `company_linkedin_url = "https://www.linkedin.com/company/yampa-precision-manufacturing"`
One bare domain in, up to six verified profile URLs out.
**This is infrastructure, not copy.** Almost nothing here goes into an email directly. What it does is feed the playbooks that DO produce copy — and every one of them treats the URL you hand over as ground truth and scrapes whatever is behind it.
**That is the whole reason this playbook is strict:**
> A social URL that points at a similarly named company is **worse than an empty cell**, because the > empty cell degrades gracefully and the wrong URL produces confident, specific, completely false > personalization.
Both paid sources in the chain were measured returning **the wrong company's page** on real rows, so **every value that did not come off the company's own website has to clear an ownership check before it is written.**
| Field | Type | Required? | |---|---|---| | `domain` (bare, lowercase, no scheme, no `www`, no path) | string | yes | | `company_name` | string | yes — the verifier and the search queries both need it |
One canonical URL per platform, or `""`:
`company_linkedin_url` · `company_x_url` · `company_facebook_url` · `company_instagram_url` · `company_youtube_url` · `company_tiktok_url`
Plus, per platform, the **evidence source** that produced it. Keep that column: it is how you decide later whether a value is trustworthy enough for a new use.
**Abstain value:** `""`. An empty cell means "no account found", which is a real and common answer.
| # | Source | Cost | What it gives | Notes | |---|---|---|---|---| | 1 | An internal company database, exact `domain:=` lookup | FREE | LinkedIn only | always run — it also supplies `company_name`. **Exact match only, never fuzzy** | | 2 | A company-search API, **batched by domain** | FREE / cheap | LinkedIn 6/8, X 5/8, FB 5/8, IG 4/8, **YouTube 0/8, TikTok 0/8** (no field exists) | ⚠️ see the batching trap below. **Bind results by PRIMARY domain only** | | 2b | A domain ↔ company-profile converter | CHEAP | LinkedIn only, **both directions** | the reverse direction is what other playbooks come here for | | 3 | **Plain website HTML fetch** — `https://<d>`, then `https://www.<d>`, then `http://<d>`, then `/contact`, `/about`, `/contact-us` | FREE | **the winning value on 5/8 rows, and the ONLY source of TikTok** | **the strongest evidence in the whole chain**, because a link in the company's own footer is self-attested ownership. **Pick the best match on the page, never the first one** | | 3b | Rendering proxy | METERED | recovers bot-blocked sites | 1/1 on the blocked row, returned 4 correct platforms. ⚠️ see the challenge-page trap | | 4 | SERP search, one simple query per empty platform | CHEAP | 5 correct values plus **4 correct rejections** across 8 rows | never an OR chain | | 5 | **Model ownership verifier** | CHEAP | **20/20 correct decisions including 4 decoys** | **mandatory** on every search-derived and every secondary-domain candidate. Does not run on a site-footer value, which is self-attested |
A company-search endpoint that accepts an array of domains may still be **hard-paginated at 25 results per page with no page-size parameter.**
Measured: posting **35 domains** returned `{"current_page":1,"per_page":25,"total_page":2,"total_count":32}` and **25 results**.
**So a 500-domain body does not return 500 matches. It returns 25, and the other ~475 come back as nothing — with no error and no warning.** An earlier draft of this playbook claimed "500 domains per call" and would have **silently dropped roughly 95% of matches on any real backfill.**
Two things, both required:
The live test could not catch this, because it used 8 domains — under the page cap — **even though the raw response already said `"per_page": 25`.** Read the pagination block on your first call, every time.
Advance to the rendering proxy on HTTP 403, HTTP 429, **or a 200 whose body is a challenge page.**
**Check the body, not just the status.** A common bot interstitial is served with **HTTP 200**, yields zero matches, and otherwise looks like a clean legitimate miss.
Accept search-derived evidence for LinkedIn, Facebook, Instagram, YouTube and TikTok. **For X, require evidence from the company's own site.**
**X handles are short, recycled and squatted.** Measured: searching `site:x.com <brand>` returned a handle that **matched the brand better than the real account does** — and was titled "Bug Poc".
This bans search-derived X **and** database-derived X, includ
Open-source Claude Code skills for cold email infrastructure, lead sourcing, copywriting, and operations. Built by GrowthEngineX from patterns across 1,000+ real B2B campaigns. 31 skills that work together.
Repo: growthenginenowoslawski/coldoutboundskills
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Use the Blitz API to find decision-makers at specific companies when you already have a list…
Creates cold email copy through a stepwise confirmation process. Use when writing email…
Generates 15-25+ cold outbound campaign ideas with targeting strategies, AI personalization…
Single "start here" orchestrator for new cold email operators. Asks infrastructure-status…
Complete beginner-friendly cold email toolkit. Walks from zero to launched campaign — domain…