auto-research-public
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Produces a line about what a company is currently advertising on Facebook and Instagram, from the Meta Ad Library. Triggers on "are they running ads", "what are they advertising", "meta ad library", "facebook ads", "pull their ad copy", "who is spending on paid social". Outputs
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-ad-library --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/playbook-ad-libraryContext preview
The summary Claude sees to decide when to auto-load this skill.
Produces a line about what a company is currently advertising on Facebook and Instagram, from the Meta Ad Library. Triggers on "are they running ads", "what are they advertising", "meta ad library", "facebook ads", "pull their ad copy", "who is spending on paid social". Outputs
name: playbook-ad-library description: Produces a line about what a company is currently advertising on Facebook and Instagram, from the Meta Ad Library. Triggers on "are they running ads", "what are they advertising", "meta ad library", "facebook ads", "pull their ad copy", "who is spending on paid social". Outputs ad_library_line, a lowercase clause that completes "Noticed <line>."
> 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:** the angle depends on the prospect spending money on paid social right now — creative agencies, UGC shops, CRO and landing-page services, media buyers, attribution and analytics tools, or anyone selling to ecommerce brands that already advertise.
**Do not use when:** you only need to know a company exists or sells online (`playbook-tech-on-website`), or you want LinkedIn organic activity (`playbook-linkedin-engagement`). Facebook and Instagram only — not Google Ads, not TikTok, not LinkedIn ads.
**One-line output:** `ad_library_line = "you are using ai to run outbound campaigns with one command"`
One question per row: **is this company running ads on Meta right now, and what is the ad actually about.**
**The hard part is not the ad library. It is the input.** The Meta Ad Library is keyed to a Facebook **Page**; your lists are keyed to a **company domain**. Nothing maps one to the other for free. So most of this playbook is a discovery chain that turns a domain into a *verified* Facebook Page URL, plus the gates that stop that chain from returning the wrong company's page. Ungated, it confidently returned **a golfer's page for `ridge.com`** and **a pottery studio for `clay.com`**.
Two things it deliberately does not do:
duplicates and overstates reality — one brand showed 950 for what was really about three creatives.
rather than shipping a plausible-looking wrong page.
| Field | Type | Source | Required? | |---|---|---|---| | `domain` (bare, lowercase, no `www`, no scheme) | string | your list | yes | | `company_name` (cleaned) | string | your list, cleaned by `playbook-company-name-cleaning` | yes — step 2 searches on it | | `fb_page_url` | string | this playbook produces it; pass it in to skip to step 4 | no |
| Field | Type | Example | Max | Null? | |---|---|---|---|---| | `ad_library_line` | string | `you are using ai to run outbound campaigns with one command` | 20 words / ~120 chars | no, use `""` | | `ad_theme` | string | `ai outbound automation` | 4 words | no, use `""` | | `active_ad_count` | integer | `33` | n/a | no, use `0` | | `fb_page_url` | string | `https://www.facebook.com/smartleadai` | 120 chars | no, use `""` | | `evidence_ad_id` | string | `26618345894517042` | 32 chars | no, use `""` | | `ad_confidence` | enum | `high` or `low` | n/a | no |
⚠️ **Name mapping.** The model returns the JSON key `confidence`; the output field is `ad_confidence`. The rename happens in the parse step, **not in the prompt** — the prompt is evidence-locked and its key names must not drift.
**Abstain value:** `""` for every string, `0` for the count. Never "null", never "N/A", never a guessed page.
6/8 rows usable (75%) on the graded re-run: **8/8** on page discovery, **6/6** on the ad fetch with zero vendor errors, **5/6** on the line writer.
**Read the split, not the headline.** Of the 5 pages that actually carried ads, 3 produced a shippable line, 1 was blanked by the spam-word gate, and 1 correctly abstained. A prompt that abstained on everything would still score 3/8 on this rubric and be worthless, so **track the positive-line rate on ad-bearing pages separately.**
Expect roughly **half** of a cold list to end with an empty line, mostly because no Facebook page can be verified. Treat the variable as **spintax-optional, never mandatory.**
If empty: drop the clause through spintax and **keep the row**. "Not currently advertising" is usually a targeting question for the strategist, not a disqualification. The exception: if the campaign's whole premise is "you are running ads", decide up front whether empty rows route to a different campaign variant.
| # | Source | Cost | Call | Hit rate | Stop rule | |---|---|---|---|---|---| | 0 | **Cache** (45 days, keyed on bare domain) | FREE | lookup before anything else | depends on list overlap | **ALWAYS first.** Every paid step is gated on a cache miss | | 1 | Company website HTML | FREE | `GET https://{domain}/`, then `/contact`, `/about`, browser UA, follow redirects. Un-escape `\/` to `/`, then regex for a `facebook.com/<slug>` link | **38%** measured | always run, it costs nothing | | 2 | SERP search | CHEAP | `site:facebook.com "{Company Name}"`, limit 10, then **three gates** | 40% of step-1 misses | only if step 1 found nothing | | 3 | JS-rendering proxy | METERED | render the homepage, same regex as step 1 | 1/1 measured | **only** if step 1 returned HTTP 403 or 429 AND step 2 found nothing. Never for a plain "no link on the page" miss | | 4 | **Apify Meta Ad Library** | METERED ($4.20/1k pages) | actor `apify/facebook-ads-scraper`, input `{"startUrls":[{"url":"<fb_page_url>"}],"onlyTotal":true,"activeStatus":"ac
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…