What it measures

Whether your service page declares the correct schema.org service-type subtype — and whether that declaration carries the filterable properties agents need to match you against service-typed queries.

I1 identifies your organization. I2 identifies what your organization does. A site can score 5 on I1 — well-declared identity — and 2 on I2 if the service-type axis is missing. An agent that knows you're an NGO but doesn't know you provide removal defense in Spanish in Cook County can't match you to "free immigration legal aid in Spanish in Chicago."

I2 covers any page that describes a service, offering, or operating business — anything an agent might evaluate against a service-typed query such as "free legal help in Spanish in Maryland," "community health clinic in San Antonio," or "emergency plumber in Oakland."

Why it matters

For matching

Agents answering service queries filter by type before they rank by relevance. A community clinic without MedicalClinic schema ranks below competitors who declared it, even when the clinic is the better answer.

For filtering

Declaring the service type tells agents the category. Declaring the filterable properties — jurisdiction, language, cost, eligibility — lets them answer the specific question, not just the general one.

For both audiences

The same mechanics apply to a free legal aid clinic and a two-attorney immigration practice. The consequence classes differ — but the technical requirement is the same: type plus filterable properties.

Very high public-interest stakes. A noncitizen facing removal may rely on an AI assistant to find free legal help in their language. If the legal aid clinic's page declares NGO with no LegalService, areaServed, or availableLanguage, the agent is less likely to surface it — and more likely to surface a commercial firm or a referral directory the person cannot actually use.

The stakes

5 Precise service-type subtype with the filterable property set: serviceType (or equivalent), provider, areaServed, availableLanguage, audience/eligibilityCriteria, and isAccessibleForFree or offers
4 Precise service-type subtype with name, description, and at least three filterable properties — one or two of the agent-filter properties missing
3 Correct parent type where a precise subtype was available (e.g., Service instead of LegalService), or precise subtype declared with only name and url
2 Generic Organization/LocalBusiness only, where a service-type subtype clearly applies
1 No service-type schema on a service page, or declared type misrepresents the offering (referral directory declaring LegalService, news article declaring the service it covers, unlicensed practitioner declaring a credentialed type)

What each score looks like

5 Precise subtype + full filterable property set

Public-interest

A noncitizen-serving legal aid clinic declares LegalService with serviceType: "Removal defense", provider linked to its NGO, areaServed: "Cook County, IL", availableLanguage: ["en", "es"], audience.audienceType: "noncitizens facing removal proceedings", and isAccessibleForFree: true.

Commercial

A two-attorney immigration practice declares Attorney with serviceType: "Family-based petitions", areaServed: "California", availableLanguage: ["en", "zh"], and fees via offers and priceRange.

4 Precise subtype + three filterable properties (one or two missing)

Public-interest

A community health clinic declares MedicalClinic with areaServed, availableLanguage, and isAccessibleForFree, but no audience to signal sliding-scale eligibility.

Commercial

An urgent care chain declares MedicalBusiness with areaServed, openingHours, and priceRange — but no availableLanguage despite serving a multilingual population.

3 Parent type instead of subtype, or subtype with name and url only

Public-interest

A food-pantry network declares itself a SocialService with name and URL only — agents see the category but can't tell which locations serve which neighborhoods, on which days, in which languages.

Commercial

A regional plumbing co-op declares LocalBusiness (parent type) instead of Plumber (subtype); agents filtering on "plumber in Oakland" are more likely to surface typed competitors above it.

2 Organization/LocalBusiness only — service-type axis absent

Public-interest

A community legal aid organization declares NGO (strong I1 signal) but no LegalService — the page reads as "an organization that exists," not "an organization that provides removal defense in Spanish in Cook County."

Commercial

An independent plumbing business declares LocalBusiness only — the service axis agents filter on isn't present.

1 No schema, or declared type misrepresents the offering

Public-interest

A 501(c)(3) volunteer-run food pantry has no JSON-LD service-type schema at all on its main page; an agent answering "free food pantry open Saturday in Pilsen" is more likely to surface commercial grocery delivery instead.

