launch-meta-ad-campaign · diff
git:20260921.6a46365 to git:20260921.7879397
40 added, 60 removed. Audit A to A.
---
name: launch-meta-ad-campaign
- description: Guide a user from campaign intent through a verified, human-approved Meta/Facebook/Instagram launch that creates only paused objects. Use automatically when the user asks to launch, run, create, publish, or set up Meta ads; use analysis skills instead for reporting-only requests.
+ description: Plan or safely create Meta/Facebook/Instagram campaigns through GooseWorks tools or a bundled direct Meta Marketing API adapter. Use automatically for requests to launch, run, create, publish, set up, or plan Meta ads; use reporting skills for analysis-only requests.
---
# Launch Meta Ad Campaign
- Own the conversation from intent to a correctly configured **paused** Meta campaign. Inspect the brand's existing work first, collect only missing facts, validate the destination, present one exact plan, and hand it to the human approval surface. Never claim a Meta write succeeded until the saved objects have been read back.
-
- ## Safety boundary
-
- - `prepare_meta_ad_push` saves a proposal and creates nothing in Meta.
- - Only the approval page returned by that tool can create Meta objects. The coworker cannot approve its own plan.
- - Approval creates the campaign, ad set, creatives, and ads **PAUSED**. Do not call this “live.”
- - Activation is a separate UI action that requires the human to type `GO LIVE`. Never infer that permission from chat and never activate during a test.
- - A decline is final for that push. Do not prepare a replacement unless the user asks to change or retry the plan.
-
- ## 1. Resume before starting over
-
- If the conversation already contains a `push_id`, call `get_meta_push_status` first. Use the persisted budget, schedule, audience, destination, creative, and approval state; do not ask for them again and do not create a duplicate push.
-
- ## 2. Inspect existing Goose and Meta work
+ Guide the user from campaign intent to either a verified **paused** Meta campaign or a complete campaign plan. This skill is agent-neutral: choose the best available adapter, but keep one safety workflow and one approval boundary.
- Before proposing a new campaign:
+ ## Choose one mode
- 1. Use `campaign_read` and `ads_creative_read` to understand the current Goose campaign, approved creative, and reusable renders. Keep the first creative read bounded to `status: "published", limit: 10`; if none are published, say so and inspect at most five review candidates. Fetch full render detail only for the 2–3 candidates under consideration. Never dump the full creative library into the conversation.
- 2. Use `get_meta_sync_status`, `get_meta_account_summary`, and `list_meta_entities` to inspect the connected account and its campaigns, ad sets, and ads.
- 3. For every current Meta ad that could be reused or overlaps the proposed work, call `get_meta_ad_context`. Treat its evidence map as the trustworthy dossier for Meta facts, Goose provenance, current creative identity, Facebook Page identity, optional Instagram actor identity, performance, and approval history. Reuse that identity for a new launch when it matches the requested brand; do not ask the user for an opaque Page ID already present in the dossier. If it reports `conflict` or `stale_creative`, do not attribute that ad's results to the old Goose creative.
+ Use the first available mode:
- Then explain which path you recommend:
+ 1. **GooseWorks adapter** when all GooseWorks launch tools are callable. Read [references/gooseworks-adapter.md](references/gooseworks-adapter.md).
+ 2. **Direct Meta adapter** when a valid Meta token and ad-account access are available. Read [references/direct-meta-adapter.md](references/direct-meta-adapter.md) and use the bundled `tools/meta_marketing_api.js`.
+ 3. **Planning-only fallback** when neither write adapter is available. Read [references/planning-only.md](references/planning-only.md). Produce a useful plan; do not present missing write access as a failed planning task.
- - **Reuse an existing ad set** when its objective, geography, audience, schedule, and optimization already fit the user's intent.
- - **Create a new campaign** only when the user has explicitly chosen a separate Traffic test and overlap with current work has been explained.
+ If both write adapters are available, prefer GooseWorks because its approval page, creative links, and recovery records are already integrated. Never mix adapters within one launch.
- Do not build another account-context system or reconstruct performance from unrelated calls when `get_meta_ad_context` can answer the question.
+ ## Universal workflow
- ## 3. Collect only missing decisions
+ ### 1. Resume or inspect before asking
- State what is already known, then ask for the missing items in one compact prompt:
+ - Resume any existing launch record or push first. Never duplicate a partially completed launch.
+ - Inspect existing campaigns, ad sets, ads, and relevant creative before recommending a new structure.
+ - Explain whether the intent fits reuse or needs a new campaign. Do not create a second context system when the selected adapter already provides one.
- - desired result and objective;
- - total budget and duration or account-local start/end dates;
- - destination URL;
- - geography selected by the user;
- - audience approach;
- - optimization goal and bidding approach;
- - 2–3 approved creative renders and the Facebook Page identity (plus Instagram identity when relevant).
+ ### 2. Collect only missing decisions
- For the initial new-campaign path, the supported configuration is deliberately narrow:
+ State what is known, then ask once for the missing budget, account-local schedule, destination URL, result/objective, bidding and optimization, geography/audience, placements, tracking, Page/Instagram identity, and creative/copy.
- - Traffic objective only;
- - one campaign, one ad set, and 2–3 genuinely different ads;
- - total/lifetime budget with start and end in the Meta account timezone;
- - broad country targeting selected by the user;
- - `LANDING_PAGE_VIEWS` when the rendered destination has working Meta tracking, otherwise `LINK_CLICKS` with that limitation stated plainly;
- - `IMPRESSIONS` billing and `LOWEST_COST_WITHOUT_CAP` bidding.
+ Do not silently approximate unsupported objectives, special-ad-category handling, targeting, bid controls, or tracking. Planning-only mode may still design these configurations even when the available write adapter cannot create them.
- If the requested new campaign needs another objective, special-ad-category handling, detailed interests, bid caps, or multiple ad sets, explain that the first production path does not support it. Do not silently approximate it.
+ ### 3. Validate before any write
- ## 4. Prepare and validate
+ - Render or inspect the final destination, follow redirects, require public HTTPS, and confirm the approved host.
+ - Check message and claim match, one clear CTA, tracking/pixel availability, and obvious broken-page states.
+ - Run Meta policy review for the objective, audience, copy, creative, destination, and special-category implications.
+ - Block hard destination or policy failures. Show non-blocking warnings plainly and explain any optimization fallback.
- Call `prepare_meta_ad_push` only after every required decision is present. The tool renders the destination before saving the plan and blocks invalid/unreachable URLs or unsafe redirects. Treat message/claim mismatch, unclear CTA, and missing pixel as visible warnings; never hide them. A prepare failure means nothing was created in Meta.
+ ### 4. Prepare one exact plan
- Use `EXISTING_AD_SET` only for a user-selected compatible ad set. Use `NEW_CAMPAIGN` only for the constrained configuration above. Pass the current Goose campaign ID so the Meta push remains permanently linked to its source campaign.
+ Summarize in human language:
- ## 5. Present the approval handoff
+ - campaign name, objective, special category, and paused status;
+ - ad set names, budget type and amount, account timezone, dates, geography, audience, placements, optimization, and bidding;
+ - every ad, creative, Page/Instagram identity, copy, CTA, and destination;
+ - what is reused versus created, destination/policy results, warnings, and tracking assumptions.
- After preparation, summarize in plain language:
+ Persist the exact plan before asking for approval. A changed plan requires validation and approval again.
- - campaign name, objective, and paused status;
- - ad set name, total budget, account-local dates, countries, audience, optimization, and bidding;
- - each ad and its creative;
- - destination, CTA, rendered-page checks, and every warning;
- - what will be created and that none of it will spend while paused.
+ ### 5. Obtain explicit human approval immediately before writing
- Then give the returned approval URL/card and say: “Review this exact plan and choose Approve paused launch or Decline.” This is the explicit permission immediately before the Meta write. Do not execute the push from chat.
+ Preparation, inspection, validation, and planning are read-only. They do not authorize a Meta write.
- ## 6. Resume after approval
+ - GooseWorks mode uses the returned approval page/card. Chat cannot approve a GooseWorks push.
+ - Direct Meta mode requires an explicit user confirmation for the exact paused plan immediately before the publish command.
+ - A decline or missing confirmation means **no write**.
- When the user returns, call `get_meta_push_status` with the existing `push_id`.
+ Never activate ads automatically. This skill has no direct-activation step.
- - `COMPLETED`: report every campaign, ad set, creative, and ad ID; confirm readback showed all objects paused.
- - `PARTIAL` or `FAILED`: say exactly what failed, list every object that was created, confirm its paused state, and repeat `next_action`. Retry only the failed scope after the user asks.
- - `CANCELED`: say nothing was created in Meta.
- - `AWAITING_APPROVAL`: link the same approval page again; do not prepare another push.
+ ### 6. Create paused, persist, and read back
- Never describe a create response alone as success. Success requires Meta readback of names, ownership, objective, budget, schedule, geography, optimization, bidding, destination/creative identity, and `PAUSED` status.
+ - Create campaign, ad set, and ads only with `PAUSED` status.
+ - Persist each returned ID immediately so interruption and partial failure are recoverable.
+ - Read every object back from Meta. Report success only after names, parent links, objective, budget/schedule, targeting/optimization, creative/destination identity, and paused state match the approved plan.
+ - On failure, list what failed, every object already created, its verified status, and the exact next action. Resume from persisted IDs only after renewed user approval; never recreate completed steps.
## Final response
- End with a compact run record: what was reused or created, the exact configuration, destination-preflight result, Meta IDs, paused/readback status, warnings or failures, and the next human action. The normal stopping point is “ready in Meta, paused, spending nothing.”
+ End with the adapter used, inspection/reuse decision, approved configuration, destination and policy result, Meta IDs, readback status, warnings or partial failures, and the next human action. The normal write-mode stopping point is: **ready in Meta, paused, spending nothing**.