Your customers have started asking a chatbot the questions they used to type into Google —
“what size dumpster for a kitchen remodel?”,
“who hauls an old couch same-day near me?”
In February 2026 OpenAI turned on advertising inside ChatGPT. By May it opened a self-serve platform to every U.S. business,
dropped the minimum spend to $0, and added local geo-targeting down to the ZIP code.
The honest bottom line. ChatGPT Ads is not ready to replace Google Local Services Ads,
Google Search, or your Google Business Profile. Niche volume is thin, the platform is buggy beta, and there are
no dumpster/junk-specific benchmarks yet. But your competitors mostly aren’t here — so run it as a
disciplined, well-tracked 60–90 day experiment funded with new money,
measured strictly on cost-per-booked-job. The downside is capped; the upside is a channel where you’re early.
Free + GoAd-eligible tiersGo is $8/mo; Plus/Pro are ad-free ✅
ZIPGeo grainState / DMA / ZIP, since May 2026 ✅
~5%Of users payThe Free/Go pool is your reach 🟡
02 Is it for you?
A complementary experiment — not a replacement for what already works
ChatGPT Ads is a 5–15% incremental slice you add on top of a healthy Google stack —
never a swap for Local Services Ads, Search PPC, or your Google Business Profile. The honest upside today is a
first-mover edge: your local competitors almost certainly aren’t here yet. The honest cost is a
60–90 day ramp before the signal is trustworthy. Judge it on exactly one number —
cost-per-booked-job.
5–15%Of ad budget — experimental, additive only
60–90Days before the read is real 🟡 reported
$3–5CPC starting max bid 🟡 reported
1Verdict that matters: cost-per-booked-job vs. your LSA baseline
Cost-per-booked-job, Q2-2026 junk/dumpster snapshot. Everything else is a known quantity. ChatGPT Ads is the
one row with no cost-per-job cell — that unknown is exactly what you’re paying a small budget to learn.
🟡 reported
How to read it: SEO+GBP and referrals are your cheapest booked jobs — foundations, not experiments.
LSA is your workhorse at a known, defensible cost. ChatGPT Ads is the blank cell — keep it small until it fills in with your data.
Should you run ChatGPT Ads yet?
Walk the five gates in order. Any “no” routes you to a fix-first action and stops the line.
Only an all-yes path greenlights a test. Tap any gate to expand its detail.
No → Stop. ChatGPT Ads self-serve is US-only today. Revisit when your country opens; meanwhile double down on Google/Meta. ✅ US-only
✓ Yes → continue to the next gate.
No → Stop. You can’t measure cost-per-booked-job without conversion tracking. Fix first: get a fast landing page live, install the pixel, and add call-tracking numbers (CallRail or equivalent) on every channel.
✓ Yes → continue.
No → Stop. Cheaper, proven booked jobs are still on the table. Fix first: claim/optimize GBP, get reviews flowing, scale LSA to its efficient ceiling. Maxed = cost-per-booked-job no longer improving month-over-month and you’re hitting your daily budget ceiling.
✓ Yes → continue.
No → Stop. Do not rob LSA/Search to fund an experiment with an unknown CPA. Fix first: free up genuinely additive test budget, or wait a quarter.
✓ Yes → continue.
No → Stop. Coarse ZIP/DMA-only geo means you’d pay for clicks outside your service radius. Fix first: map your billable ZIPs to available targeting. If your DMA is huge and your radius small, the waste may kill the math — wait. ✅ ZIP/DMA only
✓ Yes → greenlight.
All five gates clear — greenlight
Run a disciplined 60–90 day test, starting at the Crawl tier ($500–$2k, top ZIPs only). Never expand a losing ZIP; never graduate a tier until the prior tier’s tracking is clean and the read is real.
Commercial note: most B2B decision-makers (ops directors, property managers, GC owners) likely sit on
ad-free Plus/Pro tiers and may never see a ChatGPT ad. Reserve ChatGPT Ads mainly for residential
jobs — single dumpster rentals, one-off junk hauls — where the Free/Go audience and post-research moment line up.
Bottom line. ChatGPT Ads in mid-2026 is a legitimate first-mover experiment for residential waste jobs — and nothing more, yet.
Run it only after LSA, GBP/SEO, and tracking are solid; fund it with genuinely new money; keep it to 5–15%. If it produces booked jobs at or below your LSA/Search cost, scale through Crawl → Walk → Run. If not after a clean 90-day read, cut it without sentiment.
03 How it works
How ChatGPT Ads actually works, in plain English
Four moving parts decide whether your dumpster, junk, or hauling ad ever shows up: where the card
renders, who sees it, how the auction picks winners, and which door
you walk in. None of them work like Google Ads — so here's the whole machine, stripped to plain English.
Where the ad appears
When a user has a relevant conversation, a "Sponsored" card renders
below ChatGPT's normal answer — a lightly shaded tinted box with your favicon, business name, a short
title, a short line of copy, an optional square image, and a link.
🟡 reported
Placement diagram — answer vs. sponsored card
Answer Independence
The card is not woven into the AI's sentence. Per OpenAI's Answer Independence principle, your
ad spend has zero influence on the organic answer. You can buy a labeled placement next to the
answer — you cannot buy your way into the recommendation itself.
🟡 reported
One clickable unit. The entire card is a single link to your landing page. There is
no separate CTA button you pick — you don't choose "Learn More" or "Get Quote."
✅ confirmed
Who sees it
Ads serve only to logged-in adults on the Free and Go ($8/mo) tiers✅. Plus, Pro, Business, Enterprise, and Edu subscribers are ad-free
🟡 reported. Only ~5% of users pay — so the Free/Go pool is the overwhelming
majority, and it skews toward the price-conscious, DIY homeowners doing cleanouts who are your bread and butter.
~5%Users who pay (ad-free)
Free + GoTiers that see ads ✅
18+No ads to minors ✅
What advertisers never receive: chats, identity, precise location, or conversation themes.
No ads serve to users declared or predicted under 18. ✅ confirmed
The real reach constraint isn't the tier split — it's geo (covered next section).
The auction
It's a relevance-weighted second-price auction. You set a max bid; you typically pay just enough
to beat the next advertiser. Crucially, relevance can beat money.
Relevance beats raw bid 🟡 Digiday
A tightly-matched $3 bid can outrank a loosely-matched $5 bid.
Bid by CPC, not CPM
OpenAI recommends a $3–5 starting max bid on cost-per-click. Platform-wide click-through is
very low (⚠️ ~0.91%, Adthena — single-source, cross-industry), so CPM
buying makes you eat the risk of impressions that never click.
$3 is the practical floor. Advertisers bidding under $3 have reported getting
zero delivery. 🟡 WebFX
Which door: self-serve vs. partners
A local hauler wants self-serve at ads.openai.com — open to all U.S. businesses, $0 minimum,
no agency required. The managed partners are built for national brands.
For you
Self-serve · ads.openai.com
· Open to all U.S. businesses
· $0 minimum spend
· No agency required
· U.S.-only✅ — CA/AU/NZ haulers go through sales
National brands
Managed partners
· Criteo
· StackAdapt — $50K minimum
· Agency holdcos — six-figure IOs
04 The Mental Shift
There are no keywords
This is the part that trips up every operator who has run Google Ads. ChatGPT Ads has
no keyword bidding — no exact match, no phrase match, no negative-keyword list.
Forget everything about bidding on “dumpster rental near me.”
Unlearn this first: targeting does not rest on the words a buyer types. It rests on the
meaning of the conversation they’re having. Matching is semantic, not literal.
Targeting rests on two layers
Layer 1 · Coarse pre-filter
~200 topic clusters
A coarse pre-filter sitting under everything. The full list isn’t public, and there is
no “dumpster rental,” “junk removal,” or home-services cluster named
anywhere. You ride adjacent home-improvement, renovation, and moving clusters that overlap your demand.
home improvementrenovationmoving
🟡 ~200, single-source🟡 no hauling cluster (inferred)✅ auto-matched, no menu
You do not pick clusters from a menu — matching is automatic via conversation embeddings.
Layer 2 · The real lever
Context Hints
Each ad group gets one free-text paragraph describing the conversation you want to
appear in, written in plain English. This is the dial you actually turn.
✅ one paragraph per ad group⚠️ ~280-char cap not confirmed
The community-observed ~280-character cap is not confirmed in any reachable public doc —
treat it as a planning assumption, not a hard limit.
How the matching actually works
OpenAI embeds your hint once, embeds live conversations in real time, and serves your ad when the two are
close enough. Same meaning wins — even if the exact words never match.
01
Embed your hint, once. Your plain-English paragraph becomes a fixed point in meaning-space.
02
Embed live conversations, in real time. Each eligible chat gets placed in the same space.
03
Serve when they’re close. Distance — not a shared keyword — decides whether your card shows.
The deeper mechanics often quoted in trade write-ups — an AND pre-filter, an LLM re-ranker, and a
Contextual Relevance Score (CRS) acting as the ChatGPT equivalent of Google’s Quality
Score — are ⚠️ not independently confirmable in current public primary
docs. The crawlable developer API reference covers the pixel, CAPI, and creative specs but not these
matching mechanics, and help.openai.com 403s to bots. Treat CRS as a useful working model, not a documented fact.
Two consequences for a local business
1 · Write in your customer’s words, not yours
If your hint says “roll-off container” but the homeowner types “dumpster for my kitchen
reno,” the embedding may miss. As contexthints.com puts it: use your internal product category while the
buyer uses a different term, and you lose the match.
The embedding lands on the conversation. Write to the right column.
2 · One moment = one ad group = one tight hint
Blend three jobs into one hint and the embedding drifts and leaks. Split them into
separate ad groups so each centroid stays pinned to a single buyer moment.
One blended hint — drifts
estate cleanout + contractor debris + moving out
Centroid sits between three jobs — matches none of them well.
Three tight hints — locked
estate cleanout
contractor debris
moving out
Each ad group owns one moment — sharp matches, no leak.
Up next: the builder below turns these two rules into a finished context hint — vernacular
lock tokens, buyer grammar, and a disqualifier clause — for your exact buyer moment.
05 Hint builder
Build a paste-ready context hint
ChatGPT Ads has no keywords — one free-text context hint per ad group does all the targeting,
matched by embedding similarity (not string matching). Pick a vertical and a buyer moment, and this tool composes a
vernacular-locked hint with a “— not X” disqualifier — the only negative-targeting lever observed.
⚠️ the “— not X” syntax & ~280-char cap are prior-verification convention, not public docs
Generated context hint
0 / 280
Swap [YOUR CITY] / [YOUR METRO] for your real location before you paste. One moment = one ad group = one hint.
Lock tokens (3–4 tokens that essentially never co-occur outside this vertical)Disqualifier appended
Leak riskLow
Why this works: the match is semantic. If your hint uses a roofer’s “roll-off container” but the homeowner types “dumpster for my kitchen reno,” the embedding can miss — so write in the buyer’s words and lean on the tight lock tokens. Geo is set separately in campaign settings (US state / DMA / ZIP ✅) — the hint controls which conversations, not where.
06 Geo
The geo-targeting reality — and the honest caveat
This is the question that decides whether ChatGPT Ads is even usable for a single-market hauler. So let's be precise: what you can fence, what you can't, and the structure that actually reaches your service area.
The good news — a May 2026 change
Self-serve geo is no longer country-level only.
✅ confirmed On May 22, 2026, OpenAI added U.S. state, DMA (designated market area — the ~210 Nielsen TV markets), and ZIP code targeting. You can now fence spend to your actual haul radius. ZIP-level is actually finer than the city/radius default most local Google advertisers use.
The granularity ladder
ZIP
The finest grain. Approximate a service radius by hand-picking the ZIPs you cover. 🟡 coverage incomplete
DMA
Metro-wide coverage. ~210 Nielsen markets — your reliable fallback wherever ZIP delivery is thin.
State
Too broad for a single yard. Skip it.
The honest limits
No radius, no city name. ✅ confirmed
There is no radius targeting ("X miles around my yard") and no city-name targeting. ZIP is the finest grain. You approximate a service radius by hand-picking the ZIPs you cover.
ZIP coverage is incomplete. 🟡 reported
"Not every postal code is supported." Before you promise yourself precision, open the account and verify your ZIPs are actually selectable; fall back to DMA for any gaps.
Granular geo is U.S.-only. ✅ confirmed
Canada / AU / NZ are still country-level.
Geo and the hint run independently.
Geo is a hard campaign-level pre-filter that runs separately from your context hint. Geo narrows where; the hint still controls which conversations. You need both.
The recommended structure
From the freeagency.ai and Button Block local playbooks: layer two campaigns and back them with a custom-audience safety net.
Campaign 1
DMA — metro-wide
A DMA-level campaign for broad metro coverage. This is your dependable reach floor while ZIP delivery proves out.
Campaign 2
Hyperlocal — 8–15 best ZIPs
A hyperlocal campaign scoped to your 8–15 best ZIPs, chosen by ticket size and close rate. Skip state-level — too broad for a single yard.
Backstop
Custom-audience list
✅ launched 2026-05-14
Upload your past-customer and quoted-lead list as a custom audience. Those contacts are inherently local, so your ad reaches known service-area people even where ZIP delivery is thin — and you can exclude existing customers so budget chases new demand.
512 MBMax list size
CSV / TXTEmail or phone
+ / −Include & exclude
Raw or SHA-256-hashed. Gated rollout. 🟡 no minimum list size documented
If a tight ZIP set barely spends, widen to the DMA and let geo-named hint text and a city-specific landing page do the localizing.
Bake the metro into the hint, too
Even though ZIP targeting is a separate setting, write your metro or neighborhood into the hint text and ad copy. It helps the embedding land on local-intent conversations and doubles as a vernacular signal.
… needs a roll-off dumpster for a kitchen reno,
serving North Atlanta — not DIY trailer or self-haul.
07 Build steps
From zero to live in six deliberate steps
There is no shortcut button. Work these six in order — each one carries a gotcha that quietly kills campaigns when skipped. Click a step to expand the full detail.
Step 01
Verify the business — before anything else
Verification is a two-stage gate: account-level identity through OpenAI's third-party vendor (Persona🟡 reported), then a per-ad review of every creative and landing page before it serves ✅ confirmed. The single biggest cause of rejection for haulers is a name mismatch.
Get a US EIN. Required. Sole proprietors with no EIN are the most common rejection. Free at IRS.gov in ~10 minutes.
Legal name must match your EIN exactly. Many haulers run as a DBA or franchise where the brand name ≠ the registered entity. Match the account's legal name to the EIN character for character, then add your DBA/brand separately and keep formation/DBA docs handy.
Have a director / owner government ID ready for the identity verifier 🟡 reported — driver's license or passport. The form clears in ~5–10 minutes; approval can lag 1–3 business days (up to ~7 under signup volume).
Choose the "Local services" category✅ confirmed-eligible. Junk removal, hauling, and dumpster rental sit squarely inside it. Never describe yourself as medical-waste, financial, or legal — that routes you into restricted manual review.
Permanently locked: at account setup you pick country / currency / timezone and these cannot be changed later. Set them right the first time: US / USD / your local timezone.
Step 02
One ad group per moment — one locked hint each
There is no keyword bidding✅ confirmed. Targeting is hidden topic clusters (reportedly ~200 🟡) acting as a pre-filter, plus one free-text Context Hint per ad group matched to live conversations by similarity. The golden rule:
One buyer moment = one ad group = one tight Context Hint. Never blend moments — the match drifts and your ad leaks to the wrong conversations.
Pick your 2–3 strongest, most profitable service lines to launch — don't build all six ad groups at once (homeowner cleanout, renovation debris, roofing tear-off, estate/move-out, storm, junk removal).
Write each hint in the customer's words, not jargon. They say "haul away the junk," not "roll-off container" or "C&D tonnage."
Vernacular-lock with 3–4 tokens that essentially never co-occur outside this exact intent — this pins the match and stops drift.
Add a disqualifier clause ("— not X"). It's the only negative-targeting lever there is.
One worked, vernacular-locked hint (fictional Apex Roll-Off, Mesa AZ):
Mesa AZ homeowner cleaning out a garage, basement, or whole
house and asking what size roll-off dumpster they need, how
much it costs for a week, and whether it fits in the driveway.
Vernacular: garage cleanout, 20-yard dumpster, driveway,
weekend cleanout. — not DIY pickup-truck hauling, not municipal
free bulk pickup, not starting a dumpster business.
Geo vs. hint: set ZIPs / DMA at the campaign level to control where the ad serves; the hint controls which conversations. You need both. Working hint guardrail ~280 characters ⚠️ unverified — verify live.
Step 03
The native "Sponsored" card
The ad is a small tinted-box card rendered below ChatGPT's answer. The entire card is one clickable unit linking to your landing page — there is no separate CTA button and you do not pick "Shop now / Learn more." ✅ confirmed Your copy, not a button, has to carry the call to action.
3–50Title chars (cap) ✅
≤100Body chars (cap) ✅
1:1Square image 512px+ 🟡
Write tighter than the cap — aim ~16–24 char title / ~32–48 char body 🟡 so copy doesn't truncate at thumbnail scale. The local-service formula: city/area + ONE trust signal + ONE moment-matched benefit.
Sponsored
Reno cleanout? Next-day bin
Driveway-safe 10–20 yd, flat-rate. Mesa AZ since 2012.
Instant rejection: no ALL CAPS, no exclamation marks, no emoji-as-shouting, no "best/#1/cheapest" superlatives, no fake urgency. Never imply ChatGPT/OpenAI endorses you or mimic the assistant's voice. Every price/license claim must be true and substantiable. Don't paste your Google/Meta copy — strip the superlatives first.
Step 04
A dedicated landing page per persona
The card click lands here — and the page doubles as a targeting input (OpenAI reads it during review). One dedicated page per ad group, no nav, single CTA, with a headline that mirrors that ad group's hint.
Continue the conversation, don't restart it. Skip the "what is a dumpster" explainer — the visitor already researched in ChatGPT. Open with an 8–14 word answer-continuation headline + one concrete benefit, seeded with the same vernacular as your hint.
Tap-to-call above the fold on mobile (phone converts far better than forms), plus a same-day instant-quote or ZIP→size→contact mini-form (3–5 fields).
Show sizes & flat pricing (10/15/20/30/40-yard) in the first screen.
Trust cluster directly under the CTA: "4.8★ · 200+ reviews," licensed/insured badge, same-day badge — not buried in the footer.
Speed: LCP < 2s, mobile-first. Pages over 3s lose ~half of mobile visitors.
Crawlability is mandatory:OAI-AdsBot and OAI-SearchBot must reach the page ✅. A robots.txt disallow or Cloudflare/WAF rule silently fails ad review. Allow the UA; don't IP-allowlist (no published IP range ⚠️).
Step 05
Wire the pixel on day zero
OpenAI gives you only aggregated impression/click data — no per-conversation reporting✅. You MUST build your own closed loop or you spend blind. A conversion flowing early is also the gate to unlock conversion-optimized bidding later.
Install the oaiq base pixel in <head> on every page — it loads from bzrcdn.openai.com (with the cdn) and captures the oppref click ID.
Fire measure only on the real action, with the correct type: lead_created requires type:"customer_action" — not"form". Wrong type = invalid event.
Route every ad to a landing page with a tracked number, never a raw phone number. Reliable call attribution needs the caller to hit the site first. CallRail shipped a native ChatGPT Ads integration 🟡 reported — verify it's live in your account.
Push offline/phone wins via CAPI to bzr.openai.com (no cdn) within 24h. phone_call and offline are first-class ✅. Dedup by reusing the same event id string across pixel + CAPI under the same Pixel ID.
<!-- ChatGPT Ads pixel — bzrcdn.openai.com (NOT bzr) -->
<script>
(function (w, d, s, u) {
if (w.oaiq) return;
var q = function () { q.q.push(arguments); }; q.q = []; w.oaiq = q;
var js = d.createElement(s); js.async = true; js.src = u;
var f = d.getElementsByTagName(s)[0]; f.parentNode.insertBefore(js, f);
})(window, document, "script", "https://bzrcdn.openai.com/sdk/oaiq.min.js");
oaiq("init", { pixelId: "[YOUR-PIXEL-ID]" });
</script>
Verify before you spend: use the pixel debug:true flag and the Event Stream tab to confirm conversions land before switching to any CPA/conversion bidding objective. The __oppref cookie lifetime is undocumented ⚠️ — don't assume a 30-day window.
Step 06
Launch with a daily budget and a $3–5 CPC
No account minimum exists ✅, but there's a reported ~$3–5 starting CPC, and bids under ~$3 are reported to under-deliver🟡. Bid CPC, not CPM — the ~0.91% platform CTR makes CPM risky.
$3–5Max CPC bid 🟡
DailyBudget type (locks)
14–21Day learning ramp
Choose a DAILY budget — you can't change budget type on an existing campaign, so pick daily up front or you'll rebuild.
Size for tracked leads, not clicks. Aim for a daily budget that yields roughly 5–10 tracked leads/week to read a signal — usually well under the agency-default $100–300/day for a single hauler.
Cap ChatGPT Ads at ~5–15% of total ad budget while Google LSA / Search / SEO stay your proven workhorses. Fund this with new money.
Don't judge week one. Expect the learning ramp to run 30–50% above eventual steady-state cost. Measure cost-per-booked-job — beat Google LSA (~$120/booked job), not CTR.
Two-stage approval: even after the account verifies, every ad's title, copy, image, and landing page gets a per-campaign policy review (usually <24h). Category eligibility does not guarantee a specific ad clears review.
Work them in order. Skip step 05 and you launch blind; skip step 01's name-match and you never launch at all.
08 Verticals
Three businesses, three buyer moments
Dumpster rental, full-service junk removal, and commercial recurring hauling each map to a
different conversation, a different urgency, and a different break-even. Build one ad group per
moment below — and let the economics, not the volume, decide how hard you fund each.
01 · Self-load renter
Dumpster rental
You drop the box, the renter fills it. Priced by size + rental period; the tightest margins of the three.
~8Distinct size-driven moments
~10Jobs / $1,000 to break even
The renter is ~8 moments, each with its own size logic
Homeowner cleanout10–15 yd"what size to clean out my garage?"
Renovation / gut-remodel15–30 yd"do I need a dumpster for a kitchen remodel?"
Concrete / heavy debris10 yd clean-fill"do I need a special dumpster for concrete?"
Estate · moving · landscaping · stormstorm is high-urgency, seasonal, higher-CPC — books in 24–48h
Decision factors for copy + landing page
SizeAll-in price7–10 day periodDriveway protectionWeight / overageProhibited itemsStreet permitDelivery speed
02 · Labor + speed
Full-service junk removal
You do the lifting. The lock is labor-included + speed, priced by truck-load volume (⅛ to full), not rental period.
~5Jobs / $1,000 to break even
$1k–25kEstate & hoarding ticket
Distinct personas to split into ad groups
Single bulky itemcouch, mattress, broken fridge — same day
Room / garage / whole-house cleanout
Estate & hoardinghigh-ticket$1,000–$25,000 — worth a well-funded group
Foreclosure · eviction · tenant turnover
Move-out · post-construction · commercial/office
Strongest triggers customers voice
Same-day, 2-hr window"What won't you take"Upfront pricingDonation / recycling
Sensitive-context suppression ✅ documented
OpenAI throttles ads in conversations it reads as emotionally high-stakes — so
"after a death," hoarding, and estate threads can deliver fewer impressions
than their search volume implies.
⚠️ categorical vs. probabilistic unpublished
Fund the groups, but frame hints in neutral, logistics terms
("large-volume cleanout, multi-truck, same-week") — not grief hooks — and don't read low
volume as a broken campaign.
03 · B2B recurring
Commercial / recurring hauling
Route revenue. The defining trigger is contract pain — and it tolerates the highest allowable CAC of the three.
"Service""Front-load""Pickup frequency"not "rent a dumpster"
More B2B decision-makers may sit on ad-free paid tiers, so size volume
expectations down. But commercial clears break-even on a single contract —
it can absorb the highest cost-per-acquisition you'll allow.
How hard to fund each
Margin sets the leash
Per-sale net margin (mid) is what each vertical can pay back per booked job — and therefore the
ceiling on what a click is worth. Dumpster runs on the tightest leash; commercial on the loosest.
🟡 operator economics — recompute at launch
Build the ad group, then point each at a dedicated, message-matched landing page. The mechanics of
writing the hint that captures each moment live in Section 06; the break-even math behind these
numbers is in Budget-Calculator.md.
09 Ad preview
Type your card. Watch it land — and lint.
A ChatGPT Sponsored card is the whole creative: favicon, business name, a short title, one line of
copy, and the entire card is a single clickable link — ✅ there is no selectable CTA button.
Write it like a knowledgeable neighbor's recommendation, not a billboard. Edit the fields below and the
live mock re-renders on every keystroke, with a policy linter watching for the hard don'ts.
Whole card is clickable · favicon + name set once at account level · "Sponsored" label is platform-applied and mandatory.
Policy linterChecking…
Native, not salesy: city + one trust signal + one moment-matched benefit.
Hard don'ts auto-reject in OpenAI's per-ad review. ✅ policy-sourced
Disputed limits, reconciled: the API accepts up to 50 / 100,
but write to the tighter ~24 / 48 so copy doesn't truncate at thumbnail scale, then
expand if the live UI allows. ⚠️ lower numbers floating around are UI/blog ranges, not the cap
10 Tracking
Tracking what actually works
ChatGPT hands you only aggregated impressions, clicks, spend, and CTR
✅ no per-conversation or per-theme reporting. You will
never see which prompt drove a call. So you must build your own closed loop — and you must
judge on cost-per-booked-job, not impressions or CTR.
Confidence on the code below:✅ pulled verbatim from primary docs
(developers.openai.com/ads) and cross-verified on two fetches, 2026-06-10.
⚠️ time-sensitive — this API is weeks old; re-check before
each launch.
You get aggregates only
Impressions, clicks, spend, CTR — never the prompt that triggered them.
You build the loop
Pixel on every page, CAPI for phone & offline wins, dedup on a shared id.
You judge one number
Cost-per-booked-job — the only metric that competes with your LSA/Search baseline.
The pixel — paste in <head> on every page
Loads from bzrcdn.openai.com (note: notbzr). The init also captures the oppref
click ID into a first-party __oppref cookie for reuse on later page views.
⚠️ cookie lifetime is NOT stated in the docs — do not promise a
30- or 90-day window.
<!-- ChatGPT Ads pixel — loads from bzrcdn.openai.com (NOT bzr) -->
<script>
(function (w, d, s, u) {
if (w.oaiq) return;
var q = function () { q.q.push(arguments); };
q.q = [];
w.oaiq = q;
var js = d.createElement(s);
js.async = true;
js.src = u;
var f = d.getElementsByTagName(s)[0];
f.parentNode.insertBefore(js, f);
})(window, document, "script", "https://bzrcdn.openai.com/sdk/oaiq.min.js");
oaiq("init", { pixelId: "[YOUR-PIXEL-ID]" });
</script>
Phone tracking — non-negotiable for this phone-heavy vertical
🟡 reportedCallRail shipped a native, no-extra-cost, self-serve ChatGPT Ads integration on
June 10, 2026 — it auto-detects the oppref ID and
attributes inbound calls, texts, and form fills back to the campaign (set up with an OpenAI
API key + pixel ID, no developer). Invoca is the enterprise alternative.
Server-side Conversions API — for phone & offline / CRM-won jobs
Endpoint ✅
POST https://bzr.openai.com/v1/events?pid=<PIXEL-ID>
host is bzr, notbzrcdn
Timestamp ✅
timestamp_ms within the last 7 days and ≤ 10 min ahead — import offline / phone wins promptly.
Dedup ✅
Reuse the same string as CAPI id and pixel event_id, under the same Pixel ID.
✅action_source supports both
phone_call and offline. Set
validate_only: true to dry-run a payload without recording it.
⚠️ Rate limits, max events/request, and the success/error schema
are not surfaced in the docs.
The one mechanical catch to design around: reliable call attribution needs the
caller to hit your website first — that is where the pixel runs and CallRail
reads the oppref. A customer who calls a raw number straight from
the ad with zero web visit can only be matched weakly. So always route the ad to a
landing page with a tracked number — never drop a bare phone number in the ad.
Add UTMs (utm_source=chatgpt) so your CRM can source-label leads
regardless of how attribution resolves.
11 Economics
The bar to beat is cost-per-booked-job — not clicks.
Every other channel you run already has a known cost-per-booked-job. ChatGPT Ads is the one row with a blank cell —
finding that number is the entire point of the test. Below: where the known channels land, and the by-analogy break-even math
you can borrow until your own pixel data fills the gap.
Read this honestly. There are no dumpster / junk / waste-specific ChatGPT Ads benchmarks yet
⚠️ unverified. Every figure here is vertical-specific where flagged, otherwise general home-services applied
by analogy. All are a Q2-2026 snapshot, rising ~5–21% YoY — re-baseline against your own CallRail/CRM data quarterly.
Cost per booked job, by channel
Junk-removal benchmarks unless noted. Bars show the reported range; ChatGPT Ads has no vertical number yet.
Never quote LSA at its headline CPL.✅ confirmed
~45% of LSA leads are unbookable and booking runs ~31%, so a $50 lead is really ~$161 per booked job.
Keep ChatGPT Ads only if your tracked cost-per-booked-job competes with the right column above.
Per-vertical break-even ceilings 🟡 by analogy
Derived from the reported $3–5 CPC and assumed conversion/close rates — these are operator benchmarks, not
ChatGPT-specific results. The max CPC is the most you can pay per click and still break even on the first job:
Max CPC = Margin$/job × LPCR × CR.
Per-vertical break-even ceilings, by analogy
Vertical
Max CPC break-even
Margin / job
Derived CAC @ $4 CPC
B/E close rate
Verdict
Dumpster (1-time)
$2.40
~$100
~$167
33%
⚠️ Tight — needs repeats / higher AJV.
Junk removal
$2.30
~$48
~$83
69%
⚠️ Tight on 1st job — lean on speed.
Commercial (36-mo)
$75.60
~$2,160
~$114
1.9%
✅ Best fit — huge headroom on LTV.
Takeaway. At the reported $3–5 ChatGPT Ads CPC 🟡 reported,
residential dumpster/junk break even only on the optimistic end of conversion/close (or via repeat value),
while commercial/recurring clears break-even on a single contract and can absorb almost any CPC.
Weight budget toward the vertical whose margin most exceeds its CAC — and replace every default with your measured number after one season.
12 Seasonality
The year has a shape. Ride it.
Hauling demand is strongly seasonal, but ChatGPT Ads has no scheduler and no
keyword dayparting. Your seasonality strategy is three manual levers: shift budget
month to month, toggle moment-specific ad groups on and off, and rotate hint
vernacular to match the conversations people are actually having.
Relative monthly demand
🟡 modeled
Indexed, peak month = 100 · qualitative model from trade/operator sources
Re-baseline against your own data. These curves are
🟡 modeled from trade and operator sources, not
your market. Roughly 🟡 ~65% of residential
dumpster rentals fall in spring/summer. After one full season, redraw this against
your CallRail and CRM data — the local truth always wins.
The seasonal ad-group calendar
Build one ad group per buying moment. Lead the calendar by 3–4 weeks
— planning conversations precede the booking, so turn the spring hint on in late
February and the fall hint in late August.
Late Feb → Jun
Spring cleanout
Garage & attic purges. Turn the hint live in late February to catch the planning chatter.
May → Aug
Summer reno & moving
Remodel debris plus moving & estate clear-outs through the peak plateau.
Sep → Oct
Fall yard & storm-prep
Yard waste and pre-storm clearing. Switch the fall hint on in late August.
Nov → Dec
Holiday hosting
Pre-guest declutter and post-party haul-away as households prep for company.
January
New-Year declutter
A real January bump for junk removal. The reason you don't go dark in winter.
Mar → Nov
Contractor / trade
Run tradespeople on a flatter curve than homeowners — fewer deep troughs.
~65%Residential rentals in spring/summer 🟡
3–4 wkLead the calendar before each peak
78–96%Atlantic storm activity Aug–Oct ✅
The paused storm ad group. Pre-write and pre-approve a
storm/disaster ad group, then leave it paused so you can toggle it live
within hours of a forecast — never author a hint mid-crisis.
✅ Atlantic hurricane season runs Jun 1–Nov 30,
but ⚠️ NOAA forecasts a below-normal 2026 season.
Hold storm budget as a reserve activated on a named-storm trigger —
don't pre-commit it.
Don't go dark in winter. Cheaper clicks, fewer competing advertisers,
and genuine January declutter demand. Keep a reduced always-on baseline rather than
switching off. And remember: there's no per-theme reporting — validate
which seasonal groups actually work downstream, via lead quality and your pixel.
13 Channel mix
Where ChatGPT Ads fits beside the channels you already run
ChatGPT Ads is not a replacement for Google LSA, Search, or your Business Profile — it’s a
complementary, incremental 60-day test you bolt on top of a healthy stack. Anchor every
decision to one number: cost-per-booked-job, tagged by source in your CRM.
The authoritative guidance is blunt: “Do not defund proven channels to fund experimental
ones.” Cap ChatGPT Ads at ~5–15% of your ad budget while it proves out.
The channel-fit matrix
Six roles, six verdicts. ChatGPT Ads is the only row with a blank cost-per-job cell — that unknown is
exactly what you’re paying to learn. Confidence tagged per the kit.
Directional only — for an established hauler with a healthy Google foundation and genuine
incremental budget. If LSA isn’t maxed yet, that money belongs in LSA, not here.
SEO + GBP and referrals are foundations
They produce your cheapest booked jobs — not experiments. Build them regardless of what you do on ChatGPT.
LSA is your workhorse
Capture intent at a known, defensible cost. Max it before you fund anything experimental.
ChatGPT Ads is the one blank cell
Everything else is a known quantity. This is the unknown you’re paying to learn — keep it small until the cell fills in with your data.
The appear-twice bonus
Because ads and organic answers are separate, if you also win the organic ChatGPT recommendation
you can show up twice on one screen — an organic mention plus a sponsored card. The organic
side runs on a different mechanic (a live Bing search narrowed to 3–5 trusted sources), and ChatGPT recommends
only ~1.2% of locations, averaging 4.3★ ✅. Claim it as a cheap hedge.
The hard rule: never pull money from LSA, Search, or SEO to feed the experiment. Fund ChatGPT Ads
with genuinely new budget you can afford to “lose to learning” for 90 days — and judge it on one verdict:
does it produce booked jobs at or below your LSA / Search cost?
14 Organic (AEO)
The thing you cannot buy: getting ChatGPT to recommend you
Paid ads buy you a labeled sponsored card. They cannot buy your way into the recommendation ChatGPT writes
in its own voice. That mention is earned, not bought — and the door is brutally narrow: ChatGPT recommends
only about 1.2% of locations, averaging 4.3 stars. Here is the prioritized,
evidence-backed checklist that gets a hauler through it.
~1.2%Locations ChatGPT recommends ✅
4.3★Avg rating of recommended businesses ✅
>5%Review-response rate to stay visible ✅
3–5Trusted sources per “near me” answer ✅
A tiny door, by surface
How often a local business appears, per the SOCi 2026 Local Visibility Index (350k+ locations, 2,751 brands).
Ranking on Google does not guarantee a ChatGPT mention — only ~45% of Google local winners carried into AI results. ✅
How ChatGPT actually picks businesses (the mechanic that drives everything).
For “best dumpster rental near me” it does NOT query a single map/places database. ✅
It detects your location, rewrites “near me” into [service] [city], runs a
live Bing web search, grabs the top ~20–30 results, then narrows to 3–5 trusted sources
that show rating, hours, address, and recent reviews. You win by being the business the trusted third-party pages agree is good.
Three myths to clear before you spend a minute
The Foursquare “60–70%” myth ⚠️ disputed
“Foursquare powers 60–70% of ChatGPT local results” is an agency estimate with no OpenAI or Foursquare primary source —
the single most common error in competitor AEO kits. A real Foursquare–OpenAI Places API partnership does exist (announced Dec 16, 2024
✅), but it powers ChatGPT Search’s POI/place data — a different layer than the recommendation answer.
Claim your Foursquare listing as a cheap hedge; don’t bet the strategy on it.
llms.txt is NOT a ranking factor ✅
Across 515M+ LLM bot-traffic events, ChatGPT pickup of llms.txt was negligible (one window: 408 of 500M+ AI-bot visits).
Its real value is the agentic/coding-agent layer, not local AEO. Don’t sell it, don’t prioritize it — spend that time on reviews.
ChatGPT can’t read your GBP or Bing Places dashboard ✅
It reads what Bing has indexed. Google Business Profile and Bing Places still matter — but as public, crawlable, NAP-consistent pages,
not a private control panel. (This is why ChatGPT’s local profile-data accuracy measured only ~68% vs Gemini’s 100%.)
And no one can “submit your business to ChatGPT” — there is no such submission. Anyone selling it is selling fiction.
The prioritized action plan
Ordered by impact. Tier 1 is where the 1.2% door actually opens; later tiers make you cleanly extractable and earn the third-party trust ChatGPT cites.
Tier 1
Reputation — the lever that matters most
✅ confirmed
Get your rating to 4.3+ on Google and Yelp. Recommended businesses averaged 4.3 stars; ~3.4-star businesses were effectively invisible. ✅
Keep reviews recent. A steady drip beats a stale pile — ask after every completed haul, texting a direct review link while the truck is still in the driveway. 🟡
Respond to reviews — target >5% response rate. Sub-5% correlated with total AI invisibility. The cheapest, highest-leverage action in the whole guide. ✅
Be listed AND rated on Yelp, BBB (get accredited), Facebook, plus Yellow Pages / Angi / Thumbtack. A claimed-but-empty profile is wasted. 🟡
Tier 2
Be found & consistent on the indexed web
Claim and 100%-complete GBP and Bing Places. ChatGPT can’t read the dashboards, but the public data gets indexed by Bing — fill hours, categories, service area, services, photos. 🟡
Lock NAP consistency. Exact Name / Address / Phone, character-for-character identical everywhere. Inconsistency is a leading cause of the ~68% accuracy gap. ✅
Claim your Foursquare listing — a cheap hedge for the Places-API layer. Low effort, not the main lever; don’t over-invest on the “60–70%” myth. ⚠️
Tier 3
Make your own site cleanly extractable
Per-city service pages — one per service × city (Dumpster Rental in [City]) with neighborhoods, ZIPs, landmarks, and transparent pricing. This mirrors the “[service] [city]” string ChatGPT rewrites the query into. 🟡
FAQ blocks that mirror real ChatGPT queries. ChatGPT lifts these answers directly — write the exact questions a homeowner types, with specific, local, priced answers. 🟡
Add schema — LocalBusiness (geo + areaServed), Service, FAQPage. An enabler that helps Bing parse your page; no OpenAI confirmation it’s a ranking input. ⚠️
No paywalls; always attribute. ChatGPT skips paywalled or unattributed pages — keep service pages fully open and crawlable. 🟡
Tier 4
Earn third-party mentions — the real differentiator
Get into local “best dumpster rental in [city]” roundups and local-news / local-blog coverage. Editorial mentions on high-authority local sites are exactly what ChatGPT cites — pitch the paper’s home-improvement writer, sponsor a community cleanup and get covered. 🟡
Chamber of Commerce + local trade-association listings — additional trusted citations ChatGPT recognizes. 🟡
The trusted-source set
ChatGPT favors a recurring set of third-party sites and skips paywalled or unattributed pages. 🟡 reported
YelpBBB.orgFacebookTripAdvisorYellow PagesMapQuestChamber of CommerceLocal news & city guides
Skip / deprioritize.
llms.txt — confirmed non-factor for ChatGPT local in 2026. ✅
Don’t over-index on Foursquare based on the “60–70%” myth — claim it once and move on. ⚠️
Don’t buy “AI listing submission” packages that promise to submit your business to ChatGPT — there is no such submission.
Re-verify quarterly. This is the fastest-moving surface in local marketing. ChatGPT’s GPS location-sharing only shipped March 26, 2026 🟡, and the Bing-dependency, the Foursquare-Places split, and these thresholds are all moving. Treat these as correlations from the SOCi data, not a published formula. ⚠️
15 Failure modes
Red-team: the expensive ways this quietly fails
Most ChatGPT Ads money doesn't burn in a fire — it leaks. The platform shows you seductive
vanity metrics, hides the conversation themes that would explain them, and lets you spend for
weeks before the truth shows up in your CRM. Pre-commit your stop-loss while you're rational.
Decide your kill price before you spend a dollar, not while you're protecting sunk cost.
Confidence convention.✅ confirmed🟡 reported⚠️ unverified
Facts carry the same tags the kit assigned. This platform is weeks old and shifts weekly —
re-confirm against developers.openai.com/ads before every launch.
The five most expensive mistakes
Each one has an early-warning signal — what you'd actually see — so you catch it in
week 1, not month 3.
Mistake 01Judging the test on CTR / impressions
Dashboards surface impressions, clicks, and CTR first; booked revenue requires you
to populate amount yourself
(⚠️ reported, not enforced — integer in cents, $450 =
45000✅). The ~0.91% CTR is
by design — users keep chatting. Vanity metrics arrive instantly and are seductive.
You'd see
You're "optimizing" toward a high-CTR ad group that produces no jobs; weekly reviews talk
about clicks, never closed revenue or cost-per-booked-job.
Fix
Define success as cost-per-booked-job and ROAS from day zero. Populate
amount + currency on
order_created. Treat CTR as a diagnostic, never the goal.
Mistake 02Over-broad context hints
The hint is a conversational steer with ✅ no delivery
guarantee. A vague "we haul stuff away" leaks to moving, storage, handyman, or
out-of-market chats. The containment mechanics (AND pre-filter, re-ranker, ~280-char cap,
"— not X" disqualifier) are ⚠️ not publicly confirmable.
You'd see
Leads from outside your service area or callers asking for services you don't offer; CTR
looks fine but booked-job rate is dismal. Conversely, zero impressions after 48h
means your hint is too narrow or your ZIP set too thin.
Fix
Vernacular-lock 3–4 tokens; write the hint as a specific local-services situation;
add — not moving, not storage, not hazardous waste disqualifiers
(⚠️ best-effort, not enforced); layer exclude-audiences.
Mistake 03Ignoring call tracking
Most haul jobs close by phone — ✅ >90% of LSA-style leads are
calls. If your page shows a static number and you don't capture the
oppref click ID → fire a server-side CAPI event with
action_source: phone_call✅,
the ChatGPT-driven call is invisible. You under-credit the channel and may kill a winner.
You'd see
Pixel shows clicks but near-zero attributed revenue; the phone rings more on days you spend
but the dashboard can't prove it; ROAS looks fake-low.
Fix
Dynamic number insertion (CallRail), capture oppref, POST won
calls to CAPI. ✅ timestamp_ms must
be within the last 7 days — import phone/offline wins promptly or they're rejected.
Mistake 04Killing the test too early
CTR is low (~0.91% reported) and CPCs run ~$3–5; $1,000 ≈ 250 clicks, and at 10–25% close
rates on cold local-services leads you may see only a handful of jobs before you have signal.
Launch in a seasonal trough (Dec–Feb dumpster index ~45–50) and volume is structurally thin.
You'd see
You declare "doesn't work" after 1–2 weeks / <30 leads — a sample too small to tell an $80
CPA from a $200 CPA. You launched in the off-season and blamed the channel.
Fix
Pre-commit a minimum learning window: ≥30–50 leads OR ~$1,500–2,500 OR 4 weeks,
whichever is last. Launch into a ramp/peak month (Apr–Jun, Sep–Oct). Change one variable at a time.
Mistake 05Defunding a proven channel to feed the shiny new one
Novelty bias: a hauler shifts budget out of Google LSA / PPC / referrals — channels with a
known cost-per-booked-job (junk LSA ~$45–110 ✅🟡,
referrals ~$0–65 at 70–80% close 🟡) — into unproven
ChatGPT Ads whose true cost-per-booked-job is still unknown. The authoritative
guidance is blunt: "Do not defund proven channels to fund experimental ones."
You'd see
Total booked jobs drop or stay flat while spend reshuffles; you're comparing ChatGPT's raw
CPL to LSA's raw CPL — apples to oranges. LSA's true cost is ~$161/booked job at
~31% booking ✅, not its headline CPL.
Fix
Fund ChatGPT Ads from incremental test budget — cap it at ~5–15% of total
ad spend. Compare channels only on cost-per-booked-job and LTV, never raw CPL. Keep proven
channels at baseline until ChatGPT Ads proves a comparable booked-job cost over a full window.
Pre-committed kill criteria
Decide your stop-loss before you spend. Pull the plug — pause, don't
tinker — if any one hard stop is true after your minimum learning window. Soft
stops mean reduce/redirect, not necessarily kill.
Hard stops — pause immediately, any single trigger
Can't spend the deliverability floor. After 2 weeks, daily delivery stuck below ~20–25% of cap and widening geo + broadening the hint didn't move it. A "come back next quarter" stop, not a failure of execution.
Cost-per-booked-job exceeds your ceiling with adequate sample (≥30–50 leads OR ~$1,500–2,500 OR 4 weeks). Judge on booked jobs, never CTR/impressions/raw CPL.
Attribution is broken and can't be fixed. Phone/offline wins aren't flowing via CAPI — you cannot measure cost-per-booked-job at all. Don't scale a channel you can't measure.
Conversions don't reconcile with the CRM. Platform conversions materially exceed actual booked jobs — phantom ROAS from a dedup failure. Pause until dedup is verified.
Persistent rejection / suppression you can't clear — unsubstantiated claims, hazmat mis-classification, DBA/EIN mismatch, landing-page bot-block, or a structurally grief-suppressed ad group.
Soft stops — reduce / redirect, re-evaluate
Out-of-area leak. A material share of leads come from outside your service area via DMA/state fallback and tightening hasn't fixed it — cap budget until contained.
It's the off-season. Dec–Feb dumpster trough (index ~45–50) and CPA is high — drop to a maintenance budget, re-scale in Apr–Jun / Sep–Oct peaks.
Cannibalization, not growth. Total booked jobs flat/down while spend shifted from proven channels — redirect budget back.
Restart criteria
Re-launch a paused-for-deliverability account at a peak month, ideally after AEO groundwork lifts your organic presence.
Re-launch a storm reserve only on a ✅ named-storm trigger for your DMA.
Re-test the whole channel quarterly regardless — geo coverage, clusters, and policy shift weekly.
What is NOT a kill criterion — resist these
❌ Low CTR or low impressions alone — vanity metrics, not money.
❌ A bad first 1–2 weeks or <30 leads — under-powered sample; you can't tell $80 from $200 CPA yet.
❌ Optimistic agency benchmarks "saying it should work" — your own booked-job data overrides them.
❌ A quiet storm season — expected (✅ NOAA below-normal 2026); hold the reserve, don't force-spend it.
FTC & policy landmines
OpenAI reviews creative AND landing page with ML/LLM classifiers plus human
review ✅. The FTC requires a reasonable basis BEFORE
the ad runs for every objective claim ✅. FTC risk
has no early dashboard signal — it surfaces as a complaint or action later. Keep
documented basis on file before launch.
Substantiation before the ad runs
Pricing claims — "$99 dumpster," "from $299," "lowest price," "free haul-away," "flat-rate,"
"was $X now $Y" — each need a documented basis (rate cards, route data) on file
before launch (FTC Advertising Substantiation; Deceptive Pricing Guides, 16 CFR 233).
✅
"Free" timing rule
Never advertise a service "free" for more than 6 months in any 12.
✅ Use "free with rental" only at a genuine ~30-day
regular price.
Green Guides
"Eco-friendly / we recycle" invokes the FTC Green Guides — no broad, unqualified "green"
claims. Use specific qualified language ("we divert metal appliances to a
licensed recycler"), substantiated with your actual % diverted.
✅
"Licensed & insured"
Must be literally true — active hauler permit + coverage. False claims are an FTC penalty
offense. ✅
Reviews Rule
Only genuine, non-suppressed reviews. Fake or incentivized reviews carry civil penalties up to
⚠️ ~$53,088 / violation (2026 figure, inflation-adjusted —
re-pull at launch) under the FTC Consumer Reviews & Testimonials Rule.
Hazmat / medical mis-classification🟡 Copy promising paint, solvents, oil, batteries, tires,
propane, freon appliances, or "biohazard/sharps/medical waste" can be re-ranked by LLM
classifiers into a disallowed bucket. Keep accepted-items language conservative; add
— not hazardous waste, not medical/biohazard, not chemicals.
Two silent killers with no dashboard tell.✅ OAI-AdsBot (OAI-AdsBot/1.0; +https://openai.com/adsbot)
crawls submitted landing pages — a WAF / Cloudflare rule or robots.txt
disallow silently fails the ad. Allow the UA (rely on Cloudflare's verified-bot category), never
IP-allowlist — there's ✅ no published IP-range file. Separately,
OpenAI ✅ suppresses ads in sensitive / emotionally-vulnerable contexts —
estate, deceased-parent, and hoarding queries deliver fewer impressions than their search volume
implies, with no rejection notice. Re-frame those hints in neutral logistics terms and capture the
demand via AEO / organic instead.
↘ One-line gut check before every launch
"Can I measure cost-per-booked-in-area-job, is my window long enough to trust the
number, and have I pre-committed the kill price?"
If any answer is no, fix that before you spend.
16 Quick start
The launch checklist
Everything above, distilled into a single run-list. Work top to bottom: lock the
foundation before you launch, build the campaign once, then let the data — not the clicks —
tell you whether to scale.
01
Before you launch
Foundation, verification, and tracking — get these wrong and the rest fails silently.
Get an EIN; make your account's legal name match it exactly;
have DBA/formation docs and a director ID ready for Persona.
Verify at ads.openai.com; budget a few days. Set country,
currency, and timezone correctly — they lock.
Claim and complete your Foursquare listing and Google Business
Profile; push reviews to 4.3★+ with a
>5% response rate (foundation AEO).
Build dedicated landing pages per persona: tap-to-call above the fold,
instant ZIP price/size quote, transparent pricing, trust cluster under the CTA, sub-2s load.
Confirm OAI-AdsBot is not blocked
✅ confirmed — allow the UA, don't IP-allowlist
⚠️ unverified.
Install the oaiq pixel site-wide
(bzrcdn.openai.com/sdk/oaiq.min.js); wire
CallRail's ChatGPT integration🟡 reported
and CAPI for phone_call/offline
events. Fire one test conversion (validate_only: true).
02
Build
One campaign, structured deliberately: bid, geo, ad groups, creative.
In the campaign, choose Clicks/CPC at a
$3–5 max bid and a daily budget.
Set geo: a DMA campaign + a hyperlocal
8–15-ZIP campaign (verify ZIPs are supported). Upload your
past-customer list as a custom-audience backstop (CSV/TXT, raw or SHA-256) and
exclude existing customers.
Create one ad group per moment (cleanout, reno, roofing, estate/move, storm;
or per commercial trigger), each with one vernacular-locked hint + disqualifier
clause and your metro baked in.
Write 2–3 native ad variants per group to
3–50 char title / ≤100 char body
(write tighter, ~24/48, to avoid thumbnail truncation) — city + one
trust signal + moment-matched benefit + a specific CTA-in-copy. No CAPS, no "!", no "ChatGPT
recommends," no selectable CTA button (there isn't one).
03
Run & optimize
Patience first, then ruthless pruning — always against cost-per-booked-job.
Treat weeks 1–2 as learning. Don't read A/B tests under
~1,000 impressions/variant; don't judge under ~30
days / 50+ conversions.
Measure cost-per-booked-job against your LSA/Search/Angi numbers.
Pause the bottom ~20% of variants by CTR; rebuild on winners.
Tag every lead's service-area fit and job type to detect hint leakage.
Rotate hints/budget by season; keep a paused storm ad group ready to toggle
on a named-storm trigger.
Cap ChatGPT Ads at ~5–15% of total ad spend until tracked
cost-per-booked-job earns more.
BOTTOM LINE
This is a disciplined experiment, run beside your proven channels — never instead of
them. Let cost-per-booked-job, not clicks or impressions, be the one number that
decides whether you scale it up or shut it down.