When someone asks ChatGPT, Gemini or Perplexity "best plumber near me" or "who does emergency HVAC in Tempe," the assistant does not run a map query the way Google Maps does. It assembles an answer from what it can retrieve and verify about businesses in that area. Your job is to be retrievable and verifiable for the place and the service, in the sources these systems actually read.
This is a playbook for local business AI visibility. It covers the inputs you control, the ones you only influence, and how to tell whether any of it is working.
Start with the boring part: one name, one address, one phone number
Assistants cross-check. If your website says Suite 210, your Google Business Profile says Suite 200, and a directory listing shows an old address from a previous location, that inconsistency is a small signal that the entity is unreliable. Multiply it across fifty listings and it becomes the dominant signal.
Pick a canonical format and enforce it everywhere:
- Legal or trading name exactly as you want it spoken aloud. If you trade as "Ridgeline Plumbing" but your GBP says "Ridgeline Plumbing & Drain Services LLC," decide which one customers and assistants should use, then make the other a documented alias.
- Full street address with the same abbreviations everywhere ("St" vs "Street" matters less than being consistent).
- One primary phone number. If you use call tracking numbers, keep the tracked number off your main site and profiles, or expect the mismatch to confuse retrieval.
- Hours, including holiday exceptions, kept current in every place you list them.
This is unglamorous and it is most of the work. Nothing downstream fixes bad entity data.
Google Business Profile still anchors local answers
Google's AI Overviews are part of Google Search, so they are governed by normal Googlebot crawling and indexing. There is no separate opt-in for AI Overviews. That means your Google Business Profile, your site, and the local pack all feed the same system.
Practical items:
- Complete every field: categories (primary plus secondary), service areas, attributes, opening date, booking links.
- Post regularly, even briefly. Posts go stale, but an active profile is a live profile.
- Upload real photos of the location, team, and finished work. Stock imagery does not help anyone.
- Answer questions in the Q&A section yourself when nobody else has.
- Keep the description factual and specific: what you do, where you do it, what makes you different in operational terms (same-day service, licensed for commercial refrigeration, whatever is true).
Google Business Profile is the single highest-leverage local asset because it is both a ranking input for Search and a frequently retrieved source for assistants answering location questions.
Reviews: what gets quoted
Assistants summarizing a business tend to pull from review text, not just star averages. A five-star average with reviews that say "great service" gives a model nothing to work with. Reviews that mention the specific service, the neighborhood, and the outcome give it something to quote.
You cannot write reviews for customers. You can make it easy and natural to mention specifics:
- Ask at the moment of completion, in person or by text, with a direct link.
- In your ask, prompt for detail: "If you have a second, mention what we fixed and where you are." That is a request, not a script.
- Respond to reviews, especially negative ones, with facts: what happened, what you did. Responses are public text about your business.
- Spread reviews across Google, Yelp, and any trade-specific directory your customers actually use. Different assistants lean on different sources.
Service-area and city pages that say something
The classic local SEO failure is forty pages that differ only by city name. Assistants and search engines both discount that pattern.
A service-area page worth having includes:
- The specific services offered in that area, including anything you do not offer everywhere.
- Named neighborhoods, landmarks, or ZIP codes you genuinely serve.
- Local proof: a project in that city, a permit jurisdiction you work in, response times you actually meet.
- The nearest physical location or dispatch point, if you have one.
If you serve a metro rather than a set of towns, one strong regional page beats twelve thin ones. If you have real differences by location, say so. "We staff two crews in Mesa and one in Gilbert" is the kind of sentence a model can use.
Schema markup: LocalBusiness, done accurately
Structured data does not guarantee a mention, and no vendor can promise that. What it does is remove ambiguity about what your business is, where it operates, and how to contact it. For a local business, LocalBusiness (or a more specific subtype like Plumber, HVACBusiness, Dentist) with address, telephone, geo, openingHoursSpecification, areaServed, and sameAs links to your profiles is the core block.
Two rules:
- Mark up only what is visible on the page and true in the world. Schema that contradicts your content is worse than none.
- Use one consistent
@idfor the business across pages so the entity resolves to a single thing.
If writing JSON-LD by hand is the reason this has not gotten done, our free schema markup generator builds JSON-LD for Organization, LocalBusiness, Product or FAQPage from a form. Fill it in, paste the output into your page template, validate it, move on.
What the AI crawlers actually do
This matters because local businesses sometimes block the wrong bot. Per verified vendor documentation:
| Bot | Owner | What it does |
|---|---|---|
| OAI-SearchBot | OpenAI | Surfaces sites in ChatGPT search. Sites opted out are not shown in ChatGPT search answers. |
| GPTBot | OpenAI | Collects content for foundation model training. Blocking it does not affect ChatGPT search. |
| ChatGPT-User | OpenAI | User-initiated actions in ChatGPT and custom GPTs. Not used to decide search inclusion. |
| ClaudeBot | Anthropic | Collects content that may be used for training. |
| Claude-User | Anthropic | Fetches pages when a user asks Claude a question. Blocking it prevents retrieval for those queries. |
| Claude-SearchBot | Anthropic | Indexes content to improve search results. |
| PerplexityBot | Perplexity | Surfaces and links sites in Perplexity search results. Not used for foundation model training. |
| Perplexity-User | Perplexity | Fetches pages for user questions; generally ignores robots.txt because the user requested it. |
| Google-Extended | Controls use for training future Gemini models and grounding in Gemini apps and the Vertex AI Gemini API. Does not affect Google Search inclusion. |
The practical takeaway for a local business: if you block OAI-SearchBot or Claude-SearchBot, you are removing yourself from the retrieval pool for exactly the questions you want to appear in. Blocking GPTBot or Google-Extended is a training decision with no effect on whether you show up in search answers. Robots.txt changes can take about 24 hours to take effect at OpenAI and Perplexity.
One more technical note, since local businesses often ask: robots.txt is a request, not access control. RFC 9309 says a crawler follows the most specific group that names it and ignores the * group in that case, and within a group the longest matching rule wins. If you write a * rule and a named rule that conflict, the named rule governs. Perplexity-User and ChatGPT-User act on a user's behalf and may not honor robots.txt at all, because the user initiated the request.
Region in the prompt is a variable you can test
People phrase local queries in different ways, and the phrasing changes what gets retrieved:
- "plumber near me" (relies on the assistant's location signal)
- "plumber in Tempe AZ" (explicit geography)
- "emergency plumber Tempe within 30 minutes" (geography plus constraint)
- "is Ridgeline Plumbing good" (brand-first)
You cannot control the phrasing. You can check which phrasings return you, and whether the description the assistant gives is accurate. Inaccurate descriptions (wrong services, wrong hours, wrong service area) point back to a source that is wrong or stale, and that is fixable.
How to measure without fooling yourself
Run a fixed set of prompts weekly from a consistent location and account state, and record:
- Whether you are mentioned at all
- Position in the list, if there is a list
- Which competitors appear
- Which source the answer seems to draw from (review text, your site, a directory)
Keep the prompt set stable so changes mean something. Small samples are noisy; treat a single week as a data point, not a trend. If you want the pattern behind this kind of tracking, the same logic applies to other verticals — see how it works for SaaS shortlists and for online stores, where the inputs differ but the measurement discipline does not.
Next step
Open your Google Business Profile and your website footer side by side. Fix any mismatch in name, address, phone, or hours today, then list the three directories you have not claimed. That is an afternoon of work, and it is the foundation everything else in this playbook sits on.