Install Analyze Performance
Pick your agent. Every command is ready to paste.
npx skills add gooseworks-ai/goose-skills --skill analyze-performanceThe open skills CLI detects your agents (Claude Code, Cursor, Codex and 70+ more) and installs to the right folder. Add -g to install globally.
01
Install it
Run the command above, or upload the folder in Claude.
02
Ask naturally
Describe the task. Your agent loads analyze-performance when the request matches its description.
03
Name it if needed
If it does not trigger, say “use the analyze-performance skill”. In Codex, type $analyze-performance.
analyze-performance
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.
Tips for Analyze Performance
- • Start a fresh session after installing so your agent picks up the new skill.
- • It bundles reference files. The agent reads them only when needed, so they cost no context until then.
- • It is part of a pack with 29 skills. Install only the ones you need with --skill to keep triggers precise.
- • If two skills overlap, mention the one you want by name.
Questions about Analyze Performance
What does the Analyze Performance skill do?
Weekly performance read across every channel we run: what worked, why, and what to make next, judged on the business's real number (store revenue, qualified pipeline, retained users), not platform claims. Use when: write my Monday report; how are my ads doing — which ad won?; are my ads actually making money (Meta says 4x ROAS but revenue is flat); why did sales drop this week; did the test win; is my tracking workin
How do I install Analyze Performance?
Run "npx skills add gooseworks-ai/goose-skills --skill analyze-performance" in your project. The skills CLI installs it for Claude Code, Cursor, Codex and 70+ other agents. In Claude on the web, upload the skill folder as a ZIP under Customize > Skills.
Does Analyze Performance work in Cursor and Codex?
Yes. Analyze Performance uses the open SKILL.md format, so it works in Claude Code, Claude, Cursor, OpenAI Codex, Gemini CLI, GitHub Copilot and other agents that support agent skills.
Is Analyze Performance free?
Analyze Performance is open source on GitHub under the MIT license. It is free to install; check the license before commercial use.
Who made Analyze Performance?
Analyze Performance is published by gooseworks-ai in the gooseworks-ai/goose-skills repository, together with 28 other skills.
