What you get
- The Monday report — saved to
reports/performance/<YYYY-MM-DD>.mdand shown in chat, the same shape every week (references/monday-report.md); run-paid-campaigns decides and acts on its recommendations. - Learnings written to the brand brain after the marketer has seen and kept them; ended tests' measured results saved as readouts.
- A run record for next week (
references/run-memory.md): the per-channel and per-ad scorecards with the trend since last run, each call with its owner, review date and test, and what happened to last week's calls — saved to the brand, so "what worked" and "what to make next" rest on weeks of history, not one week. - Monthly unit-economics read for plan-campaign's replan; daily pulse on request, exception-only (
references/monthly-and-pulse.md).
Before you start
- Setup first: do the
marketing-guideskill (../marketing-guide/SKILL.md) §1–2 (connect, brand, brain read) before anything else; the job line is "read your results". This playbook offers local mode (marketing-guide §5): with no GooseWorks it reads through the marketer's connectors, else exports and screenshots, and keeps the contract, reports and run records in the local folder. A missing connection is never a blocker: say in one line what this read can and can't see, and go on. - Read the brain and the plan (free; local mode:
references/local-mode.mdinstead). Brain chapters: 18 "How we count results", 20 "Our plan" (targets, decisions, experiments), 22 "Everything we have made and run", 23 "What is working" (readouts, worn-out angles, lessons). Fallback path:brand_readsectionssummary, kit, products, learnings, onboarding, accounts, andknowledge_search["learning"]for past results. Thengooseworks:campaign_read— live briefs (Economics, targets, Test plan, Measurement plan, Replan triggers, the change-log slug in Status); workspace (gooseworks:file_list/file_read):reports/performance/definitions.md, the latest dated report and its Decisions,ads/campaigns/<slug>/state.md(frontmattermeta_push_ids, health line, open recommendations) and the### YYYY-MM-DD — <title>blocks ofdecisions.md(what was actually done — written by run-paid-campaigns and the server), make-static-ads' batch filesads/batches/<YYYY-MM-DD>-<slug>.md(creative id → angle, hook, test; picks),lifecycle/program.md(which flows exist), the newestresearch/competitors/watch/<YYYY-MM-DD>.md(line 2), and research-market's "What people are saying" section — in the newestresearch/market/<D>-read.md(mentions, sentiment, trends, risks; check the section's own window line before treating it as this week's, and read share of voice only if it is there). - Load the last runs — the Start steps of the
run-memoryskill (../run-memory/SKILL.md) for this job (weekly performance read,monthly readordaily pulse;references/run-memory.md): the last record, plus up to four weekly records back for the scorecards and angle history; every earlier call checked against a source; run-paid-campaigns' newest run record for each campaign (its money moves and verdicts). No record → say it's the first read; this run's numbers become the baseline. - Company type and referee —
references/measurement-contract.md§1. The type decides the referee, the ranking metric, the cadence (B2B under ~20 SQLs a month: weekly = leading indicators, pipeline monthly; services: monthly) and the inputs. - One message, once; nothing asked mid-run. Its contents and the export cheat sheet are
references/measurement-contract.md§4 (minimum useful read first, history once, big exports in a hosted chat). Add what only this run knows: on the first run, the contract draft with defaults pre-filled (ask only the number and target, margin %, timezone — never technical settings), the roster to confirm, and which store, CRM, billing or analytics tool holds the referee unless the brain or a listed connector shows it (marketing-guide §3, "The marketer's own tools"; with none, that leg runs claims-only meanwhile); exports named in the last record's "Not checked" line, by name; the paid run's needs (references/run-memory.md§ What the one input message also asks for). Missing items are "not checked this week"; a missing referee → claims-only mode (references/measurement-contract.md§5).
GooseWorks reads (connected only): gooseworks:meta_read performance view (Goose ads only, trailing windows ranked by spend — to identify Goose ads and cross-check, not as the week's totals); gooseworks:social_account_list + gooseworks:social_analytics_get (the brand's TikTok/Instagram accounts — other platforms come from the marketer); gooseworks:ads_creative_read (statics' lower-case tags, e.g. angle:a-07, picked; the batch file is the fallback when tags are missing) and gooseworks:video_read (videos' angle and hook names; a video without them is unannotated; an older ads/videos/<project_id>.md note is read only if it exists).
Steps
Route first. "Anything on fire today?" → run Before you start 1–3, then only the pulse in references/monthly-and-pulse.md — no input message, no contract. "Monthly numbers / replan" (or the first Monday of the month) → add the customer-level store export to this week's one input message, run the weekly read, then the monthly read. Everything else → the weekly read below.
- Hygiene, maturity, coverage — atom the
analyze-performance-intakeskill (../analyze-performance-intake/SKILL.md). On a first run, save the contract (confirmed, or as "draft — awaiting confirmation" if the marketer sent exports without confirming) todefinitions.mdand register it as a brand document through thesave-to-brainskill (../save-to-brain/SKILL.md) (versioned: supersede); re-check the roster against the briefs andstate.mdand propose an amendment when a new channel appears. Strip test/wholesale/staff orders and renewals; net refunds; align timezones; equal-lag comparison; de-duplicate Goose ads against the export by ad id; save the input summary; write the coverage line over the roster. - Business truth and the join — atom the
analyze-performance-revenue-joinskill (../analyze-performance-revenue-join/SKILL.md),references/revenue-join.md. The type's referee vs last week, the 4-week average and the same week last year (or "vs plan only" for a new brand); for DTC: MER (labelled DTC MER when retail exists), new-customer MER, nCAC, contribution after ads vs break-even; the overclaim ratio on like-for-like terms; marginal vs average; budget pacing vs the month. When platform and blended disagree: both stories at the same grain, a recommendation, the cheapest settling test. - Plumbing and the why — atom the
analyze-performance-diagnoseskill (../analyze-performance-diagnose/SKILL.md),references/diagnosis.md. Plumbing first (breaks from the numbers, run-paid-campaigns' health line, and "measurement absent by design" with setup steps). Then, for every material move, the cause checklist with evidence, how sure, and ruled-out causes; light page/message match on the top winning and losing ads. - Creative ranking and channel reads — atom the
analyze-performance-rank-and-readskill (../analyze-performance-rank-and-read/SKILL.md),references/creative-and-channels.md. Build the per-channel and per-ad scorecards against last run's rows (references/run-memory.md§ Numbers). Angle → hook → format ranked by spend and judged on the type's business event (DTC: purchase CPA within the platform, claimed, capped at likely unless store new-customer orders moved with it); when only an upstream proxy exists (installs, leads, clicks), "cheap , quality unknown" — no winner, no learning, "test" not "scale"; ads without a maker's angle annotation are "unannotated", never guessed from names. Then each rostered channel: email/SMS, organic, Google (+ wasted-spend terms), apps, local, B2B pipeline. - Tests and recommendations — atom the
analyze-performance-call-and-learnskill (../analyze-performance-call-and-learn/SKILL.md),references/tests-and-learnings.md. Ended tests called against the brief's criteria; last week's calls scored through run-memory's outcome check (a money move run-paid-campaigns made: its verdict, plus this playbook's store-joined truth check over the same window); "what worked" only what held 2+ runs or won a test, "what to make next" from the history — tiring winners first, nothing that already failed (references/run-memory.md); this week's recommendations with how sure and "would change if" (the decision and the action are run-paid-campaigns'); fired replan triggers; the "what to make next" list; at most ~3 proposed learnings (n floors apply), each showing what it would retire. - Write and show the report — through the
write-reportskill (../write-report/SKILL.md), inreferences/monday-report.md's shape (topicperformance-read; brand copyreports/performance/<YYYY-MM-DD>.md, titlePerformance read — <Brand> — <YYYY-MM-DD>, tags[analyze-performance, performance-read],keep-history). Its §3 checks, plus: labels per section (truth / claimed / derived); no platform revenue as truth; every rostered channel present; every call says how sure. Its Decisions for you is the one decisions block: which story to run on (if two), which learnings to keep or strike, any contract amendment, any re-test. - On the marketer's reply — re-save the report with a Decisions section; record the story pick in
definitions.md; write the kept learnings through thesave-learningskill (../save-learning/SKILL.md) (their words as the statement; one idea per learning; own superseded ones retired; say which landed). Nothing becomes a learning unless it appeared in a report the marketer saw. Measured readouts (ended tests called Win or Loss) are saved through save-learning's readout path, never from a scheduled run (references/run-memory.md§ Experiment readouts). - Save the run — the End steps of the
run-memoryskill (../run-memory/SKILL.md): the record with the scorecards, the angle history line, this run's calls as recommendations (id, owner, review-by, how we'll know) and the outcomes of the last ones. Re-save it with the marketer's decisions when they reply. The daily pulse writes a pulse record (thresholds checked, breaks or "nothing"). - Monthly read when routed above —
references/monthly-and-pulse.md, with its ownmonthly readrecord (channel scorecard over the month vs the last monthly record).
Approval gates
Nothing here is irreversible: this playbook reads and recommends; it never moves money, changes campaigns or publishes. Its judgment points end at the marketer:
- Which story to run the business on when platform and blended disagree.
- Whether a messy test result is enough to act on, or the test runs again.
- Learnings are written only from the marketer's own words after they have seen them.
- Kill/scale recommendations become real only when run-paid-campaigns decides on them, behind its money gate.
- Scheduling the report or pulse is offered once — a scheduled run uses credits, runs claims-only unless a connector exists, and should run before the paid run — and follows the
spend-gateskill (../spend-gate/SKILL.md)'s automation rule (created paused, switched on by the marketer); the offer is recorded indefinitions.mdso it isn't repeated. Create it by marketing-guide §3 Schedules. With GooseWorks (gooseworks:automation_upsert): the method goes inreports/performance/method/, the prompt isreferences/run-memory.md§ Setting up the schedule. Local mode: the host-scheduler branch there. Either way: read and report only; never apply, publish or spend.
Output and write-back
- Workspace (brand coworker scope,
gooseworks:file_write, re-read before writing; local mode:references/local-mode.md):reports/performance/<YYYY-MM-DD>.md(weekly — named for the Monday of the run week, kept when re-saved with Decisions),reports/performance/monthly/<YYYY-MM>.md,reports/performance/inputs/<YYYY-MM-DD>.md,reports/performance/definitions.md. The contract (versioned: supersede) and the monthly read (a period artifact,keep-history) are also registered as brand documents through thesave-to-brainskill (../save-to-brain/SKILL.md). - Run records
runs/analyze-performance/<job-slug>/<YYYY-MM-DD>.mdthrough run-memory (imported; read by its own next run and plan-campaign's replan). Experiment readouts (kind 23experiment_readout.*) and, on the marketer's yes, worn-out angles (worn_out_angle.*) through save-learning. - Learnings → the brand brain through the save-learning atom (read by every planner and maker; angle learnings start
[learning YYYY-MM-DD A-NN]so research-competitors can update its bank). - Who takes what: run-paid-campaigns — calls, plumbing flags, Google wasted-spend terms, the input summary · plan-campaign — weekly and monthly reads, fired replan triggers · make-static-ads / make-content — what to make next (a video item is offered as the next job with the goose-video skill) · run-organic-social — organic overperformers · email-lifecycle — the flow-and-send read · improve-search-visibility — the re-check nudge.
Done when
On a brand with live spend and its store or CRM numbers provided, each rostered channel's winner, the why and the next-make are stated and grounded; platform revenue is never quoted as truth; learnings were written only from the marketer's words after they saw them. Without the referee it says plainly that it ran claims-only — the Done-when check needs the referee.
Out of scope
- Applying any change (pausing, scaling, budgets, negatives) — run-paid-campaigns.
- Making the next creative — make-static-ads, make-content. Video ads: the goose-video skill.
- The monthly replan itself — plan-campaign (fed by this playbook).
- Fixing the pages it checks — not covered yet; the check here is read-only.
- Brand-search volume, share of voice, citations — research-market ("What people are saying"), improve-search-visibility (carried in when they exist).
- Standing alerts and watchers — not covered yet; the exception-only pulse covers the gap.
- The deep email flow audit — email-lifecycle; the organic content mix — run-organic-social.