October 08, 2026

Blog

10 min read

Schema markup for a local business website: what to add and where

Blog
Schema markup for a local business website: what to add and where

Local business schema markup is a short block of JSON-LD on your web page that tells Google, in a fixed vocabulary, who the business is, where it is, how to call it and which other profiles online belong to it. For a small business in India the minimum worth adding is one LocalBusiness node with the name, address, telephone, opening hours and sameAs links, plus breadcrumbs on inner pages. Paste it once in the shared header so every page carries it, test the live URL in Google's Rich Results Test, and keep every detail identical to your Google Business Profile.

That is the whole recipe. What follows is the example we'd hand a client, field by field, where each part goes, and the three mistakes we find most often when we audit a site that "already has schema" and gets nothing from it.

What is local business schema markup and what does it do?

Schema.org is a shared vocabulary that Google, Bing and the others agreed to read. JSON-LD is the format Google recommends for writing it: a script tag containing a JSON object, separate from the visible HTML, so it can't break your layout. When you put a LocalBusiness object on your page, you're labelling facts the page already shows. The name is this string. The phone is this number. The address is here. These accounts on Instagram and LinkedIn are ours.

What it does is remove guesswork. Google is good at reading a contact page, but it has to infer that the number in the footer is the main line, and that "Asket Studio" and "asketstudio.in" are the same thing as the Google Business Profile of that name in Rajkot. Markup states it. That helps the knowledge panel fill in correctly, helps Google connect the website to the map listing, and makes the page eligible for the result formats that depend on structured data, such as the breadcrumb path shown in the result line.

What it does not do: it is not a ranking signal on its own. Adding it to a slow site with thin pages changes nothing you can see. About 70 people a month in India search for this phrase, and most of them, in our experience, are at the stage where the site is otherwise fine and they want Google to stop misreading it. That is the right moment for it.

How do you add schema markup to a website?

The block goes inside a script tag with the type application/ld+json. Google accepts it in the head or the body; we put it in the head so it is emitted before anything that could fail further down the page.

Where you paste it depends on how the site is built.

On a custom PHP site, add it to the shared header include, so one file produces the block for every page. On our own site a single PHP file builds one @graph per page: the organisation node is identical everywhere, and each page adds its own WebPage and BreadcrumbList nodes to the same graph. One block, one graph, no duplicates.

On WordPress, the theme or an SEO plugin usually has a field for it. Use one of them, not both. Two plugins each emitting an organisation node with slightly different phone numbers is the most common mess we clean up.

On Shopify, the theme's theme.liquid file is the place, or a theme setting if the theme exposes one. Many Shopify themes already emit an Organization node; check the source before adding a second.

Whichever route you take, the rule is the same: view the page source after deploying, search for ld+json, and confirm there is exactly one block that describes your business. If you find two, decide which one stays.

What does a local business schema markup example look like?

This is the shape we start from. It uses our own studio as the business, with the address at city level because that is what the site publishes.

<script type="application/ld+json">

{

"@context": "https://schema.org",

"@type": "LocalBusiness",

"@id": "https://asketstudio.in/#organisation",

"name": "Asket Studio",

"url": "https://asketstudio.in/",

"telephone": "+91 99744 63300",

"email": "connect@asketstudio.in",

"address": {

"@type": "PostalAddress",

"addressLocality": "Rajkot",

"addressRegion": "Gujarat",

"addressCountry": "IN"

},

"sameAs": [

"https://www.instagram.com/your-handle",

"https://www.linkedin.com/company/your-company"

]

}

</script>

Replace the two sameAs URLs with your real profiles and the rest with your own details. If you publish a street address on the site, add streetAddress and postalCode inside the address object. Google's local business rich result wants a full postal address; a city alone passes validation but shows as a warning.

One more choice is the @type. LocalBusiness has dozens of more specific subtypes, such as Dentist, Restaurant, Store, HomeAndConstructionBusiness and ProfessionalService. Pick the most specific one that is true. A tiles showroom is a Store. A clinic is a MedicalClinic. If nothing fits, LocalBusiness is fine, and a company without a walk-in location can use Organization instead.

Which fields matter, one by one?

name: the trading name exactly as it appears on your Google Business Profile and your signboard. Not the legal entity name if that differs, unless the profile also uses it.

@id: a stable identifier, usually your home page URL with #organisation on the end. Other nodes on the page (WebPage, Service, Article) point to this @id instead of repeating the whole block.

url: the home page, with the trailing slash you actually redirect to.

telephone: with the country code, in the same format you print on the site.

address: locality, region and country at minimum. Use the two letter country code IN. Street and postcode when you publish them.

geo: optional. Latitude and longitude copied from the Google Maps pin. Useful for a showroom or a clinic, pointless for a business that only works remotely.

openingHoursSpecification: the days and hours, in 24 hour time. Only add it if you will keep it true. A wrong "open Sunday" produces a phone call and a bad review.

