---
title: "Schema Markup Generator"
id: "23922"
type: "page"
slug: "schema-markup-generator"
published_at: "2026-11-04T08:02:17+00:00"
modified_at: "2026-11-04T20:34:57+00:00"
url: "https://uprisedigital.com.au/tools/schema-markup-generator/"
markdown_url: "https://uprisedigital.com.au/tools/schema-markup-generator.md"
excerpt: "Schema Markup Generator: Free JSON-LD for Service Businesses Build clean JSON-LD for your business, services, people, FAQs and articles in a few minutes. Made for law firms, builders and solar companies, and free with no sign-up. Free to use. No..."
---

# Schema Markup Generator: Free JSON-LD for Service Businesses

Build clean JSON-LD for your business, services, people, FAQs and articles in a few minutes. Made for law firms, builders and solar companies, and free with no sign-up.

Free to use. No sign-up. Built by [Uprise Digital](https://uprisedigital.com.au/about-us/)
.

Step 1: pick a type

Local BusinessOrganizationServicePersonFAQ PageArticle

Step 2: fill in what applies

Reset this typeFill an example

Step 3: copy your JSON-LD

### Your schema markup

Updates as you type. Empty fields are left out.

This blockCombined @graph (0)

Copy codeDownload .jsonAdd to @graph

Blocks in your @graph

**Test it before you publish.** Paste the code into Google's Rich Results Test to see which rich results it qualifies for, and the Schema.org validator to check every property.

[Google Rich Results Test](https://search.google.com/test/rich-results)
[Schema.org validator](https://validator.schema.org/)

**Schema is one small part of being recommended by AI.** Assistants also check what rankings, directories and reviews say about you. See what ChatGPT and Gemini say about your business today.

[Get a free AI visibility audit](#audit)

' + (o.help ? '' + esc(o.help) + '' : '') + '

'; } function hoursHTML() { var H = S.hours; var h = 'Hours' + [['set', 'Set hours for each day'], ['247', 'Open 24 hours, 7 days'], ['none', 'Don’t include hours']].map(function (p) { return '' + p[1] + ''; }).join('') + '

'; if (H.mode === 'set') { h += '' + DAYS.map(function (d, i) { var r = H.days[i]; return '' + d + '' + '' + '

'; }).join('') + 'Copy Monday to all ticked days

'; } return h; } function ratingHTML() { var R = S.rating; return 'Star rating (read this first)' + 'Google’s review snippet guidelines say reviews a business marks up about itself on its own site aren’t eligible for star rich results. Most sites should leave this out and let their Google Business Profile reviews do the work.

' + 'I understand. Include an aggregate rating anyway.' + 'Average rating (out of 5)

' + 'Number of reviews

'; } function faqHTML() { var n = S.faq.length; return '' + S.faq.map(function (r, i) { return '**Question ' + (i + 1) + '**' + '↑' + '↓' + 'Remove

' + 'Question

' + 'Answer' + esc(r.a) + '

'; }).join('') + '

Add a question

'; } function renderForm() { var html = '', open = false; function close() { if (open) { html += '

'; open = false; } } F[S.type].forEach(function (f) { if (f[0] === '#') { close(); html += '' + esc(f[1]) + '

'; return; } if (!open) { html += ''; open = true; } if (f[0] === '@hours') html += hoursHTML(); else if (f[0] === '@rating') html += ratingHTML(); else if (f[0] === '@faq') html += faqHTML(); else html += fieldHTML(f); }); close(); $('[data-form]').innerHTML = html; $('[data-intro]').textContent = INTRO[S.type]; $$('[data-type]').forEach(function (b) { b.setAttribute('aria-pressed', String(b.getAttribute('data-type') === S.type)); }); } function renderOut() { var cur = buildCurrent(); if (S.view === 'graph' && !S.graph.length) S.view = 'block'; $$('[data-view]').forEach(function (b) { b.setAttribute('aria-pressed', String(b.getAttribute('data-view') === S.view)); }); $('[data-gcount]').textContent = S.graph.length; var txt = codeText(outputObj()); $('[data-code]').innerHTML = highlight(txt); var W = S.view === 'graph' ? [] : cur.W; $('[data-warn]').innerHTML = W.map(function (w) { return '' + esc(w[1]) + '

'; }).join('') || (S.view === 'block' ? '**Looks complete.** Test it in Google’s Rich Results Test before you publish.

' : ''); var props = Object.keys(S.view === 'graph' ? {} : cur.obj).filter(function (k) { return k.charAt(0) !== '@'; }).length; $('[data-status]').textContent = S.view === 'graph' ? S.graph.length + ' blocks combined into one @graph.' : props + ' properties, ' + W.filter(function (w) { return w[0] === 'bad'; }).length + ' to fix.'; $('[data-graphwrap]').hidden = !S.graph.length; $('[data-graph]').innerHTML = S.graph.map(function (g, i) { return '' + esc(g.label) + 'Remove'; }).join(''); save(); } function toast(m) { var t = $('[data-toast]'); t.textContent = m; clearTimeout(toast.t); toast.t = setTimeout(function () { t.textContent = ''; }, 2600); } function copy(text) { if (navigator.clipboard && window.isSecureContext) return navigator.clipboard.writeText(text).then(function () { return true; }, function () { return fallback(); }); return Promise.resolve(fallback()); function fallback() { var ta = document.createElement('textarea'); ta.value = text; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.opacity = '0'; document.body.appendChild(ta); ta.select(); var ok = false; try { ok = document.execCommand('copy'); } catch (e) {} document.body.removeChild(ta); return ok; } } // ---------- events root.addEventListener('input', function (e) { var t = e.target, k = t.getAttribute('data-k'); if (k) { (S.v[S.type] = S.v[S.type] || {})[k] = t.value; return renderOut(); } if (t.hasAttribute('data-hopen')) { S.hours.days[+t.getAttribute('data-hopen')].open = t.value; return renderOut(); } if (t.hasAttribute('data-hclose')) { S.hours.days[+t.getAttribute('data-hclose')].close = t.value; return renderOut(); } if (t.hasAttribute('data-rating')) { S.rating[t.getAttribute('data-rating')] = t.value; return renderOut(); } if (t.hasAttribute('data-fqk')) { S.faq[+t.getAttribute('data-i')][t.getAttribute('data-fqk')] = t.value; return renderOut(); } }); root.addEventListener('change', function (e) { var t = e.target; if (t.getAttribute('data-k') && t.tagName === 'SELECT') { S.v[S.type][t.getAttribute('data-k')] = t.value; return renderOut(); } if (t.hasAttribute('data-hmode')) { S.hours.mode = t.value; renderForm(); return renderOut(); } if (t.hasAttribute('data-hday')) { var i = +t.getAttribute('data-hday'); S.hours.days[i].on = t.checked; t.closest('.uts-day').classList.toggle('off', !t.checked); return renderOut(); } if (t.hasAttribute('data-rating-on')) { S.rating.on = t.checked; return renderOut(); } }); root.addEventListener('click', function (e) { var b = e.target.closest('button'); if (!b || !root.contains(b)) return; var ty = b.getAttribute('data-type'); if (ty) { S.type = ty; S.view = 'block'; renderForm(); return renderOut(); } var vw = b.getAttribute('data-view'); if (vw) { if (vw === 'graph' && !S.graph.length) { toast('Add a block to the @graph first.'); return; } S.view = vw; return renderOut(); } var fq = b.getAttribute('data-fq'); if (fq) { var i = +b.getAttribute('data-i'), F2 = S.faq; if (fq === 'add') F2.push({ q: '', a: '' }); if (fq === 'del') { F2.splice(i, 1); if (!F2.length) F2.push({ q: '', a: '' }); } if (fq === 'up' && i > 0) F2.splice(i - 1, 0, F2.splice(i, 1)[0]); if (fq === 'down' && i < F2.length - 1) F2.splice(i + 1, 0, F2.splice(i, 1)[0]); renderForm(); renderOut(); if (fq === 'add') { var q = $('#uts-q' + (F2.length - 1)); if (q) q.focus(); } return; } if (b.hasAttribute('data-gdel')) { S.graph.splice(+b.getAttribute('data-gdel'), 1); toast('Removed from the @graph.'); return renderOut(); } var act = b.getAttribute('data-act'); if (act === 'copy') { copy(codeText(outputObj())).then(function (ok) { toast(ok ? 'Copied. Paste it into your page or SEO plugin.' : 'Copy failed. Select the code and copy it manually.'); }); } if (act === 'download') { try { var blob = new Blob([JSON.stringify(outputObj(), null, 2)], { type: 'application/ld+json' }); var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = (S.view === 'graph' ? 'schema-graph' : 'schema-' + S.type) + '.json'; document.body.appendChild(a); a.click(); setTimeout(function () { URL.revokeObjectURL(a.href); a.remove(); }, 500); } catch (err) { toast('Download isn’t available in this browser. Use Copy instead.'); } } if (act === 'add') { var cur = buildCurrent().obj, v = S.v[S.type] || {}; var name = v.name || v.headline || (S.type === 'faq' ? S.faq.filter(function (r) { return r.q; }).length + ' questions' : ''); S.graph.push({ type: S.type, label: LABEL[S.type] + (name ? ': ' + name : ''), obj: cur }); S.view = 'graph'; toast('Added. Switch type to build the next block.'); renderOut(); } if (act === 'reset') { var fresh = blankState(); S.v[S.type] = fresh.v[S.type]; if (S.type === 'lb') { S.hours = fresh.hours; S.rating = fresh.rating; } if (S.type === 'faq') S.faq = fresh.faq; S.view = 'block'; renderForm(); renderOut(); toast('Cleared.'); } if (act === 'example') { S.v[S.type] = JSON.parse(JSON.stringify(EXAMPLE[S.type])); if (S.type === 'lb') { S.hours = blankHours(); S.hours.days[5] = { on: true, open: '09:00', close: '13:00' }; } if (S.type === 'faq') S.faq = [{ q: 'How much does a knockdown rebuild cost in Melbourne?', a: 'Most of our knockdown rebuilds cost between $450,000 and $900,000, depending on the size of the home and the inclusions.' }, { q: 'How long does a knockdown rebuild take?', a: 'Usually 9 to 14 months from demolition to handover.' }]; S.view = 'block'; renderForm(); renderOut(); toast('Example filled. Replace it with your details.'); } if (act === 'copymon') { var m = S.hours.days[0]; S.hours.days.forEach(function (d, i) { if (i && d.on) { d.open = m.open; d.close = m.close; } }); renderForm(); renderOut(); } }); renderForm(); renderOut(); root.__schemaTest = { S: S, B: B, clean: clean, buildCurrent: buildCurrent, outputObj: outputObj, codeText: codeText, normPhone: normPhone, render: function () { renderForm(); renderOut(); } }; })();

## What is schema markup?

[Use the Schema Markup Generator](#ut-top)

Schema markup is a block of code that describes the facts on a page in a format search engines can read without guessing: who you are, where you are, what you sell and who wrote the page. It uses the shared [schema.org](https://schema.org/)
 vocabulary, which Google, Bing and other search engines all support.

The most common format is JSON-LD, a short script that sits in your page’s HTML and doesn’t change how the page looks. Google recommends it over the older Microdata and RDFa formats ([Google Search Central](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)
).

Done well, schema can make a page eligible for rich results such as business details and article information, and it gives AI assistants accurate facts to work from.

FormatJSON-LD, Google’s recommended format

Vocabularyschema.org, used by Google and Bing

Where it goesIn the page HTML, head or body

Checked withRich Results Test and Schema.org validator

## Which Schema Types Matter for Service Businesses

Schema.org has hundreds of types, but a service business needs only a handful. Start with the one that describes the business, add one for each service you sell, then add one for each person whose expertise you want recognised.

| Business | Main type | Add these |
| --- | --- | --- |
| Law firm | LegalService | Person for each lawyer, with credentials and law society membership. Service for each practice area page. |
| Builder | GeneralContractor | Service for each build type (custom homes, knockdown rebuilds, extensions). Article for cost guides. |
| Solar and battery installer | HomeAndConstructionBusiness or Electrician | Service for solar, batteries and EV chargers, each with the areas you install in. |
| Online or national business | Organization | Person for founders and authors. Article for guides and research. |

Schema.org has no specific type for solar installers, so use the closest parent type and describe the work in a Service block. For law firms, use LegalService rather than the older Attorney type, which schema.org now flags as less useful than LegalService.

### Local business schema

This is the most valuable block for most businesses. Google lists `name` and `address` as required, and recommends telephone, URL, opening hours, geo coordinates and price range ([Google Search Central: local business](https://developers.google.com/search/docs/appearance/structured-data/local-business)
). If you work from home or only travel to clients, add at least your suburb, state and postcode, and use `areaServed` for the regions you cover.

The `sameAs` property is the one most businesses skip. It lists the profiles that confirm you are the same business everywhere: your Google Business Profile, LinkedIn, Facebook and industry directories such as HIA or Doyle’s Guide. Those are the sites AI assistants check before they recommend anyone.

### Person schema and E-E-A-T

Google’s guidance on helpful content asks whether it is clear who wrote a page and why they are qualified to ([Google Search Central: creating helpful content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content)
). Person schema puts that answer in code: job title, credentials, memberships, education and profile links. Pair it with a real bio page for each author. We cover the wider picture in our guide to [E-E-A-T](https://uprisedigital.com.au/blog/eeat/)
.

### Service schema and the @graph

Give each service its own page and its own Service block: one for knockdown rebuilds, one for extensions, one for family law, one for home batteries. Name your business as the `provider`, list the areas you cover, and add a price or a price range if your page publishes one. Prices in plain sight are one of the things AI assistants quote.

When a page needs more than one block, such as the business, the service and the person who leads it, combine them in one `@graph`. Each block keeps its own `@id`, so search engines can see they describe one connected business rather than three separate ones. Use Add to @graph in the generator to build this.

## Schema and AI Search

Schema helps machines read facts about you accurately: your name, address, services, people and prices. That matters for AI assistants, which have to state facts about a business plainly before they recommend it.

It is not a shortcut to being recommended. In our own research on Australian builders, schema slightly favoured the builders AI left out, so we treat it as a tool for accuracy rather than a lever for visibility. What moves AI recommendations is being findable, being confirmed by sites the assistants trust, and publishing specific, checkable facts. Read more in [what is GEO](https://uprisedigital.com.au/blog/what-is-geo/)
 and our study of [Google knowledge panels](https://uprisedigital.com.au/blog/google-knowledge-panel/)
.

**The rule of thumb:** schema should repeat what your page already says in plain text. If a fact only exists in your JSON-LD, readers and most AI answers will never see it.

## How to Add JSON-LD to WordPress

Google recommends JSON-LD and reads it in the `<head>` or the `<body>` of the page ([Google Search Central: introduction to structured data](https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data)
). On WordPress you have three practical options.

1. **Your SEO plugin.** Rank Math and Yoast both output a base schema graph for every page, usually WebSite, WebPage and Organization. Check their schema settings first so you fill in the business details once.
2. **A code snippet plugin.** Plugins such as WPCode can add a script to chosen pages. This suits a LocalBusiness block on the homepage or a Person block on each bio page.
3. **An HTML block in the page.** In the block editor or Elementor, paste the code into a Custom HTML block or HTML widget on that page only.

<script type="application/ld+json">  
{ "@context": "https://schema.org", "@type": "LegalService", "name": "Smith Legal", ... }  
</script>

Whichever you choose, make sure you don’t end up with two different Organization blocks on one page, one from the plugin and one you pasted. Use the same `@id` for the same business everywhere, which this generator does for you by adding `#localbusiness` or `#organization` to your URL.

## Common Schema Mistakes

- **Marking up content that isn’t on the page.** Google’s guidelines say structured data should describe content readers can see ([Google Search Central: structured data policies](https://developers.google.com/search/docs/appearance/structured-data/sd-policies) ).
- **Self-serving review stars.** Reviews a business marks up about itself on its own site aren’t eligible for star rich results for LocalBusiness and Organization ([Google Search Central: review snippet](https://developers.google.com/search/docs/appearance/structured-data/review-snippet) ).
- **Details that don’t match your Google Business Profile.** A different phone number or an old address in your schema undoes the point of it.
- **Relative URLs.** Use full addresses that start with https:// for your website, logo, images and profiles.
- **Copying a template and forgetting a field.** A leftover placeholder name or the wrong suburb gets read as fact.
- **Expecting FAQ stars.** Since August 2023, Google has shown FAQ rich results mainly for well-known government and health sites ([Google Search Central Blog](https://developers.google.com/search/blog/2023/08/howto-faq-changes) ). The markup is still valid; just don’t expect the dropdowns in search results.

## How to Test Your Schema

Test every block before it goes live, then check it again after publishing.

1. Paste the code into [Google’s Rich Results Test](https://search.google.com/test/rich-results) to see which rich results the page can get and any errors Google flags.
2. Paste it into the [Schema Markup Validator](https://validator.schema.org/) to check every property, including types Google has no rich result for, such as Person and Service.
3. After publishing, test the live URL in the Rich Results Test, so you know the code survived your theme and caching.
4. Watch the enhancement reports in Google Search Console for new errors over the following weeks.

Schema is one technical layer of a site that gets found. For the rest, see our breakdown of [technical SEO problems on Australian sites](https://uprisedigital.com.au/blog/technical-seo/)
, or talk to us about [AI SEO](https://uprisedigital.com.au/ai-seo/)
.

## How to Use the Schema Generator

Four steps, under a minute, nothing to sign up for.

45+ 5 Star Reviews

**5.0**★★★★★

1

### Pick the type

Choose Local Business for your homepage or contact page, Service for each service page, Person for bio pages, FAQ Page or Article for content.

2

### Fill in the facts

Enter only what’s true and visible on the page. Empty fields are left out, and the warnings show what Google requires or recommends.

3

### Copy the code

Copy the JSON-LD and paste it into your SEO plugin, a code snippet plugin or an HTML block on that page. Use Add to @graph to combine several types.

4

### Test, then publish

Run it through Google’s Rich Results Test and the Schema.org validator, publish, then test the live URL again.

## Find Out What AI Says About You

- Where your marketing stands: ads, website, tracking and how AI assistants describe you.
- Where the money leaks: the spend, pages and steps that cost you enquiries.
- Your first three moves, in priority order.
- You’ll speak with a specialist who runs campaigns, not a salesperson.

★ ★ ★ ★ ★

5.0 Rating

45+ Reviews

### Find Out What Your Marketing Is Really Costing You

## Schema Markup Questions, Answered

What is a schema markup validator?

A tool that checks your structured data for errors. Google’s Rich Results Test shows which rich results a page can get, and the Schema Markup Validator at validator.schema.org checks every schema.org property. Paste the code from this generator into either one.

Does schema markup improve Google rankings?

Not directly. Google uses structured data to understand a page and to decide whether it can show rich results. Those can make your listing more useful, but schema won’t lift a page that doesn’t already deserve to rank.

Does schema help with ChatGPT and AI search?

It helps machines read your facts accurately, which matters when an assistant describes your business. In our research on Australian builders, schema slightly favoured the builders AI left out, so treat it as a tool for accuracy. Being confirmed by sites AI trusts matters far more.

Which schema should a law firm use?

LegalService for the firm, with your address, phone, hours and areas served, plus Person schema for each lawyer with their credentials and memberships. Add Service schema to each practice area page.

Which schema should a builder or solar installer use?

Builders should use GeneralContractor. Solar installers can use HomeAndConstructionBusiness or Electrician, because schema.org has no solar-specific type. Then add a Service block for each type of work, listing the areas you cover.

Is FAQ schema still worth adding?

Since August 2023, Google has shown FAQ rich results mainly for well-known government and health sites, so most businesses won’t get the dropdowns. The markup is still valid and still describes your questions and answers clearly, as long as they’re visible on the page.

Can I add review stars to my own website?

You can add the markup, but Google won’t show stars for reviews a business marks up about itself on its own site for LocalBusiness and Organization. Your Google Business Profile reviews are what show in local results.

Where do I put JSON-LD in WordPress?

Check what your SEO plugin, such as Rank Math or Yoast, already outputs first. Then add your own blocks with a code snippet plugin or an HTML block on the specific page. Avoid two different Organization blocks on the same page.

## More Free Marketing Tools

[CPM CalculatorCost per 1,000 impressions, total cost or reach, plus CTR, CPC and cost per lead.Open the tool →](https://uprisedigital.com.au/tools/cpm-calculator/)
[ROAS CalculatorReturn on ad spend, break-even ROAS from your margin, and profit after fees.Open the tool →](https://uprisedigital.com.au/tools/roas-calculator/)
[Cost Per Sale CalculatorCompare lead sources on true cost per sale, including your sales team’s time.Open the tool →](https://uprisedigital.com.au/tools/cost-per-sale-calculator/)
[CTR CalculatorClick-through rate for ads, search and email, and what a better CTR is worth.Open the tool →](https://uprisedigital.com.au/tools/ctr-calculator/)
[UTM BuilderCampaign URLs for GA4 with presets for Meta, Google, email and Google Business Profile.Open the tool →](https://uprisedigital.com.au/tools/utm-builder/)
[Google Review Link GeneratorA direct review link, QR code and printable review card for your business.Open the tool →](https://uprisedigital.com.au/tools/google-review-link-generator/)
[PPC ROI CalculatorEstimate leads, sales and return from a Google Ads budget.Open the tool →](https://uprisedigital.com.au/ppc-roi-calculator/)
[AI Marketing StrategyA marketing strategy for your business, written by AI from your answers.Open the tool →](https://uprisedigital.com.au/ai-marketing-strategy/)
