Skip to content
SEO & Growth

7 Technical SEO Steps for Local 2026 (Step-by-Step)

Sep 7, 2026

Technical SEO for a local service business is the crawl, index, and internal-link work that makes every city page, service page, and job-booking URL eligible to rank in the pack and in organic — without wasting Googlebot on faceted "filter by zip" toys. It is not a truck wrap, it is not a review campaign, and it is not a GBP photo dump. Screaming Frog, Sitebulb, Oncrawl, Lumar, Botify, JetOctopus, and ContentKing are the seven crawlers in this shortlist. US Tech Automations sits above them as the ticket layer that blocks a city-page publish when status, canonical, and NAP extract have not all passed.

TL;DR: Start with Screaming Frog at £199/year if you can run a laptop crawl of a few hundred city URLs. Move to Sitebulb when the owner needs a hint-based report instead of a spreadsheet. Move to JetOctopus or Lumar when you need scheduled cloud crawls after every template push. Move to Oncrawl or Botify when logs prove Googlebot prefers parameter URLs over /hvac/austin/. Move to ContentKing when the theme vendor edits titles at 2 a.m. Do not buy a cloud crawler to "get more leads."

Who should run this

This page is for HVAC, plumbing, roofing, pest, and similar operators (and the agencies who inherit their WordPress or Jobber-connected sites) who ship city and service-area pages from one template.

Red flags: Skip paid crawlers if you have three city URLs you can click on a phone. Skip log-file platforms if you cannot get access to logs. Skip always-on monitoring if nobody is on-call when an alert fires during a job.

A before/after on the same vertical is in the local service businesses SEO case study. Links that actually move local entities are covered in link building for local service businesses. Store-finder overlap with ecommerce local is in local SEO for ecommerce stores.

Technical SEO for service-area sites

Service-area businesses fail technically in three repeating ways. First, 40 city pages share one H1 and one canonical-to-home. Second, the booking widget is a JavaScript iframe the raw-HTML crawl never sees. Third, "filter by ZIP" creates thousands of parameter URLs that Googlebot prefers over the money pages. The 7-step recipe below is built to find those three, in that order.

BEST_OF earn rate: 15.2% according to US Tech Automations (2026), on 12,514 live pages counted 2026-08-24. '7 Best' earn rate: 25.5% according to the Phase 1 12,514-page count (2026), versus 14.0% for "5 Best" titles. Google Search Central's specialty guidance on crawlable URL structure still applies when your "catalog" is city × service rather than SKUs: if the URL is not reachable without a script, Google may never parse it.

Key Takeaways

  • Local-service technical SEO is city/service URL crawl + index + NAP extract, not a blog word count.

  • Screaming Frog's public paid licence is £199/year with a 500-URL free cap (checked 2026-09-07).

  • Cloud crawlers in this list (Oncrawl, Lumar, Botify, JetOctopus, ContentKing) did not publish a usable self-serve TCO in this pass — write "contact vendor."

  • Parameter URLs and JS booking widgets are the two failure modes a laptop HTML crawl will miss.

  • Zapier can retry a CSV; it is not robots.txt and it is not a human publish gate unless you build both.

Step-by-step crawl recipe

  1. Export the sitemap and keep only /services/ and /areas/ (or your equivalents). Count the URLs. That number is the crawl target, not "the whole blog."

  2. Crawl the target with a licensed spider. Enable JavaScript only on booking and quote-form templates.

  3. Export status code, indexability, canonical, H1, and word count. Fail any city URL that canonicals home.

  4. Inspect three money URLs in Search Console. Read inspectionResult.indexStatusResult.coverageState; do not stop at "we submitted the sitemap."

  5. Diff on-page NAP against GBP. A crawl that passes while the phone number is wrong is not a local win.

  6. If logs exist, join them. If parameter URLs get more hits than city URLs, that is the next ticket, not a new blog post.

  7. Open one ticket per broken city URL. Close it only when status, canonical, and NAP all pass a human check.

Worked example: a 12-city HVAC company with 200 service URLs and a $189 average ticket runs Jobber for dispatch. After a weekend theme update, invoice.paid still fires for 74 jobs on Monday, but 11 city pages now 302 to / and the quote form is JS-only. A 75-minute paid Screaming Frog crawl of 240 URLs flags the 11 redirects and 8 forms missing from raw HTML. The ticket stays open until the 11 city URLs return 200 with self-canonicals and the 8 forms render. US Tech Automations would ingest that CSV, key tickets on the Address column, retry failed rows, and require a dispatcher-adjacent marketer to sign NAP before anyone hits "request indexing."

