Most ways of putting Google reviews on a WordPress site come down to pasting in a third-party embed. It works on the first day and then quietly costs you three things.
What an embedded widget actually costs
1. It loads someone else's JavaScript on every page
A typical review widget pulls a script from a vendor's CDN, which then fetches the reviews over the network before anything appears. That is a render-blocking request plus an API round trip, sitting in front of content that never changes between page loads. On a slow connection it is the difference between a section that is there and a section that pops in three seconds late.
2. It looks like the vendor, not like you
Widgets ship with their own typography, card shapes and colours. Some let you pick an accent colour. Almost none let you match your own type scale, spacing or border radius — so the reviews section reads as a foreign object on the page.
3. You are renting your own reviews
If the vendor raises their price, changes their free tier or shuts down, your reviews section goes with them. The reviews are about your business, but you do not hold a copy.
The alternative: keep the reviews yourself
The fix is not complicated. Store the reviews in your own database as ordinary WordPress content, and render them with your own markup.
- No network call on page load. Reviews come out of the database like any other post, and the rendered output can be cached until a review actually changes.
- Your markup, your CSS. If the stars, spacing and type are yours, the section stops looking bolted on.
- The reviews survive. Whatever happens to any API, you still hold them.
Getting the reviews in
There are three honest routes, and it is worth knowing the limits of each before you pick one.
The Google Places API
Places gives you the true star rating and total review count for a profile, plus the five most recent reviews. That five is Google's own limit for sanctioned API access, not a limitation of any particular plugin — be suspicious of anything claiming to pull your full history through Places.
A one-off import
For the full history, export what you have and import it once. After that the collection is yours and only new reviews need to arrive.
SerpApi
SerpApi reads the public results page for a Place ID and can return the full review history without Google approval. It is a paid service with a monthly search allowance, so it is worth picking a refresh interval deliberately rather than polling every fifteen minutes out of habit.
One detail worth getting right: the aggregate
The "4.8 ★ · Based on 65 reviews" line can be calculated two ways, and they do not agree.
- From the reviews you hold. Honest about what is on the page, but it will read low if you only hold the five most recent.
- From Google's totals. Matches what people see on Google, even when you are displaying a subset.
Use Google's totals for the headline figure. A visitor comparing your site to your Google listing should not find two different numbers.
A note on review schema
It is tempting to emit review structured data on every page that shows reviews. Do not. Google's guidelines expect review markup to describe the thing the page is actually about. Sitewide review markup on unrelated pages is a policy problem rather than a ranking win, and it is the kind of thing that gets rich results turned off for a domain.
What this looks like in practice
Review Engine is the plugin built to do exactly this: reviews stored as a custom post type, merged across every business profile you run, rendered with one shortcode and cached until something changes. Places, SerpApi, CSV import and a REST ingest endpoint all produce the same normalised review, so you can change how reviews arrive without touching how they look.