Commercial

A referral-only directory declares LegalService as if it provides legal services rather than referrals — agents are more likely to match it to direct-service queries it can't fulfill.

How to implement

Step 1: Choose your service type

Pick the most precise schema.org subtype that accurately describes what the page offers. Granularity is rewarded only when it's also accurate.

Public-interest types (representative)

LegalService Free or low-cost legal aid organizations
GovernmentService Public services offered by a government agency
SocialService Social support services — food pantries, shelters, case management
MedicalClinic Community health clinics, FQHCs
EmergencyService Emergency response services
Hospital When the site is for an actual hospital — not a clinic
EducationalOrganization Schools, literacy programs, workforce development

Commercial types (representative)

Attorney Law offices and legal practices
Restaurant Restaurants and food service
Plumber Plumbing businesses
HomeAndConstructionBusiness Contractors, HVAC, general home services
Store Retail
FinancialService Banks, credit unions, financial advisors
MedicalBusiness Private medical practices
Dentist Dental offices

These lists are representative, not exhaustive. The full schema.org vocabulary is at schema.org/Service.

Step 2: Gather the filterable properties

These are the six properties that separate a Score 5 from a Score 3. Collect them before writing any code:

  • serviceType — human-readable category ("Removal defense," "Pediatric primary care," "Residential plumbing")
  • provider — link to your Organization via @id (the I1 record)
  • areaServed — jurisdiction or city/county/region the service covers
  • availableLanguage — if you serve multiple languages, list them as an array
  • audience or eligibilityCriteria — who the service is for; use audienceType for a plain-language description
  • isAccessibleForFreetrue for free services; use offers with price or priceRange for paid services

Step 3: Add JSON-LD to your service page

Add this code to the <head> of the service page. If you have multiple distinct services, each gets its own declaration.

Minimal version — Score 3 baseline (public-interest) Click to expand

Subtype declared, but no filterable properties. Type is correct; the filter axes are empty.

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "LegalService",
  "name": "Casa Adelante Legal Aid",
  "url": "https://casaadelante.org/legal"
}
</script>
Full version — Score 5 target (public-interest) Click to expand

All six filterable properties declared. An agent can match jurisdiction, language, eligibility, and cost in a single pass.

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "LegalService",
  "name": "Casa Adelante Legal Aid — Removal Defense",
  "url": "https://casaadelante.org/legal",
  "description": "Free removal defense representation for noncitizens in Cook County",
  "serviceType": "Removal defense",
  "provider": {
    "@type": "NGO",
    "@id": "https://casaadelante.org/#organization"
  },
  "areaServed": "Cook County, IL",
  "availableLanguage": ["en", "es"],
  "audience": {
    "@type": "Audience",
    "audienceType": "Noncitizens facing removal proceedings"
  },
  "isAccessibleForFree": true
}
</script>
Minimal version — Score 3 baseline (commercial) Click to expand

Precise subtype, no filterable properties. Type is right; nothing an agent can filter on.

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "Attorney",
  "name": "Nguyen Immigration Law",
  "url": "https://nguyenimmigration.com"
}
</script>
Full version — Score 5 target (commercial) Click to expand

Attorney subtype with serviceType, areaServed, availableLanguage, and pricing via offers.

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "Attorney",
  "name": "Nguyen Immigration Law",
  "url": "https://nguyenimmigration.com",
  "description": "Family-based petition practice serving California",
  "serviceType": "Family-based petitions",
  "provider": {
    "@type": "LegalService",
    "@id": "https://nguyenimmigration.com/#organization"
  },
  "areaServed": "California",
  "availableLanguage": ["en", "zh"],
  "priceRange": "$$",
  "offers": {
    "@type": "Offer",
    "description": "Initial consultation",
    "price": "250",
    "priceCurrency": "USD"
  }
}
</script>

Step 4: Verify it worked

  1. Go to Google's Rich Results Test
  2. Paste the URL of your service page and run the test
  3. Look for your service schema — it should show your type, serviceType, and areaServed
  4. Fix any errors (usually a missing required property or a type mismatch)

