DEV Community

Jonathan Comparelli
Jonathan Comparelli

Posted on

How AI answer engines decide which local business to recommend: a schema markup field guide

The question that started this

A homeowner asks ChatGPT: "Who is the best plumber near me?" The answer comes back as a shortlist of three businesses, with confident one-line descriptions of each.

Where did that shortlist come from? Not from the businesses with the best websites. Not even from the ones with the best Google rankings. In audit after audit, I keep finding the same pattern: the businesses that get recommended are the ones AI can describe with confidence, and the single biggest lever for that is structured data.

This guide is the schema layer of that work, written for developers who would rather implement it themselves than hire anyone.

What answer engines actually read

When an answer engine assembles a local recommendation, it triangulates:

  1. Your website, and specifically its structured data
  2. Your Google Business Profile
  3. Citations across directories (name, address, phone consistency)
  4. Reviews and third-party mentions

You cannot control all of it from code. But the first one is entirely yours, and it is the one most sites get wrong.

The schema that actually moves the needle

Forget generic Organization markup for a local business. Use the most specific LocalBusiness subtype you can: Dentist, LegalService, MedicalBusiness, HomeAndConstructionBusiness. Schema.org has subtypes for most local verticals.

A minimal but complete example:

{
  "@context": "https://schema.org",
  "@type": "Dentist",
  "name": "Example Dental Studio",
  "description": "Family dentist in Leslieville offering cleanings, implants, and emergency appointments. Accepting new patients.",
  "url": "https://example.com",
  "telephone": "+1-416-555-0142",
  "priceRange": "$$",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Queen St E",
    "addressLocality": "Toronto",
    "addressRegion": "ON",
    "postalCode": "M5A 1S2",
    "addressCountry": "CA"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 43.6629,
    "longitude": -79.3287
  },
  "areaServed": ["Toronto", "Leslieville", "Riverdale", "East York"],
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "08:00",
      "closes": "18:00"
    }
  ],
  "sameAs": [
    "https://www.google.com/maps/place/example",
    "https://www.facebook.com/example",
    "https://www.linkedin.com/company/example"
  ]
}
Enter fullscreen mode Exit fullscreen mode

The properties I see skipped most often, ranked by how much they seem to matter:

  • description: write it the way you want AI to describe you. One or two sentences, plain language, no slogans. Answer engines paraphrase this field constantly.
  • sameAs: this is your entity-resolution layer. It tells AI that your website, your GBP, and your directory profiles are the same business. Without it, you are three fuzzy entities instead of one confident one.
  • areaServed: be specific. Neighborhoods and towns, not just the metro.
  • openingHoursSpecification: "open now" logic feeds real recommendation decisions.

The three mistakes that kill you

1. Schema that contradicts the visible page. If your JSON-LD says "24/7 emergency service" and your homepage does not, you have trained AI to distrust everything else you publish. Markup must match visible content exactly.

2. NAP drift across citations. Name, address, phone. If your site says "Suite 200" and three directories say "Ste. 2" and one has an old number, the entity graph fragments. Pick one canonical format and propagate it everywhere.

3. Organization markup on a local business. A Dentist that only declares Organization is leaving its most important properties (geo, hours, areaServed) unclaimed.

Beyond schema: answer-ready content

Structured data tells AI what you are. Your content tells it when to recommend you. The pattern that works:

  • Write pages that mirror the questions customers actually ask: "How much does emergency plumbing cost in Toronto?"
  • Answer in the first sentence, plainly, then expand. AI extracts answer-first paragraphs.
  • Keep facts consistent with your schema. Always.

How to test any of this

  1. validator.schema.org for syntax
  2. Google Rich Results Test for eligibility
  3. The manual test nobody skips twice: once a month, ask ChatGPT, Gemini, and Perplexity "best [your category] in [your city]" from a clean session. Log whether you appear, how you are described, and who appears instead. The descriptions AI uses will tell you exactly which of your signals it is reading.

A confession and an offer

I got into this because I watched excellent local businesses, five-star reputations and all, stay completely invisible in AI answers while weaker competitors got named. Most of the fix is unglamorous structured-data and citation work like the above.

I run Futurebloom, where we do these audits and implementations for local service businesses full time. Everything in this post is stuff you can do yourself, and I am happy to answer implementation questions in the comments, whether or not you ever become a client.

What are you seeing in your own tests? Curious which industries people here are watching AI eat first.

Top comments (0)