How we took a broken WordPress install and turned it into a fast, rankable, schema-complete static site for a veteran-owned locksmith business — with zero monthly hosting cost.
01 / 09
GoKey Locksmiths is a veteran-owned locksmith business serving multiple cities. They came to us with a WordPress site that was slow, broken, and invisible to search engines. No schema markup, no service-area targeting, generic content, and a $30+/month hosting bill for the privilege.
A veteran-owned locksmith business with real skills and zero online presence. WordPress was running outdated plugins, page speed was in the red, and there was no structured way to target the city-service combinations that drive local search traffic.
Every month they were paying for hosting that wasn't delivering. No tracking, no schema, no OG tags. A site that existed but didn't work.
Full migration to Hugo — a fast, zero-dependency static site generator. We designed a scalable page architecture with Go template-driven city+service combinations, allowing us to generate optimized local landing pages at scale without duplicating effort.
DNS migrated from GoDaddy to Cloudflare. Deployed to Netlify on the free tier. Every page ships with JSON-LD schema, OG tags, and Twitter Cards out of the box.
02 / 09
Side-by-side breakdown of what changed — from platform and performance to cost, SEO coverage, and maintainability.
03 / 09
Every technology chosen for a reason: performance, maintainability, and cost. Zero dependencies that cost money. Zero server to manage.
04 / 09
We designed a data-driven content architecture that lets Hugo generate every city+service landing page from a single template. No duplicate HTML. No copy-paste content. Add a city or service in the data layer, and the pages generate automatically.
Each city+service page is unique — localized city references, service-specific copy, and area-specific schema. Not thin duplicate content; actual differentiated landing pages targeting "locksmith [city]" and "car locksmith [city]" queries.
Template variables handle city names, service descriptions, and schema values so every page is distinct while the structure stays consistent.
| Page Category | URL Pattern | Count | Schema Types |
|---|---|---|---|
| Homepage | / | 1 | LocalBusiness BreadcrumbList |
| Service Pages | /services/[service]/ | 4 | Service BreadcrumbList |
| City Hub Pages | /[city]/ | ~8 | Service BreadcrumbList |
| City + Service Combos | /[city]/[service]/ | 35 | Service BreadcrumbList |
| Static Pages | /about/, /contact/ | 2 | LocalBusiness |
| Blog / Content | /blog/[slug]/ | 26+ | Article BreadcrumbList |
05 / 09
Every technical SEO signal that matters for a local service business — implemented on every page, automatically, at build time. No plugin required. No ongoing maintenance.
Structured navigation breadcrumbs on every page. Helps Google understand site hierarchy and enables sitelinks in search results.
Service schema on every service and city+service page — name, description, area served, provider, price range. Rich result eligible.
og:title, og:description, og:image, og:url on every page. Facebook, LinkedIn, Slack, iMessage previews all look sharp.
twitter:card, twitter:title, twitter:description, twitter:image. Every page shares correctly on X/Twitter with a proper preview card.
35 city+service landing pages each targeting specific "locksmith [city]" and "[service] locksmith [city]" queries with unique content.
No server-side rendering. No PHP. Pure HTML+CSS served from Netlify's CDN. Core Web Vitals: green across the board.
Auto-generated sitemap.xml covering all 76 pages. Submitted to Google Search Console. Hugo regenerates it on every deploy.
Clean robots.txt allowing full crawl. No accidentally-blocked pages from a poorly configured WordPress SEO plugin.
Automatic HTTPS via Netlify. Security headers configured in netlify.toml. No mixed-content warnings. Signals trust to both users and Google.
06 / 09
Two JSON-LD blocks render in the <head> of every page at build time.
No plugin. No runtime JavaScript. Pure structured data baked into every HTML file Hugo generates.
{{/* BreadcrumbList — every page */}} <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://gokeylocksmiths.com/" }, { "@type": "ListItem", "position": 2, "name": "{{ .Title }}", /* injected by Hugo */ "item": "{{ .Permalink }}" /* injected by Hugo */ } ] } </script> {{/* Service schema — city+service pages */}} <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Service", "name": "{{ .Params.service_name }}", "description": "{{ .Params.service_desc }}", "areaServed": "{{ .Params.city }}", "provider": { "@type": "LocalBusiness", "name": "GoKey Locksmiths", "url": "https://gokeylocksmiths.com" }, "serviceType": "Locksmith" } </script>
BreadcrumbList tells Google exactly how the site is structured. When the site ranks, Google can show breadcrumb sitelinks in the SERP — more real estate, more clicks.
Service schema makes each page eligible for rich results in local search. Combined with area targeting, this is the structured-data foundation for local pack visibility.
07 / 09
From a broken WordPress site to a production-ready, schema-complete, fully optimized local business website — deployed, live, and built to last.
08 / 09
Local businesses deserve websites that actually work. We build fast, rankable, schema-complete sites that don't cost a fortune to run.
GoKey Locksmiths — Case Study — eDot Dev LLC — 2026
09 / 09