SEO for Contractors: the Technical Work Guides Skip
Search "seo for contractors" and you get the same article eleven times: claim your Google Business Profile, ask for reviews, write blog posts, build backlinks. It is not wrong. It is just the first twenty percent, and it stops exactly where the work that separates two identical roofing companies begins.
We read the pages ranking for this term on 2026-08-17. The one at position two runs about 1,100 words and contains no structured data, no city page guidance, and no code. The long one at position seven runs roughly 4,200 words and still has no schema markup, no Core Web Vitals, and no mention of Search Console. Neither says a word about the rules that get Business Profiles suspended.
This article is the other eighty percent. Every claim about how Google behaves is quoted from Google's own documentation with the source named, so you can check it instead of trusting us. Where something is not verifiable, it says so.
In Google's own words, from its page on hiring an SEO: "No one can guarantee a #1 ranking on Google." Nothing here promises a position or a date. It describes work you can do and measure, which is a different claim.
You are competing on two different result pages
A search for "kitchen remodel near me" returns two things that look like one page: a map with three businesses in it, and a list of blue links underneath. They are ranked by different systems, and they respond to different work.
The map results come from your Google Business Profile. Google's help page names three factors: relevance, "how well a Business Profile matches what someone is searching for"; distance, "how far each business is from the customer who's searching"; and prominence, "how well-known a business is", which Google says is "based on info like how many websites link to your business and how many reviews you have".
The blue links come from your website, ranked by the ordinary Search index. Your Business Profile does not rank there and your website does not rank in the map pack. A page of JSON-LD markup will not move you up the map, and a hundred five-star reviews will not rank your service page.
Distance is the factor nobody tells contractors about, and it is the one that decides most of it. If you serve three towns from a shop in one of them, you are at a structural disadvantage in the other two, and no amount of on-page work changes your address. That constraint is exactly why the website half matters: organic results are not filtered by proximity the way the map pack is.
One more line from the same page, worth quoting to every vendor who calls you: "There's no way to request or pay for a better local ranking on Google."
The Business Profile rules that get profiles suspended
Most contractor SEO advice tells you to optimise your profile. Almost none of it tells you which optimisations are against Google's rules, which is the more expensive half, because a suspended profile takes the map pack away entirely.
Your business name is not a keyword field. Google's guidelines: "Your name should reflect your business's real-world name, as used consistently on your storefront, website, stationery, and as known to customers." Adding keywords or a city to the name violates that unless they are genuinely part of the registered name. "Smith Roofing" is fine. "Smith Roofing | Best Roofer in Tucson AZ" is a suspension waiting to happen, and it is sold as a tactic constantly.
If you go to customers, hide the address. Verbatim: "If you're a service-area business, you should hide your business address from customers." Most general contractors, electricians and plumbers fall in this category, and showing a home address gains nothing while breaking the rule.
One profile per location, not per service or per town. Verbatim: "Do not create more than one page for each location of your business, either in a single account or multiple accounts." The plan where you spin up a profile for each city you serve is not a growth tactic, it is duplicate listings.
A mailbox is not a location. Google states that "P.O. boxes or mailboxes located at remote locations aren't acceptable", and that if you rent a mailing address but do not operate from it, "also known as a virtual office, that location isn't eligible for a Business Profile."
Do not buy or bribe reviews. The Maps user-contributed content policy lists as prohibited: "Offer incentives such as payment, discounts, free goods and/or services in exchange for posting any review or revision or removal of a negative review." The same policy states that "Contributions to Google Maps should reflect a genuine experience at a place or business. Fake engagement is not allowed and will be removed." Asking a real customer for a review is fine. Paying for one is the thing being removed.
None of these five rules appeared in any of the guides we read this morning, and four of the five are actively sold as services in this vertical. The same eligibility rules apply to any business that travels to its customers, which is why they come up again in our article on SEO for photographers.
The markup almost no contractor site has
Structured data is the cheapest technical work available to a contractor site, and it is missing from every one of the top-ranking guides. Nobody in the top ten shows a single line of it.
Schema.org has a type built for your business. The hierarchy, from schema.org: "Thing > Organization > LocalBusiness > HomeAndConstructionBusiness > GeneralContractor". HomeAndConstructionBusiness has eight sub-types, and one of them is probably yours: Electrician, GeneralContractor, HVACBusiness, HousePainter, Locksmith, MovingCompany, Plumber, RoofingContractor.
Google's local business documentation asks for exactly that level of precision: "Use the most specific LocalBusiness sub-type possible". Only two properties are actually required, name and address, and Google recommends geo, openingHoursSpecification, priceRange, telephone and url on top.
Here is a block you can paste into the <head> of your home page, with your details swapped in. It is plain JSON-LD in a <script> tag, which works on WordPress, Squarespace, Wix or a hand-built site.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "RoofingContractor",
"name": "Smith Roofing",
"url": "https://smithroofing.com",
"telephone": "+1-520-555-0142",
"address": {
"@type": "PostalAddress",
"streetAddress": "1420 W Grant Rd",
"addressLocality": "Tucson",
"addressRegion": "AZ",
"postalCode": "85745",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 32.2540,
"longitude": -110.9742
},
"areaServed": [
{ "@type": "City", "name": "Tucson" },
{ "@type": "City", "name": "Marana" },
{ "@type": "City", "name": "Oro Valley" }
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "07:00",
"closes": "17:00"
}],
"priceRange": "$$"
}
</script>
One trap, and it is a common one. Google's documentation says review properties are "only recommended for sites that capture reviews about other local businesses". Marking up the testimonials on your own site as review or aggregateRating is not what that property is for, and it is the single most frequent mistake in local markup.
Be honest with yourself about what this buys. Structured data is not a ranking factor for the map pack, and Google's guide on generative AI states plainly that "Structured data isn't required for generative AI search, and there's no special schema.org markup you need to add."
What it does is make your address, hours, phone number and service area machine-readable rather than trapped in a graphic in your header, which is where most contractor sites keep them.
The same argument applies to any site whose content is mostly visual, which is why markup turns up again in our guide to SEO for photographers. If your site is custom-built rather than on a website builder, the mechanics of putting JSON-LD on a page correctly are covered in our Next.js SEO article.
City pages: where a service area becomes a doorway
Every contractor gets sold the same plan: one page per town, twenty towns, twenty pages. It works until it does not, and the failure mode is named in Google's spam policies.
Verbatim: "Doorway abuse is when sites or pages are created to rank for specific, similar search queries. They lead users to intermediate pages that are not as useful as the final destination." One of the listed examples is "Having multiple domain names or pages targeted at specific regions or cities that funnel users to one page."
That is the twenty-city plan, described by the policy that forbids it. The tell is not the number of pages, it is whether each page says anything a customer in that town could not have read on the page for the town next door.
| The doorway version | The page that earns its URL |
|---|---|
| Same 600 words, city name swapped | Jobs you actually did there, with addresses at street level |
| Stock photo of a house | Photos from those jobs, with the crew and the truck in them |
| "We serve Marana homeowners" | Permit process and inspection timeline for that jurisdiction |
| Generic price range | What the local building code adds to the cost, and why |
| Links to one shared contact form | Its own phone number in text, its own driving time from the shop |
The practical rule: if you cannot write four paragraphs about a town that would be false about the town next to it, you do not have a page yet. You have a line on the service page. Three real city pages beat twenty templated ones, and the twenty carry an actual policy risk while the three do not.
The other half of that rule is pricing. A page about what a roof replacement costs in your county, with the ranges you actually quote and the variables that move them, is the page competitors will not write because it exposes their margin. It also matches how people search before they call.
The pages that get you called, in the order they pay
Search volume is the wrong sort order for a contractor site. The right one is distance from a signed job, and it is roughly the inverse of what most content plans start with.
| Page type | Distance from a call | Why it works |
|---|---|---|
| Service plus city ("roof replacement Tucson") | Closest | The person is choosing a company right now |
| Cost and pricing pages | Close | They are budgeting, and nobody publishes numbers |
| Emergency and seasonal ("burst pipe", "post-monsoon roof") | Close | Urgency collapses the decision |
| Project write-ups with photos | Medium | Proof, and it feeds the city pages |
| Comparison ("metal vs asphalt shingle") | Medium | Earlier in the decision, still buying |
| "How to fix it yourself" posts | Farthest | Ranks well, and the reader is not hiring you |
The last row is where most contractor blogs live, because DIY queries have the highest volume in this vertical. They bring traffic that will never call. This is the same audience mistake we describe for software companies in our guide to SEO for SaaS: a keyword can be perfect on volume and difficulty while every person searching it belongs to someone else's business.
Check the intent before you write. Open the search results for the phrase and look at who is already there. If the whole page is forums and video tutorials, that query is a hobbyist query, whatever its volume says.
A note on cadence, since it is the question behind most of these plans. Publishing weekly with something real to say beats publishing daily with nothing, and both beat the twenty-city dump. The compounding effect comes from pages that stay useful, not from the count.
Speed, on the site somebody built for you in 2019
Contractor websites fail Core Web Vitals in the same three ways, and all three are fixable in an afternoon without touching the design.
Google's thresholds, from web.dev: Largest Contentful Paint "should occur within 2.5 seconds", Interaction to Next Paint should be "200 milliseconds or less", and Cumulative Layout Shift should stay at "0.1 or less". These are measured at "the 75th percentile of page loads, segmented across mobile and desktop devices", so the reading that matters is your slower quarter of visitors, not your office wifi. INP became a stable Core Web Vital in 2024 and replaced First Input Delay, so any checklist still naming FID predates that change.
The hero image. A photograph of a truck or a finished kitchen, exported straight from a phone at 4,000 pixels wide and four megabytes, is almost always the LCP element. Resize it to twice its displayed width, save it as WebP, and it drops by ninety percent with no visible difference.
The embedded map. A Google Maps iframe in the footer loads on every page and blocks the main thread. Add one attribute and it stops competing with your content:
<iframe src="https://www.google.com/maps/embed?pb=..."
width="600" height="450"
loading="lazy"
title="Our service area"></iframe>
The review widget. Third-party review carousels inject scripts you do not control and shift the layout when they arrive, which is CLS. If you want the reviews on the page, paste the text as HTML and link to the profile. Your CLS problem disappears and the words become crawlable, which they were not inside the widget.
Measure before and after with PageSpeed Insights on the actual URL, on mobile, and read the field data section rather than the lab score. Field data is what Google has from real Chrome users on your site, and it is the number that counts.
Measuring it without buying a dashboard
Two free tools cover the whole picture, and they measure different halves of it. Confusing them is why so many contractors think their SEO is working when it is not, or the reverse.
Search Console covers the website half: which queries showed your pages, how many impressions and clicks each got, and which pages Google has indexed. Verify the property, submit a sitemap, then leave it alone for a month. If you would rather pull the numbers programmatically than click through the interface, our SaaS SEO guide shows the API calls and their quotas. The report worth opening is Performance, filtered to queries containing your service words, sorted by impressions with few clicks. That list is where you already rank badly for things people actually search.
The Business Profile performance report covers the map half, and it counts actions rather than positions. Google's definitions: calls are "the number of times a customer clicked on the call button on your Business Profile", website clicks are "the number of times people clicked on the website link on your Business Profile", directions is "how many people asked for directions to your business", messages are "the number of different conversations through messages", and bookings are "the number of bookings people completed". Google also notes that a person "can only be counted once a day" in the views figures.
Calls is the number to watch. It is the closest thing to revenue that Google reports for free, it is not affected by anything you tell yourself about rankings, and it moves within weeks of profile work rather than months.
One caution on call tracking. Swapping the phone number on your website for a tracking number breaks the consistency between your site and your profile, which Google uses to confirm the business is the same one. If you use call tracking, keep the profile number visible somewhere in the page text and use dynamic insertion only for the click-to-call button.
What none of this tells you is which job was profitable. Track the source in your own estimating software, at the point of the quote, and match it back. A contractor who knows that map pack calls close at forty percent and DIY blog traffic closes at nothing will make better decisions than one reading a ranking report.
When the answer is written by an assistant
An increasing share of searches never reaches your site, because Google writes an answer at the top or the customer asks ChatGPT which roofer to call. The response to that has been oversold in this vertical, so here is what the primary source actually says.
Google published a guide on optimizing for generative AI search, last updated 2026-07-10, with a section on what you do not need to do. Verbatim: "You don't need to create new machine readable files, AI text files, markup, or Markdown to appear in Google Search." Also: "There's no requirement to break your content into tiny pieces for AI to better understand it", "You don't need to write in a specific way just for generative AI search", and "Seeking inauthentic 'mentions' across the web isn't as helpful as it might seem."
The same guide settles the framing: "Optimizing for generative AI search is optimizing for the search experience, and thus still SEO."
The eligibility requirement is the sentence with a real consequence: "To be eligible to be shown in generative AI features on Google Search, a page must be indexed and eligible to be shown in Google Search with a snippet." A nosnippet tag someone added during the AI panic of 2024 will quietly remove your pages from those features. Check for it.
What does help is unglamorous and already on your list: pages that answer a specific question in plain text, a phone number and service area that are readable as text rather than baked into an image, and mentions on the local sites an assistant is likely to read. Our article on LLM SEO covers the crawler-level detail across OpenAI, Anthropic and Perplexity, and how to rank on ChatGPT covers what makes an assistant pick one source over another.
Google's page on hiring an SEO now includes a vetting question for exactly this: whether the provider's "advice on optimizing for AI experiences (also known as 'AEO' 'GEO' services)" is "aligned with Google Search's official guidance on optimizing for generative AI features". If a vendor's AI pitch contradicts the mythbusting list above, you have your answer.
FAQ
What is a SEO contractor?
The phrase means two different things and both turn up in these search results. A contractor searching it usually wants SEO for a contracting business, which is this article. The other meaning is an independent SEO specialist hired on contract rather than employed, somewhere between a freelancer and an agency.
If you are searching for the second, Google publishes a list of vetting questions on its own page about hiring an SEO, including whether they follow Google Search Essentials and whether they can show previous work. It also warns to "Beware of SEOs that claim to guarantee rankings, allege a 'special relationship' with Google, or advertise a 'priority submit' to Google."
How much should I expect to pay for SEO?
There is one large public dataset. Ahrefs surveyed 439 providers and found agencies averaging $3,209 per month, freelancers $1,348.63, with 68.8% charging $2,000 per month or less and per-project agency work averaging $9,507.84. That survey is dated August 2024 and covers SEO generally rather than trades specifically, so treat it as an order of magnitude rather than a quote.
The useful question is not the monthly number but what is inside it: audit work is one-off, technical fixes are one-off, and content production is the recurring line that grows. We broke the same maths down for software companies in our article on agency retainers, and the structure holds in any vertical.
What is the 80/20 rule of SEO?
The idea is that a small part of the work produces most of the result, which is true here and worth being specific about. For a contractor, the twenty percent is a Business Profile that follows Google's rules, a website that loads on a phone at a job site, and a handful of pages that match what a buying customer types. The eighty percent that gets sold and mostly does not matter is monthly backlink packages, keyword density reports, and a page for every town in the county. Note that the ratio is a rule of thumb, not something Google publishes.
Should I build a page for every city I serve?
Only for the cities where you can write something true that would be false elsewhere. Google's spam policies list "multiple domain names or pages targeted at specific regions or cities that funnel users to one page" as an example of doorway abuse. Real jobs, local permit details, photos from that town and its own driving time give a page a reason to exist. A find-and-replace on the town name does not, and the risk lands on the whole site rather than the one page.
Do I still need a website if I have a Google Business Profile?
Yes, and for two reasons. The map pack is filtered by distance, so a profile alone caps how far your reach extends, while organic results are not filtered that way. The profile also has no room for the things that win larger jobs: project write-ups, cost breakdowns, permit explanations and photographs of finished work. Prominence, one of Google's three local ranking factors, is partly "how many websites link to your business", and a site is what other sites link to.
How long does contractor SEO take to work?
Nobody can tell you honestly, and anyone who names a date is guessing. Google's own position is the one to hold vendors to: "No one can guarantee a #1 ranking on Google." What you can do is set the measurement up first, so you find out. Record your Business Profile calls, website clicks and direction requests for the month before you start, then compare monthly. Profile work tends to show movement soonest because it affects a system with fewer competitors in it; page work on a new site takes longer because the pages have to be indexed first. Both are measurable, which is the only claim worth making.
Get cited by ChatGPT. Rank on Google.
You found this article through search. That is the whole product.
- One researched article a day
- Published on your own domain
- Keywords checked against live results
Get cited by ChatGPT. Rank on Google.
You found this article through search. That is the whole product.
- One researched article a day
- Published on your own domain
- Keywords checked against live results
