How the scoreboard is scored
Rubric version 3.0.0. Every score on this site states the rubric that produced it.
Where these businesses come from
One query per market to the Google Places API text search endpoint, phrased as the trade and the city, for example "pest control in Tucson, AZ". What comes back is Google's business listings, the records behind Maps, and not the page of web results a person gets from a Google search box. The two overlap; they are not the same set.
Two consequences worth knowing. That endpoint returns at most 60 listings for a query however large the market is, so no scoreboard here is a census. And service-area businesses with no storefront are asked for explicitly, because in the trades a great many plumbers and pest controllers have no address to list, and leaving them out would make "every business in this trade" straightforwardly false.
Pillars
| Pillar | Weight |
|---|---|
| Reputation | 30% |
| Findability | 25% |
| Content | 20% |
| Trust | 10% |
| AI visibility | 15% |
What we measure
- Reputation uses Google rating and review volume, Bayesian-adjusted so a 5.0 from three reviews does not outrank a 4.7 from four hundred.
- Findability covers LocalBusiness structured data, whether the phone number on the site matches the one Google publishes, whether the city appears in the page title, and whether service-area pages exist.
- Content covers site depth, how recently the site appears to have been maintained, the page title, the meta description, and whether the page has exactly one main heading.
- Trust covers stated licensing, insurance, bonding or guarantees, and linked social profiles.
- AI visibility measures whether a business is legible to AI assistants: structured identity, stated services, stated hours, question-shaped content, the business's own summary of itself, and what its robots.txt disallows. Two kinds of token are read there and they are not the same finding. GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot are crawlers, and disallowing one asks that vendor not to fetch the page. Google-Extended and Applebot-Extended fetch nothing: they are the tokens their vendors read to decide whether to train on a page and whether to ground an answer in it, so disallowing one does not stop the page being fetched. Every page that reports a block says which kind it found.
How a score is computed
Each pillar is scored 0 to 100, multiplied by its weight in the table above, and added up. Every failed table stake then takes 12 points off that total, and the result is floored at 0. No term in the arithmetic reads the other businesses in the market, so a score describes one business and rank is where the comparison lives.
Rank is position in that order, highest total first, and the sort is stable: rows holding an equal total stay in the order the Places query returned them in. That order is not a measured difference. It affects a real share of this site: 1,990 of the 11,972 rows published here (16.6%) share a total with another row in their own market, across 826 groups of equal scores. Those rows are marked on the market table and on their own page.
Findability, content and trust are each the share of that pillar's own checks that pass, as a percentage. Findability has 4 checks, content 5 and trust 2, so one failed content check costs 20 points of that pillar. Every check a business fails is listed on its own page, so the count can be redone there.
Findability, content, trust and AI visibility are all read from the business's website. Where this scan could not read one, all four score 0 and the scorecard says so: that is an absence of data rather than a measurement. Since 2026-09-03 a listed site that could not be read also fails the working-website table stake, below. A business with no website on its listing, or a listing whose address is not a usable URL, fails no table stake, because there was never a site to check.
AI visibility is the share of its checks that pass, with one further rule: when the site a business's Google listing points to disallows any of the tokens above in its robots.txt, of either kind, this pillar is held at 25 however many checks pass. That is why a scorecard can print 25 above a row of mostly passing lights. Every page where that cap changed the number says so on the page.
Reputation is 30% of every score and is pure arithmetic on two figures Google publishes, the star rating and the review count. In full:
- Adjusted rating. The rating is pulled toward a prior of 4.2 stars carrying the weight of 20 reviews, so a 5.0 from three reviews does not outrank a 4.7 from four hundred: adjusted = (20 × 4.2 + rating × reviews) / (20 + reviews).
- Quality. The adjusted rating becomes a 0 to 1 figure across the band 3.5 to 5.0 stars, clamped at both ends: quality = (adjusted − 3.5) / 1.5.
- Volume. The review count becomes a 0 to 1 figure against a fixed reference of 500 reviews, clamped at 1, so it means the same in every market: volume = ln(1 + reviews) / ln(1 + 500).
- The pillar. reputation = 100 × (0.70 × quality + 0.30 × volume), rounded to one decimal. A business with no rating, or no reviews, scores 0.
Those constants are the rubric. They move only with a rubric version, and every page that prints a score names the version it was scored under.
Two readings counted in two pillars
AI visibility is 6 checks, and two of them read something a check in another pillar has already read. Both pillars count the result, so those two readings move the total twice. That is what the rubric does. It is set out here because a reader working from the weights table alone would compute the wrong cost for either one.
- LocalBusiness structured data. It is a findability check, and AI visibility's machine-readable identity check reads that same verdict. Publishing no LocalBusiness markup takes 6.25 points off the total through findability and 2.5 through AI visibility. The cost is 8.75 points of 100, not the 6.25 the findability weight on its own implies.
- The meta description. A content check and an AI visibility check both read it, asking different questions: content asks whether it is 50 to 165 characters, AI visibility asks whether the business wrote one at all. A page carrying no meta description fails both, at 4 points through content and 2.5 through AI visibility, so 6.5 points of 100. A description that exists but sits outside the length band fails the content check only.
Nothing else in the rubric is read twice. Where a scorecard lists what the top competitors do that a business does not, each of these two findings is printed once rather than under both names.
Table stakes
HTTPS, mobile readiness, a tappable phone number and a visible booking path are the floor rather than an achievement, so passing them earns nothing and failing one costs 12 points. They are common, not universal: of the 8,121 businesses on this site whose website this scan could read, 1,672 (20.6%) fail at least one. By check: Tappable phone number 1307, Clear booking or quote request 720, Secure connection (HTTPS) 276, Mobile-ready 202.
A listed website that does not load is a fifth failed stake, working website, and costs the same 12 points. Until 2026-09-03 it cost nothing: a site nobody could load carried no table stakes at all, while a site that merely lacked HTTPS lost 12, so the worse outcome scored higher. Correcting that moved 121 of the 1,146 scored rows then on the site. The stored scans were not re-run; the correction is applied when a page is built, so every score that moved can be traced to this one rule.
When a site does not load
Each site gets one paced request. Requests are paced by the server's address rather than by its name, because several businesses can share one machine and a burst at it earns a refusal the businesses did not cause. A transient failure (a connection that drops, a timeout, or a status in the 408, 425, 429, 500 to 504 range) is retried, honouring any wait the server asks for. An answer is never retried: a 404, a 403 and a broken certificate are what the site said, and asking three times does not change them.
Every failure keeps its own reason, and the scorecard prints it. A domain with no DNS record is reported as that, not as a network error. A server that refused this scanner with a 429, 403 or 409 is reported as refusing, since a status is proof a server is there, and the scorecard says the finding is inconclusive; it still scores as a failed website, which is the one place this rubric may be penalising a business for our own traffic. Until 2026-09-02 there was no retry and no pacing, and two scans of the same markets hours apart disagreed about which sites were down: 20 failures were the scanner's own, 8 remain after the fix, and 9 turned out to be listed domains that do not exist.
Limits worth stating
- Each scoreboard is one Places query for that trade and city, ranked. A query reaches at most 60 listings, and a scan can be run shallower than that to spend fewer API calls. Every market page states how deep its own scan went and whether the market ran out of businesses before the scan ran out of room. A page headed "top N" is not a complete census.
- The arithmetic above can be redone from what is published here. The readings underneath it cannot: whether a check passed depends on what a site served on the day it was scanned, and this site does not republish those pages. That half is disputed by writing in, not by recomputing.
- Scores describe public web presence. They are not a judgement of workmanship, service quality or value.
- A business can have an excellent reputation and still rank low here. That gap is the point of the exercise, not an error.
- Findings describe identified opportunity. They are not a projection or guarantee of revenue.
- Rankings change when the rubric changes. Scans are never compared across rubric versions.
Corrections
Every figure here comes from a public source, and the formula that turns those figures into a score is set out above with its constants. If something is wrong, it gets corrected and the scan is re-run. Report one at team@mainstreetscoreboard.com. There is no charge, and a correction never depends on buying anything. Who makes this.