$npx -y skills add gooseworks-ai/goose-skills --skill meta-ad-policy-checkerPre-flight policy check for Meta ads. Takes ad copy plus advertiser context, resolves and fetches the relevant Meta transparency-center policy pages at runtime, and returns a Pass / Fix Required / Block verdict with cited findings and rewrites.
| 1 | # Meta Ad Policy Checker |
| 2 | |
| 3 | Meta disapproves ads for policy reasons constantly, and most disapprovals are preventable. The pattern is almost always the same: an advertiser (or an AI agent generating variants) writes copy that uses a phrase or implies a claim that violates Meta's published advertising standards. The fix is cheap if you catch it before submission, expensive if you don't — repeated disapprovals on the same account can throttle delivery or trigger account-level restrictions. |
| 4 | |
| 5 | This skill is a pre-flight check. It reads ad copy, figures out which Meta policies apply, fetches the live policy text from Meta's transparency center, and returns a clear verdict with specific findings, citations, and rewrites. It does not hardcode policy rules — Meta updates those, and a static rule list goes stale. Instead, the skill uses Meta's own canonical policy pages as ground truth on every run. |
| 6 | |
| 7 | **Core principle:** The skill provides the methodology — what to check, how to reason, what severity to assign. Meta provides the source of truth — the actual policy text. This separation is what keeps the skill correct as Meta's standards evolve. |
| 8 | |
| 9 | ## When to Use |
| 10 | |
| 11 | - Before launching any new Meta ad |
| 12 | - After generating ad copy variants (call this on each variant before showing or submitting) |
| 13 | - When auditing an existing live ad for policy risk |
| 14 | - When troubleshooting a recently disapproved ad |
| 15 | - Before pushing copy through any Meta MCP / API write tool |
| 16 | |
| 17 | ## Phase 0: Intake |
| 18 | |
| 19 | 1. **Advertiser context** *(1–2 sentences)* |
| 20 | - What the business does |
| 21 | - What product / service / offer is being advertised |
| 22 | - Primary conversion goal |
| 23 | 2. **Ad asset(s)** |
| 24 | - Headline(s) |
| 25 | - Primary text / body |
| 26 | - Description (if applicable) |
| 27 | - CTA button text |
| 28 | - Destination URL *(optional — enables a landing-page cross-check)* |
| 29 | 3. **Special Ad Category** — declared by user: `None` / `Employment` / `Credit` / `Housing` / `Social Issues, Elections or Politics` *(this changes the applicable rules significantly)* |
| 30 | 4. **Targeting summary** *(optional)* — useful for discrimination checks (age, gender, location exclusions) |
| 31 | 5. **Visual description** *(optional)* — text-in-image is policy-relevant |
| 32 | 6. **Mode** — `pre-flight` (block until clean) or `audit` (flag-only, used for already-live ads) |
| 33 | |
| 34 | ## Phase 1: Determine Which Policies Apply |
| 35 | |
| 36 | Reason about the ad before fetching. Most ads need 3–6 policy pages, not all 25. Always include the **baseline set**, then add **content-driven** pages based on what the ad mentions, then add **category-driven** pages based on declared Special Ad Category. |
| 37 | |
| 38 | Treat the entries below as policy lookup keys, not URL slugs. Meta's Transparency Center URLs are nested under category paths and change over time, so never construct a flat policy URL directly from these labels. |
| 39 | |
| 40 | ### Baseline (every ad) |
| 41 | - Community Standards |
| 42 | - Personal Attributes |
| 43 | - Sensational Content |
| 44 | - Misinformation |
| 45 | - Engagement Bait / Spam |
| 46 | - Grammar & Profanity |
| 47 | - Non-Functional Landing Pages |
| 48 | |
| 49 | ### Content-driven (add when present) |
| 50 | |
| 51 | | Triggers | Policy lookup keys | |
| 52 | |---|---| |
| 53 | | Income, earnings, payouts, "make money", specific dollar amounts | Personal financial requirements; unrealistic outcomes | |
| 54 | | Health, weight loss, supplements, wellness claims | Health and wellness; before-and-after photos | |
| 55 | | Targeting by age, gender, race, religion, nationality | Discriminatory practices | |
| 56 | | Crypto, weapons, adult, drugs, alcohol, gambling, tobacco | Restricted content | |
| 57 | | Political, social-issue, election content | Social issues, elections or politics | |
| 58 | | Profanity, slurs, sensitive language | Profanity; inflammatory content | |
| 59 | | Anything that implies tracking / scraping / circumvention | Circumventing systems | |
| 60 | |
| 61 | ### Category-driven (add based on declared Special Ad Category) |
| 62 | |
| 63 | | Special Ad Category | Add | |
| 64 | |---|---| |
| 65 | | Employment | Employment | |
| 66 | | Credit | Credit | |
| 67 | | Housing | Housing | |
| 68 | | Social Issues, Elections or Politics | Social issues, elections or politics | |
| 69 | |
| 70 | Output of Phase 1: an ordered list of policy lookup keys to resolve and fetch in Phase 2. |
| 71 | |
| 72 | ## Phase 2: Fetch + Cache Live Policy Text |
| 73 | |
| 74 | Fetch Meta's ad-standards index first: |
| 75 | |
| 76 | ``` |
| 77 | https://transparency.meta.com/policies/ad-standards/ |
| 78 | ``` |
| 79 | |
| 80 | For each lookup key from Phase 1: |
| 81 | |
| 82 | 1. Resolve it from the index to Meta's canonical policy page URL. Prefer exact title matches, then closest title / category matches. |
| 83 | 2. Fetch the resolved canonical URL. Do not build a URL by appending the lookup key directly to the ad-standards base path; those flat URLs 404 for many current policies because Meta nests policy pages under category paths. |
| 84 | 3. Cache the lookup key → canonical URL → page text mapping. |
| 85 | |
| 86 | **Caching rule:** in-memory for th |