Turn a brand's facts, a campaign brief and the product into a one-minute Meta ad strategy with its reasoning — goal, audience, objective and placements, budget split, how many ads and how different they must be (generate 3x so the user can choose), the test frame, the success metric, and safety rules for the user to accept. Decides what launch-meta-ad-campaign then executes, and re-reads the strategy after a deep check to show which assumption changed. Use it after intake and before any creative is generated or any campaign is built.
npx gooseworks install --all # then, in Claude Code, Cursor, or Codex: /gooseworks use the ads-north-star-strategy skill
What this is for. Intake produced facts: what the business sells, what a customer is worth, how long they take to buy, what the user wants from this money. This skill turns them into a strategy the user can read in a minute. Each choice comes with its reason, because the deep check re-reads this file weeks later and has to see what was assumed.
This skill decides. launch-meta-ad-campaign executes. The launch skill already holds
the rules for what to optimize for, how big a test the budget buys, and how to structure the
campaign. This skill applies those rules and records the answer. It does not restate
them. When they change, they change in one place.
The three things most strategies get wrong:
Paths are relative to this skill's own folder, not your working directory (in GooseWorks:
agent-config/skills/ads-north-star-strategy/). The harness docs contract ships with the
meta-ad-manager skill and the Stage 2 and Stage 4 rules with launch-meta-ad-campaign; both
are installed beside this one.
Use the first mode that is available:
"The adapter" below means the file for the mode you chose.
Write strategy.md for one campaign: goal, audience, objective and placements, budget,
creative plan, test frame, success metric and reasoning. Then propose safety rules for the
user to accept. Use it after intake and before any creative is generated. Use it again
after a deep check, to revise the strategy and say what changed.
| Input | Where it comes from | If missing |
|---|---|---|
| Brand facts: business type, unit economics (ACV or AOV, margin, LTV, CAC target), sales cycle, other channels, claims rules, safety limits, the user's familiarity with Meta | the brand file intake wrote | read brand research; ask only per the asking rule below |
| Campaign brief: the goal in the user's words, the offer, the ICP, the destination, total budget and duration | the campaign brief | ask |
| Product: what is sold, price point | the catalog, by product id | ask which product |
| Account facts: lifetime spend, tracking present, weekly volume of the target event | read from the ad account (launch skill, Stage 2) | assume a cold account with no tracking, and say so |
| Existing customers (a customer list or custom audience) | the ad account's audiences | no exclusion; say so |
| Brand record ids: brand id, the coworker agent that owns the files | the brand record | ask the host; never invent one |
| What the executing host can launch: which objectives, and how many ads per ad set | the host's launch tool | assume Traffic only, 2–3 ads |
| Deep-check findings (re-read only) | the deep check's report | not a re-read |
The asking rule. Ask only when both are true: the answer cannot be inferred from research, the catalog or existing campaigns, and a wrong guess changes money, claims or legal exposure. State everything else as an assumption: "I'm assuming X, Y, Z. Tell me if any are wrong." Ask at most four questions per turn, in plain words.
Things that usually pass the rule at strategy time: the budget ceiling, what a lead or sale is worth (when the brief has no ACV/AOV), and whether a named result may be claimed. Things that never pass it: the objective, the optimization goal, the structure and the placements. Those are yours to decide.
Facts that came from intake, not from a tool. An account fact the user or intake stated
(lifetime spend, weekly events) has no sync time. Write it as an assumption ("per intake,
not yet read from the account"), never as an - Observed: line with an invented sync
time. Once the account is read, the observation replaces the assumption.
launch-meta-ad-campaign: its Stage 2 tables (choose the optimization goal, size the
test honestly, structure follows the budget) and its Stage 4 test design. Read them
before deciding. Do not copy them.meta-ads-analyzer: produces the deep-check findings that trigger a re-read.strategy.md, the deep-check findings and the campaign's decision log.strategy.md in the contract format (below). Increment version on any change.launch-meta-ad-campaign.Apply them in order. Each writes its reason into the strategy.
Decide the objective from the business outcome, not from what is easiest to buy:
| The business | The outcome that pays | Right objective |
|---|---|---|
| Software, sales-led, cycle over ~30 days or ACV over ~$2k | qualified pipeline: demo requests, sales calls | Leads |
| Software, self-serve with a free trial | trial starts that activate | Leads (a signup event), or Sales if paid checkout is the first step |
| E-commerce | purchases | Sales |
| App | installs that pay | App promotion |
| "Does this work at all?" | learning, not revenue | Traffic, as a stated plumbing test |
Say why the cheaper objective is wrong for this business. For a long-cycle software brand, Traffic buys people who tap ads. Those people rarely book a call and never become a $10k contract. A low cost per click hides the fact that nothing in the pipeline moved.
When the host cannot launch the right objective, do not quietly downgrade. Write three things, in this order:
Never write a strategy whose success metric is a click for a business that makes money on a lead or a sale.
The right objective and the right optimization goal are two different claims. Sales can be the right objective while the account is still too thin to optimize for purchases (under ~50 a week, launch Stage 2). Write both: "the right objective is Sales; at 6 purchases a week Meta could not optimize for them yet, so this run pays for landing-page views and is judged on cost per purchase."
Bridge stopping point. Stop the bridge early when it has spent 3× the target cost per result with zero results. Otherwise, judge cost per result against the target at the end of the run, or at the test frame's threshold if that comes first.
Apply the three tables in launch-meta-ad-campaign Stage 2: "choose the optimization goal
from those numbers", "size the test honestly" and "structure follows the budget". Record:
Apply launch-meta-ad-campaign Stage 4: what is being compared, the single variable, how
the budget splits, the metric that decides, and the evidence needed before judging. The
success metric follows the goal from rule 1: cost per qualified lead, cost per
purchase, cost per paying install. Measure it with what the tracking actually counts,
e.g. a booked demo. When quality is judged downstream, e.g. the sales team qualifies demos,
say how the two are reconciled: "cost per booked demo, checked weekly against the demos
sales marked qualified". Give a threshold drawn from the unit economics, e.g.
"a lead is worth it at up to $150, because at a 10% close rate and a $12k ACV, a
customer at $1,500 pays back in the first two months." If the budget cannot reach the
evidence threshold, the test frame says so.
Propose these. Save them only after the user accepts:
| Rule | Default threshold | Why |
|---|---|---|
| Pause everything if the destination is down | the page fails to load on two checks in a row | every tap on a broken page is paid for and lost |
| Pause an ad set that has spent X with zero results | X = the larger of 2× the target cost per result and 3 days of its budget | past that point the money is not buying learning; the 3-day floor stops a small budget from pausing before a normal gap between results |
With one ad set, pausing the ad set pauses the campaign. Say so when you propose the rule. Stay inside the brand's safety limits, such as the maximum daily budget and excluded audiences. Budget changes are never pre-approved; they always go back to the user.
The deep check brings evidence. The strategy says which assumption the evidence overturned, not just which number moved.
version, and set based_on: deep check YYYY-MM-DD.## What changed after Reasoning. A bullet belongs there for either of two
reasons: the evidence overturned an assumption vN stated, or it answered a question the
test frame said this run would answer. Each bullet has four parts: the assumption or
question, what version N said, the evidence (a tagged - Observed: line), and the new
decision. A finding that only confirms the plan working does not belong here. Neither does
a finding still below its bar: put it under a short "could not judge yet" line instead.meta-ads-analyzer).
Delivery was already concentrating on the buyers. Narrowing to that segment usually
raises the cost. Leave the audience alone unless the segment finding clears the bar
and a business reason agrees.If no comparison clears its bar, change nothing, and say what the check could not yet judge.
ads/campaigns/<slug>/strategy.md, in the contract format (the meta-ad-manager skill's
contract/templates/campaign/strategy.md), where the adapter keeps the ads/ files:
campaign, product_ids (catalog references, never copies), version,
updated_at, based_on.## What changed on a re-read.- Observed: line with its window, sync time and
source. Never call an observation current.The skill also writes, in the same turn:
R<next free n>: approve strategy vN — awaiting, and, only once accepted, the safety rules under ## Pre-approved rules.
On a first run, set stage strategy. On a re-read, leave the stage as it is: a live
campaign stays live.Decided: shown to the user; awaiting approval, Outcome: pending) and one for the
safety-rule proposal and its answers. When the user answers, record it by filling that
entry's - Outcome: pending line (the only line that may change), e.g. "approved v1 on
2026-09-28; launched". Never edit the Decided line afterwards. A re-read that finds the v1
entry still pending fills in its Outcome in the same way.## What changed names the assumption, and there
is a decision-log entry.| Symptom | Cause | Fix |
|---|---|---|
| The strategy for a B2B brand optimizes for clicks and reports a great CPC | The objective was chosen from what the host can launch | Apply rule 1: name Leads, write the bridge judged on cost per lead, and state the limit |
| Three ad sets at $10/day each | Splitting by audience "to test audiences" | Rule 2: one ad set; the test is between angles |
| Nine generated ads, all the same headline in different colours | Diversity read as visual variety | Rule 4: angles differ in message; name them |
| Thirty creatives when the user asked for ten | The 3x rule was applied to the user's own number | Triple only the plan's count; a user's number is used as is |
| A safety rule in state before the user said yes | Proposal treated as acceptance | Save only accepted rules; log the answer |
| The re-read strategy just has new numbers | Evidence recorded, assumption not named | ## What changed: assumption → old → Observed evidence → new decision |
| The strategy promises an answer the budget can't produce | Test size not checked | Launch skill Stage 2 "size the test honestly"; write the limit |
launch-meta-ad-campaign: its Stage 2 tables (choose the optimization goal, size themeta-ads-analyzer: produces the deep-check findings that trigger a re-read.Full video production sequence with script review, actual ingredient choices, controlled generation, editing, evidence-based quality review, polish, captions and delivery. A host binding supplies project storage, authentic approvals, provider access and billing.
Build a vox-pop street interview video ad. An interviewer with a handheld mic asks passers-by one question about the brand's product, they give blunt wrong guesses, one gives the real answer, and the cut lands on a branded end card. Generates the takes through the GooseWorks fal proxy (Seedance 2.0 with native voice), then grades, re-cuts, captions and gates them locally. Use for the street-interview format.
Write the words of a short-form video ad (voiceover, dialogue, chat bubbles, on-screen lines) the way performance creative teams do instead of from a blank page. Builds the script from the buyers' own words, the beat sheet of an ad that already works and three deliberately different angles, filters them with a rule check and a second non-Claude model, and takes the strongest into the review with the other two as one-line swaps. Use it in every video ad run before any paid step, and whenever the user asks to write, rewrite or improve a video ad script or says a script sounds generic or AI-written.