conversational-ads

v2026.09.24

Plan, write and measure ads inside AI assistants and AI search (ChatGPT Ads, Google AI Overviews and AI Mode, Microsoft Copilot). Use when testing ChatGPT ads, answer-adjacent copy, or incrementality for AI placements.

GitHub
安装命令
npx skhub add borghei/conversational-ads
Markdown
SKILL.md

Conversational Ads

Paid placements next to AI answers: ChatGPT Ads (test began February 2026, self-serve Ads Manager since May 2026), Google ads in AI Overviews and AI Mode, and ads in Microsoft Copilot. This skill covers what is different from search, which platforms your category and market can use, how to write copy that sits next to an answer without borrowing its authority, how to get feeds and landing pages ready, and how to prove incrementality when two of the three platforms give no placement-level reporting.

Platform facts are as of September 2026 and come from each platform's own help pages — see references/platform-specs.md. These products change monthly; re-check the linked pages before committing budget.


When to use this skill

SituationUse
"Should we test ChatGPT ads?" / first AI-placement testscripts/conversational_ad_planner.py + test-plan template
Writing ad copy for ChatGPT, AI Overviews, AI Mode or CopilotCreative rules below + scripts/answer_adjacent_copy_linter.py
Explaining why AI Overviews spend can't be reported or turned offplatform-specs.md
Measuring whether AI placements add conversionsMeasurement workflow + playbook §5
Earning organic citations in AI answers (not paid)Out of scope — this skill is paid media only
Labelling AI-generated creativeOut of scope beyond a lint warning — use a disclosure/compliance process

Clarify First

Before planning, confirm these inputs. If any is unknown or vague, ASK — do not assume:

  • Category and markets/language — sensitive categories are excluded on ChatGPT and AI Overviews, and AI Overviews ads are English-only in 12 countries
  • Monthly budget and target CPA — decides how many platforms can be tested with a readable holdout (≥50 conversions per arm)
  • Real customer prompts — 20-50 questions people ask assistants, tagged research / compare / purchase / support
  • Measurement readiness — server-side conversions and the ability to hold out regions; without these the test cannot be read

Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the plan.


Quick start

# 1. Plan: eligibility, mix, holdout test, KPI targets, readiness (exit 2 = blocked)
python3 scripts/conversational_ad_planner.py assets/sample_plan_input.json
python3 scripts/conversational_ad_planner.py my_brief.json --format json --min-conversions 100

# 2. Lint copy before upload (exit 2 = errors; --strict fails on warnings too)
python3 scripts/answer_adjacent_copy_linter.py assets/sample_ad_copy.json

# 3. Fill assets/test-plan-template.md and freeze it before launch

The shipped samples fail on purpose: the planner exits 2 because the Copilot arm is underpowered at USD 12,000/month and a USD 60 CPA; the linter exits 2 with 10 errors across three broken ads (assistant-endorsement copy, unsubstantiated "clinically proven", over-length Google headline, unverified testimonial, http landing URL). Two ads pass clean.


How conversational placements differ from search [RECOMMENDED]

Search adAnswer-adjacent ad
IntentShort queryWhole conversation + the answer's content
ControlKeywords, placementsBroad matching; Google and Microsoft: no opt-out, no placement targeting
ReportingBy placementChatGPT: own reporting. Google: counted as Top ads, no AI segment. Microsoft: no Copilot metrics
Creative jobBeat nine other linksAdd a useful fact the answer lacks
Main riskLow CTRLooking like you hijacked a trusted answer

Position: optimise inputs (feed, assets, landing pages, negatives) and read outcomes with holdout experiments. Do not try to optimise a placement you cannot see.


Platform snapshot (as of September 2026)

ChatGPT AdsGoogle AI Overviews / AI ModeMicrosoft Copilot
How to buyDirect, Ads Manager (beta), CPC or outcome biddingIndirect: Search with broad match / AI Max, Shopping, PMaxIndirect: PMax, Search with logo, Shopping, Multimedia, some vertical ads
Who sees adsLogged-in adults on Free and Go plans; not Plus/Pro/Business/Enterprise/Edu; not Temporary ChatsEnglish queries in AU, CA, IN, ID, KE, MY, NZ, NG, PK, PH, SG, US (AI Overviews)Copilot users; negative keywords apply
ExcludedNear health, mental health, politics; several categories disallowed; finance/health/legal by manual approvalAdult, alcohol, gambling, finance, healthcare, politics and moreBing policies; ads not shown in flagged conversations
MeasurementPixel + Conversions API, UTMs, macrosBlended into Top adsSearch term + asset reports only
CopyTitle 16-24, copy 32-48 chars (recommended)RSA 30 / 90 chars (limits)RSA 30 / 90 chars (limits)

Perplexity: 2024 ads experiment announced; current availability unverified — excluded from the planner.


Workflows

Workflow: first test plan

  1. Collect prompts and tag each with a stage and a weight (relative volume or value).
  2. Write the brief (assets/sample_plan_input.json shows every field).
  3. Run the planner. Resolve BLOCKERS first: drop a platform, raise budget, extend weeks, or install tracking.
  4. Resolve READINESS items marked MISSING — landing pages that answer the prompt and a clean feed matter more than bids. [RECOMMENDED]
  5. Copy the plan into assets/test-plan-template.md, pick treated and holdout regions, and set the freeze window.

