Skip to content
CrawlerData
Menu
Guides

Google local results: ratings, review counts and position across 640 businesses

We pulled 640 businesses from 32 local searches: median rating 4.8, median 333 reviews, and top-3 results had more. Data, code and what it can't show.

CrawlerData teamPublished 7 min read

Contents

Local SEO advice is full of statements about what a business needs to be listed first: more reviews, a higher rating, a complete profile. How much of that shows up in the data?

We looked. We ran 32 local searches, 8 services in 4 cities, through the Google Local API with location set, collected 640 businesses, and measured ratings, review counts, completeness and how they relate to position. This guide has the numbers, code to run the same measurement for your market, and a clear note on what the data cannot say. Results change, so yours will differ.

How we ran it

We used 8 services: plumber, dentist, hair salon, gym, car repair, pizza, coffee shop and personal injury lawyer. We ran each with location set to Austin,Texas,United States, Brooklyn,New York,United States, Denver,Colorado,United States and Miami,Florida,United States. Each request returned 20 businesses, so 32 searches gave 640 businesses and cost 32 credits.

It is a small set of services and cities we picked, checked once. The figures describe it and nothing wider.

Ratings are high and bunched

The median rating of a listed business was 4.8. The spread was narrow:

  • 79% had 4.5 or higher.
  • 94% had 4.0 or higher.
  • Only 6% were below 4.0, and the lowest was 1.0.

If nearly everyone in the list is at 4.5 or above, a rating mostly tells you that a business is not terrible. It does not separate the first result from the fifteenth. The median rating was 4.8 for positions 1 to 3, for positions 4 to 10 and for positions 11 to 20, and the correlation between position and rating was 0.02, which is nothing.

By service, plumbers (4.9) and personal injury lawyers (5.0) had the highest median ratings, and gyms (4.4) the lowest.

Review counts vary a lot, and by service

The median business had 333 reviews. The middle half sat between 118 and 765, the largest count was 18,000, 12% had fewer than 50 and 18% had 1,000 or more.

The count depends heavily on what is being sold:

Service Median reviews Median rating
pizza 548 4.6
coffee shop 436 4.6
hair salon 426 4.8
dentist 410 4.8
personal injury lawyer 290 5.0
gym 270 4.4
plumber 201 4.9
car repair 104 4.7

A plumber with 150 reviews is above the middle of its list. A pizza place with 150 is below. So compare a business with the others in its category, not with a general benchmark.

Higher positions have more reviews, but only a little

We grouped businesses by their position in the list:

Position Businesses Median reviews Median rating With under 100 reviews
1 to 3 96 501 4.8 10%
4 to 10 223 395 4.8 22%
11 to 20 315 278 4.8 26%

The top three had a higher median review count than the businesses further down, 501 against 278 for positions 11 to 20, and fewer of them had under 100 reviews. That is a real pattern in this sample. It is also modest: the rank correlation between position and review count was -0.16, which is weak, and about one in ten of the top-three businesses had under 100 reviews.

This is a description, not an explanation. The data does not show that reviews push a business up. Businesses that are well established can have more reviews and also appear higher for other reasons. And the position is where Google listed the business on that request, which can change from one request to the next, as we saw in Google search results by city.

Profiles are mostly complete

Among the listed businesses, a field was present for:

  • hours: 98%
  • phone: 96%
  • address: 96%
  • website: 91%

Nine in ten had a website, and six of the 640 had no rating or review count at all. So almost every listed business has the basics, which means a missing website or phone number is a rare gap, and one a competitor can see.

None of the 640 were marked sponsored. The sponsored flag exists on every result, and in this test, with a location set, it was false for all of them.

Chains

10 business names appeared more than once across the 32 searches. The repeats were chains that exist in several cities, such as Life Time and 24 Hour Fitness, which each appeared four times. When you track one location of a chain, match the address as well as the name, as explained in local rank tracking.

Review counts are rounded above 1,000

We found 116 businesses with 1,000 or more reviews, and all 116 counts were a multiple of 100: 1,200, 3,600, 18,000 and so on. Below 1,000 the counts looked exact. So large counts are approximate, and a business that moves from “1,200” to “1,300” gained roughly 100 reviews, not exactly 100.

The code

Put your key in an environment variable:

export CRAWLERDATA_API_KEY="YOUR_API_KEY"
import os
import statistics
import time

import requests

API_URL = "https://api.crawlerdata.com/v1/jobs"
HEADERS = {"Authorization": f"Bearer {os.environ['CRAWLERDATA_API_KEY']}"}


