Google Reviews Widget

Reusable embed served from widgets.bentliquid.com. Config lives entirely in the embed tag — no database, no per-client server records.

Embed

<script src="https://widgets.bentliquid.com/google-reviews.js" async></script>
<!-- Use place-id="PLACE_ID_HERE" instead of gbp-location if this client
     isn't on the Business Profile API yet (see scripts/gbp-list-locations.mjs) -->
<google-reviews-widget
  gbp-location="GBP_LOCATION_HERE"
  layout="marquee"
  direction="elevated"
  min-rating="5"
  primary-color="#1a1a1a"
  text-color="#1a1a1a"
  theme="light"
  align="left"
  hide-summary="false"
  hide-empty-reviews="true"
></google-reviews-widget>

Attributes

place-idGoogle Place ID. Required unless gbp-location is set.
gbp-locationBusiness Profile resource name, accounts/{id}/locations/{id}. Opt-in — switches this embed from the Places API (≤5 reviews, always live) to the Business Profile API (every review, cached 1 hour). Takes priority over place-id when both are set. Find it with scripts/gbp-list-locations.mjs.
layoutmarquee (default), grid, list, spotlight, badge
directionelevated (default), minimal, editorial — visual treatment, independent of layout
max-reviewsDefault 5 on Places (Google's own cap), 200 on the Business Profile path (clamped 1–200) — leave unset there to show everything.
min-rating0–5, default 0. Hides reviews below this rating. Opt-in curation — see CLAUDE.md. On Places, Google picks which ≤5 reviews it returns, so a strict value can leave very few. On the Business Profile path this is a real "5-star only" filter over every review.
primary-colorInteractive accent (links, dots, "read full review")
text-colorBody text color
themelight (default) or dark
hide-empty-reviewsDefault true — hides reviews with no written text (a bare star rating). Keys off text only, not rating. Set "false" to show every review.
api-baseOverride the proxy origin (rarely needed)
alignleft (default), center — summary + attribution row only, for full-width embeds
hide-summarytrue hides the business-name/rating row. Attribution row stays regardless.
draggableDefault false. marquee only — grab the auto-scrolling strip mid-motion and drag it; releases back into auto-scroll from that spot, no snap. No effect under reduced-motion.

Live demo

Renders when a ?place_id= query param is present, e.g. ?place_id=ChIJ...

Add ?place_id= to the URL to preview.