Ads Plan & SOP
How CMG runs paid social for every agency client: one account structure, one eight-step loop, one set of pass / fail rules. Variation by client is expected; variation by pod is a smell.
The loop at a glance
Every ad runs the same loop, from the goal to the pass / fail call. Winners scale, near-misses get one new hook, losers die with a one-line reason — and the loop restarts.
The 8-step process
The 20% of process that drives 80% of results. Each step has one owner and one exit criterion — if the exit isn’t met, the ad doesn’t move forward.
Every ad starts with a one-line reason to exist: the business outcome, the ad set it runs in (Prospect / Retarget / Scale & test), and the one metric that decides pass or fail, with its target. Set the test budget (3× target CPA) and the earliest decision date — never before 7 days. If we can’t name the number it has to move, it doesn’t get briefed.
Exit: one-line goal, ad set, KPI with target, test budget.
One angle, one hook idea, one product set — written so a designer or editor can start without a call. Check products against live inventory so we never advertise what the client can’t ship. Name the ad now using the naming convention below; the name follows it from brief to file to platform to report.
Exit: a complete brief with the ad name assigned.
Build the deliverables against the brief: static 1080×1080 master plus 4:5 and 9:16 crops, video 6–30s with the hook in the first 3 seconds and captions burned in, carousel 3–5 cards, copy doc with landing URL + UTMs. One variable per version so the review can learn something. Export with the ad name as the filename.
Exit: final files named, QA’d, and attached to the brief.
Build the ad in the right campaign and ad set with the copy, CTA, and URL — and leave it paused. Settings check: text enhancements off, catalog items off for creative ads, placements per plan, pixel and the correct Page / IG account selected. Confirm back with the ad ID and preview link.
Exit: ad built and paused, with ad ID + preview link.
The client sees the ad exactly as it will run, in every placement, before anything spends. They check product and price accuracy, brand voice, the landing page, and anything legal. Changes requested go back to Produce as the next version; approval is recorded in writing.
Exit: written approval, or a change list and a new version.
Set the ad live at the planned budget and date. Make edits at midnight local so the day’s data stays clean. Put the review date on the calendar: go-live + 7 days.
Exit: ad live, review date on the calendar.
One read per ad at the review date, scored against the brief’s KPI. Never score before 7 days and 3× the target CPA is spent — early strong numbers are usually noise. Leading signals: hook rate > 25%, hold rate > 25%, CTR > 1.5%. Deciding metric: CPA at or below target for 3+ days.
Exit: the numbers written down and a call: scale, iterate, or kill.
Winners duplicate into the scaling ad set (keep existing reactions, comments, and shares) and budget climbs 15–20% every 3 days — never more than 20% in one edit. Near-misses get a new hook only, body unchanged, and re-enter at Produce as v+1. Losers pause with a one-line reason; an angle that fails twice is retired. The next brief starts at step 1 with what we learned.
Exit: a winner scaling, a v+1 back in testing, or a kill with a reason. The loop restarts.
Pass / fail calls
The same three calls for every client. The floor is the floor: never graduate or kill before 7 days and 3× the target CPA is spent.
| Call | When | Action |
|---|---|---|
| Scale Ad | 7+ days and 3× target CPA spent; hook rate > 25% and hold > 25% (or CTR > 1.5% on static); CPA at or below target for 3+ days; frequency stable | Duplicate into the scaling ad set, keep social proof. Raise that ad set’s budget 15–20% every 3 days, edits at midnight local. |
| Iterate Ad Creative | Between 1× and 2× target CPA; CTR acceptable but hook or hold under 25% | Change the hook only (first 3 seconds), keep the body identical. One variable. Re-enter as v+1 and re-review after 7 days. |
| Kill Ad | 3× target CPA spent; hook < 25% and CTR < 1.5% | Pause the ad, log one line on why. Retire the angle if it has failed twice. |
Kill an ad if it spends 2× target CPA without a sale, or if hook rate falls below 15% after 2K impressions. Discipline beats hope.
The 3-ad-set framework
Every CMG client account on Meta runs on three foundational ad sets. They have different jobs, different KPIs, and different success criteria. Don’t blur them.
Audience
- Broad · minimal exclusions
- Lookalikes off purchasers (1–3%)
- Interest stack if seed audience <100K
Creative
- UGC-style hooks
- Problem → product framing
- 5–10 variants in rotation
Budget
- 50–60% of total spend
- CBO with min budgets to protect learning
KPIs
- New-customer ROAS
- CPA vs LTV ceiling
- Spend velocity
Audience
- Site visitors 30d
- Engaged shoppers 90d
- Cart abandoners (exclude purchasers 30d)
Creative
- Social proof · reviews
- Limited-time offer angle
- Founder voice / brand POV
Budget
- 15–25% of total spend
- Frequency cap 3 per 7d
KPIs
- Blended ROAS
- Frequency / fatigue signals
- Cart recovery rate
Audience
- Broad · same as Prospect
- Per-creative ad sets when testing
Creative
- New concepts every 2 weeks
- Partnership / Spark Ads from creators
- 3–5 hook variants per concept
Budget
- 20–30% of total spend
- Promote winners to Prospect within 7–14d
KPIs
- Hook-rate (3s view-through)
- CTR · CVR
- Cost per result · promotion velocity
Budget split · $30K/month example
Default split for an account spending ~$30K/month. Adjust by season, runway, and what’s working.
| Ad set | % of spend | Monthly | Daily | Target KPI |
|---|---|---|---|---|
| 01 · Prospect | 55% | $16,500 | $550 | New-customer ROAS > 2.0 |
| 02 · Retarget | 20% | $6,000 | $200 | Blended ROAS > 4.0 |
| 03 · Scale & test | 25% | $7,500 | $250 | Hook-rate > 25% · new winner / month |
| Total | 100% | $30,000 | $1,000 | Blended ROAS > 2.5 |
Creative testing matrix
Every test should answer one question. Don’t change two variables at once.
| Variable | Test cadence | How we test |
|---|---|---|
| Hook (first 3s) | Every cycle | 3–5 hook variants over same body. Kill at 1K imps if hook-rate < benchmark. |
| Format (static / UGC / motion) | Every 2 weeks | Same offer, three formats. Hold audience constant. |
| Offer / promotion | Quarterly | A vs B offer at parity creative. 7-day flight. |
| Audience | Monthly | One new audience at a time. Hold creative constant. |
| Landing page | Quarterly | Coordinate with AI Developer for split test infrastructure. |
Ad naming convention
Naming is non-negotiable. Bad naming makes reporting impossible and audits painful. One name follows the ad from the brief to the file to the platform to the weekly report.
CMG X [BRAND]_[SET]_[CONCEPT]_[FORMAT]_[HOOK]_[v##]
Example: CMG X VITACLAY_PROSPECT_PROBLEMSOLUTION_UGC_QUICKCOOK_v03
- CMG X: fixed prefix on every ad — marks CMG-built work in shared ad accounts and makes our ads filterable in reporting.
- BRAND: client short code, all caps.
- SET: PROSPECT / RETARGET / SCALE.
- CONCEPT: the angle (PROBLEMSOLUTION, FOUNDERSTORY, SOCIALPROOF, etc.).
- FORMAT: UGC / STATIC / MOTION / CAROUSEL.
- HOOK: short slug for the opener.
- v##: version — increment on every edit.
Reporting hooks
The ads plan feeds straight into the weekly report — see Reporting & Cadence. Pull these numbers every Friday.
- Spend by ad set (Prospect / Retarget / Scale)
- Top 3 winning creatives by ROAS, with thumbnails
- Top 3 losing creatives killed this week
- Hook-rate distribution across the test ad set
- Net-new customers vs returning customers
- Frequency / fatigue check on Retarget