image and logo: a square logo of at least 112 pixels on each side, as a full URL. This is what the knowledge panel tends to pick up.

sameAs: only profiles you control. Instagram, LinkedIn, Facebook, YouTube, a Justdial or IndiaMART listing if it is yours. Not a competitor's page, not a news mention, not a placeholder.

areaServed: the places you serve, as text or as City objects. "Rajkot", "Gujarat", "India". Not forty cities you have never worked in.

priceRange: optional, and usually best left out for a services business, because there is no honest single answer.

Does schema markup help local SEO?

Indirectly, and only once the basics are done. Google's local results are driven by proximity to the searcher, how well your category matches the query, and how prominent you are (reviews, citations, links). None of that lives in the markup. What the markup does is remove doubt about which business the website belongs to, and that matters most when your name is common, your address has changed, or you have moved from one domain to another.

The practical value is consistency. Your name, address and phone should be identical in four places: the website footer, the contact page, the Google Business Profile and the markup. When they differ (an old landline in the footer, a new mobile on the profile), Google has to pick one, and it sometimes picks wrong. Fixing that is a ten minute job and we do it in every audit.

Article 16 on local SEO for small business in India sets out the order: profile first, then citations and reviews, then the site, then the markup. If you have done it the other way round, no harm, but do not expect the markup to carry the rest.

What about services, FAQ and breadcrumbs?

Services: add a Service node for each service page, with the name, a short description, provider pointing to your organisation @id, and areaServed. Keep it to the services you sell and that have a page. There is no rich result for it today, but it is the cleanest way to say "this company offers SEO in Rajkot" in a form a machine can read.

FAQ: an FAQPage node lists the questions and answers that are visibly on the page. Google stopped showing FAQ rich results for most sites in 2023 and now shows them mainly for government and health pages, so do not add it for the dropdown look. Add it where the page genuinely has a question and answer block, because it still describes the page accurately, and remove it from pages that don't.

Breadcrumbs: a BreadcrumbList on every inner page, with each item carrying a position, a name and the URL. This one does still change the result. Google shows the path (Home, Services, SEO) instead of the raw URL. It is the cheapest visible win in the whole set.

Articles: for a blog post, a BlogPosting node with headline, author, datePublished, dateModified and image, with publisher pointing to the organisation @id.

How do you test schema markup?

Use two tools, in this order.

The Rich Results Test at search.google.com/test/rich-results shows what Google will actually use. Paste the live URL, not the code, because a plugin, a cache or a template condition can change what is served. It reports each detected item, errors that stop it being used, and warnings for missing optional fields.

The Schema Markup Validator at validator.schema.org checks the whole graph against the vocabulary, including node types Google shows no rich result for, such as Service. Use it to catch a misspelt property or a wrong type.

After that, Search Console. Under Enhancements it reports breadcrumbs and other items it found across the site, with counts of valid and invalid pages. Give it two to four weeks after a change before reading anything into it.

Test more than the home page. The inner pages are where the breadcrumb and article nodes live, and where a template bug will show first.

Which three mistakes make Google ignore it?

Markup that says something the page does not. An address in the JSON that appears nowhere on the site. FAQs in the markup with no visible questions. A star rating pulled from your Google reviews and placed in aggregateRating: Google's guidelines rule out self-serving reviews on LocalBusiness and Organization, and that can earn a manual action, not just get ignored. If it isn't on the page, it doesn't go in the block.

Duplicates. A theme block, a plugin block and a pasted block, each with a slightly different name or number. Google may merge them, ignore all of them, or pick the wrong one. One block per page.

Syntax and spelling. A trailing comma after the last property makes the whole JSON invalid, and nothing in it is read. A British spelling in a type name does the same: the vocabulary is American, so inside the code it is "Organization", not "Organisation", even though the prose on your site says organisation. A telephone without a country code, and placeholder URLs left in sameAs, are the other regulars.

If you'd rather someone checked the block against your Google Business Profile and the rest of the site, this sits inside the technical audit that starts our SEO work. Send the URL through the contact page and we'll tell you what we find.

Questions

Does schema markup improve rankings?

Not directly. It helps Google read the page correctly and can change how the result looks, with a breadcrumb path for example. Rankings still come from the page, the links and, for local results, the Business Profile.

Should I use LocalBusiness or Organization?

Use LocalBusiness, or one of its specific subtypes, if customers visit a physical location. Use Organization if the business has no walk-in address, such as a studio that works remotely. Both take the same core fields.

Can I add schema to a Shopify or WordPress site?

Yes. WordPress themes and SEO plugins have a field for it, and on Shopify it goes in theme.liquid. In both cases check the page source afterwards, because the theme may already emit a block and you want only one.

How long before Google shows the change?

Google reads the new markup the next time it crawls the page, usually within days for an active site. Search Console reports typically catch up in two to four weeks. Request indexing on the changed pages to speed it up.

Comments

No comments yet. Sign in above to write the first one.