What "good" looks like on a Monday

A healthy local-service site after the weekend jobs is boring: every city URL returns 200, every self-canonical matches the sitemap, the quote form exists in rendered HTML, and the footer phone equals GBP. Ads, if you run them, point at those 200s. The dispatcher does not need to know what a crawler is. The marketer does need a CSV that proves the boring state.

If the WordPress vendor "updated plugins" on Sunday, assume the boring state is gone until a crawl says otherwise. That is why step 2 in the recipe is not optional and why a £199 licence that a tech can run at 6 a.m. often beats a cloud quote that finance has not signed.

Glossary for service-area crawls

  • Service-area page: A URL for a city or ZIP you serve but may not have a storefront in. It still needs unique NAP-consistent facts, not 40 clones.

  • Parameter URL: /hvac/?zip=78704 and friends. Useful for humans, expensive for Googlebot if indexed.

  • Rendered form: The quote or call-tracking widget after JavaScript. If it is missing in the rendered crawl, the CTA does not exist for search.

  • Redirect chain: Old domain → www → city page. Each hop wastes crawl and confuses ads.

  • Custom extraction: XPath or CSS grab of the phone or city name so you can diff 200 pages without eyeballing them.

  • Coverage state: Search Console's reason a URL is in or out of the index.

  • Internal link score: How buried a city page is from the homepage. A footer-only link is better than an orphan; a nav link is better than a footer-only link.

Scoring table

CriterionWeightRationalePass bar
City/service coverage25%Orphans do not generate calls100% of sitemap money URLs crawled
Canonical hygiene15%Cloned cities collapse0 home canonicals on city URLs
JS form visibility15%Quotes hide in widgetsForm HTML in rendered crawl
Parameter URL waste15%ZIP filters steal crawlFacets noindex or unlinked
NAP extract match10%Pack vs site fightsFooter = GBP
Licence clarity10%Owners hate surprise SaaSDated price or contact vendor
Ticketable export10%Slack screenshots dieURL-level CSV

Feature matrix

CapabilityScreaming FrogSitebulbOncrawlLumarBotifyJetOctopusContentKing
Public list (2026-09-07)£199/yearContact vendorContact vendorContact vendorContact vendorContact vendorContact vendor
Free cap500 URLsContact vendorContact vendorContact vendorContact vendorContact vendorContact vendor
JS renderPaidPaidYesYesYesYesMonitor
LogsSeparate productLimitedYesYesYesYesNo
SchedulePaidYesYesYesYesYesAlways-on
Staging vs liveURL mappingYesYesYesYesYesWatch both
Owner-readable hintsIssues listCoreDashboardsDashboardsDashboardsDashboardsAlerts
Best local-service jobAfter-hours auditOwner reportLog proofDeploy QACrawl budgetCloud cadenceTemplate drift

Paid spider licence: £199/year according to Screaming Frog (2026). Free crawl cap: 500 URLs according to Screaming Frog SEO Spider (2026). SEO plan list: $139/mo according to Semrush (2026) if Site Audit is already on the invoice. Lite list: $129/mo according to Ahrefs (2026) for 100,000 crawl credits on Lite.

Cost snapshot

VendorPublic list (2026-09-07)12-month TCOQuote?Notes
Screaming Frog paid£199/year£199NoRAM-bound crawl size
Screaming Frog free$0$0No500 URLs, no JS
SitebulbContact vendorContact vendorYesHint reports
OncrawlContact vendorContact vendorYesLogs
LumarContact vendorContact vendorYesQA
BotifyContact vendorContact vendorYesBudget
JetOctopusContact vendorContact vendorYesCloud
ContentKingContact vendorContact vendorYesAlways-on
Ahrefs Lite (suite path)$129/mo$1,548No100,000 credits
Semrush SEO plan$139/mo monthly$1,668No$117.33/mo annual

Vendor profiles

Screaming Frog

Best fit: A shop that can crawl after the last job of the day. Limitations: Free 500-URL cap; JS and GSC API need the paid licence. Implementation: Custom extraction on phone numbers in the footer; compare crawls after the WordPress vendor "just updated plugins." Primary evidence: Screaming Frog. Who should not buy: A 40-city franchise that needs overnight cloud.

Sitebulb

Best fit: Agencies presenting to an owner who will not read Ahrefs. Limitations: Contact vendor for price. Implementation: Use hints on thin city pages and redirect chains from the old domain the shop bought last year. Primary evidence: Sitebulb. Who should not buy: Teams that already live in Frog CSVs.

