Anatomy of a ChatGPT local answer

Anatomy of a ChatGPT local answer

Someone asks ChatGPT which HVAC company in Austin is best. On screen, they get a map with a handful of businesses, paragraphs about them and, recently, an ad up top. It arrives as one answer, though six separate steps build what they see.

We spent the past month taking that answer apart. We first collected 44,988 answers through a scraper, then captured the raw payload delivered to a logged-in browser. We used both sources because their contents differ. The figure tags each part of the answer with the step that produced it.

Who is the best HVAC company in Austin, TX?

Step 1

Advertiser nameAd

Ad headline

Ad description

Step 6
Business name 4.6Business categoryOpen
Business name 4.6Business categoryOpen
Step 5

Business name Answer text about this business.

Business name Answer text about this business.

Step 1

It rewrites your question

ChatGPT searches with a query it writes itself, using different words from the question you typed. The payload carries that query in a field called map_search_model_queries. We captured three on September 23, each beside the question that produced it.

"Who is the best roofer in Phoenix, AZ?" went out as "best roofers Phoenix AZ reviews roofing contractors." "Who is the best HVAC company in Austin, TX?" went out as "best HVAC companies Austin TX reviews licensed AC repair." "Who is the best plumber in Raleigh, NC?" went out as "best plumbers Raleigh NC reviews licensed plumber."

The word "reviews" appeared in all three queries, though nobody on our side typed it. "Licensed" appeared in two. ChatGPT read "best" as reviewed and licensed, then searched on those words. For your business, the query you have to match is the one ChatGPT wrote, and the person asking never sees it.

You typed

Who is the best HVAC company in Austin, TX?

ChatGPT sent

map_search_model_queries

best HVAC companies Austin TX reviews licensed AC repair

Added by ChatGPT

For the same prompts on the same day, the logged-in browser got the rewritten query on 95% of responses. The DataForSEO scraper returned nothing for that field on 95% of them.

Step 2

It looks up listings and searches the web

The map card comes from a places lookup. ChatGPT queries an index of business listings and gets records back, much as a maps app does. That's a separate task from reading web pages and summarizing them.

The places lookup and a normal web search travel in the same call. In all 100 captures from September 8 and 10 where we could see the call itself, ChatGPT sent the lookup and web search in a single request. One call from September 10 is shown as it was sent.

Business lookup

business|Austin, TX, USA|best plumbers;top rated plumbers;emergency plumbers

Web search

fast|best plumbers Austin TX reviews 2026|30

The lookup line contains one to four category phrases ChatGPT wrote itself, and some include words that weren't in the question. "Top rated" appeared in 12 of the 100 lookups, though the questions behind those lookups didn't contain it. The web search line also picks up added words. "review" appeared in 70 of the 111 web queries, while none of the 100 questions contained it.

In our census of 27,405 local answers, the card appeared in 95.4%. In a same-day check using a real browser, 57 of 60 prompts showed a card.

Index of business listings

95.4%Of 27,405 local answers in our census carry the card

57 of 60Prompts run through a real browser the same day carried one

We can't name the supplier of the listings index. The business details in those rows closely track Google's listing data, but nothing we can capture identifies the provider.

Step 3

Each business comes back as 57 fields

Every business on the card comes back as a record with 57 fields. We checked 173 business records across 16 captures taken September 23, and all 173 had the same 57 fields.

A ChatGPT places card on an Austin map with placeholder business details, its eight visible parts labeled with their payload field names: name, latitude, rating, longitude, image_url, is_open, provider_logo_url_short, and categories.

Only eight of those fields are drawn on the card. For the same business, the DataForSEO scraper, which much of the industry measures with, returns nine fields.

In the logged-in payload

Business name57 fields

  • id
  • entity_key
  • entity_lookup_id
  • provider
  • provider_url
  • provider_logo_url
  • provider_logo_dark_url
  • provider_logo_url_short, drawn on the card
  • provider_logo_dark_url_short
  • name, drawn on the card
  • latitude, drawn on the card
  • longitude, drawn on the card
  • distance_meters
  • ranking_score
  • rating_scale
  • address
  • description
  • description_cite
  • image_url, drawn on the card
  • image_urls
  • provider_images
  • reconciled_thumbnails
  • selected_images
  • rating, drawn on the card
  • review_count
  • reviews
  • review_highlights
  • price
  • price_str
  • categories, drawn on the card
  • website_url
  • hours
  • is_open, drawn on the card
  • next_open_hour
  • phone
  • is_closed_permanently
  • is_closed_temporarily
  • rank
  • country_code
  • country_name
  • city
  • state
  • zipcode
  • location
  • tags
  • attributes
  • is_claimed
  • date_opened
  • date_closed
  • special_hours
  • menu
  • yelp_menu_url
  • popularity_score
  • reservation_providers
  • service_providers
  • enriched_description
  • from_cache

