ChatGPT Ads Field Guide

01 Overview

CurbWaste Field Guide · June 2026

Haulers can win the answer engine in 2026.

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.

$0 Minimum spend Self-serve, since 2026-05-05
$3–5 Starting CPC bid OpenAI-recommended max 🟡
~0.91% Platform CTR Cross-industry, single-source ⚠️
Free + Go Ad-eligible tiers Go is $8/mo; Plus/Pro are ad-free
ZIP Geo grain State / DMA / ZIP, since May 2026
~5% Of users pay The 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–90 Days before the read is real 🟡 reported
$3–5 CPC starting max bid 🟡 reported
1 Verdict that matters: cost-per-booked-job vs. your LSA baseline

Confidence key: ✅ confirmed 🟡 reported ⚠️ unverified


Where it sits against channels you already know

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.

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

ChatGPT answer with a Sponsored card below it A diagram showing ChatGPT's organic answer on top and a separate, labeled Sponsored advertiser card beneath it. "who hauls away an old couch near me?" ChatGPT answer ORGANIC · UNPAID ANSWER INDEPENDENCE — SPEND CAN'T CROSS SPONSORED Reno cleanout? Next-day dumpster Driveway-safe 10–20 yd roll-offs, flat-rate. Serving Mesa AZ since 2012. whole card = 1 link →

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 + Go Tiers 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 improvement renovation moving
🟡 ~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.

  1. Embed your hint, once. Your plain-English paragraph becomes a fixed point in meaning-space.

  2. Embed live conversations, in real time. Each eligible chat gets placed in the same space.

  3. 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
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

The finest grain. Approximate a service radius by hand-picking the ZIPs you cover. 🟡 coverage incomplete

Metro-wide coverage. ~210 Nielsen markets — your reliable fallback wherever ZIP delivery is thin.

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 MB Max list size
CSV / TXT Email 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.


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.

~8 Distinct size-driven moments
~10 Jobs / $1,000 to break even

The renter is ~8 moments, each with its own size logic

  • Homeowner cleanout 10–15 yd"what size to clean out my garage?"
  • Renovation / gut-remodel 15–30 yd"do I need a dumpster for a kitchen remodel?"
  • Roofing 20–30 ydcontractor vernacular naturally excludes homeowners
  • Concrete / heavy debris 10 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

Size All-in price 7–10 day period Driveway protection Weight / overage Prohibited items Street permit Delivery 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.

~5 Jobs / $1,000 to break even
$1k–25k Estate & hoarding ticket

Distinct personas to split into ad groups

  • Single bulky itemcouch, mattress, broken fridge — same day
  • Room / garage / whole-house cleanout
  • Estate & hoarding high-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 pricing Donation / 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.

<1 Contract to clear $1,000
~$2,160 LTV / 36-mo contract (mid)

Contract-pain triggers that push a switch

  • Evergreen auto-renewalsshop near contract end
  • CPI escalators 3–8%
  • Surprise fuel fees 10–18%
  • Environmental fees 13–19%
  • New-lease setup · right-sizing · SB 1383 compliance

The vernacular split is your cleanest lock

"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.

0/50
0/100
creative.type = "chat_card"
Mesa Roll-Off Co. Sponsored
Reno cleanout? Next-day dumpster
Driveway-safe 10–20 yd roll-offs, flat-rate. Serving Mesa AZ since 2012.

Whole card is clickable · favicon + name set once at account level · "Sponsored" label is platform-applied and mandatory.

Policy linter Checking…

    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: not bzr). 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

    🟡 reported CallRail 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, not bzrcdn

    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.

    curl -X POST "https://bzr.openai.com/v1/events?pid=<PIXEL-ID>" \
      -H "Authorization: Bearer <API-KEY>" \
      -H "Content-Type: application/json" \
      -d '{
        "validate_only": false,
        "events": [
          {
            "id": "job_88231",
            "type": "order_created",
            "timestamp_ms": 1773892800000,
            "oppref": "oppref_abc",
            "action_source": "phone_call",
            "user": {
              "email_sha256": "b4c9a289323b21a01c3e940f150eb9b8c542587f1abfd8f0e1cc1ffc5e475514",
              "zip_code": "78701",
              "country": "US"
            },
            "data": {
              "type": "contents",
              "amount": 45000,
              "currency": "USD",
              "contents": [
                { "id": "20yd-rolloff", "name": "20yd dumpster", "content_type": "service", "quantity": 1 }
              ]
            }
          }
        ]
      }'

    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.

    Q2-2026

    Sources: PushLeads, LocaliQ + BlueGrid, agency case studies (self-reported), WordStream. 🟡 reported ⚠️ analogy

    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 wk Lead 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.

    Channel Role in the mix Cost / booked job Maturity (waste) % of budget
    Google LSA Foundation — highest-intent capture workhorse $45–110 🟡 reported Mature 35–45%
    SEO + GBP Cheapest long-run booked jobs — compounds, owned $10–30 🟡 reported Mature 20–30%
    Search PPC Volume workhorse; fills gaps LSA can’t cover $70–165 🟡 reported Mature 15–25%
    Angi / Thumbtack Degrading — shared leads, rising complaints $50–500 🟡 reported Mature 0–10%
    Meta / Facebook Top-of-funnel demand gen; seasonal / visual ~$30–50 CPL ⚠️ unverified Moderate 🟡 5–10%
    ChatGPT Ads New Complementary 60-day experiment — first-mover edge UNKNOWN ⚠️ unverified Very early ⚠️ 5–15%
    Google LSA35–45%

    Foundation — highest-intent capture workhorse

    Cost / job
    $45–110 🟡
    Maturity
    Mature
    SEO + GBP20–30%

    Cheapest long-run booked jobs — compounds, owned

    Cost / job
    $10–30 🟡
    Maturity
    Mature
    Search PPC15–25%

    Volume workhorse; fills gaps LSA can’t cover

    Cost / job
    $70–165 🟡
    Maturity
    Mature
    Angi / Thumbtack0–10%

    Degrading — shared leads, rising complaints

    Cost / job
    $50–500 🟡
    Maturity
    Mature
    Meta / Facebook5–10%

    Top-of-funnel demand gen; seasonal / visual

    Cost / job
    ~$30–50 CPL ⚠️
    Maturity
    Moderate 🟡
    ChatGPT AdsNew

    Complementary 60-day experiment — first-mover edge

    Cost / job
    UNKNOWN ⚠️
    Budget
    5–15% (experimental)

    A typical budget split

    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–5 Trusted 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 schemaLocalBusiness (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.orgFacebook TripAdvisorYellow PagesMapQuest Chamber 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.

    Vanity-metric trap
    Mistake 01 Judging 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.

    Hint leakage
    Mistake 02 Over-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.

    Call attribution gap
    Mistake 03 Ignoring 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.

    Killed too early
    Mistake 04 Killing 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.

    Defunding proven channels
    Mistake 05 Defunding 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

    1. 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.
    2. 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.
    3. 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.
    4. 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.
    5. 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

    1. 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.
    2. 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.
    3. 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.

    Foundation
    • 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.

    Build
    • 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.

    Optimize
    • 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.