Your service areas page tells AI exactly where you operate. For plumbing businesses, geography is everything — a homeowner in Edina does not need a plumber in Duluth. This blueprint structures every city, neighborhood, and region you cover so AI can confidently recommend you for location-specific queries.
Location is the most important filter for plumbing queries. When someone asks AI for a plumber in a specific city, the answer comes from structured geographic data — not from scanning paragraphs that mention a city name once. This page needs to declare every area you serve in a way machines can parse without guessing.
City node inside areaServed. List them individually rather than as a comma-separated string so AI can match each one to a query.State or AdministrativeArea node alongside your city entries.Plumber node on this page should share the same @id as your homepage so AI treats them as the same entity across pages.Each field in the template below serves a specific role in how AI systems discover, classify, and recommend your business.
Researched and tested by Minnesota AI
nameurltelephoneareaServedCopy this prompt and paste it into Claude, ChatGPT, Cursor, or any AI coding tool. It will ask for your business details and generate ready-to-use JSON-LD schema for your page.
You are implementing AIFDS-compliant JSON-LD structured data for a Plumber Service Areas page. AIFDS (AI-Friendly Data Structure) is a schema framework built on research into which structured data fields AI systems actually read, parse, and use when deciding whether to cite a page. Documentation at aifds.org. Before generating any code, ask me for the following information in a single numbered list. Do not generate schema until I have answered every required field. REQUIRED — do not proceed without these: 1. Business name 2. City 3. Domain 4. Faq answer 5. Faq question 6. Phone number 7. Service areas page description 8. Service areas page title 9. State OPTIONAL — ask for these but proceed if I skip them: 1. Any additional details not covered above Once I provide the information, output a complete JSON-LD script block ready to paste into the <head> of my HTML page. Output requirements: - Valid JSON-LD wrapped in <script type="application/ld+json"> tags - schema.org vocabulary only - Every AIFDS-required field for this industry and page type included - Include this data attribute on the script tag: data-aifds="aifds.org Plumber Service Areas" - No placeholder text — omit missing optional fields rather than fill with examples - After the code block, list any optional fields skipped that would strengthen AI citation
Generated schema follows the AIFDS framework. Fields were selected based on research into AI crawler behavior. View the research at minnesota.ai
Copy this template and replace every YOUR_* placeholder with your own data. Add or remove City entries to match all the areas your plumbing business actually covers.
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Plumber",
"@id": "https://YOUR_DOMAIN.com/#business",
"name": "YOUR_BUSINESS_NAME",
"url": "https://YOUR_DOMAIN.com",
"telephone": "YOUR_PHONE_NUMBER",
"areaServed": [
{
"@type": "City",
"name": "YOUR_CITY_1"
},
{
"@type": "City",
"name": "YOUR_CITY_2"
},
{
"@type": "City",
"name": "YOUR_CITY_3"
},
{
"@type": "City",
"name": "YOUR_CITY_4"
},
{
"@type": "City",
"name": "YOUR_CITY_5"
},
{
"@type": "State",
"name": "YOUR_STATE"
}
]
},
{
"@type": "WebPage",
"@id": "https://YOUR_DOMAIN.com/service-areas/",
"name": "YOUR_SERVICE_AREAS_PAGE_TITLE",
"description": "YOUR_SERVICE_AREAS_PAGE_DESCRIPTION",
"isPartOf": {
"@id": "https://YOUR_DOMAIN.com/#website"
},
"breadcrumb": {
"@id": "https://YOUR_DOMAIN.com/service-areas/#breadcrumb"
}
},
{
"@type": "BreadcrumbList",
"@id": "https://YOUR_DOMAIN.com/service-areas/#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://YOUR_DOMAIN.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Service Areas",
"item": "https://YOUR_DOMAIN.com/service-areas/"
}
]
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "YOUR_FAQ_QUESTION_1",
"acceptedAnswer": {
"@type": "Answer",
"text": "YOUR_FAQ_ANSWER_1"
}
},
{
"@type": "Question",
"name": "YOUR_FAQ_QUESTION_2",
"acceptedAnswer": {
"@type": "Answer",
"text": "YOUR_FAQ_ANSWER_2"
}
},
{
"@type": "Question",
"name": "YOUR_FAQ_QUESTION_3",
"acceptedAnswer": {
"@type": "Answer",
"text": "YOUR_FAQ_ANSWER_3"
}
}
]
}
]
}
List every city individually. AI systems match queries to specific City entries, not to vague metro names. If someone asks for a plumber in Bloomington, a City node with "Bloomington" will match directly. A single "Twin Cities Metro" entry will not. You can include a broader State or AdministrativeArea node in addition to individual cities, but not instead of them.
There is no practical limit. If you serve 30 cities, list all 30. AI does not penalize long arrays — it rewards completeness. The only rule is accuracy: do not list cities where you do not actually provide service. Overstating your coverage area can result in poor reviews and lost trust signals.
That is a common SEO strategy, but for structured data purposes, one service areas page with all cities listed in areaServed is sufficient. If you do create individual city pages, each one should carry its own JSON-LD with the Plumber node and an areaServed limited to that specific city.