8 drawn on the card

Through the scraper

Business name9 fields

  • type
  • title
  • description
  • address
  • phone
  • reviews_count
  • url
  • domain
  • rating

The other 49 fields include whether the listing is claimed, its hours, review highlights, a quote-request link, and a ranking score. One field, provider_logo_url_short, holds a small image URL that records the source of the star rating. Among card rows with a Yelp logo, 15 of 16 were exact matches to Yelp's own rating and review count. No rows without that logo matched Yelp's own rating and review count exactly.

That field lets us identify each business's rating source. Yelp is the top rating source among businesses on the card, ahead of every other source, though its exact share changes with the list being counted.

Step 4

The records split into three lists

What looks like one card holds three distinct lists of businesses. The lists differ so much that a pooled figure describes none of them.

Rows captured across 60 prompts, one square per row

One set in the scraper

215 On the card

27.9% Carry the Yelp rating logo

390 Behind the Expand control

52.1% Carry the Yelp rating logo

53 Only in the prose

0% Carry the Yelp rating logo

40.0%Carry the Yelp rating logo when all 658 rows are pooled

The scraper merges the map card with the pool behind Expand into one set, so all the figures we published about "the card" in our census describe the Expand pool, a separate list from the businesses on screen. As far as we can tell, the same is true of all figures others have published from that source. For our only direct check, we hand-counted one rendered page for a single prompt and saw five businesses before Expand. When we sorted the data from that capture, five businesses were in its map list.

Step 5

It writes the answer from other sources too

ChatGPT's prose paragraphs often name businesses that don't appear on the card at all. Among answers with a card, 70.4% name at least one business in the prose that isn't on that answer's own card.

Business nameAnswer text about this business. Business site

Business name not on the cardAnswer text about this business. Directory

Business nameAnswer text about this business. Directory

Directories account for a large share of the sources behind those answers, and in our census, the most common domains behind local answers were angi.com, expertise.com, bbb.org, and reddit.com. Among answers with a card, directories made up 29.9% of cited sources, while business websites made up 56.5%. In answers where both retrieved and cited URLs were visible, directories accounted for 39.8% of retrieved URLs and 29.9% of cited URLs, so ChatGPT fetched directory pages it didn't use.

In the logged-in captures, search results and answer citations appear as separate lists that let us compare what ChatGPT retrieved with what it cited. Across 116 logged-in captures, about a fifth of retrieved pages were cited, and the median answer retrieved 12 distinct visible pages and cited 2.

12 pages retrieved, 2 cited

Cited

Directories vary widely in how often they get cited. Thumbtack and Expertise.com were each retrieved in 45 answers. Expertise.com was cited in 24 of those answers and Thumbtack in 2.

Step 6

An ad can sit on top

On September 8, we captured 63 logged-in ChatGPT payloads and found no ads in any of them. On September 23, we used the same account, free tier, and method and saw an ad on 10 of 16 local answers.

The ChatGPT payload records an ad through a single field on the user's own message, the ad_delivered flag. The ad itself never appears in the captured data. The rest of the message metadata matches across both dates, so the September 8 zero wasn't a recording gap.

Hours later, DataForSEO's scraper ran the same 16 questions. It reported no ads on any of them.

A field on your own message

ad_delivered: true

Local answers with an ad, one square per answer

September 2310 of 16

September 80 of 63

Scraper, same 16 questions0 of 16

If you track AI visibility through that scraper, ChatGPT ads on local answers appear to vanish in late August and stay near zero. In a logged-in browser, ads appeared on over half of the answers to those same questions.

Lead-generation marketplaces bought six of the 10 ads, three from Thumbtack and three from Angi. The other four came from businesses and brands, including an Austin HVAC company and a Raleigh plumber.

Only one of the 10 advertisers also appeared in the organic card beneath its own ad. Directories account for 29.9% of cited sources on these answers, and they're now buying the ad slot above them too.

Thumbtack bought three of the 10 ads. Across our three samples, totaling 116 logged-in captures, ChatGPT retrieved Thumbtack in 45 answers and cited it in two.

What we still can't tell you

Every row on the card has a ranking_score, but the card's display order doesn't follow it. The popularity_score field sits next to it and has been blank on every row we've captured so far. Neither field has documentation.

We can tell you the card exists, how often it appears, what arrives for each business, which of the three lists a number refers to, and where each star rating came from. We can't yet tell you what puts a business on the card or higher up it. Fields that might explain that are in the payload, and modeling them is our next project.

Subscribe to the newsletter