The markup for one office
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Dentist",
"@id": "https://www.example.com/offices/main-street/#office",
"name": "Example Family Dental",
"url": "https://www.example.com/offices/main-street/",
"telephone": "+15555550123",
"address": {
"@type": "PostalAddress",
"streetAddress": "100 Main Street, Suite 200",
"addressLocality": "Yourtown",
"addressRegion": "OH",
"postalCode": "00000",
"addressCountry": "US"
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday"],
"opens": "08:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": "Friday",
"opens": "08:00",
"closes": "13:00"
}
]
}
</script> Every value comes from the page the block sits on: the name on the office’s sign and profile, the number that rings at that office, the page’s own address in url. A practice with one office puts the block on its homepage. A group puts one on each office’s page, with that office’s details and its own @id, instead of one block repeated on every page. The block is a small part of the office page a dentist SEO company gets right, beside the address, the hours, the dentists and the way to book.
What it will not do
Stars under your result
Under Google’s review snippet rules, a business’s reviews on its own website get no stars in the results, whether they are marked up by hand or come through an embedded Google reviews widget. Leave aggregateRating and review out of the office’s markup.
FAQ dropdowns
Google stopped showing FAQ results in May 2026, so FAQ markup on a treatment page earns nothing in Google’s results. The questions still belong on the page, where patients read them.
A place on the map
The map shows Business Profiles, so no markup on your site moves an office up there. Local SEO for dentists covers what does.
Dentists, specialists and groups
In schema.org, Dentist is a kind of LocalBusiness, so it describes the practice, and the dentist is a Person. Each dentist gets a Person on their own page, pointing at the office they work in through that office’s @id:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Dr. Jane Doe",
"jobTitle": "Dentist",
"url": "https://www.example.com/dentists/jane-doe/",
"worksFor": { "@id": "https://www.example.com/offices/main-street/#office" }
}
</script> An orthodontic practice uses Dentist as well, since schema.org has no orthodontist type, and its page says it is an orthodontic practice. In a group, each office’s page carries its own Dentist block, and every block points at one Organization for the group with parentOrganization. DSO SEO covers keeping every office, dentist and ID right across the group.
Check it against the page
Run each office page through Google’s Rich Results Test to see that Google reads the markup, then compare every value with the page by eye: the test passes a wrong phone number as happily as the right one. Check again after a move, a dentist’s departure or a rebuild of the site. The mistake to look for is every office page carrying the main office’s phone and address: the test passes it, and Google reads the same office on every page.