Schema markup is the structured-data layer Google uses to understand your business. It is invisible to your customers, load-bearing for the algorithm, and most Collingwood trade websites either have none or have wrong copy-paste from a 2017 tutorial. Below are the exact JSON-LD blocks that rank, written for plumbers, HVAC contractors, roofers, electricians, contractors, and landscapers across the Georgian Bay shoreline. Drop them in the <head> of your homepage and location pages. Adjust the obvious fields. Validate. Ship.
Why schema matters more in 2026
Three reasons schema is more load-bearing than it was even two years ago:
- AI Overviews and LLM citations. ChatGPT, Perplexity, Claude, and Google’s own AI Overview all read structured data to decide which businesses to cite when answering local queries. A page with
LocalBusinessschema gets cited; a page without often does not. - Map Pack relevance signal. Google’s local algorithm cross-references your schema’s NAP and category data against your GBP. Mismatches suppress ranking. Consistent schema reinforces the signal.
- Voice search. Voice queries surface businesses with cleanly marked-up data more aggressively, because the assistant needs unambiguous business identification to read out loud.
If you have one technical SEO project to do this month, do schema.
The core LocalBusiness block (everyone uses this, customise per trade)
This goes on your homepage. The @type field is what distinguishes trades from each other (see the per-trade list further down).
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://acmeplumbing.ca/#organization",
"name": "Acme Plumbing",
"url": "https://acmeplumbing.ca",
"logo": "https://acmeplumbing.ca/logo.png",
"image": "https://acmeplumbing.ca/hero.jpg",
"telephone": "+1-705-555-0100",
"email": "info@acmeplumbing.ca",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Bay St",
"addressLocality": "Collingwood",
"addressRegion": "ON",
"postalCode": "L9Y 1A1",
"addressCountry": "CA"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 44.5006,
"longitude": -80.2168
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "08:00",
"closes": "17:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday"],
"opens": "09:00",
"closes": "13:00"
}
],
"areaServed": [
{ "@type": "City", "name": "Collingwood" },
{ "@type": "City", "name": "Blue Mountain" },
{ "@type": "City", "name": "Wasaga Beach" },
{ "@type": "City", "name": "Thornbury" },
{ "@type": "City", "name": "Meaford" }
],
"sameAs": [
"https://www.facebook.com/acmeplumbing",
"https://www.google.com/maps/place/?q=place_id:YOUR_GBP_PLACE_ID",
"https://www.linkedin.com/company/acmeplumbing"
]
}
</script>
Replace "@type": "Plumber" with your trade-specific type from the list below. Replace every other obvious field. The sameAs array linking to your GBP place_id URL is the single most under-used schema signal; it explicitly tells Google “this website is the same entity as this GBP”. It tightens the website-to-GBP relationship and lifts Map Pack rank measurably.
The right @type per trade
Use the most specific Schema.org type that matches your trade. More specific is always better than LocalBusiness (the generic fallback).
- Plumbers:
"@type": "Plumber" - HVAC contractors:
"@type": "HVACBusiness" - Roofers:
"@type": "RoofingContractor" - Electricians:
"@type": "Electrician" - General contractors:
"@type": "GeneralContractor" - Landscapers:
"@type": ["LocalBusiness", "Landscaper"](Schema.org does not have a directLandscapersubtype yet, so use multi-type) - Painters:
"@type": "HousePainter" - Cleaners:
"@type": "HouseCleaner" - Restoration:
"@type": ["LocalBusiness", "DamageRestorationCompany"] - Chalet rentals:
"@type": "LodgingBusiness"
If your trade is not in the list, use "@type": "LocalBusiness" and add a category field matching your trade name. Schema.org adds new types every few quarters; check schema.org/docs/full.html for updates.
The Service block (one per service you offer)
LocalBusiness describes what you are. Service describes what you do. Both matter. Add one Service block per major service:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"serviceType": "Emergency plumbing repair",
"provider": { "@id": "https://acmeplumbing.ca/#organization" },
"areaServed": [
{ "@type": "City", "name": "Collingwood" },
{ "@type": "City", "name": "Blue Mountain" }
],
"hoursAvailable": "Mo-Su 00:00-23:59",
"description": "24-hour emergency plumbing service in Collingwood and Blue Mountain. Burst pipes, water heater failure, drain emergencies. Typical 60-minute response window."
}
</script>
The provider field with @id referencing your LocalBusiness block is what knits the two together. Use one Service block per page where that service is the focus. Three to six service blocks across the site is typical for a trade.
The Review and AggregateRating block (use when you have 3+ real reviews to cite)
Google requires that schema reviews be displayed on the page that contains the schema. You cannot pull random reviews from your GBP and inject them into schema if they are not also on the visible page. The right pattern: pick 3 to 5 representative reviews from your GBP, display them as a “What customers say” section on the page, then mark them up in schema:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Plumber",
"@id": "https://acmeplumbing.ca/#organization",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "87"
},
"review": [
{
"@type": "Review",
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"author": { "@type": "Person", "name": "Sarah M., Collingwood" },
"reviewBody": "Acme came out at 11 PM on a Sunday when our hot water tank let go. Fixed it the same night. Worth every penny."
},
{
"@type": "Review",
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"author": { "@type": "Person", "name": "Dave T., Blue Mountain" },
"reviewBody": "Replaced our entire main line. Clear pricing, no surprises, did exactly what they said. Fourth time I've used them in 10 years."
}
]
}
</script>
This AggregateRating data feeds the rich-result “stars” that appear in organic search results, lifting click-through rate by 15% to 35% in our testing. It also reinforces the review-velocity signal Google uses for Map Pack ranking.
For more on the review side of the equation, see our piece on how many Google reviews you need to rank in Collingwood.
The FAQPage block (for any page with 4+ FAQs)
If a page has an FAQ section (most of our blog posts do, our service pages do, our area pages do), wrap the FAQs in FAQPage schema:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How fast can you respond to an emergency call?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Typical response time in Collingwood and Blue Mountain is 45 to 75 minutes from initial call. Same-day for non-emergency repair work scheduled before noon."
}
},
{
"@type": "Question",
"name": "What is your service area?",
"acceptedAnswer": {
"@type": "Answer",
"text": "We serve Collingwood, Blue Mountain, Wasaga Beach, Thornbury, Meaford, and surrounding areas within 45 minutes of downtown Collingwood."
}
}
]
}
</script>
The text in acceptedAnswer.text must exactly match the answer text visible on the page. Mismatch can trigger a Google manual penalty (very rare in practice but possible).
The BreadcrumbList block (for any page deeper than the homepage)
Every page that is not the homepage should have breadcrumb schema. It is the cheapest schema win and Google uses it to render breadcrumbs in search results:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://acmeplumbing.ca" },
{ "@type": "ListItem", "position": 2, "name": "Services", "item": "https://acmeplumbing.ca/services/" },
{ "@type": "ListItem", "position": 3, "name": "Emergency Plumbing" }
]
}
</script>
The deepest item should not have an item field (it represents the current page).
The Person block (for the About page, identifies the founder)
For E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) reasons, mark up the business owner on your About page:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"@id": "https://acmeplumbing.ca/about#owner",
"name": "Jane Smith",
"jobTitle": "Owner, Acme Plumbing",
"worksFor": { "@id": "https://acmeplumbing.ca/#organization" },
"url": "https://acmeplumbing.ca/about/",
"image": "https://acmeplumbing.ca/team/jane.jpg",
"sameAs": ["https://www.linkedin.com/in/janesmith"]
}
Google uses Person schema as an authority signal for the underlying business, especially for trades where the operator’s reputation drives trust.
The validator (always run this before pushing)
Before deploying any schema, validate with:
- Schema.org Validator: https://validator.schema.org, catches syntax errors and Schema.org compliance issues.
- Google Rich Results Test: https://search.google.com/test/rich-results, shows what Google understands and which rich-result eligibility you qualify for.
Both are free, both run instantly on a pasted URL or pasted code. Run them every time you change schema. A typo in JSON-LD silently invalidates the entire block.
The ordering and placement
All schema goes inside the <head> of the HTML, in separate <script type="application/ld+json"> tags. Order does not matter; clarity does. Recommended pattern per page:
- LocalBusiness (your
#organizationentity, once per site, in the<head>of every page via your site’s base layout) - Service blocks specific to that page
- AggregateRating + Review on pages displaying reviews
- BreadcrumbList on every non-homepage
- FAQPage on pages with FAQ sections
- Person on the About page
The Astro repo this site is built on auto-injects the LocalBusiness and Website schema on every page via the base layout. Pages add their own page-specific schema via a schema prop. If you are on WordPress, plugins like RankMath or Yoast handle most of this for you, but the per-page schema details are worth hand-tuning.
What this is worth
Schema cleanup is one of the cheapest, fastest wins in local SEO. Hours of work, weeks to first measurable impact, typical effects:
- Rich-result eligibility: stars in SERPs (CTR lift of 15% to 35%)
- Map Pack confidence: modest but real lift (0.5 to 1.5 positions on competitive queries)
- AI Overview citations: LLMs increasingly cite businesses with clean structured data
- Voice search visibility: Alexa, Siri, Google Assistant all read schema preferentially
For most Collingwood trade sites going from no schema to clean schema, expect first effects in 3 to 6 weeks.
FAQ
Will schema markup rank me for queries I do not deserve to rank for? No. Schema makes you legible to Google. It does not invent relevance. If you have weak content, schema cannot save you. If you have strong content, schema unlocks the rich results.
Can I have schema on a page that does not display the schema data? No. Google requires schema content to match visible page content. Hidden schema is treated as a violation and can suppress ranking site-wide.
What if I have schema but my page also has competing data (different phone on the page footer vs. the schema)? The mismatch will reduce Google’s confidence in your business identity. Make them match. See our NAP consistency piece for the broader pattern.
Should I use JSON-LD or Microdata or RDFa? JSON-LD is Google’s preferred format and the easiest to maintain. Stick with JSON-LD.
My site is on Squarespace, Wix, or another builder. Can I add schema?
Most builders have a code-injection field for the <head> of pages (sometimes under Advanced Settings or SEO Settings). Use it. The JSON-LD code blocks above paste in directly.
For the broader local SEO playbook that uses schema as one layer of a larger strategy, see our Collingwood SEO guide.
Want this run against your own business?
Free 15-minute audit. We pull up Google together and show you exactly where you rank, where you could be in 60 to 90 days, and the cheapest moves to get there.
Prefer to talk? (705) 539-0398