Schema Markup Generator for Edmonton Businesses — What to Ship and Why
Today we shipped the Schema Markup Generator — a free JSON-LD generator for Edmonton businesses. Fill in a few fields, pick a schema type, watch the JSON-LD build itself on the right, copy once, paste into your site's <head>. Alberta defaults are pre-filled so most Edmonton businesses can finish a LocalBusiness block in under a minute.
This post is about which five schemas we chose, why we didn't bother with twenty others, what the Alberta defaults are doing for you, and where the JSON-LD actually needs to live on your site for AI search engines and Google to read it. If you've been meaning to add schema and kept getting lost in the schema.org docs, this is the shortcut.
Why schema markup still matters — especially in 2026
Schema markup is invisible text you add to your HTML that tells search engines and AI assistants exactly what a page is about: this is a local business in Edmonton, these are its hours, this is the phone number, this person wrote this article. Google has used it for rich results for a decade. What's new is that LLM-based search — ChatGPT, Claude, Gemini, Perplexity — leans on structured data even more heavily when deciding whether to cite a page.
Two specific reasons schema punches above its weight in an AI-search world:
- LLMs train on HTML, not on screens. When a crawler feeds a page to the model, structured data is one of the cleanest signals of "what this page actually is." A human skims the page; the model reads the fields.
- Citation needs a ground-truth. When ChatGPT writes "Agency7 is an AI agency in Edmonton founded by Anders Kitson," it's more confident in that claim if it can trace it back to an Organization + Person schema on a real domain — not just scraped body copy.
So adding schema is low-effort, reversible, and one of the highest-ROI things you can do before you spend another dollar on content.
The five schemas we cover — and why we stopped there
Schema.org defines hundreds of types. Most are useless for an Edmonton service business. Five are load-bearing:
1. LocalBusiness
For any business with a physical location or defined service area — plumbers, clinics, restaurants, law firms, real estate agents. This is the single most important schema for local visibility. When someone asks ChatGPT "who should I call for emergency plumbing in Edmonton," the LLM is statistically more likely to name businesses with clean LocalBusiness schema than businesses without it, all else equal.
Our generator supports thirteen subtypes — Plumber, Dentist, LegalService, RealEstateAgent, Restaurant, Electrician, HVACBusiness, and more — because Google and LLMs treat @type: Plumber as more specific than generic @type: LocalBusiness, and specificity helps.
2. Organization
For businesses without a physical location — consultancies, SaaS, pure-online agencies. Also useful as a sitewide "who are we" block that pairs with LocalBusiness on a physical business's homepage. Organization is the schema that carries sameAs links (your LinkedIn, Twitter, Wikipedia, etc.), which is how search engines verify that the Agency7 in one place on the web is the same Agency7 somewhere else.
If you run a pure-online business, use Organization. If you run a physical or hybrid business, use both — LocalBusiness for the geographic facts, Organization for the identity graph. Different @id values, same entity, two strong signals.
3. Service
One Service block per distinct offering you sell. "Emergency Plumbing Repair," "AI Voice Agent Deployment," "Corporate Real Estate Law." Pair it with a provider reference to your Organization @id and an areaServed of the cities you work in. Service schema is the closest thing in the schema.org vocabulary to "what you actually do for money" — and it's severely underused on small-business sites.
4. FAQPage
For any page with a question-and-answer section. FAQPage used to generate big expandable rich results in Google; Google has since pulled those for most queries, but the schema still matters because LLMs quote from it heavily. When Perplexity or ChatGPT builds an answer from your page, a well-structured FAQPage block is the most quotable shape of content you can ship.
Our generator lets you add unlimited Q&A pairs. Ten short, honest FAQs on a service page will outperform a dense 2,000-word wall of prose for AI citation.
5. Person
For the author of a blog post, the owner of a business, or a named service provider. This is the schema that builds E-E-A-T signals — Experience, Expertise, Authoritativeness, Trustworthiness — for AI search engines. A blog post with a Person schema pointing to a detailed About page outranks an anonymous post on equivalent content, because LLMs use "is there a real human behind this" as a citation-worthiness filter.
What we deliberately didn't cover
- Article, BlogPosting, BreadcrumbList. These are real and useful, but they are per-page things that your CMS or site framework should inject automatically. A paste-it-into-the-head generator is the wrong UX for them — we ship those via templates in the site code instead.
- Product, Offer, AggregateRating. Important for e-commerce, but not the target audience for this tool (Edmonton service businesses). We'll add them when we ship a dedicated e-commerce generator.
- Event, Recipe, Course, JobPosting. Niche. If you need them, use Schema.org's own generator or ask a developer.
Five schemas covers ~90% of what an Edmonton service business actually needs.
The Alberta defaults — why we pre-fill Edmonton
When you open any tab, several fields are already populated:
addressLocality: "Edmonton"addressRegion: "AB"addressCountry: "CA"openingHours: "Mo-Fr 09:00-17:00"areaServed: "Edmonton, Alberta, Canada"
This is not laziness. Pre-filled defaults are how you make a schema tool actually get used. Most business owners who land on this page don't know the ISO region code for Alberta is AB (not Alberta, not AB, Canada, not Province of Alberta). They don't know that openingHours takes a specific machine-readable format with two-letter day codes and 24-hour times. They'd either guess wrong or bounce.
By pre-filling with the most-common-right answer for our audience, we flip the default from "fill in 12 fields you don't understand" to "change the three that are wrong." Someone in Calgary edits Edmonton to Calgary and ships. Someone in Leduc changes the city and leaves everything else. That's the win.
The defaults also encode best-practice: using AB instead of Alberta is what Google Rich Results Test and schema.org both expect, and using the Mo-Fr 09:00-17:00 shorthand is the canonical format — not the verbose "openingHoursSpecification" array, which is valid but overkill for a 9-to-5 business.
The live preview, and why copy-paste beats download
As you type, the JSON-LD rebuilds in the dark panel on the right. One click copies the whole thing — already wrapped in a <script type="application/ld+json"> tag — to your clipboard. You paste it once into your site's <head> and you're done.
We chose "copy to clipboard" over "download .json" because nobody does anything with a downloaded .json file. Copy-paste matches how the output is actually going to be used: pasted into a Squarespace code injection block, a WordPress header.php edit, a Webflow custom code field, a Next.js layout file. The clipboard is the right primitive.
The preview also shows an empty state when required fields aren't filled — it tells you which fields are missing, rather than silently emitting a broken block. LocalBusiness needs at least a name; Service needs a name + provider; FAQPage needs at least one Q&A pair. If you leave them blank, the panel says so instead of generating garbage.
Where the JSON-LD actually needs to go
This is the step that trips up more people than the generator step. You need to paste the <script type="application/ld+json">...</script> block:
- In the
<head>or<body>of the page's HTML. Either works. Google's documentation recommends<head>but<body>is fine. - On the page the schema is describing. LocalBusiness goes on your homepage or contact page. Service goes on the specific service page. FAQPage goes on the page that has the FAQ. Person goes on your About page or blog author bylines.
- Once per entity, not once per page. If you put LocalBusiness on every page of your site with the same
@id, that's fine and correct. If you put different LocalBusiness data on different pages for the same business, you're confusing the crawlers.
For a Squarespace or Wix site, use the Code Injection / Custom Code setting. For WordPress, use a plugin like "Insert Headers and Footers" or paste into your theme's header.php. For Next.js or a framework-built site, either inject via <Head> in the page file or render a <script> element with dangerouslySetInnerHTML.
After you paste, validate at Google Rich Results Test and Schema.org Validator. Both are free, both are instant. If the Rich Results Test shows green for your URL, you're done.
How LocalBusiness and Organization differ (the most common mistake)
Half of the schema questions we get are "do I use LocalBusiness or Organization?" The answer:
- Brick-and-mortar or service-area business → LocalBusiness. Plumber, clinic, dental office, restaurant, real-estate agent, plumber, contractor, accountant with a physical office.
- Purely online or no-single-location business → Organization. SaaS, agency without a public-facing office, consultancy.
- Hybrid — you have an office but most customers are online → Use both. Different
@idvalues on the same page. LocalBusiness for the office; Organization for the identity graph.
LocalBusiness is a subclass of Organization, so in a sense LocalBusiness already includes Organization's capabilities — but LLMs and Google both treat them as different signals, and shipping both is cheap.
What happens after you paste the schema
Two things, on two different timelines:
Within days. Google's crawler re-visits your page, reads the schema, and updates the rich-results eligibility for your URL. You can accelerate this with a "Request Indexing" click in Google Search Console.
Within weeks to months. LLMs — ChatGPT, Claude, Gemini, Perplexity — retrain or refresh their indexes on the updated content. You won't see an instant change in how ChatGPT describes your business, but over one to three training cycles, well-marked-up businesses accumulate an edge in citation likelihood.
If you want a concrete way to see whether AI search engines are picking you up, use our ChatGPT Visibility Checker before and after. Baseline today, re-test in sixty days, look for the delta.
What this tool deliberately doesn't do
- No automatic injection. We don't push the schema to your site for you. We output JSON-LD; you paste it. This is a feature, not a bug — you stay in control of your own HTML.
- No account, no save, no history. You lose the form when you close the tab. If you need to keep the output, paste it somewhere durable (your site, a notes doc, Google Docs).
- No AggregateRating or reviews schema. Review schema is being aggressively down-weighted by Google in 2026 because of fake-review abuse. We're not emitting it. If you want review markup, work with a specialist — it's a legal and reputational minefield.
- No multi-location support. The generator outputs one LocalBusiness at a time. If you have five franchise locations, run the tool five times and paste five blocks with different
@idvalues.
How this fits into AEO in 2026
If you've read any of our other AEO posts — How to Rank on ChatGPT in 2026, E-E-A-T Signals for AI Search Engines, How AI Search Engines Actually Cite Local Edmonton Businesses — you've seen the same theme: LLMs are lazy crawlers, and the easier you make it for them to understand and cite you, the more often they do. Schema is the cheapest, most deterministic version of that signal.
Think of the hierarchy:
- Schema markup (cheapest, most deterministic) — tells the crawler what you are.
llms.txt(also cheap) — tells the crawler where to look.- Clean, FAQ-structured content (moderate effort) — gives the LLM quotable fragments.
- External citations +
sameAslinks (ongoing effort) — builds the identity graph. - E-E-A-T signals (long-term) — Person schema, author bylines, About-page depth.
You don't need all five to start. Schema is #1 and takes twenty minutes. Do it today.
Try it
Open the Schema Markup Generator →
Free, no signup, Alberta-pre-filled. Five schema tabs. Live preview. One-click copy. Valid JSON-LD out the other end.
If you'd rather have us audit and ship all the schema for your site, book a free 15-minute AI audit — we'll tell you exactly what's missing and what it would cost to fix.
FAQ
Do I need schema markup on every page of my site?
No. You need it on the pages it describes. LocalBusiness belongs on your homepage or contact page. Service schemas belong on each individual service page. FAQPage belongs on pages that actually have an FAQ section. Person schema belongs on the About page and on blog post author bylines. It's fine to put the same sitewide Organization block on every page via a shared template.
Will this tool work for businesses outside Edmonton?
Yes. Every default field is editable. If you're in Calgary, change Edmonton to Calgary and AB stays correct. If you're in Toronto, change the city and change AB to ON. If you're in the US, change the country code to US and set the state abbreviation. The defaults are a starting point, not a constraint.
What's the difference between LocalBusiness and Organization schema?
LocalBusiness is a subclass of Organization. Use LocalBusiness when you have a physical location or a defined service area (most Edmonton service businesses — clinics, contractors, restaurants, law firms). Use Organization when you have no physical location (pure SaaS, remote-only agencies). Hybrid businesses can ship both with different @id values on the same page.
Where do I paste the JSON-LD output?
Inside the <head> or <body> of the page's HTML. For Squarespace or Wix, use the Code Injection setting. For WordPress, paste into your theme's header.php or use a header-injection plugin. For Next.js, use the <Head> component or render a <script> element. For a raw HTML site, paste directly into the <head>.
Will adding schema instantly make me rank higher on Google?
No. Schema is a prerequisite, not a magic accelerant. It makes you eligible for rich results, it clarifies what you are to crawlers, and it increases the odds of AI-search citation over time. If your page was invisible because of schema, fixing it helps. If your page was invisible because of thin content or no backlinks, schema alone won't save it.
Is there a penalty for emitting multiple schemas on one page?
No. You can and often should ship multiple schemas on the same page — Organization + LocalBusiness + FAQPage on a homepage is common and correct. Use different @id values for each distinct entity.
Why don't you generate Article or BlogPosting schema?
Because Article and BlogPosting are per-post, and the right way to ship them is automatically from your CMS or site framework — not by hand-generating a JSON-LD block for each post and pasting it. If you're on Next.js, WordPress, or Ghost, those schemas should be auto-generated. If they're not, the fix is a code change, not a one-off paste.
What if I want schema for a Product or AggregateRating?
Not in this tool. Product/Offer schemas belong in an e-commerce context and require specific pricing, availability, and SKU data that service businesses don't have. AggregateRating is being de-emphasized by Google due to fake-review abuse. If you need either, work with an e-commerce-focused SEO specialist.
How do I validate that my schema is correct?
Use Google Rich Results Test — paste your URL, Google tells you which rich results you're eligible for. Also use the Schema.org Validator for a stricter spec check. Both are free and instant. We link to both from the tool.
How often does Google re-read my schema?
Within days for most sites, sooner if you "Request Indexing" in Google Search Console. For AI search engines (ChatGPT, Claude, etc.), re-indexing happens on their training cadence — weeks to months, not hours. Schema is a long-game signal.
Can I add my own custom fields to the JSON-LD?
Not via the generator. If you need custom schema.org properties we haven't included, edit the copied JSON-LD by hand before pasting. Our output is valid JSON — add fields, test again in Rich Results Test, and ship.
I have multiple business locations. How do I handle that?
Generate one LocalBusiness block per location. Give each a distinct @id (e.g. https://yoursite.com/#downtown-location, https://yoursite.com/#south-location). Paste all blocks on your homepage or on location-specific pages. Google and LLMs will treat them as distinct entities that share a parent brand.
Does this replace hiring an SEO consultant?
For schema specifically — for most Edmonton service businesses, yes. If your schema is the only thing between you and rich-result eligibility, this tool plus thirty minutes is the fix. If you need a full AEO + SEO audit (content, backlinks, technical, identity graph), that's a bigger engagement and we offer it.