agentleFS
devaimanidevaimani/openai-ads-mcp/skills/ads-campaign/SKILL.md

ads-campaign

Skill0 starsChanged 2 months agoMITView on GitHub

Build a complete OpenAI Ads campaign — from clarifying the goal through structure, bidding and copy to creating everything through the MCP server. Use this skill when a campaign should be created, planned, set up or launched.

The file

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 4 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈4

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Ask one topic at a time, conversationally.

    line 22
  2. Distinctive:

    Start cautiously, err low

    line 72
  3. Distinctive:

    Only once the preview and the review are in order.

    line 102
  4. Distinctive:

    Do not intervene immediately.

    line 117

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Building a campaign

Three stages in order: clarify, decide, create. The first is not skipped — without it you get campaigns whose results cannot be interpreted.

1. Clarify

Ask one topic at a time, conversationally. Skip anything already answered earlier in the conversation.

  1. Goal. One, not three. Leads, appointments, sales or awareness? This determines bidding_type, which is immutable afterwards.
  2. Offer. What exactly, for whom, at what price, on which landing page?
  3. Proof. Three to five concrete anchors: numbers, timeframes, references. These carry the ad copy later.
  4. Differentiation. Often sharpest as a negative: without an IT department, without a contract term.
  5. Intents. Three to six clearly separated conversational situations. Each becomes an ad group.
  6. Area. Nationwide or restricted? Can the service be delivered remotely?
  7. Budget. Total, and a daily cap if wanted.
  8. Measurement. Is conversion tracking in place? Settle this before the first campaign — without it you cannot switch to conversion optimisation later.

Invent nothing. Mark what the user does not know as open and move on. An incomplete draft beats a fabricated one.

2. Decide

Choosing the bidding type

Goalbidding_typeRequirement
Clicks, gathering first dataclicksnone
Conversionsconversionsenabled account, exactly one active standard event, active source
Awarenessimpressionsnone

For a start without measurement history: clicks. Conversion optimisation needs data that does not exist yet. And since bidding_type is immutable, the later switch means a new campaign anyway — so nothing is lost.

Structure

  • One campaign per goal and bidding type
  • One ad group per intent, with 10 to 25 context_hints
  • Two or three ads per group, each with a different angle

Show the structure and confirm it before creating anything. Corrections are free at this point and expensive later.

Setting the bid

There are no benchmarks for this platform, so do not guess:

  1. Derive the maximum tolerable CPA from the business model (see ads/references/benchmarks.md)
  2. Start cautiously, err low
  3. Adjust after two weeks using real numbers

Click prices from search advertising are not a reference point. Different auction, different participants. Transferring them means adopting a number with false precision.

3. Create

Everything is created paused. Nothing spends until explicitly activated.

get_account                → check currency, timezone, review.status
check_feature_access       → what is enabled?
search_geo(...)            → location IDs
create_campaign(...)       → paused
create_ad_group(...)       → paused, with context hints
upload_creative(image_url) → file_id
create_ad(...)             → paused, enters review
preview_ad(ad_id)          → look at it (valid 24 hours)

Validate the copy before create_ad:

uv run python scripts/validate_creative.py --title "..." --body "..."

Activating

Only once the preview and the review are in order. Top down:

set_campaign_state(id, "activate")
set_ad_group_state(id, "activate")
set_ad_state(id, "activate")

Delivery requires all three levels to be active.

On a first campaign, activate one ad group, not all of them. Watch for two or three days, then add the next.

Afterwards

Do not intervene immediately. The first days fluctuate heavily, and every change resets measurement.

  • Days 1–3: observe only. Is delivery starting? Are ads serving or stuck in review?
  • Days 4–14: let it run. Intervene only for something clearly broken — an ad rejected, the budget gone in a day, zero impressions.
  • From day 14: assess, using ads-audit.

Common mistakes

MistakeConsequence
bidding_type: conversions without measurementCampaign cannot optimise; switching requires recreating it
All hints in one groupResult cannot be interpreted
Activating everything at onceIf something goes wrong, the cause is unclear
Adjusting after three daysToo little data; reacting to noise
Narrow area for a remotely delivered serviceAlmost no delivery
Landing page uncheckedRejection with a crawler_* reason

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.