Hack #017 · Structured data

Most schema markup does nothing. A few fields do.

You do not need two hundred lines of JSON-LD. You need your name, your location, your hours and your services to be machine-readable and identical to your Google profile.

2026-09-08 · 3 min · we hit this one ourselves

By Chen Deng · OxOne, Calgary AB

Do this

Put one LocalBusiness block on your site with name, address, phone, hours, area served, and a sameAs list pointing at your Google profile and social accounts. Match your listings word for word. Skip the rest until something specific needs it.

Structured data attracts more advice than it deserves. Most of it is written by people selling a plugin that emits every type in the vocabulary, and volume of markup is not what it buys you.

What it buys you is two things. Eligibility for the richer-looking search results, which is eligibility and not a promise. And a machine-readable statement of the facts about your business, which matters a great deal more now that the things reading your site are trying to answer a question rather than build an index.

The block that is worth having

One LocalBusiness (or the closest subtype), in JSON-LD, on your homepage and contact page:

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "@id": "https://example.com/#business",
  "name": "Example Plumbing Ltd.",
  "telephone": "+14035550142",
  "address": { "@type": "PostalAddress", ... },
  "areaServed": ["Calgary", "Airdrie", "Chestermere"],
  "openingHours": ["Mo-Fr 08:00-17:00", "Sa 09:00-13:00"],
  "sameAs": ["https://www.google.com/maps/place/...", "https://www.facebook.com/..."]
}

Two fields do the quiet work. @id gives your business a stable identifier that other blocks on the site can point at, so your pages describe one entity instead of several. sameAs connects that entity to your Google profile and your social accounts, which is how a machine confirms these are all the same business rather than four similar ones.

Every string in it has to match the canonical version you wrote down. Schema that disagrees with your Google profile is worse than no schema, because you have now published the contradiction in a format designed to be trusted.

What to add after that, and what to skip

WhatWhy
AddService, FAQPage, BreadcrumbList, Product with a real priceEach one states a fact a machine can repeat about you.
SkipAnything describing content that is not visible on the pageGoogle enforces this rule by ignoring the whole block.
NeverYour own aggregateRating on your own siteIneligible for years, and the most common thing a plugin adds without asking.

On FAQ markup specifically: rich results from it are now largely limited to government and health sites. That is not a reason to remove it. The markup still hands a clean question-and-answer pair to anything reading the page, and question-and-answer pairs are the most quotable shape there is.

Test it in two minutes

  1. Google's Rich Results Test on the live URL — tells you what Google will use.
  2. Schema Markup Validator at validator.schema.org — tells you whether the syntax is actually valid, which the first tool will not always say.
  3. Search Console's Enhancements section a week later — tells you what it found across the whole site, including the pages you forgot.

The reason to bother

An assistant asked whether you are open on Saturday can either read a fact or guess from prose.

An assistant asked whether you are open on Saturday can either read a fact or guess from prose. One of those gets your hours repeated correctly and the other gets you described vaguely, or not at all. Twenty lines of JSON, once.

Every one of these came out of work we actually did. If you would rather not do it yourself, book a free 30-minute diagnostic and we will tell you which of these your business is losing money to.

More on this Local SEO for Calgary businesses Everything we have written