How do you add breadcrumbs to a Katy business website?
Build the trail from your site structure, never from the visitor's click path, then emit BreadcrumbList JSON-LD that matches what is visible. Katy businesses often serve a ring of surrounding communities, so the useful step is deciding which service each area page sits under before writing any markup.
Decide the hierarchy before you write any markup
Breadcrumbs describe a structure. If the structure is wrong, the markup just publishes the wrong structure more clearly.
For a local service business the hierarchy that works is almost always:
Home > Services > Roof Repair > Roof Repair in Katy
Not the click path the visitor happened to take, and not a flat list where every page hangs off the homepage. One page, one parent, consistently.
If you cannot name a single parent for a page, that is a structural problem worth fixing before you add breadcrumbs.
Build the visible trail
Mark it up as a list inside a labelled navigation element, so a screen reader announces it correctly:
<nav aria-label="Breadcrumb">
<ol>
<li><a href="/">Home</a></li>
<li><a href="/services">Services</a></li>
<li><a href="/services/roof-repair">Roof Repair</a></li>
<li aria-current="page">Roof Repair in Katy</li>
</ol>
</nav>
The current page is not a link. The separators between items should come from CSS, not from characters typed into the markup, so they are not read aloud.
Add the structured data
Search engines can read a well-formed HTML trail, but the JSON-LD version is unambiguous and is what typically drives the breadcrumb display in results:
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://example.com/"},
{"@type": "ListItem", "position": 2, "name": "Services", "item": "https://example.com/services"},
{"@type": "ListItem", "position": 3, "name": "Roof Repair", "item": "https://example.com/services/roof-repair"},
{"@type": "ListItem", "position": 4, "name": "Roof Repair in Katy"}
]
}
The final item carries no item URL because it is the page you are on. Positions start at 1 and must not skip.
The mistakes that actually cause problems
Markup that disagrees with the page. If the JSON-LD names a trail the visitor cannot see, that is a mismatch and it can be ignored or flagged.
Absolute versus relative URLs. Use absolute URLs in the JSON-LD, matching your canonical exactly — including whether you use www and whether you have a trailing slash.
Breadcrumbs on the homepage. Pointless. Skip it.
A trail generated from browsing history. It must reflect the site's structure, not the visitor's path.
Why this matters for a Katy business
Katy businesses frequently serve a ring of surrounding areas — Cinco Ranch, Fulshear, west Houston — and end up with a set of area pages that all look like siblings of the homepage. Breadcrumbs force you to decide which service each one belongs under, and that decision usually improves the internal linking more than the markup does.
Checking it worked
Use the Rich Results Test on a live URL, then watch Search Console's enhancement reporting over the following weeks. Display in results is never guaranteed — the markup makes eligibility possible, not certain.
Frequently asked questions
Should breadcrumbs follow the click path or the site structure?
The site structure. A trail generated from browsing history changes page to page and describes nothing stable, which defeats the purpose for both visitors and search engines.
Do I need the JSON-LD if I already have a visible trail?
A well-formed HTML trail can be read, but BreadcrumbList JSON-LD is unambiguous and is typically what drives the breadcrumb display in search results. Add both, and keep them in agreement.
Should the last breadcrumb be a link?
No. The current page should be plain text with aria-current="page", and in the JSON-LD the final ListItem carries no item URL.
Do breadcrumbs guarantee they will show in search results?
No. Correct markup makes the page eligible for the display, but whether it appears is the search engine's decision and is never guaranteed.
What is the common mistake on local area pages?
Hanging every area page directly off the homepage. Breadcrumbs force you to name a parent service for each, and making that decision usually improves internal linking more than the markup itself does.