Oncrawl

Best fit: Proof that Googlebot wastes hits on ?zip=. Limitations: Contact vendor; needs logs. Implementation: Segment money URLs vs parameters; ticket if parameters win for 7 days. Primary evidence: Oncrawl. Who should not buy: Sites without log access.

Lumar

Best fit: Staging vs production before a seasonal landing-page blast. Limitations: Contact vendor. Implementation: Extract city name and phone; fail the build when extract empty. Primary evidence: Lumar. Who should not buy: Three-page brochure sites.

Botify

Best fit: National service brands with huge URL spaces. Limitations: Contact vendor. Implementation: Crawl-budget alarm when blog pagination outranks /areas/. Primary evidence: Botify. Who should not buy: Single-truck operators.

JetOctopus

Best fit: Cloud JS crawls without Botify procurement. Limitations: Contact vendor. Implementation: Sunday crawl; Monday ticket 404s before Google Ads spends. Primary evidence: JetOctopus. Who should not buy: Teams already on Lumar with no dual-run reason.

ContentKing

Best fit: Always-on after a vendor has access to WordPress. Limitations: Contact vendor; confirm Conductor SKU on the quote. Implementation: Alert on title/canonical change on /areas/. Primary evidence: ContentKing. Who should not buy: Shops that ignore email.

Do not dual-run Botify and Lumar "to be safe." Pick the cloud crawler that matches the evidence you can actually get (logs vs staging QA vs always-on). Keep Screaming Frog even after you buy cloud: it is the £199 confirmation crawl a tech can run when the cloud queue is waiting on a seat.

Hardware still matters on the desktop path. A 16 GB laptop will finish a 1,000-URL JS crawl; a 4 GB office PC will freeze and produce a partial export that looks like "the site is small." If the crawl dies at 400 URLs, that is a machine limit, not a site-size fact. The free Frog cap of 500 URLs is a product limit; RAM is a separate limit on the paid licence.

Ads amplify technical debt. If Google Ads points at a city URL that 302s to home, you pay for the home page and the city page both lose the query. Put the ads account and the crawler export in the same Monday review. That review is a spreadsheet, not a strategy workshop. If the ad account manager and the SEO are different people, the ticket still has one owner: whoever can change the template.

Mistakes that waste crawl budget

  • Letting the blog paginate into four digits while 12 city pages stay orphaned.

  • Indexing quote-form thank-you URLs.

  • Shipping ?gclid= and ?zip= without a parameter plan.

  • Calling Site Audit "green" while city URLs 302.

  • Requesting indexing before canonicals are fixed.

When NOT to use US Tech Automations: If the owner already runs a free 500-URL crawl and edits three city pages by hand, stay there. If Jobber already is the system of record for jobs and the website is a three-page brochure, do not invent a crawl workflow. If Make.com already drops GSC exports into a Sheet with retries and a human reads it every Monday, staff that review rather than adding a second queue.

Zapier, Make, and n8n can hold run histories, retries, error branches, and audit evidence when configured. The buyer still owns observability, idempotency, escalation, access controls, retention, and maintenance. A proposed ticketed design would key on the crawler Address field, collapse duplicate city URLs, and stop for a human NAP check before any recrawl request.

See the ticket layer on pricing. Other workflows start on the company homepage.

Questions

Which technical SEO software fits a local service business first?

Screaming Frog's paid licence if you can run it; Sitebulb if the owner needs hints; a cloud crawler only after logs or JS widgets exceed a laptop crawl.

Do I need Botify for a 15-city HVAC site?

Usually no. Frog or JetOctopus covers the URL count. Botify starts to earn a quote when logs show crawl waste you cannot see in a desktop export.

How is this different from GBP optimization?

Technical SEO is your URLs. GBP is the profile. A 200-status city page with the wrong phone still loses the pack.

Should service-area pages use JS booking widgets?

They can, if the rendered crawl shows the form and a no-JS fallback exists. If the quote CTA is JS-only, paid rendering is required.

Can n8n replace ContentKing?

n8n can poll a sitemap and email diffs. It will not be always-on HTML monitoring unless you build storage, auth, and a human on-call path and then maintain them.

How often should city pages be crawled?

After every template or plugin update, and at least weekly if ads point at those URLs. Recrawl requests in Search Console remain hints, not a clock.

About the Author

Garrett Mullins
Garrett Mullins
Workflow Specialist

Helping businesses leverage automation for operational efficiency.