Skip to content
Sales
Skill

/playbook-ad-library

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

BOOST
From plugin
coldoutboundskills
76452 skills
Install
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-ad-library --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/playbook-ad-library

Context 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

SKILL.md

playbook-ad-library.SKILL.md
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>."

Playbook: Meta Ad Library

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

1. Trigger and scope

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:

  • **It never reports a raw ad count to a prospect.** Meta's `totalCount` counts collated

duplicates and overstates reality — one brand showed 950 for what was really about three creatives.

  • **It never guesses.** When a page cannot be verified, the row abstains with an empty string

rather than shipping a plausible-looking wrong page.

2. Output contract

Inputs required per row

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

Output fields

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

Coverage expectation

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.**

Copy-fit rules

  • Slots into: `Noticed {{ad_library_line}}.`
  • First character lowercase, no trailing punctuation.
  • **Never begins with "noticed", "saw", or "seeing"**, or the sentence stutters.
  • No quotation marks, no raw ad counts, no em or en dashes.
  • 5th-grade reading level, 16 words target, 20 words hard cap.
  • The word "angle" is banned. Name the offer or the product instead.

Downstream gate

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.

3. Source chain (cost-tagged)

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

Read more
Ships withcoldoutboundskills

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.

Get the whole plugin
Stats
766
Stars
269
Forks
Active
Maintenance
TypeScript
Language
MIT
License
9d ago
Last commit
7mo ago
Created
5h ago
Added

Repo: growthenginenowoslawski/coldoutboundskills

Other skills on coldoutboundskills.