Why Schema Matters for Advocacy
Schema.org structured data enables search engines to:
- Display rich results (FAQ accordions, how-to steps)
- Power voice search responses for crisis queries
- Understand the authority and freshness of legal content
- Generate knowledge panels for your organization
Recommended Schema Types
| Content Type | Schema Type | Rich Result |
|---|---|---|
| Know Your Rights guides | Article | Article rich result |
| Step-by-step procedures | HowTo | Numbered steps in SERP |
| Q&A content | FAQPage | Accordion drop-downs |
| Legal aid directory | LegalService | Business information |
| State/government info | GovernmentService | Service area display |
| Downloadable resources | DigitalDocument | Download indicators |
| Crisis summaries | Speakable | Voice assistant reading |
JSON-LD Implementation
Why JSON-LD?
JSON-LD (JavaScript Object Notation for Linked Data) is the preferred format because:
- Injected in
<head>without cluttering HTML - Easier to maintain than microdata
- Better support for nested schemas
- Recommended by Google
Basic Structure
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Know Your Rights at Immigration Checkpoints",
"description": "...",
"author": {...},
"publisher": {...},
"datePublished": "2026-03-24",
"dateModified": "2026-03-24"
}
</script>
Schema Templates
Article Schema (Know Your Rights Guides)
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Know Your Rights: What to Do If ICE Comes to Your Door",
"description": "A complete guide to your constitutional rights during an encounter with ICE at your home.",
"image": "https://example.org/assets/images/kyr-home.jpg",
"author": {
"@type": "Organization",
"name": "ICE Advocacy",
"url": "https://example.org"
},
"publisher": {
"@type": "Organization",
"name": "ICE Advocacy",
"logo": {
"@type": "ImageObject",
"url": "https://example.org/assets/images/logo.png"
}
},
"datePublished": "2026-03-24",
"dateModified": "2026-03-24",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.org/know-your-rights/home-raids/"
},
"inLanguage": "en-US",
"isAccessibleForFree": true
}
HowTo Schema (Procedural Guides)
Triggers numbered step display in search results:
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Respond If ICE Comes to Your Workplace",
"description": "Step-by-step guide for workers during immigration enforcement at work.",
"step": [
{
"@type": "HowToStep",
"name": "Stay calm",
"text": "Remain calm and do not run. Running may be perceived as suspicious."
},
{
"@type": "HowToStep",
"name": "Exercise your right to remain silent",
"text": "You have the right to remain silent. Say: 'I am exercising my right to remain silent.'"
},
{
"@type": "HowToStep",
"name": "Do not sign anything",
"text": "Do not sign any documents without speaking to an attorney first."
},
{
"@type": "HowToStep",
"name": "Document what happens",
"text": "If safe, note badge numbers, agency, and what occurred."
}
],
"totalTime": "PT5M"
}
FAQPage Schema (Q&A Content)
Generates accordion rich results:
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do I have to open my door for ICE?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. You are not required to open your door unless agents have a judicial warrant signed by a judge. An ICE administrative warrant (Form I-200 or I-205) does not give them the right to enter without your consent."
}
},
{
"@type": "Question",
"name": "What is the difference between a judicial warrant and an ICE warrant?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A judicial warrant is signed by a judge and allows entry. An ICE administrative warrant is signed by an immigration officer and does NOT give the right to enter your home without consent."
}
}
]
}
LegalService Schema (Legal Aid Directory)
{
"@context": "https://schema.org",
"@type": "LegalService",
"name": "California Immigration Legal Aid",
"description": "Free and low-cost immigration legal services in California.",
"url": "https://example.org/resources/legal-documents/california/",
"serviceType": "Immigration Law",
"areaServed": {
"@type": "State",
"name": "California"
},
"provider": {
"@type": "Organization",
"name": "ICE Advocacy"
},
"isAccessibleForFree": true
}
Speakable Schema (Voice Search)
Critical for crisis content - tells voice assistants which text to read aloud:
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Your Rights If ICE Is At Your Door",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": [".voice-summary", ".key-rights-list"]
}
}
In your HTML, mark speakable sections:
<div class="voice-summary">
You do not have to open your door. Ask if they have a warrant signed
by a judge. You have the right to remain silent.
</div>
11ty Implementation
Automatic Schema Generation
In your base layout (_includes/layouts/base.njk):
{% if schema_type == 'Article' %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "{{ title }}",
"description": "{{ description }}",
"author": {
"@type": "Organization",
"name": "{{ site.title }}"
},
"datePublished": "{{ date | date: '%Y-%m-%d' }}",
"dateModified": "{{ last_updated | date: '%Y-%m-%d' }}"
}
</script>
{% elif schema_type == 'FAQPage' %}
...
{% endif %}
Frontmatter for Schema
---
title: "Know Your Rights at Checkpoints"
schema_type: "Article"
# For FAQPage, add questions array:
questions:
- question: "Do I have to answer questions at a checkpoint?"
answer: "You have the right to remain silent..."
# For HowTo, add steps array:
steps:
- name: "Stay calm"
text: "Remain calm and do not exit your vehicle."
---
Validation and Testing
Tools
| Tool | URL | Purpose |
|---|---|---|
| Google Rich Results Test | search.google.com/test/rich-results | Validate schema, preview rich results |
| Schema.org Validator | validator.schema.org | Check syntax compliance |
| Search Console | search.google.com/search-console | Monitor rich result errors |
Common Errors
| Error | Cause | Fix |
|---|---|---|
| Missing required field | Incomplete schema | Add required properties |
| Mismatch with visible content | Schema doesn't match page | Ensure exact text match |
| Invalid JSON syntax | Typos, missing commas | Validate with JSON linter |
| Nested array errors | Improper structure | Check array formatting |
Schema Checklist
Before Publishing
- [ ] Schema type matches content type
- [ ] All required fields present
- [ ] dateModified reflects actual last update
- [ ] Text in schema matches visible page content
- [ ] Validated with Rich Results Test
- [ ] No Search Console errors for page
Ongoing Monitoring
- [ ] Weekly Search Console review
- [ ] Check rich result appearance in SERPs
- [ ] Update dateModified when content changes
- [ ] Verify FAQ/HowTo schema still displays
Next Steps
- Capture featured snippets - Content formatting for Position Zero
- Implement local SEO - State and city schema
- Configure technical SEO - Core Web Vitals, sitemaps