Schema Markup for Law Firm Websites: The LegalService Structured Data Guide
Here's the uncomfortable truth about most law firm websites: the humans understand exactly what the firm does within about four seconds of landing on the homepage, but Google is still squinting. Structured data is the difference between telling a search engine "we do family law, commercial disputes and wills" in prose it has to interpret, versus handing it a clean, structured answer it can trust and display 💖. It's one of the few genuinely "set and forget" pieces of SEO — implement it properly once, and it keeps working in the background indefinitely.
What most law firms get wrong with schema
The most common mistake is using generic "LocalBusiness" schema copied from a template, which tells Google you're a business but not that you're specifically a legal service — so you miss out on the more relevant display treatment schema.org actually offers for firms like yours. The second mistake is far worse: firms that add an aggregateRating field with a rating and review count that isn't backed by genuine, verifiable reviews on the page. That's not just an SEO risk, it's a straightforward violation of Google's structured data guidelines, and it can get your rich results — or your whole site — penalised. The third, quieter mistake is setting it up once during a website build and never touching it again, so as the firm adds practice areas or offices, the schema quietly goes stale and stops matching the actual page content.
Copy-paste LegalService JSON-LD template
Drop this in a <script type="application/ld+json"> tag in your page's <head>, then replace every bracketed placeholder with your firm's real details:
{
"@context": "https://schema.org",
"@type": "LegalService",
"name": "[Firm Name]",
"image": "[https://yourfirm.com.au/logo.jpg]",
"url": "[https://yourfirm.com.au]",
"telephone": "[+61-X-XXXX-XXXX]",
"priceRange": "[$$ or "Contact for pricing"]",
"address": {
"@type": "PostalAddress",
"streetAddress": "[Street address]",
"addressLocality": "[Suburb]",
"addressRegion": "[State]",
"postalCode": "[Postcode]",
"addressCountry": "AU"
},
"areaServed": [
"[Suburb/Region 1]",
"[Suburb/Region 2]"
],
"openingHours": "Mo-Fr 08:30-17:00",
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Practice Areas",
"itemListElement": [
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "[Practice Area 1, e.g. Family Law]"
}
},
{
"@type": "Offer",
"itemOffered": {
"@type": "Service",
"name": "[Practice Area 2, e.g. Wills & Estates]"
}
}
]
}
}
On aggregateRating: only add this field if you have genuine, verifiable reviews displayed on the same page, with a real count and average. If you're not 100% sure, leave it out entirely — the risk of a manual action isn't worth the marginal ranking benefit.
hasOfferCatalog covering commercial litigation, contract disputes and insolvency meant Google started surfacing the right service pages for those specific searches instead of just the homepage.How it actually works, mechanically
-
Placement: the JSON-LD script sits in the
<head>(or before the closing</body>) of each relevant page — homepage plus every location and practice area page, ideally. - Validation: always test with Google's Rich Results Test before publishing — a single missing comma breaks the whole block silently.
-
Consistency: your
name,addressandtelephonefields need to match your Google Business Profile exactly, character for character — mismatches are a known trust signal issue. - Timeline: Google doesn't reprocess schema instantly — expect anywhere from a few days to a few weeks for it to reflect in search results, depending on how often your pages get crawled.
- Maintenance: update the schema every time you add a practice area, open a new office, or change your hours — it's a five-minute edit, not a rebuild.
Mistakes to avoid
- Using generic LocalBusiness schema instead of LegalService.
- Adding aggregateRating without genuine, displayed reviews to back it.
- Letting name/address/phone details drift out of sync with your Google Business Profile.
- One giant schema block that doesn't match the specific page it's sitting on.
- Setting it up once at launch and never updating it as the firm grows.
- Skipping validation and publishing broken JSON-LD that search engines simply ignore.
Frequently asked questions
Will adding LegalService schema improve our Google rankings?
Not directly, and it's important to be honest about that — schema is not a confirmed ranking factor on its own. What it does is help Google understand your page correctly and become eligible for richer display treatments, which can improve click-through rate even without a ranking change. Think of it as removing friction, not adding rocket fuel.
Do we need a developer to add this, or can our marketing team do it?
Most website platforms (including common law firm site builders) let you paste custom code into a page's header settings without developer access. If your platform locks that down, a developer will need roughly 15-30 minutes per template, which is a very small job worth asking for.
Should every page have its own schema, or just the homepage?
Ideally every page that represents a distinct location or practice area gets its own scoped schema matching that page's actual content. A single homepage-only block is better than nothing, but it undersells firms with multiple offices or a wide range of services.
Is it risky to list practice areas we don't heavily focus on?
Only if it's misleading. If you genuinely handle a practice area, even occasionally, it's fine to list it. Listing something you don't actually practise just to capture search traffic risks both a poor user experience and, depending on how it's framed, a misleading advertising problem — which brings you back to the same rules covered in our legal advertising compliance guide.
Keep reading 🤍
I help Gold Coast and Brisbane businesses grow with branding, websites and marketing that actually works.
Work with me ✦