def google_local(query, location, country="us", retries=4):
    body = {"endpoint": "google-local", "params": {"query": query, "country": country, "location": location}, "queue": "live"}
    for attempt in range(retries):
        resp = requests.post(API_URL, json=body, headers=HEADERS, timeout=180)
        if resp.status_code == 429:
            time.sleep(int(resp.headers.get("retry-after", 10)))
            continue
        resp.raise_for_status()
        job = resp.json()["job"]
        if job["status"] == "completed":
            return resp.json()["result"]["local_results"]
        if "retry" in (job["error"] or "").lower():  # "service is busy" and "temporarily blocked" both say retry
            time.sleep(5 * (attempt + 1))
            continue
        raise RuntimeError(job["error"])
    raise RuntimeError("Local search failed after retries")


def local_stats(results):
    """results: list of google_local() lists, one per search. Ratings, reviews and position buckets."""
    rows = [(pos, r) for items in results for pos, r in enumerate(items, start=1)
            if not r.get("sponsored") and r["rating"] is not None and r["reviews"] is not None]
    ratings = [r["rating"] for _, r in rows]
    stats = {
        "businesses": len(rows),
        "median_rating": statistics.median(ratings),
        "share_4_5_plus": round(100 * sum(x >= 4.5 for x in ratings) / len(ratings)),
        "median_reviews": int(statistics.median(r["reviews"] for _, r in rows)),
    }
    for name, lo, hi in (("1-3", 1, 3), ("4-10", 4, 10), ("11-20", 11, 20)):
        bucket = [r["reviews"] for pos, r in rows if lo <= pos <= hi]
        stats[f"median_reviews_position_{name}"] = int(statistics.median(bucket))
    return stats

Run it over the searches that matter in your market:

searches = [google_local("dentist", "Denver,Colorado,United States"),
            google_local("dentist", "Austin,Texas,United States")]
print(local_stats(searches))

On our 32 searches it returned:

{'businesses': 634, 'median_rating': 4.8, 'share_4_5_plus': 79, 'median_reviews': 333,
 'median_reviews_position_1-3': 501, 'median_reviews_position_4-10': 395, 'median_reviews_position_11-20': 278}

The function counts the 634 businesses that have both a rating and a review count, which is why it says 634 and not 640. For a single dentist search in Denver it returned a median of 4.8 and a median of 605 reviews, with 90% rated 4.5 or higher.

Location names come from Google’s own list, which you can search with the public GET https://api.crawlerdata.com/public/locations?q=denver, with no key.

What to do with it

  • Benchmark inside your category and city. Run your own local_stats and compare a business with the median for its service, not a general rule.
  • Do not chase the rating. With a median of 4.8, a higher rating is unlikely to separate you.
  • Watch review velocity. Review counts are the number that varies, so track a competitor’s count over time with the monitor in our reviews guide.
  • Check completeness. Nine in ten listings have a website and 98% have hours. A missing field stands out.

What it costs

Every request is 1 credit, on every queue. Starter is $1.00 per 1,000 requests and the largest pack is $0.30 per 1,000, see pricing.

What you run Requests At $1.00 per 1,000 At $0.30 per 1,000
This study 32 $0.032 $0.01
20 services in 25 cities, once 500 $0.50 $0.15
The same, refreshed weekly for a year 26,000 $26.00 $7.80

Failed requests are not charged.

Next steps

You now have numbers on what the businesses in Google’s local results look like, a function that measures your own market, and a view of what the data does and does not show. The Google Local API page lists every parameter with a full example response, and Build a local business lead list from Google uses the same endpoint to collect the businesses themselves.

Frequently asked questions

What is a typical rating for a business in Google's local results?
High. Across 640 businesses from 32 local searches in October 2026, the median rating was 4.8, 79% were 4.5 or higher and 94% were 4.0 or higher. Only 6% were below 4.0. Because almost everyone is rated high, rating tells you little about who is listed first.
How many reviews do businesses in the local results have?
A median of 333, with a middle half between 118 and 765. 12% had fewer than 50 reviews and 18% had 1,000 or more. The median varied by service, from 104 for car repair to 548 for pizza.
Do businesses listed higher have more reviews?
Somewhat. The median review count was 501 for positions 1 to 3, 395 for positions 4 to 10 and 278 for positions 11 to 20. The correlation between position and review count was weak, at -0.16, and it shows only that the two move together in this sample, not that reviews cause the order.
Do the local results include ads?
None of the 640 businesses in our test were marked sponsored, with a location set on each request. Each result has a sponsored flag, so check it rather than assume.
Are review counts exact?
Counts below 1,000 looked exact. All 116 counts of 1,000 or more were rounded to a multiple of 100, such as 1,200 or 18,000, so treat big counts as approximate.
How much does a study like this cost?
1 credit per search. Our 32 searches returned 20 businesses each and cost 32 credits, which is $0.032 at the Starter rate of $1.00 per 1,000 requests.
  • Google Local results
  • Local SEO
  • Google reviews
  • Google Local API
  • Python
  • Data