Real example

The same upgrade path applies to both a free immigration legal aid clinic and a small immigration law practice — different consequence classes, same technical axis.

Public-interest: Free immigration legal aid clinic

❌ Before — NGO only, no service-type schema

An agent answering "free immigration legal help in Spanish near Chicago"

[searching "free removal defense
Spanish Cook County"]

Results: commercial law firm,
referral directory, bar association.

Agent: "I found several immigration
attorneys in Cook County. Free legal
aid wasn't clearly identified — you
may want to search 211 directly."

✓ After — LegalService + filterable properties

After adding the Score 5 declaration

[searching "free removal defense
Spanish Cook County"]

Found: casaadelante.org — LegalService
serviceType: Removal defense
areaServed: Cook County, IL
availableLanguage: en, es
audience: noncitizens facing removal
isAccessibleForFree: true

Agent: "Casa Adelante offers free
removal defense in Spanish and
English in Cook County."

Commercial: Small immigration law practice

❌ Before — LocalBusiness only

An agent answering "immigration attorney family petitions Mandarin California"

[searching "family petition attorney
Mandarin California"]

Results: three firms with Attorney
schema and availableLanguage: zh.
Nguyen Immigration not surfaced.

Agent: "Here are three Mandarin-
speaking immigration attorneys in
California." [Nguyen not listed]

✓ After — Attorney + filterable properties

After upgrading from LocalBusiness to Attorney with serviceType and language

[searching "family petition attorney
Mandarin California"]

Found: nguyenimmigration.com — Attorney
serviceType: Family-based petitions
areaServed: California
availableLanguage: en, zh

Agent: "Nguyen Immigration Law handles
family-based petitions in California
and works in English and Mandarin."

Why both before examples miss, and why both after examples land

In both cases, the agent is filtering by service type and language before ranking by relevance. Without the type declaration, neither page is in the candidate set. Without availableLanguage, neither page surfaces for language-specific queries — even if the service is genuinely multilingual.

The upgrade from Score 2 to Score 5 is the same technical task for both: choose the right subtype, add the filterable properties, link back to the I1 record via provider.

FAQ

Does NGO + LegalService score higher on I2 than LegalService alone?

No. I1 and I2 score independent axes. I1 measures your organization declaration (who you are). I2 measures your service-type declaration (what you do). A site that co-declares both and links them via provider is doing the right thing architecturally — but I2 doesn't award a bonus for the linkage. Only service-type correctness and the filterable property set determine your I2 score. This keeps the math symmetric: a commercial firm with a perfect LegalService declaration scores the same on I2 as a nonprofit with the same declaration.

What if the schema.org vocabulary has no perfect type for our service?

Use the closest accurate parent type, document your reasoning internally, and score accordingly. Declaring SocialService for an unusual peer-support program is better than declaring nothing or choosing a type that doesn't fit. The rubric treats parent types as Score 3 — correct but less precise than a subtype. If the vocabulary genuinely lacks a good fit, that's a schema.org gap, not a failure on your part.

What if a page describes multiple services?

Declare the primary service as the main schema.org type on the page. Secondary or ancillary services can be declared as separate Service entities with their own serviceType properties. Each should have its own filterable properties if they differ meaningfully — different languages served, different eligibility criteria, different coverage areas.

What counts as a 'wrong' type — and is that an I2 or an I3 problem?

A wrong type is one that misrepresents what the page actually does, judged from the page's own content. A referral directory declaring LegalService as if it provides direct services is a wrong type — I2 catches it. An unlicensed practitioner declaring Attorney is also a wrong type — I2 catches the declaration mismatch. Whether the practitioner holds the relevant license is a separate question: that's I3. I2 is about whether the schema.org type matches the page's stated offering, not about credential verification.

Should service-type schema go on every page, or just the main service page?

On every page that substantively describes a distinct service. A legal aid org with separate pages for removal defense, asylum, and VAWA petitions benefits from a separate service declaration on each. A small business with a single services page can declare it once there.

Checklist

Use this to confirm you've implemented I2 correctly before moving on.