The creative is accepted (movement X), the budget is agreed. The eleventh movement is a campaign-launch runbook: six phases, a QA gate before the start, a UTM spec after movement VIII's incident, and kill / scale thresholds derived from the unit economics, not from a mood.
Phases, gate, the UTM spec and the kill/scale grid with four breakdowns
Runbook, gate checklist, naming spec, kill/scale rules, a filled campaign brief
launch_runbook.md, qa_gate_checklist.md, naming_utm_spec.md, kill_scale_rules.md, campaign_brief_example.md, n8n_campaign_guardrails.json
CAC, CPL, funnel, utilisation — from movement VIII's report; LTV — from the LUMÉ Bible
A network of four aesthetic-cosmetology studios in Kyiv, a fifth opening. Campaign launches are run by the marketing lead; there's no media-buying department. The ad accounts are Meta, Google, plus micro-influencer integrations.
One runbook across all channels. Each phase has its owner, its exit, its check. Full version — launch_runbook.md.
A numeric goal ("+110 SMAS visits at CAC ≤ ₴2,800"), why now, what's known from movement VIII, the offer, budget and split, kill/scale thresholds — fixed before the start.
exit: a filled campaign_brief · check: the goal is measurable, the offer doesn't contradict the utilisation logicCreative accepted (movement X), copy compliant with art. 21, UTMs from the generator, landing checked (movement XII), audiences and exclusions built, pixel on a test event.
check: a test enquiry from every landing reached the CRM via n8n with the right UTMsA second person goes through a 6-block checklist line by line. With one reviewer — the gate is the next day, on a fresh head.
exit: a signed checklist · a red point = stopLaunch in the morning of a working day. Budget as planned, no ramp-up. Don't touch it for 72 hours / until 50 conversions — except stop signals (0 enquiries at spend, broken UTM, delivery out of range, CPL > 2×).
studio admins are warned — otherwise the 15-minute SLA from movement IX won't holdA 7–14 day window. Intervention schedule: day 3–4 junk cleanup, day 7 evaluation against the kill/scale grid, day 10–14 budget for the next period. Between points we don't touch it.
A one-page review in the worked_month.md format: actual vs goal, what won, the best creatives with IDs from the movement X board, kill/scale decisions. Conclusions → into the briefs, dict_utm_rules, the next campaign brief.
1 · baseline
Assemble the ads, set the budget, hit "Publish," then watch the ad account and "tweak."
2 · what's wrong
Without a brief there's no telling what counts as success — so it can't be stopped with justification. Without a gate a broken UTM goes live, a landing with no analytics goal, an ad with a doctor on camera (art. 21). Without an evaluation window decisions are made on three leads over two days. Without a retro the same mistakes repeat every campaign.
3 · senior level
A runbook with phases: each has an owner and an exit that's checked before moving on. The gate between "Assembly" and "Start" is hard, like the Definition of Ready in movement X. The brief phase filters out harmful campaigns before spending money: "volume of cheap leads across all studios" at 76% utilisation doesn't pass the check.
4 · outcome
The launch stops being improvisation. Every campaign is comparable to the last (one brief and retro format), process mistakes are fixed in the runbook, not repeated.
The campaign doesn't start until all points pass. A second person checks. Full checklist — qa_gate_checklist.md.
| Block | What it catches |
|---|---|
| Creative compliance | doctor on camera, "most effective," before/after with a flaw, no "Sponsored" mark (5× the cost fine) |
| Tracking | UTM not to spec, a test enquiry didn't reach the CRM, the conversion tied to page_view instead of lead |
| Budget and pace | a "ramp-up" of the daily budget, a split against the utilisation logic, a Friday-evening start |
| Targeting | geo wider than the studio districts, current-client base not excluded, Google with no negatives and nationwide |
| Reception point | the form sends to the wrong place, "thanks, we'll call you sometime" instead of the 15-min SLA, no consent for processing medical data |
| Thresholds and access | kill/scale thresholds not written out, checkpoints not in the calendar, no one to handle stop signals on the weekend |
1 · baseline
Before launch, glance at the campaign yourself once more — looks fine.
2 · what's wrong
The person who built it looks at their own work with a tired eye and sees what they meant to do, not what they did. A space in a UTM, a test event that wasn't checked, a landing that "definitely works" — surface a week later, when ₴40K has been spent. In movement VIII exactly this way 50 leads over 24 days went into "(not set)."
3 · senior level
A formal gate: a second person (in a small team — the same person the next day) goes through the checklist line by line, each point yes/no, with a name and date. A mandatory practical point — a test enquiry from the live landing must reach the CRM, with a screenshot, not "the form looks working." A red point stops the launch with no discussion.
4 · outcome
The "launched with broken tracking / an art. 21 violation / a broken UTM" class of error is closed at the entrance. A signature on the checklist makes the check an event, not an intention.
The reason the spec exists is movement VIII's incident: on a campaign relaunch a space got into the tag (kyiv smas), GA4 split it, 50 leads over 24 days fell into (not set), and at the stand-up the best channel by ROMI was nearly cut. Spec — naming_utm_spec.md.
utm_campaign structureonly a–z, 0–9, underscore · lowercase · no spaces, Cyrillic or hyphens
lume_{scope}_{line}_{goal}_{period}
scope — net or a studio code (pech podil obol pozn centr) · line — inject hardware laser care consult smas course referral · goal — lead book promo awareness · period — 2026q4 or 2026m10
Example: lume_pech_smas_lead_2026q4
utm_content matches the creative ID from the movement X board — so the report shows which layout gave which CPL and hook rate.
1 · baseline
Put the UTM straight into the ad account when creating the campaign, from memory of how it was named last time.
2 · what's wrong
"From memory" means variance: smas / SMAS / smas-lift / смас. Analytics breaks into pieces, attribution lies, and worst of all — it's not noticed at once. One space or capital letter — and a channel looks dead in the report though it brings in clients.
3 · senior level
A UTM is never written by hand in the ad account. A generator (a spreadsheet with dropdowns) builds the string to spec and checks it with a regex (REGEXMATCH) — a red cell if it's off. The finished string is copied into the account. The campaign name in the account = utm_campaign verbatim, so movement VIII's report stitches spend and leads with no manual mapping. A validator in n8n duplicates the check at the lead layer — catching a broken tag in the first hours, not a day later.
4 · outcome
Movement VIII's incident is structurally impossible: a broken tag doesn't pass the generator, and if one somehow does — n8n pauses the campaign and alerts the same day.
The decision is made against thresholds derived from LUMÉ's economics, within a window of statistical significance. Thresholds — in the brief before the start and in the guardrails. Rules — kill_scale_rules.md.
LTV on gross profit ₴17,742 (Bible). The campaign's life boundary — LTV/CAC = 4, i.e. CAC ₴4,443
| Bundle CAC | LTV/CAC | Decision |
|---|---|---|
| < ₴1,800 | > 10× | SCALE — if there's capacity; otherwise HOLD + pour into referrals |
| ₴1,800–3,200 | 5.5–10× | HOLD — don't touch until the next point |
| ₴3,200–4,400 | 4–5.5× | ITERATE — fix one thing per iteration |
| > ₴4,400 | < 4× | KILL — switch off, record the reason |
Independent KILL triggers: lead→booking < 0.20 · share of off-target·budget (the doctor's tag, movement IX) > 40% · hook rate < 15% at CTR < 0.6% on 15,000+ impressions.
The significance window — we don't judge earlier. 7 days (Meta's learning phase) and ≥ 50 leads for a CPL decision, ≥ 30 bookings or ≥ 10 visits for a CAC decision. Earlier — only stop signals. Judging a bundle on 5 leads over 2 days is guessing.
SCALE is banned with no free capacity, even at an excellent CAC. Utilisation 76%: there's nowhere to put the extra visits. Instead of raising the budget — move to the referral programme (CAC ₴300) or to a campaign with a higher ticket (the same chair slot, more revenue). This is a direct consequence of movement VIII.
1 · baseline
Watch CPL in the ad account; when it's "expensive" or the budget's out — switch it off.
2 · what's wrong
"Expensive" relative to what? CPL ₴900 is bad for Meta and excellent if those leads reach an expensive procedure. A CPL decision ignores whether the lead reaches the chair and how much it pays there. And "switch off when you're tired" isn't a decision, it's a capitulation: a bundle you should have fixed with one offer tweak gets killed whole.
3 · senior level
The threshold is on CAC (those carried to a visit), cross-checked against the Bible's LTV: the KILL boundary is LTV/CAC = 4 (CAC ₴4,400), not the plan of ₴1,500 (that's the target, approached via ITERATE). Four outcomes, not two: KILL / HOLD / ITERATE / SCALE. ITERATE changes one thing at a time (offer → landing → creative → audience → bid, in exactly that order), to know what worked. All within the significance window, accounting for lead quality from the doctor.
4 · outcome
The decision is reproducible and explainable to the founder in one line: "CAC ₴3,100, LTV/CAC 5.0 — we iterate the offer, we don't kill." The automation (guardrails) computes and signals, a human decides with the season and the studio schedule in mind.
| When | What we do | What we don't |
|---|---|---|
| First 72 hours | stop signals only (0 enquiries, broken UTM, delivery out of range) | don't change budget, audience, bids — it resets the learning phase |
| Day 3–4 | clean obvious junk: junk placements in Meta, negatives in Google | don't touch structure and budgets |
| Day 7 | evaluate every bundle against the kill/scale grid | don't "tune" bundles in the green zone |
| Day 10–14 | budget for the next period, retire the leading and the weak creatives, the next iteration | don't scale with no free capacity |
| Between points | nothing, if there's no stop signal | every manual edit zeroes the accumulated statistics |
1 · baseline
Go into the ad account every day and tweak: raise a bid here, change an audience there, add budget somewhere.
2 · what's wrong
Meta's and Google's algorithms learn on accumulated data. Every manual budget/audience/bid change restarts the learning — and the campaign is back in an expensive, unstable phase. Daily "tweaking" keeps it in an eternal learning phase, CAC never stabilises, and the marketer makes decisions on noise, not signal.
3 · senior level
An intervention schedule with explicit dates and an explicit "between points we don't touch it." The first 72 hours — hands off, except stop signals. Then — three planned points over two weeks. Changes — as a batch at a point, one factor at a time, with a new significance window. Utilisation 76% also changes the optimisation goal: not "lower CAC further" but "hold CAC and shift the mix toward expensive lines."
4 · outcome
The campaign exits the learning phase and gives a stable CAC you can decide on. The marketer's time goes to the brief and the retro, not to nervously refreshing a dashboard.
The same approach as in movements VIII–X. n8n_campaign_guardrails.json — 13 nodes, import-ready.
| Node | What it does |
|---|---|
| Daily compute (weekdays 09:30) | for each active campaign from raw_spend + raw_leads: real spend = delivery (the +20% non-resident advertising tax was repealed in 2022, Law No. 1525-IX), leads, bookings, visits, CPL, forecast CAC, LTV/CAC, delivery pace |
| Decision grid | stop signals (0 leads at spend, pace ≥ 1.5 or < 0.4, CPL > 2× plan) → the KILL/ITERATE/SCALE grid from the campaign's thresholds; the output is only campaigns that need a decision |
| Alert dedup | the same decision on a campaign isn't repeated day after day (alert_state) — the signal comes once, until the situation changes |
| UTM validator | a separate webhook lume-campaign-lead: a tag not to spec → "pause the campaign, fix it" within the hour |
| Reminders | day 3 / 7 / 14 — checkpoints per the runbook |
What needs access: a daily spend export from the Meta / Google ad accounts into raw_spend (the same access movement VIII needs), a Telegram chat token. The logic is written and imports.
Each one is a boundary a decision is made on. Not a "dashboard metric" but an input to an action.
The campaign retro puts into the shared report: actual vs goal, the winning "channel × offer × creative" bundles, the best creatives with IDs from the movement X board, kill/scale decisions with reasoning. This closes the loop: movement X produces → movement XI launches and measures → conclusions come back into movement X's briefs.
The thresholds are tuned to the model's unit economics. KILL at CAC ₴4,400 is right while LTV ₴17,742 (Bible) is right. Meta CPL ₴620 is grade C: the one UA anchor is Rabbit Marketing "beauty/health 200–600 ₴/lead" (09.2026), the exact ad-account number is unconfirmed. The "non-resident advertising tax" (+20% on Meta/Google) kept in v0.5 was repealed back in 2022 (Law No. 1525-IX) and removed in v0.6: CAC ₴2,106 → ₴1,806, LTV/CAC 8.4× → 9.8×. At a conservative CPL of $18–22, LTV/CAC ~6–7×, still above the KILL boundary.
The runbook hasn't been tested on a live campaign. The phase sequence, the window length, the intervention schedule — from media-buying practice, not from the LUMÉ team's runs. On a real stream it's calibrated over 2–3 campaigns.
The gate's compliance points are from open sources. Art. 21 and Meta policy are read, not checked by a lawyer. For a real business gate block 1 is agreed with a lawyer.
The guardrails automation depends on movement VIII. Without a daily spend export from the ad accounts a real-time CAC computation is impossible — manual entry remains, which lowers the control frequency.
figures.jsonworked_month.mdresearch/source_register.md block H