Local SEO for contractors is the work of getting your business into the Google Maps results (the map pack) when a homeowner in your service area searches for your trade, and turning that spot into phone calls. The pack is assembled from 3 inputs you control this week (your primary category and services list, your review recency and response rate, and a name, address and phone number that match everywhere) plus 1 you cannot (the searcher's distance from you). Everything else in this guide is a multiplier on those 4.
Most contractors who tell me "SEO doesn't work" have never been in the map pack. They have a Google listing that was set up in 20 minutes and never touched again, and a competitor with fewer reviews gets the call because their listing is filed under the right category and their phone number matches on every site Google checks.
This guide is for US HVAC, plumbing, electrical, roofing, general and painting contractors. It covers the whole system, then links down to deeper guides on each piece. If you only read one section, read the one on how the pack is built.
In this guide
- Why the map pack decides who gets the call
- How Google builds the map pack for a service-area business
- You do not have one ranking, you have a grid
- Google Business Profile for contractors: the 7 fields that move the pack
- Reviews: recency and response beat count
- NAP and citations: the match that makes the rest count
- The website layer: service pages, city pages, and schema that matches your profile
- Local Services Ads sit above the pack and run on the same signals
- Call tracking: how to know the map pack produced the call
- Local SEO by trade: HVAC, plumbing, electrical, roofing, general, painting
- What local SEO for contractors costs, and what to do first on each budget
- AI answers already use your map-pack data
- The 90-day plan
- 7 mistakes that keep contractors out of the pack
- The verdict
Why the map pack decides who gets the call
Search "AC repair near me" on a phone in Phoenix in July and look at what loads above the fold. Local Services Ads first, if any are running. Then the map pack: 3 businesses, star ratings, a call button. Then the regular blue links. The homeowner with a dead AC taps a call button in the pack and never sees your website.
The demand is not small. Ahrefs data published in September 2026 puts US monthly searches at about 844,000 for "HVAC near me" and related terms, 709,000 for "plumber near me", and 381,000 for "electrician near me".
Here is the part most contractors miss. Your website is the second interview. The first interview happens inside the map pack, on your Google Business Profile, where the homeowner sees your rating, your hours, your photos and your reviews before they decide whether to call. Local SEO for contractors is mostly the job of winning that first interview.
How Google builds the map pack for a service-area business
Google publishes the 3 factors it ranks local results on: relevance, distance and prominence, and says plainly that you cannot pay for a better local ranking. What it does not explain is how those 3 play out for a contractor who drives to the customer and has no storefront.
Relevance: your primary category does more than your website
Relevance is how well your listing matches what the person typed. For a contractor it comes down to 2 fields: the primary category and the services list. A listing filed under "Plumber" with "Water heater repair service" and "Drainage service" as secondary categories matches every plumbing query in the area. A listing filed under "Contractor" with no services listed matches almost nothing specific.
Most profiles I audit have the wrong primary category or are missing 3 to 6 secondary categories that exist in Google's list. That is a 20-minute fix that outweighs a month of blog posts.
Distance: measured from the searcher, not from your shop
Distance is the one input you cannot change. Google ranks the pack by how far each business is from the person searching, or from the location named in the search. A service-area business can hide its address and set a service area, and Google still ranks it by distance. Your service area tells Google where you work, not that you are close to everyone inside it.
Google's guideline for service-area businesses is that the area should not extend much past about 2 hours of driving time from where you are based. Setting a 5-county service area does not get you into the pack in all 5 counties. It gets you into the pack near your base and makes you eligible further out.
Prominence: how well known Google thinks you are
Prominence is reviews (count, rating, recency, responses), mentions of your business across the web (directories, local news, suppliers, associations), and links to your site. Google also folds in your regular web ranking. This is the slow input. It also feeds 2 other places: Local Services Ads rankings and the answers ChatGPT and Google's AI give when someone asks for a contractor in your city.
The 3 you control this week: primary category and services, review recency and responses, and a name, address and phone number that match on every site. The 1 you do not: distance. Everything else, from city pages to backlinks, is a multiplier on these 4.
You do not have one ranking, you have a grid
"We rank number 2 for plumber" is not a true sentence for a contractor. You rank number 2 at the point where your rank tracker checked, which is usually your own address. 12 miles away, in the suburb where you want more work, you rank 15th. Both are true on the same day for the same keyword.
The honest way to see your local position is a grid: the same keyword checked from 25 or 49 points spread across your service area. Free version: open an incognito window on your phone, drive to 3 suburbs you want more work from, and search your trade plus "near me" in each. Paid version: grid tools such as Local Falcon or BrightLocal run the whole grid for you and show it as a map of numbers.
The grid changes what you fix. Strong at the center and weak at the edges means a distance problem, and the answer is reviews that name the suburb, photos taken on jobs there, and a city page with real local content. Weak everywhere means a relevance or trust problem, and the answer is categories, services and NAP first. I show how this plays out in Phoenix, Dallas-Fort Worth, Houston and Miami-Fort Lauderdale in Local SEO for HVAC, Plumbing and Electrical Companies.
Google Business Profile for contractors: the 7 fields that move the pack
Your Google Business Profile is the listing that appears in the pack. It is free, it is the first thing the homeowner sees, and most contractors fill about 60% of it. The other 40% is ranking you are leaving on the table.
- Business name, exactly as licensed. "Desert Air Heating & Cooling", not "Desert Air Heating & Cooling | AC Repair Phoenix". Adding keywords to the name violates Google's guidelines and is the most common reason a contractor's profile gets suspended. A suspended profile means zero calls from the pack until it is reinstated, which can take weeks.
- Primary category, the most specific one for your main trade. HVAC contractor, Plumber, Electrician, Roofing contractor, General contractor, Painter. Then 2 to 5 secondary categories for the services you want calls for: Air conditioning repair service, Furnace repair service, Water heater installation and repair service, Drainage service, and so on. The primary category carries the most weight, so it goes to the trade that pays your best jobs.
- Services list, one entry per service you want to be called for. Google reads this list for relevance. Write the service names the way homeowners search, "AC repair", "Drain cleaning", "Panel upgrade", not internal job codes.
- Service area without a storefront. If customers do not visit you, hide the address and list the cities and ZIP codes you serve. Keep it inside the roughly 2-hour driving guideline. A hidden address does not hurt you in the pack. A fake storefront address does, when Google finds it.
- Hours, plus the 24/7 attribute if you take emergency calls. Google shows "Open now" and homeowners filter on it. An HVAC company that answers at 9 PM in July and lists hours as 8 to 5 is turning away the most profitable calls of the year.
- Photos from real jobs, with location in the frame. 40 or more photos: trucks, crews, finished work, the shop. Add new ones monthly. A photo of your van outside a house in Mesa is a stronger local signal than a stock image of a thermostat.
- Questions and answers, and a weekly post. Seed your own Q and A with the 10 questions customers ask on the phone (do you charge a trip fee, are you licensed in Texas, do you do weekend calls) and answer them. Post once a week: a job completed, a seasonal reminder, a price range. Posts expire, which is why weekly matters.
The full field-by-field setup, including category tables for each trade, is in the Google Business Profile for Contractors guide that follows this one.
Reviews: recency and response beat count
200 reviews from 3 years ago lose to 40 reviews where 8 arrived last month and every one has a reply. Since the March 2026 core update, recency and response rate carry more weight than raw count, and homeowners read it the same way Google does. A business with no reviews in 6 months looks closed.
The system that produces steady reviews is a text message, not a sign in the truck. Send a direct review link within 2 hours of finishing the job, while the fixed AC is still blowing cold. Follow up on day 3 and day 7 if nothing came in. That sequence is the difference between 1 review a month and 8.
Reply to every review within a day, including the 1-star ones. A calm, specific reply to a bad review ("We were late on Tuesday, the earlier job ran over, and we have refunded the trip fee") does more for the next homeowner's trust than 5 unanswered 5-star reviews.
2 things Google's review policy prohibits: offering anything in exchange for a review, and asking only happy customers while steering unhappy ones away (review gating). Both can get reviews removed or the profile flagged. Ask everyone, the same way, every time.
NAP and citations: the match that makes the rest count
NAP is your name, address and phone number. Google checks them across your profile, your website and every directory that lists you. One version says "Suite 200", another leaves it out. One lists the LLC, another the trade name. Yelp still shows the tracking number from a 2022 campaign. Each mismatch makes Google less sure these are the same business, and a profile Google is unsure about ranks below one it is sure about.
Pick 1 format and use it everywhere. For a US contractor the listings that matter most are Google, Bing Places, Apple Business Connect, Yelp, Angi, the Better Business Bureau, Nextdoor, Facebook, HomeAdvisor and Thumbtack, plus your state licensing board and any trade association that lists members. Fix the mismatches on those first, then audit once a quarter, because directories change data on their own.
The deeper version, with the US directory list by trade and the audit sheet, is in the Local Citations and NAP Consistency guide in this series.
The website layer: service pages, city pages, and schema that matches your profile
The website matters less than the profile for getting into the pack and more than the profile for winning the call once the homeowner clicks through. 3 pieces do most of the work.
One page per service, one page per city, written with real local content
A homepage that lists 12 services in one paragraph ranks for none of them. Each service that pays gets its own page: what the job involves, what affects the price, how fast you respond, photos, reviews that mention that service. Then 1 page per city you want more work from, written with details only someone who works there would know: the neighborhoods, the common house age and system type, the permit office, 2 real jobs you did there with photos. 10 pages like that beat 50 pages where only the city name changed. Google treats the template version as doorway pages and ignores or removes them.
LocalBusiness schema that mirrors your profile
Schema markup is a block of code that tells Google and the AI engines the facts about your business in a form they can read without guessing. For a contractor the type is LocalBusiness or the specific trade type (HVACBusiness, Plumber, Electrician, RoofingContractor, GeneralContractor, HousePainter). The rule that matters: every value must match your Google Business Profile exactly, same name format, same phone, same address, same hours. Mismatched schema is one more NAP mismatch.
{
"@context": "https://schema.org",
"@type": "HVACBusiness",
"name": "Desert Air Heating & Cooling",
"url": "https://www.example.com/",
"telephone": "+1-602-555-0100",
"address": {
"@type": "PostalAddress",
"addressLocality": "Phoenix",
"addressRegion": "AZ",
"postalCode": "85004",
"addressCountry": "US"
},
"areaServed": ["Phoenix", "Mesa", "Tempe", "Scottsdale"],
"openingHours": "Mo-Su 00:00-23:59",
"sameAs": [
"https://www.facebook.com/example",
"https://www.yelp.com/biz/example"
]
}
Put it on the homepage and every service and city page. If you run FAQ sections on those pages, add FAQPage markup too. I cover the full order of operations in Schema Markup for AI Search.
Click to call in the header, speed, mobile
Most of this traffic is on a phone. The phone number sits in the header as a tap-to-call link on every page. Pages load in under 3 seconds on mobile data, which usually means compressing the 4 MB job photos. If your site fails the basics, the technical SEO audit checklist is the order to fix them in.
Local Services Ads sit above the pack and run on the same signals
Local Services Ads are the "Google Guaranteed" or "Google Screened" boxes that load above the map pack for most home service searches in US metros. You pay per lead (a call or a message), not per click, and you need a background check and license verification to run them.
Here is why they belong in a local SEO guide. Google says LSA ranking comes down to 3 things: your bid, how likely the lead is to convert (how fast you answer calls and messages, how well your service, timing and location match the search, and whether you accept messages and bookings), and your profile quality (ratings, review count, response time, photos and completed verification). Read that list again. Apart from the bid, it is the same work: reviews, responsiveness, a profile that matches the search. Every review you earn for the pack also lifts your LSA position, because LSAs pull from your Google Business Profile.
The practical play in Phoenix, Dallas-Fort Worth, Houston and Miami: run LSAs for calls this month while the pack work compounds, and expect the LSA cost per call to fall as the review engine runs.
Call tracking: how to know the map pack produced the call
Without call tracking you cannot tell whether the pack, the ads or the truck wrap made the phone ring, so you keep paying for whichever one has the loudest salesperson.
Start with the free report. Your Google Business Profile has a Performance section that shows calls, messages, direction requests and website clicks by month, plus the searches that triggered your listing. That is the map pack's own scorecard. Check it on the 1st of every month and write the number down.
If you add a call tracking number, follow 1 rule: your real local number stays the primary number on the profile, and the tracking number goes in as an additional number. Replacing the primary with a tracking number breaks NAP across every directory that copied the original. On the website, a dynamic number swap that shows the tracking number only to visitors from Google is fine, as long as the schema and footer keep the real number.
Then in Google Analytics 4, mark 2 events as key events: phone taps and form submissions. Nothing else. A dashboard that counts every outbound click as a win tells you nothing. A 1-line monthly scorecard does: calls from the profile, calls from the website, booked jobs, and the 3 keywords on the grid where you moved.
Local SEO by trade: HVAC, plumbing, electrical, roofing, general, painting
The system is the same for every trade. What changes is which input carries the most weight and what to fix first.
| Trade | Emergency intent | Seasonality | Map-pack dependence | Fix first |
|---|---|---|---|---|
| HVAC | High in heat waves and cold snaps | Sharp: summer and first cold front | Very high | 24/7 hours attribute, "AC repair" and "furnace repair" secondary categories, reviews before the season starts |
| Plumbing | Highest of all trades | Mild, with winter pipe spikes | Very high | Services list for the high-value jobs (repipe, water heater, sewer), review recency, response speed |
| Electrical | Medium, with panel and outage calls | Low | High | License number on the profile and site, "EV charger installation" as a service, trust signals |
| Roofing | Spikes after storms | Storm-driven | High, plus organic for insurance questions | Storm-event city pages published before the season, photos by neighborhood, review velocity after each job |
| General contractor | Low | Low | Medium, website carries more | Project pages with scope, timeline and photos; "design-build" and project-type pages over city pages |
| Painting | Low | Spring and fall exterior | Medium | Before-and-after photo sets on the profile, "exterior painting" and "cabinet painting" services, reviews that name the suburb |
For HVAC, plumbing and electrical the metro-level detail is already written: Local SEO for HVAC, Plumbing and Electrical Companies. Roofing, general contracting and electricians each get their own guide in this series.
What local SEO for contractors costs, and what to do first on each budget
You are already paying for calls. LocaliQ's 2025 search advertising benchmarks put the average cost for home services on Google Ads at about $128 for every call or form the ads produce. Angi and HomeAdvisor sell the same homeowner to 3 or 4 contractors at once. Local SEO is the one channel where the cost per call falls over time instead of rising, because the profile and the reviews keep working after the work is done.
3 ways to pay for it.
Do it yourself, 2 hours a week. Cost is your time plus $0 to $100 a month for a grid tool. Order of operations: week 1, fix the name, primary category, secondary categories and services list. Week 2, hide or correct the address, set the service area and hours, upload 20 photos. Week 3, set up the review text sequence and reply to every past review. Week 4, fix NAP on the 10 directories above. Then weekly: 1 post, new photos, review replies, and the monthly scorecard. This works for an owner-operator in a smaller metro. In Houston or Dallas-Fort Worth the pack is a full-time job to defend, and the website layer usually needs help.
Hire an agency. Published US agency ranges run from about $500 to $5,000 a month. Below roughly $700 you are usually buying templated content and directory submissions from a production line. Ask 4 questions before signing: who owns the profile, the site and the content when we stop; will you show me the grid, not one ranking number; which 3 current clients in my trade can I call; and what exactly happens in month 1. A provider who leads with backlink counts is running a 2014 playbook.
Work with a consultant who does the work. That is what I do. 1 person, direct contact, the profile and the website fixed in the order above, and a monthly scorecard of calls rather than impressions. The scope and how I price it are on the local SEO service page. I do not promise a position in the pack, because nobody can control distance or what your competitors do next month. I do promise you will know, every month, what moved and why.
AI answers already use your map-pack data
Ask ChatGPT or Google's AI Mode for "a reliable AC repair company in Mesa" and the answer is assembled from the same places the map pack is: your Google Business Profile, your reviews, your directory listings, and pages that mention you. There is no separate AI optimization for a contractor. There is the local SEO work done well, plus a website that states plain facts (licensed in Arizona since 2011, same-day service in these 6 cities) in text the engines can quote.
The way to check is to ask. Run the category questions a homeowner would ask in ChatGPT, Perplexity and Google, and note whether you appear and what source they cite. I give the exact prompt set in 15 prompts to test your own brand, and the fix order in how to improve your AI search visibility.
The 90-day plan
This is the order I run for a new contractor profile.
- Days 1 to 14: foundation. Audit and fix the profile: legal name, primary and secondary categories, services list, service area, hours and 24/7 attribute, 40 photos, 10 Q and A pairs, replies to every past review. Fix NAP on the 10 core directories. Add LocalBusiness schema and tap-to-call to the homepage and service pages. Set up the GBP Performance baseline and the 2 GA4 key events. Run the first grid and save it.
- Days 15 to 45: reviews and service pages. Turn on the review text sequence (2 hours, day 3, day 7). Target 15 to 25 new reviews in the first 30 days if your job volume supports it. Write or rebuild 1 page per paying service, 800 to 1,500 words each, with photos, price factors and that service's reviews. Start weekly posts. If you need calls now, launch Local Services Ads in parallel.
- Days 46 to 90: city pages, citations, measurement. Write city pages for the 5 to 10 suburbs where the grid is weakest and the jobs are best, with real local content. Finish the citation cleanup on the long tail of directories. Run the second grid and compare it to day 1. Produce the first monthly scorecard: profile calls, website calls, booked jobs, grid movement.
7 mistakes that keep contractors out of the pack
1. Keywords in the business name. It works until the suspension, and the suspension costs more than the keywords ever earned.
2. "Contractor" as the primary category. It matches nothing specific. File under your trade.
3. A tracking number as the primary phone. Every directory that copied your original number now disagrees with your profile.
4. City pages where only the city name changed. Google treats them as doorway pages. 10 real pages beat 50 copies.
5. Ignoring negative reviews. The reply is read by the next 100 homeowners, not by the 1 who complained.
6. No call tracking. You cannot defend a budget you cannot measure, so the loudest salesperson wins it.
7. Trusting a 1-number rank report. Rank 2 at your shop and rank 17 in the suburb you want are both true. Ask for the grid.
The verdict
Local SEO for contractors is not a website project. It is a Google Business Profile, a review system and a matching set of business details, with the website and the city pages multiplying what those 3 produce. Distance is fixed. Everything else on this page is in your hands this week.
Start with the 3 that cost nothing: file the profile under the right primary category with a full services list, send a review link within 2 hours of every job and reply to every review, and make your name, address and phone match on the 10 directories that matter. Then measure calls, not impressions, and build out from what the grid tells you.
Want to know which of the 4 inputs is costing you calls?
Book a free 30-minute call. Bring your Google Business Profile and the 3 competitors who outrank you in the pack. I will show you the category, review and NAP gaps on screen and tell you what I would fix first, whether or not you hire me. US home service companies only.