Why Service Business Websites Don't Rank on Google (Fix Guide)

TL;DR: Service business websites usually fail to rank for one of nine reasons, and almost none of them are about "needing more content". The real killers are: a broken canonical setup, missing or wrong schema, slow Core Web Vitals, thin city pages, no internal linking, a weak Google Business Profile, JavaScript-rendered content Google cannot see, duplicate page templates, and missing review signals. Fix the technical foundation first, then write more — or you are pouring content into a leaky bucket.

Key takeaways

Table of contents

How to tell if you actually have a ranking problem

Before assuming Google hates you, check the data:

  1. Search Console → Performance. Sort by impressions, not clicks. If you have impressions for the searches you care about but no clicks, you are ranking — just below the fold. If you have zero impressions, you are not in the index for those terms.
  2. Search Console → Indexing → Pages. Compare "Indexed" count vs your sitemap count. A gap of 5-10% is normal. A gap of 20%+ means you have an indexing problem.
  3. site:yourdomain.com in Google. Quick way to see what Google has. If the count is way below your real page count, you have a discovery or canonical issue.

Now, the nine real reasons.

Reason 1: Your canonical tags are broken

This is the silent killer. If every page on your site has a <link rel="canonical" href="https://yoursite.com/" /> pointing back to the homepage, Google treats every URL as a duplicate and consolidates them. Your blog post, your city page, your service page — all collapsed into one.

We fixed exactly this bug on our own site last week. The sitemap had 57 URLs, but Google was only indexing 49 — because the index.html template hardcoded the homepage as the canonical, and our SPA never overrode it fast enough for Googlebot.

How to check:

  1. Open any non-homepage URL on your site.
  2. View page source (Ctrl+U / Cmd+U).
  3. Search for canonical.
  4. The href should match the URL you are on. Not the homepage.

How to fix:

For the SPA fix specifically, see the next section.

Reason 2: Your site is a JavaScript SPA with no pre-rendering

If your site is built in React, Vue, or any other client-side framework without server-side rendering or pre-rendering, Google has to execute JavaScript to see your content. Google can do this, but:

How to check:

  1. Go to Google Search Console.
  2. Use the URL Inspection tool on a blog post or service page.
  3. Click "Test Live URL" → "View Tested Page" → "Screenshot".
  4. If the screenshot is blank or shows a loading spinner, Googlebot can not render your content reliably.

How to fix:

Three options, in order of effort:

  1. Pre-render at build time. A small script that visits every URL during your deploy and saves the rendered HTML. Tools: vite-plugin-prerender, react-snap, puppeteer + a custom script. This is what we did for our own site — solves 80% of the problem in a half-day of work.
  2. Static site generation (SSG). Migrate to a framework that pre-builds every page: Astro, Next.js with output: 'export', Gatsby. Bigger change, better long-term.
  3. Server-side rendering (SSR). Next.js or Remix with SSR. Best for dynamic content, more infrastructure complexity.

For a service business site that does not change minute-by-minute, option 1 (pre-render at build time) is usually the right answer.

Reason 3: Missing or wrong schema markup

Schema is how you tell Google what your page is, not just what it says. For local service businesses, two schema types are non-negotiable:

LocalBusiness schema — on every page that represents your business:

{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Your Business Name",
  "image": "https://yoursite.com/photo.jpg",
  "telephone": "+1-555-555-5555",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main St",
    "addressLocality": "Phoenix",
    "addressRegion": "AZ",
    "postalCode": "85001",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 33.4484,
    "longitude": -112.0740
  },
  "url": "https://yoursite.com",
  "priceRange": "$",
  "openingHoursSpecification": [...],
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.9",
    "reviewCount": "127"
  }
}

Service schema — on each service page:

{
  "@context": "https://schema.org",
  "@type": "Service",
  "serviceType": "Artificial Turf Cleaning",
  "provider": { "@type": "LocalBusiness", "name": "Your Business Name" },
  "areaServed": { "@type": "City", "name": "Phoenix" },
  "description": "Professional artificial turf cleaning..."
}

How to check: Run any page through Google's Rich Results Test. It will tell you exactly what schema it found and what is missing.

Most common mistakes:

Reason 4: Slow Core Web Vitals on mobile

Google has been ranking by Core Web Vitals since 2021 and tightened the screws in 2024. The thresholds:

Metric "Good" "Needs improvement" "Poor"
LCP < 2.5s 2.5–4.0s > 4.0s
INP < 200ms 200–500ms > 500ms
CLS < 0.1 0.1–0.25 > 0.25

If any metric is "poor", you lose ranking weight. If two or more are "poor", you lose significant ranking weight.

