LegalService wrapping Person nodes. The firm as the entity, attorneys nested inside.
Google's parser reads the LegalService node to decide which queries the firm is relevant to, then reads the Person nodes inside to attribute each attorney's bar admissions, publications, and alumni networks to the firm cleanly. Flat Organization or LocalBusiness markup is the common failure mode. We build the nested entity graph so the firm is read as one entity rather than as a fragmented set of individuals.
Why nested entities beat flat Organization markup.
The schema.org LegalService type was designed for the legal vertical specifically. It accepts a practiceArea slot, a serviceArea slot, a priceRange slot, and a list of provider entities. The Person type nests inside via the employee or member properties. Each Person can carry its own knowsAbout array, hasCredential list (bar admissions), alumniOf (law school), and publication references.
Flat Organization markup tells Google the firm exists. It does not tell Google which attorneys practice which areas, where each is licensed, what each has published, or which alumni networks each belongs to. The E-E-A-T signal Google needs to surface the firm against practice-area-specific queries is absent from the markup; it has to be reconstructed from page content if at all. The nested implementation makes the signal explicit at the JSON-LD layer.
The Florida Bar's January 2024 AI guidelines and the California State Bar's November 2023 guidelines both require a documented attorney-review chain for AI-drafted client-facing content. Programmatic practice-area pages generated through an AI workflow inherit the nested schema automatically when the template emits the entity graph at build time. The same architecture serves both the schema requirement and the AI-compliance requirement.
Our law firm SEO program treats schema as the entity-resolution prerequisite for every other ranking signal. Local Pack visibility, rich-result eligibility, and Knowledge Graph entity disambiguation all attach to a clean nested entity graph or fight against an incomplete one.
Schema implementation, phased from audit to ongoing cadence.
-
Schema audit
We inspect the firm's current schema implementation. Flat Organization or LocalBusiness markup is the common starting point. We catalog every attorney, every practice area, every office location, every bar admission, and every named publication. Output is the nested entity graph the firm should be emitting.
-
Schema implementation
LegalService wrapping individual Person nodes. practiceArea populated per attorney with vertical-specific tags (Personal injury, Family law, Immigration, etc.). serviceArea mapped to the geographic surface each attorney is licensed for. priceRange filled where the firm publishes fee bands. JSON-LD emitted at the template level so future content lands inside the established entity graph.
-
Schema cadence
New attorneys added to the Person node list as the firm hires. Bar admissions updated as licenses move. New publications attached to the relevant Person. Quarterly validation against Google's Rich Results Test and the schema.org parser to confirm the nesting still resolves cleanly.
Schema architecture questions before they book a diagnostic.
-
Should the firm site use LegalService or Person schema?
Both, nested. The LegalService type wraps the firm as the entity. Individual attorneys nest as Person nodes inside it. Google's parser reads practiceArea, serviceArea, and priceRange slots on the LegalService node to decide which queries the firm is relevant to, then reads the Person nodes inside to attribute individual attorney E-E-A-T signals (bar admissions, publications, alumni networks) to the firm cleanly without entity confusion.
-
What does a LegalService schema actually look like?
The LegalService type from Schema.org wraps the firm as the entity. Top-level slots include `name`, `description`, `url`, `address` (PostalAddress), `telephone`, `email`, `priceRange`, `image`, `logo`, `openingHours`, `areaServed`, `serviceArea`, and `parentOrganization`. The `practiceArea` slot lists the firm's practice areas as an array. Individual attorneys nest as Person nodes under `employee` or `member` slots. Reviews nest under `review` as Review objects. AggregateRating nests under `aggregateRating`.
-
How does `practiceArea` actually populate?
`practiceArea` accepts string values or LegalDefinedTerm objects. The simpler structure ships an array of practice-area strings (`Personal injury law`, `Criminal defense`, `Family law`, `Immigration law`, `Bankruptcy law`). The LegalDefinedTerm structure adds `inDefinedTermSet` and `termCode` for more specific entity references. Google's parser reads either form. The practice-area population determines which queries Google's parser treats the firm as relevant to.
-
What's the difference between `serviceArea` and `areaServed`?
Both are Schema.org slots accepting GeoCircle, Place, or AdministrativeArea values. `areaServed` is the broader slot indicating the geographic area the firm serves. `serviceArea` is the deprecated predecessor (Schema.org now recommends `areaServed`). For a firm with offices in three cities serving five states, `areaServed` lists the five states. The Local Pack ranking signals read both slots when present and treat them substantively equivalent.
-
How does `priceRange` work for a legal practice?
`priceRange` accepts string values typically formatted as dollar signs (`$$`, `$$$`, `$$$$`) signaling relative price tier. The slot is more often populated for retail and hospitality verticals than for legal services. For a legal practice, the slot can signal retainer tier (e.g., `$$$` for a mid-market practice) but the substantive consumer signal is limited. Fee transparency in the visible page copy carries more weight than the priceRange slot for buyer trust.
-
How does Person nest under LegalService?
Individual attorneys nest as Person objects under the LegalService entity through `employee` (for staff attorneys) or `member` (for partners and members). Each Person carries `name`, `jobTitle`, `email`, `telephone`, `image`, `description`, `alumniOf` (law school), `knowsAbout` (practice areas), `hasCredential` (bar admissions, certifications), `award` (recognitions), and `sameAs` (LinkedIn, Avvo, Martindale-Hubbell, Justia). The nesting structure attributes individual attorney signals to the firm entity cleanly.
Build the nested entity graph once. Every future page inherits it. Book a diagnostic.
We inspect the firm's current schema bundle, catalog every attorney and practice area, and map the nested LegalService and Person architecture the firm should be emitting. The implementation lands in foundation; future pages inherit the entity graph at the template level.