Workflow: copy for answer-adjacent placements

  1. One prompt cluster → 5-10 variations, each with a different angle (spec, price, delivery, fit, compatibility). OpenAI recommends many diverse variations.
  2. Lead with a checkable fact; end with a specific soft CTA ("Compare widths").
  3. Run the linter. Fix every ERROR; review WARNINGs — ChatGPT length ranges are recommendations, not limits.
  4. Record evidence for any claim you keep in substantiated_claims.

Workflow: measurement

  1. Server-side conversions on each platform, deduplicated.
  2. UTMs with utm_medium=cpc so paid clicks stay out of GA4's organic AI Assistant channel.
  3. Geo holdout (10-20% of matched regions) or time-based on/off if regions are too few. [RECOMMENDED]
  4. Two-week learning period, then freeze. Read at week 6: incremental conversions, incremental CPA, brand-search lift.
  5. Decide: scale if incremental CPA ≤ target; iterate inputs if within 30%; stop otherwise.

For Google and Microsoft, the holdout measures the campaign change that made you eligible (e.g. moving to broad match / AI Max / PMax), not the AI placement alone. State that in the readout.


Exit code contract [PROVEN]

CodePlannerLinterWho fixes it
0Plan produced, no blockersNo errors (warnings allowed unless --strict)Nobody
1Tool error — bad path, malformed JSON, missing fieldTool error — bad path, malformed JSON, unknown platformWhoever maintains the input file
2Blocked — no eligible platform, no conversion tracking, or an underpowered armGate failed — errors (or warnings with --strict)Media planner / copywriter

Anti-Patterns

Borrowing The Assistant's Voice

Mistake: "ChatGPT's top pick", "Recommended by Copilot", copy styled to look like the answer. Why it happens: The answer carries trust and teams want some of it. Instead: Ads are labelled Sponsored and separated from answers by design, and OpenAI's ad policies prohibit false endorsements. Lead with a fact the answer lacks. The linter blocks this pattern.

Reading Platform ROAS As Incrementality

Mistake: Scaling on platform-reported conversions in week 3. Why it happens: It is the only number available, and Google/Microsoft do not isolate AI placements. Instead: Build the holdout before launch and decide on incremental CPA.

Budgeting A Placement You Cannot Buy

Mistake: A media-plan line called "AI Overviews" with its own budget. Why it happens: Plans expect one line per placement. Instead: On Google and Microsoft, fund the underlying Search broad / AI Max / Shopping / PMax campaigns and test the change that made you eligible.

Spreading A Small Budget Across Every Assistant

Mistake: A few thousand dollars split three ways for a four-week test. Why it happens: Fear of missing the next channel. Instead: Concentrate until each arm can reach ~50 conversions. The planner exits 2 on underpowered arms.

Feed Neglect

Mistake: Polishing creative while product titles lack the attributes people ask about and prices lag the site. Why it happens: Feeds belong to another team. Instead: Treat the feed as creative. Audit the top SKUs against real prompts and use delta feeds for price and availability.

More in references/anti-patterns.md.


Troubleshooting

SymptomLikely causeFix
Planner says Google ineligible for a US brandlanguage not en or category in excluded listCheck brief; plan classic search for excluded categories
Every arm UNDERPOWEREDBudget/CPA too low for three armsDrop to one platform or extend test_weeks
Linter flags a claim you can proveClaim not listed in substantiated_claimsAdd the exact term once evidence is on file
Linter misses a restricted termCategory regexes are deliberately conservativeExtend CATEGORY_TERMS for your vertical
GA4 shows paid ChatGPT clicks under "AI Assistant"Missing utm_medium=cpcAdd UTMs or platform macros to every destination URL

Scripts

ScriptPurpose
scripts/conversational_ad_planner.pyBrief → eligibility, placement mix, holdout test plan, KPI targets, readiness, blockers
scripts/answer_adjacent_copy_linter.pyAd copy → length, claims, assistant-endorsement, category, pressure, CTA, URL/UTM, price, testimonial, AI-media and style checks

Both: Python 3.8+ standard library only, --format text|json, deterministic.

References

  • platform-specs.md — ChatGPT Ads, Google AI Overviews / AI Mode, Microsoft Copilot, Perplexity status, GA4 AI Assistant channel; official links
  • conversational-ads-playbook.md — differences from search, planning sequence, channel roles, creative rules, test designs, KPIs, risks
  • anti-patterns.md — extended anti-pattern catalogue

Assets

  • assets/sample_plan_input.json — planning brief (exits 2: underpowered arm)
  • assets/sample_ad_copy.json — five ads, two clean and three broken (exits 2)
  • assets/test-plan-template.md — hypothesis, prompts, eligibility, design, power, KPIs, readiness, readout
发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

Sep 24, 2026

分类

未分类

许可证

NOASSERTION

源路径

marketing/conversational-ads

默认分支

main

最新提交

f308cbd

Tree SHA

d30ff9d