Your Plumbing Company's Review Schema Validates Perfectly — Google Still Won't Show the Stars
A Torrance plumbing outfit hired a developer to add review schema to their homepage two years ago. The code is clean. Run it through Google's Rich Results Test today and it comes back green — valid AggregateRating, valid Review, valid LocalBusiness parent object. No errors, no warnings. And in two years, not one star has ever rendered next to their listing in a Google organic search result.
Meanwhile, a competitor three exits down the 405 shows five gold stars and "4.8 (312)" directly under their blue link. Same search, same intent, same city. The owner assumes his developer botched the implementation and asks for a fix. There is nothing to fix. The code was never going to work, and no amount of re-coding changes that.
The Schema Is Valid — The Business Type Isn't Eligible
This is the part almost no agency explains to a service business: in September 2019, Google quietly closed a loophole that had been used for years by exactly this kind of markup. Before that update, any business could self-publish AggregateRating schema on its own homepage — reviews written by the company, about the company, hosted on the company's own domain — and Google would sometimes render those as rich snippet stars in the organic results. It was, structurally, a business grading its own homework, and enough companies abused it that Google shut the door for an entire category of schema.
The specific change: self-serving review markup — where the entity being reviewed and the entity publishing the markup are the same organization — stopped being eligible for rich results display for LocalBusiness and Organization types. It still works, in narrow cases, for things like Product, Recipe, and SoftwareApplication, where a manufacturer can legitimately host reviews of a product it sells. A plumbing company is not a product. It's an Organization marking up reviews of itself, which is exactly the pattern the 2019 policy was written to exclude.
So the star rating that competitor is showing isn't coming from schema on their own site at all. It's coming from a third-party aggregator relationship — a platform like Trustpilot, BBB, or in some verticals, an industry-specific review site — where Google trusts the source because the reviewer and the reviewed aren't the same party. Google Business Profile reviews follow a completely separate pipeline; those surface in the map pack and knowledge panel through GBP's own data feed, never through schema on your website at all.
Why This Keeps Happening to South Bay Trades Sites Specifically
Here's the mechanism, and it's not incompetence — it's inheritance. Most WordPress SEO plugins (the ones bundled into template builds for plumbers, electricians, and contractors across the South Bay) ship with a "reviews" module that auto-generates this exact schema by default. The plugin developer built it for an era when it worked, the plugin never got updated to reflect the 2019 change, and it keeps quietly injecting dead code into thousands of small business sites because nobody ever goes back and audits it. Across the trades sites we've pulled schema reports on in the South Bay, the majority carrying self-hosted review schema are running it through exactly this kind of legacy plugin default — not a decision anyone made, just a box nobody unchecked.
The bigger cost isn't the missing stars. It's the hours. Developers get asked to "fix the review schema" repeatedly — rewrite it, reformat it, add more reviews to the array — and each fix produces the identical zero result, because the fix was never a technical problem. It's a policy wall. Every hour spent re-coding self-serving review markup is an hour not spent on the two things that actually move the needle for a plumbing company's local visibility: the Google Business Profile review pipeline, and the structured data types Google will actually reward.
There's a second-order risk too. Google's spam policies don't just ignore ineligible markup — in cases where the pattern looks like an attempt to manipulate rich results (inflated counts, reviews that don't correspond to anything verifiable, markup clearly designed to game the system rather than describe the page), it can factor into the structured data spam classifiers that inform manual actions. Most trades sites aren't at that level of abuse. But the fact that this even needs pointing out is a good reason to strip the pattern out entirely rather than let it sit dormant on the homepage.
What Actually Renders — And What to Build Instead
The fix isn't more schema. It's the right schema, pointed at the right target.
First: pull the self-serving AggregateRating/Review combination off the LocalBusiness entity entirely. It's not helping, and in edge cases it's a liability. Replace it with nothing on that specific claim — don't try to simulate stars through workarounds. The stars a customer sees in a Google search result for a service business almost always trace back to Google's own data, not your website's code.
Second: the actual lever is the Google Business Profile itself. GBP-sourced reviews are what populate the map pack, the knowledge panel, and — increasingly — what large language models pull from when they're asked "who's a good electrician near Redondo Beach." That means review acquisition cadence (how many, how recent, how varied in language) matters more than any line of markup ever will. A profile with 40 reviews arriving at a steady 3-4 per week reads as a living business. A profile with 40 reviews that arrived in one burst two years ago reads as dormant, no matter what the average star count says.
Third: redirect the schema budget toward the markup types that are actually eligible and actually influence how a site gets read — Service schema describing what you do and where, FAQPage markup answering the specific questions customers type into Google and increasingly into ChatGPT and Perplexity, and correctly nested LocalBusiness data (address, hours, service area, phone) that matches your Google Business Profile field for field. This is where AI-search citation actually gets built — not from a star rating your own homepage claims to have earned, but from structured, verifiable facts an answer engine can cross-check against a third-party source and trust. For a general contractor or trade business trying to get cited by AI search rather than just ranked by it, that distinction is the whole game.
Fourth, if third-party star visibility genuinely matters for your positioning, it comes from cultivating presence on the review platforms Google already trusts as independent — Yelp, BBB, industry-specific directories — not from trying to recreate that trust signal on a domain you control yourself. Google's logic here is sound even when it's inconvenient: a company can't be the sole source of proof about its own reputation.
The Stars Were Never the Point
The plumbing company that's been chasing this fix for two years doesn't have a code problem. It has a diagnosis problem — it kept asking "why doesn't this render" instead of "should this exist at all." That's a distinction worth sitting with, because it shows up everywhere in local SEO for the trades: symptoms get treated repeatedly while the actual architecture underneath never gets questioned.
If your site is carrying schema you inherited from a plugin default, a template, or an agency that hasn't opened your <head> tag since launch, it's worth an actual audit rather than another round of guesses. That's a conversation worth having before you spend another dollar on a fix that was never going to work.