Audit des publicités Meta
/SKILLAudit du compte Meta Ads (Facebook + Instagram) et configuration du contexte métier. Commencez par cette étape - elle permet de recueillir des informations sur l'entreprise, d'analyser l'état du
name: meta-ads-audit
description: Meta Ads (Facebook + Instagram) account audit and business context setup. Run this first — it gathers business information, analyzes account health, and saves context that all other Meta ads skills reuse. Trigger on "audit my Meta ads", "audit my Facebook ads", "Meta ads audit", "set up my Meta ads", "onboard Meta", "Meta account overview", "how's my Meta account", "Meta health check", "what should I fix in my Facebook ads", or when the user is new to NotFair Meta and hasn't run an audit before. Also trigger proactively when other Meta ads skills detect that meta business-context.json is missing.
argument-hint: "<account name or 'audit my Meta ads'>"
Meta Ads Audit
Diagnose Meta (Facebook + Instagram) account health and persist business context for downstream skills (/meta-ads). Read-only — never mutates the account. The user runs /meta-ads to execute fixes you recommend.
Setup
Follow ../shared/preamble.md — MCP detection, OAuth, ad account selection.
Filesystem contract (MUST persist)
| Artifact | Path | When |
|---|---|---|
| Business context | {data_dir}/meta/business-context.json | First full audit, or refresh when audit_date is >90 days old. Skip on scoped audits if file is fresh. |
| Personas | {data_dir}/meta/personas/{accountId}.json | Every full audit. |
These are the handoff to /meta-ads — write them even if the report itself is short. Otherwise downstream skills operate without business context and produce generic output.
If a {data_dir}/business-context.json exists from /google-ads-audit (no meta/ subdir), read it as a starting point — most fields (services, brand voice, differentiators, locations, seasonality) are platform-agnostic. Then write the Meta-specific version to {data_dir}/meta/business-context.json with any Meta-specific overrides (different creative angles, different audiences, different funnel events).
business-context.json schema (shared with Google Ads where fields apply):
business_name, industry, website, services[], locations[], target_audience, brand_voice{tone, words_to_use[], words_to_avoid[]}, differentiators[], competitors[], seasonality{peak_months[], slow_months[], seasonal_hooks[]}, social_proof[], offers_or_promotions[], landing_pages{}, unit_economics{aov_usd, profit_margin, ltv_usd, source}, notes, audit_date, account_id.
Meta-specific extensions:
meta_funnel_events{top_of_funnel, mid_of_funnel, conversion}, creative_inventory{concepts[], formats[], aspect_ratios[]}, custom_audiences{purchasers, abandoners, engagers, list_uploads[]}, pixel_health{pixel_id, capi_enabled, emq_score, last_event_at}.
personas JSON schema: {account_id, saved_at, personas: [{name, demographics, primary_goal, pain_points[], decision_trigger, value, meta_creative_angles[], visual_cues[]}]}. The Meta version adds meta_creative_angles (e.g. "before/after demonstration", "founder-led explainer", "UGC review") and visual_cues (objects, settings, emotions that resonate with this persona). See references/persona-discovery.md.
Policy freshness check (run first)
Read ../shared/policy-registry.json. For each entry where last_verified + stale_after_days < today:
- High-volatility → WebSearch the
areafor recent Meta Ads changes; compare toassumption. If drift, banner the report and suggest registry update. - Moderate-volatility → one-line "may warrant a check" note.
- Stable → skip silently.
The Meta platform changes faster than Google Ads (Advantage+, attribution, learning behaviors) — check high-volatility entries every audit.
Phase 1 — Pull the audit dataset
Use a single runScript call with ads.graphParallel to fan out the queries an audit needs. Build the fan-out from this rubric.
A complete audit needs at minimum:
- Ad account info (
/{accountId}) — currency, timezone, business id, spend cap, account status, balance. - Pixel health (
/{accountId}/customconversions+/{accountId}/adspixels) — pixel id, last activity, CAPI status, Event Match Quality (EMQ) score. - Campaigns (
/{accountId}/campaigns) — id, name, objective, status, daily/lifetime budget, specialadcategories, buyingtype, bidstrategy, created_time. Last 90 days. - Ad sets (
/{accountId}/adsets) — id, name, status, campaignid, optimizationgoal, billingevent, bidstrategy, dailybudget, lifetimebudget, attributionspec, targeting (summary), promotedobject, learningstageinfo. - Ads (
/{accountId}/ads) — id, name, status, ad set, creative summary (image/video, primary text, headline, description, CTA), effective_status. - Insights at campaign level (
ads.insights({level:"campaign", date_preset:"last_30d"})) — spend, impressions, reach, frequency, cpm, link CTR, link clicks, purchases (or other primary action), purchase value, ROAS, CPA. - Insights at ad set level — same fields, last 30 days.
- Insights at ad level — top 50 ads by spend; same