Playbooks · free template
Campaign Launch Kit Template
One fill-in document from brief to approved launch — nothing spends until sign-off.
Make it yours
Fill in your values.
Everything you enter below is substituted live into the template — copy or download it and the file is already yours. Skip anything you're not sure of; unfilled fields stay as {{PLACEHOLDER}} markers. Values save in your browser and carry across every template in the library.
The template
Your copy, ready to run.
The preview below updates as you type. Copy it to your clipboard or download it as campaign-launch-kit.md.
# CAMPAIGN LAUNCH KIT
Campaign: {{CAMPAIGN_NAME}} (internal campaign name — build it from the naming convention in Section 5, never freehand)
Owner: {{CAMPAIGN_OWNER}} (the one person accountable for this launch end to end)
Channel: {{CHANNEL}} (e.g. Google Search — duplicate this kit per channel rather than mixing channels in one)
Kit last edited: {{KIT_DATE}} (update every time this document changes)
Status: [ ] Draft [ ] Built [ ] QA passed [ ] Approved [ ] Live
**How to use this kit**
1. Fill Section 1 completely before building anything. A blank brief field is a blocker, not a note for later.
2. Set the guardrails in Section 2 before the campaign exists anywhere in the ad account.
3. Build Sections 3–5, verify Section 6, run Section 7.
4. Everything uploads PAUSED. Only the named approver in Section 8 enables spend.
5. Log every account-touching change in Section 10 as it happens, not after.
This document is the source of truth. If the account and the kit disagree, the launch stops until they match.
---
## 1. Campaign Brief
Every field is required. If a field cannot be filled, the campaign is not ready to build.
| Field | Entry |
|---|---|
| Goal (one sentence) | {{CAMPAIGN_GOAL}} (what this campaign exists to do, e.g. "generate demo requests for the Q3 offer") |
| Primary KPI | {{PRIMARY_KPI}} (the single number that defines success, and the system it is measured in) |
| Secondary KPI | {{SECONDARY_KPI}} (supporting signal — leading indicator or quality check) |
| Audience / ICP | {{AUDIENCE}} (who, in one or two sentences — role, segment, geography) |
| Offer | {{OFFER}} (the exact thing every ad promises: demo, guide, trial, discount) |
| Landing page(s) | {{LANDING_URL}} (final URL(s) — must be live before QA, not "will be live by launch") |
| Competitive angle | {{ANGLE}} (why someone picks this offer over the obvious alternative) |
| Daily budget cap | {{DAILY_CAP}} (a number you set and commit to — this is a placeholder, not a suggestion) |
| Total flight cap | {{TOTAL_CAP}} (the maximum this campaign may spend across the full flight) |
| Flight dates | {{START_DATE}} to {{END_DATE}} |
| Geo / language | {{GEO_LANGUAGE}} (targeted locations and languages, plus explicit location exclusions) |
| Exclusions | {{EXCLUSIONS}} (audiences, placements, topics, or terms this campaign must avoid) |
| Approver | {{APPROVER_NAME}} (the named human who enables spend — must not be the person who built the campaign) |
---
## 2. Guardrails — Set Before Anything Is Built
Confirm each guardrail before Section 3 starts. QA (Section 7) re-checks all of them.
If your team keeps a signed Guardrail Configuration for this account, the caps and
scopes below must match it — that document wins any disagreement.
| # | Guardrail | Rule | Confirmed |
|---|---|---|---|
| G1 | Paused by default | Every campaign, ad group, and ad uploads in a paused state. No exceptions, including "just to test." | [ ] |
| G2 | Caps set at creation | {{DAILY_CAP}} is entered on the campaign before upload, not added after enable. | [ ] |
| G3 | Cap raises are human-only | Any budget increase requires a new sign-off row in Section 8 before it is applied. No tool, script, or agent may raise a cap. | [ ] |
| G4 | Separated duties | Builder, QA reviewer, and approver: at least the builder and approver are different people. Only {{APPROVER_NAME}} enables spend. | [ ] |
| G5 | Tool and agent scope | Any automation connected to the account may create paused entities only. All other account access is read-only until a human widens it in writing — in the Guardrail Configuration or the agent's Campaign AGENTS.md, not in a prompt. | [ ] |
| G6 | Change logging | Every account change — human or automated — gets a Trigger / Action / Impact row in Section 10. | [ ] |
| G7 | Kill switch | {{KILL_SWITCH}} (who can pause everything and the exact steps, e.g. "owner pauses the campaign at campaign level; approver notified same day") | [ ] |
---
## 3. Ad Group / Keyword Structure
Ad group naming pattern: {{ADGROUP_PATTERN}} (e.g. theme–intent–matchtype; write the pattern here and follow it in every row)
| Ad group name | Theme | Intent tier | Match type | Seed keywords | Ad-group negatives | Landing page |
|---|---|---|---|---|---|---|
| {{ADGROUP_1}} | {{THEME_1}} (one theme only) | High / Mid / Low | Exact / Phrase / Broad | {{KEYWORDS_1}} (the seed list, one intent) | {{NEGATIVES_1}} (negatives specific to this group) | {{LP_1}} (this group's final URL) |
| {{ADGROUP_2}} | | | | | | |
| {{ADGROUP_3}} | | | | | | |
| {{ADGROUP_4}} | | | | | | |
Campaign-level negative list: {{NEGATIVE_LIST}} (shared negatives applied to the whole campaign — brand exclusions, irrelevant intents, existing-customer terms)
Structure rules:
- One theme per ad group. If a keyword fits two groups, it lives in the higher-intent group and is negated in the other.
- Every ad group maps to exactly one landing page whose content matches that group's intent.
- Broad match is allowed only with a monitoring commitment: the day-1 search-term check in Section 9 is scheduled before launch, not after.
---
## 4. Copy Variant Matrix
Character limits below are for Google Ads responsive search ads: headlines max 30 characters, descriptions max 90 characters, display path fields max 15 characters each. If you are launching on another channel, replace these limits with that channel's limits before writing a word. Voice, claims, and never-say rules live in your Campaign CLAUDE.md if you keep one — copy that fails it fails QA.
Complete one matrix per ad group. Copy this block for each.
**Ad group: {{ADGROUP_1}}**
Headline bank (max 30 characters each — count before upload, QA recounts):
| Slot | Headline | Char count | Pinned? |
|---|---|---|---|
| H1 | {{HEADLINE_1}} (lead with the offer or the intent behind the group's keywords) | /30 | |
| H2 | {{HEADLINE_2}} | /30 | |
| H3 | {{HEADLINE_3}} | /30 | |
| H4 | {{HEADLINE_4}} | /30 | |
| H5 | {{HEADLINE_5}} | /30 | |
| H6 | {{HEADLINE_6}} | /30 | |
| H7 | {{HEADLINE_7}} | /30 | |
| H8 | {{HEADLINE_8}} | /30 | |
Description bank (max 90 characters each):
| Slot | Description | Char count |
|---|---|---|
| D1 | {{DESCRIPTION_1}} (state the offer and the next step plainly) | /90 |
| D2 | {{DESCRIPTION_2}} | /90 |
| D3 | {{DESCRIPTION_3}} | /90 |
| D4 | {{DESCRIPTION_4}} | /90 |
Display paths: /{{PATH_1}} (max 15 chars) /{{PATH_2}} (max 15 chars)
Variant assembly — three ads per ad group, each with a distinct angle:
| Variant | Headlines used | Descriptions used | Angle |
|---|---|---|---|
| A | | | {{ANGLE_A}} (e.g. offer-led: what they get) |
| B | | | {{ANGLE_B}} (e.g. benefit-led: what changes for them) |
| C | | | {{ANGLE_C}} (e.g. proof-led: why believe it) |
Copy rules:
- Every claim must be substantiated. Source for claims used in this campaign: {{CLAIMS_SOURCE}} (doc or folder where proof lives). If a claim cannot be sourced, it does not ship.
- The ad's promise must appear above the fold on its landing page. QA checks this parity ad by ad.
- No superlatives you cannot prove; no competitor trademarks unless cleared against platform policy and noted here.
---
## 5. UTM Plan
This table IS the taxonomy. URLs are built from it by formula — nobody hand-types a UTM. A new value for any parameter is added to this table first, then used.
| Parameter | Convention | Allowed values | Example |
|---|---|---|---|
| utm_source | Platform serving the ad, lowercase | {{SOURCE_VALUES}} (closed list, e.g. google, bing, meta, linkedin) | google |
| utm_medium | Buying model, lowercase | {{MEDIUM_VALUES}} (closed list, e.g. cpc, paid-social, display) | cpc |
| utm_campaign | {{CAMPAIGN_UTM_PATTERN}} (your pattern, e.g. geo-product-intent-yyyymm) | Built from the pattern only | ca-launchkit-brand-202607 |
| utm_content | Ad group + variant letter | Matches Section 3 names | brand-exact-a |
| utm_term | Keyword, or the platform's keyword insertion parameter | Matches Section 3 keywords | campaign-launch-kit |
Formatting rules: lowercase everywhere; one separator (hyphen recommended) and never a mix; no spaces; no PII; no internal codenames you would not want visible in a URL bar.
Final URL register — one row per ad, filled before QA:
| Ad group | Variant | Final URL with UTMs | Resolves 200 (no redirect stripping params)? |
|---|---|---|---|
| {{ADGROUP_1}} | A | | [ ] |
| {{ADGROUP_1}} | B | | [ ] |
| {{ADGROUP_1}} | C | | [ ] |
---
## 6. Tracking Checklist — Verified Before Any Spend
Rule: no spend is enabled until every row below reads Verified. "It should work" is not verified. A test conversion is.
| Conversion action | Where it fires | Primary / secondary | Test method | Verified by | Date |
|---|---|---|---|---|---|
| {{CONVERSION_ACTION}} (e.g. demo form submit) | {{FIRE_LOCATION}} (page or event that triggers it) | Primary | Live test submission + tag debugger | | |
| {{CONVERSION_ACTION_2}} (a secondary action, if any) | | Secondary | | | |
- [ ] Each conversion action fired at least once in a live test and appeared in the ads platform
- [ ] Conversion counting (one per click vs every) matches the Primary KPI definition in Section 1
- [ ] One test click completed end to end: UTM parameters survived all redirects and the session landed in analytics with source/medium intact
- [ ] The analytics property receiving the data is the one the Primary KPI is measured in
- [ ] Ads platform and analytics both recorded the test conversion (counts may differ; both must record it)
- [ ] Consent behavior tested: with consent declined, tags behave according to your consent policy
---
## 7. Pre-Launch QA Checklist
Blockers stop the launch until resolved. Warnings are acknowledged in writing by the reviewer — never cleared silently.
**Blockers — all must pass:**
- [ ] Every Section 1 brief field is complete
- [ ] Every final URL in Section 5 resolves correctly — no 404s, no redirect that strips UTMs
- [ ] Every headline and description recounted against the character limits in Section 4 — recounted, not trusted
- [ ] Every claim in every ad traced to {{CLAIMS_SOURCE}}
- [ ] Landing page matches each ad's promise above the fold
- [ ] Targeting matches the brief exactly: geo, language, audiences, exclusions
- [ ] Campaign daily budget in the account equals {{DAILY_CAP}} from Section 1 exactly
- [ ] Every campaign, ad group, and ad is paused in the account
- [ ] Section 6 tracking checklist fully verified
- [ ] Guardrails G1–G7 all confirmed
- [ ] Naming in the account matches Section 3 and Section 5 patterns character for character
**Warnings — note and acknowledge with initials:**
- [ ] Broad match keywords present — day-1 search-term check scheduled (Section 9) — ack: ____
- [ ] Keyword overlap between ad groups noted and negated per Section 3 rules — ack: ____
- [ ] Landing page load time checked and noted — ack: ____
- [ ] {{CHANNEL_SPECIFIC_WARNING}} (add channel-specific items: extensions, placements, audience expansion settings) — ack: ____
QA result: Blockers open: ____ (must be 0) Warnings acknowledged: ____ by ____ Date: ____
---
## 8. Launch Sign-Off
| Role | Name | Date | Time | Notes |
|---|---|---|---|---|
| Built by | | | | |
| QA reviewed by | | | | Must confirm: 0 blockers, all warnings acknowledged |
| Approved by | {{APPROVER_NAME}} | | | See approval statement below |
| Enabled in account by | | | | The moment spend actually turned on |
Approval statement (the approver signs this, not a vague "looks good"):
> I approve {{CAMPAIGN_NAME}} to spend up to {{DAILY_CAP}} per day and {{TOTAL_CAP}} in total, from {{START_DATE}} to {{END_DATE}}, with the targeting and copy documented in this kit. Any change that increases spend, widens targeting, or edits live copy requires re-approval before it is applied.
>
> Signed: ______________ Date: ______ Time: ______
Rollback: before enable, the paused build can be deleted with nothing spent. After enable, pausing is one action — the kill-switch owner and steps are in G7.
---
## 9. Day-1 / Week-1 Review Schedule
Set the act-if thresholds now, before launch — they are decision triggers you commit to in advance, not benchmarks. Every value below is yours to choose.
| Checkpoint | When | What to check | Act-if threshold | Action if breached | Owner |
|---|---|---|---|---|---|
| Serving check | Launch + {{HOURS_AFTER_ENABLE}} (how long after enable you first check, e.g. "2–4 hours") | Ads approved and serving; spend pacing vs {{DAILY_CAP}}; impressions registering | {{PACING_THRESHOLD}} (your trigger, e.g. pacing to exceed the daily cap) | Pause, investigate, log in Section 10 | {{CAMPAIGN_OWNER}} |
| Day-1 close | End of first day | Conversion tag received real data (or clicks with zero conversions explained); search terms scanned for junk; UTM sessions landing in analytics | Clicks recorded but tracking silent | Automatic pause until tracking confirmed — data first, spend second | |
| Day-3 | 72 hours in | Search-term review, add negatives; ad disapprovals; spend pacing vs {{TOTAL_CAP}} | {{DAY3_THRESHOLD}} (your trigger, e.g. share of irrelevant search terms) | Add negatives / tighten match types; log changes | |
| Week-1 | Day 7 | Pacing vs total cap; directional read on the Primary KPI; warnings from Section 7 revisited | — | Decision: continue / adjust / pause. Decision and reasoning logged in Section 10 | {{APPROVER_NAME}} |
Standing rule: any checkpoint that finds spend running without verified tracking is an automatic pause, no approval needed to stop — only to restart.
---
## 10. Launch Log — Trigger / Action / Impact
Every account-touching change gets a row, whether a human or a tool made it. This is the audit trail your approver, your client, or your future self reads.
| Timestamp | Trigger (what prompted it) | Action (what changed, by whom or what tool) | Impact (spend / targeting / tracking affected) | Approved by |
|---|---|---|---|---|
| {{TIMESTAMP}} (date and time of the entry) | Brief signed off (Section 1) | Campaign structure uploaded paused via {{UPLOAD_TOOL}} (e.g. Google Ads Editor) | None — all entities paused | {{INITIALS}} (initials of the person logging) |
| | QA passed, 0 blockers (Section 7) | Approval requested from {{APPROVER_NAME}} | None | |
| | Approval granted (Section 8) | Campaign enabled | Spend begins under {{DAILY_CAP}} daily cap | {{APPROVER_NAME}} |
| | | | | |
| | | | | |
Filing: when the flight ends, complete the log, mark the kit status, and archive it with the campaign name. The next campaign starts by copying this kit — conventions, guardrails, and all.
What it is
The Campaign Launch Kit is the single document a team fills in for every paid campaign: brief, ad group and keyword structure, copy variants with character limits, UTM taxonomy, tracking verification, QA, sign-off, and a first-week review schedule. It exists because launch failures are usually process failures — a missing conversion tag, a hand-typed UTM, a campaign enabled that nobody approved. The kit turns each of those into a checklist line with an owner, and keeps every campaign paused until a named human signs off.
Make it yours