Pre‑launch preflight for new ads and campaigns — verifies tracking (UTMs, pixel, events), naming conventions, placement coverage, creative specs, and…
Runs before a campaign or ad goes live. A checklist pass returns green to launch, yellow (launch but fix within 24h), or red (block launch). Every item is machine‑checkable — no human judgment required. The goal is to catch the silent failures that waste the first 48h of budget: a broken pixel, a 404 landing page, a Reels ad uploaded at 1.78:1.
| Check | Severity |
| :------------------------------ | :------------- |
| Pixel fires on landing page | 🔴 Block |
| Conversion API server event OK | 🔴 Block |
| Conversion event mapped correctly (Purchase / Lead / etc.) | 🔴 Block |
| All UTM params present (`source`, `medium`, `campaign`) | 🟡 Warning |
| `utm_content` unique per ad (no cross‑ad collision) | 🟡 Warning |
| Pixel test event received in last 24h | 🟡 Warning |
| Check | Severity |
| :--------------------------------------------------------------------------------- | :--------- |
| Campaign name follows convention (e.g. `[Brand]_[Objective]_[Audience]_[Date]`) | 🟡 Warning |
| Ad set name includes audience identifier | 🟡 Warning |
| Ad name is unique within the ad set | 🟡 Warning |
| No `test`, `tmp`, `copy` in production names | ℹ️ Info |
| Check | Severity |
| :------------------------------------------------------------------- | :--------- |
| Selected placements match campaign objective | 🔴 Block |
| Creative asset exists for every selected placement aspect ratio | 🔴 Block |
| No placement‑blocklist violations (e.g. Audience Network off for B2B)| 🟡 Warning |
| Check | Severity |
| :------------------------------------------------------ | :--------- |
| Image/video dimensions match placement spec | 🔴 Block |
| Video duration within platform limits | 🔴 Block |
| File size under platform cap | 🔴 Block |
| Safe‑zone respected (no critical text in crop zone) | 🟡 Warning |
| Logo/brand visible in first frame or top‑third | ℹ️ Info |
| Check | Severity |
| :------------------------------------------------------------------ | :--------- |
| LP URL reachable (no 404/5xx) | 🔴 Block |
| LP loads in < 3s on 4G | 🟡 Warning |
| LP headline reinforces ad promise (offer, price, audience) | 🟡 Warning |
| LP has a visible CTA matching the ad's conversion event | 🟡 Warning |
| LP is mobile‑responsive | 🟡 Warning |
| Severity | Meaning |
| :---------- | :---------------------------------------------------------------- |
| 🔴 Block | Launch must NOT proceed until resolved |
| 🟡 Warning | Launch allowed; item must be fixed within 24h of going live |
| ℹ️ Info | Advisory — worth reviewing, not required |
Overall status is the highest severity present: any 🔴 = BLOCK, any 🟡 = PROCEED WITH FIXES, otherwise GREEN.
Preflight —
Summer Launch — Traffic→ Ad SetLAL 1% PurchaseResult: 🔴 BLOCK — 2 blockers, 3 warnings, 1 info
🎯 Tracking & Attribution
- 🔴 Pixel
Purchaseevent not firing on test click to LP- 🟡
utm_contentmissing fromAD_554🏷 Naming
- ℹ️ Ad set name
LAL 1% Purchasemissing date suffix — convention is[Brand]_[Objective]_[Audience]_[Date]🎨 Creative Specs
- 🟡
AD_554aspect ratio 1.78:1 works for Feed, fails Reels spec (expected 9:16) — upload a 9:16 variant or exclude Reels🔗 Landing Page
- 🔴
https://example.com/summer-offerreturns 404- 🟡 Message match: ad promises "50% off" — LP headline reads "Welcome", no offer reinforced
Action: fix the 2 blockers (pixel, LP URL) before launch. Warnings have a 24h SLA after go‑live.
Beyond the pass/fail checks in §2, every preflight run must produce a UTM inventory listing every ad in the batch with its current destination URL and a proposed URL with standardized UTMs. This is a required transformation — the reviewer should be able to copy each Proposed URL straight back into the ad set.
| Parameter | Value source | Required |
| :-------------- | :-------------------------------------------------------------------- | :------- |
| `utm_source` | Ad platform — `meta` · `google` · `linkedin` · `tiktok` | ✅ |
| `utm_medium` | Channel type — `paid_social` · `paid_search` · `display` | ✅ |
| `utm_campaign` | Campaign name, slugified (lowercase, hyphens) | ✅ |
| `utm_content` | Per‑ad identifier — ad ID or ad‑name slug. **Must be unique per ad.** | ✅ |
| `utm_term` | Audience or keyword (required for Search, optional for Social) | ⚪ |
For every ad in the batch:
| Column | Content |
| :--------------- | :------------------------------------------------------------------------------------------------------ |
| **Ad** | Ad ID · Name |
| **Current URL** | Destination URL currently set on the ad (may be missing UTMs or have wrong values) |
| **Proposed URL** | Same destination + all required UTMs appended (existing UTMs replaced if misaligned) |
| **Delta** | What changed — `+all UTMs` · `utm_campaign fixed` · `utm_content collision resolved` · `no change` |
ref=, plan=) — append UTMs after them; don't strip them.utm_content, append a suffix (-v2, -v3) and note it in Delta.fbclid / gclid templates — platform‑injected at click time.- · strip punctuation · collapse repeat hyphens.UTM Inventory —
Summer Launch — Traffic· 3 ads| Ad | Current URL | Proposed URL | Delta | | :----------------------------- | :----------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------ | |
AD_554Notes App Hero |https://acme.com/summer-offer|https://acme.com/summer-offer?utm_source=meta&utm_medium=paid_social&utm_campaign=summer-launch&utm_content=ad-554-notes-app-hero| +all UTMs (were missing) | |AD_388Founder UGC Hook |https://acme.com/summer-offer?utm_content=ugc|https://acme.com/summer-offer?utm_source=meta&utm_medium=paid_social&utm_campaign=summer-launch&utm_content=ad-388-founder-ugc-hook| +source / medium / campaign ·utm_contentspecialized | |AD_412Founder UGC Hook v2 |https://acme.com/summer-offer?utm_content=ugc|https://acme.com/summer-offer?utm_source=meta&utm_medium=paid_social&utm_campaign=summer-launch&utm_content=ad-412-founder-ugc-hook-v2| collision resolved — was duplicatingAD_388's value |Action: copy each Proposed URL into its ad's destination field before launch.
Audits campaign, ad‑set, and ad names against a three‑level naming convention (Foundr / How To Run Facebook Ads style) and proposes standardized renames for…
View skill Launch & audit · FreeBulk-renames creative asset files (from Google Drive or similar) following a configurable naming convention. Inspects visual content + metadata of each file…
View skill Briefings · FreeMorning ad‑ops briefing that chains am‑i‑on‑track, whats‑running, bleeders‑winners, fatigue‑detector, and copy‑rotation into a single prioritized digest…
View skill