How to check:

  1. Go to PageSpeed Insights.
  2. Test your homepage and a service page and a blog post.
  3. Look at the mobile scores, not desktop. Desktop is irrelevant for local search.

The usual fixes:

For a service business site, getting all three into "Good" on mobile is a 4–12 hour engineering job. Not weeks.

Reason 5: Thin or templated city pages

City pages are the highest-ROI SEO move for service businesses if you do them right. The wrong way kills you with Google's Helpful Content update.

The wrong way:

/service-area/phoenix
/service-area/scottsdale
/service-area/tempe

Each page has the same template with the city name swapped. 300 words. No real local content. No photos. No specific service details.

Google sees these as doorway pages and either ignores them or actively penalizes the whole site.

The right way:

Each city page needs:

Start with your top 3–5 cities. Prove the model. Then expand.

For the playbook on how to make city pages work without triggering Helpful Content, see our local SEO for service businesses page.

Reason 6: Zero internal linking strategy

Most service business sites have a navigation menu and that is it for internal linking. Google uses internal links to:

  1. Discover pages (you have to link to them to get them crawled)
  2. Pass authority between pages (the "link juice" model is still real)
  3. Understand topical relationships (which pages support which)

The minimum internal linking structure for a service business:

This sounds tedious. It is. It is also one of the highest-ROI SEO actions you can take, and almost no service business does it well.

Reason 7: A weak Google Business Profile

For "near me" searches and the local 3-pack, your Google Business Profile is roughly 60% of the ranking signal. The website is the other 40%. If your GBP is weak, no amount of website optimization will fix the gap.

GBP non-negotiables:

The single biggest GBP move that nobody makes: upload a Google Maps screenshot of your service area as a photo, every month. Google's algorithm uses photo metadata for local relevance. Real geo-tagged photos = real local signal.

For the full GBP playbook, see turf cleaning Google Business Profile — the framework applies to any local service.

Reason 8: Duplicate title tags and meta descriptions

Every page needs a unique <title> and <meta name="description">. Most service business sites do not have this — they have either the same title on every page, or templated titles like "Service - Company Name" that look identical to Google.

How to check: In Google Search Console → Pages → Indexed. Click into any page and look at the title shown. Are 10 of your pages showing the same title? You have a duplicate title problem.

The fix:

If you have 30+ pages and writing all those is daunting, batch it. One afternoon with a spreadsheet and you are done.

Reason 9: No review velocity signal

Google does not just look at how many reviews you have. It looks at the velocity — how many you got in the last 30/90 days. A business with 200 reviews from 5 years ago ranks worse than a business with 30 reviews all from the last 90 days.

The fix:

If you are doing 8+ jobs a week and getting 0 reviews, you do not have a Google problem — you have an asking problem. Fix the asking and the rankings follow within 60–90 days.

The 30-day fix-everything plan

If you do nothing else, do these in this order:

Week 1: Audit + foundations

Week 2: Technical fixes

Week 3: Content fixes

Week 4: GBP + reviews

Expect to see indexing improvements in 1–2 weeks and ranking movement in 4–8 weeks. The compounding kicks in around month 3.

Frequently asked questions

My sitemap has 57 pages but Google only indexes 49. Why? Most likely a canonical issue or a JavaScript rendering issue. Check the canonical tag on a non-indexed page first — if it points to the homepage, that is your culprit. (Yes, this is exactly the bug we just shipped a fix for on our own site.)

How long until rankings improve after I fix all this? Indexing improvements: 1–2 weeks. Ranking improvements: 4–8 weeks for the easy wins, 90–180 days for competitive local terms. SEO is not slow because it is hard — it is slow because Google needs repeated crawls to confirm the changes are real.

Should I disavow bad backlinks? For 99% of service businesses, no. Google's algorithm is good enough now to ignore spammy links automatically. Disavow only if you have evidence of a manual penalty or a clear negative SEO attack.

What about AI-generated content for SEO? Google's March 2024 update specifically targets low-quality AI content. AI can draft, but the published page needs human expertise signals: real photos, real case studies, real specific pricing. AI-only city pages get hit hard.

Is local SEO worth it if I run a lot of paid ads? Yes. Paid stops the day you stop paying. Local SEO compounds. Most clients we work with end up at a 70/30 organic-to-paid mix within 18 months — the cheapest leads are organic, the paid layer is for scaling fast in new markets.

How much do I budget for SEO if I do it right? $300–$1,500/month for a single-location service business. Most of that goes to content production and link/citation building. The technical foundation is mostly one-time work — done right once, you only revisit it when Google changes the rules.


Want us to audit your site and fix the technical foundation? Our local SEO service starts with a free technical audit — we tell you exactly which of these 9 issues you have, prioritized by impact. Or book a free strategy call and we will walk it through live.

Related reading: