Local SEO for near-identically-named branches
Six locations on two URLs, hardcoded ratings, contradictory opening hours, and a QR redirect that survives a reprint.
- Client
- Jabal Al Noor Pharmacy
- Industry
- Pharmacy retail
- Outcome
- Review programme live at 6 locations
What we started with
- Six locations sharing two URLs
- Ratings hardcoded as decaying literals (
rating: 5.0,reviewCount: 1) - Structured data claiming all-week 08:00 to 23:00, while the contact page said closed Fridays
- No map anywhere
- Two branches with names similar enough that a plain Maps search cannot reliably disambiguate them
Live ratings, carefully
A shared, React-free Google Places package, consumed by both the storefront and the optical micro-site.
Ratings come from the Places API with a deliberately narrow X-Goog-FieldMask of rating,userRatingCount, because Place Details is billed by field tier — widening the mask changes the bill.
The function returns null and never throws when the key is unset, the request fails, or either number is missing. Two reasons: a Google outage must not take a store page down, and a stale rating shown as current is worse than no rating at all on a pharmacy page.
Ratings are never persisted, because Google terms cap caching at 30 days. Freshness comes from ISR revalidation instead. Maps use the free Maps Embed API rather than the JS SDK, lazy-loaded below the fold.
The review QR redirect
In-store stickers print /r/:slug, and that route matches on a dedicated reviewSlug field — never the page slug — so renaming a page cannot invalidate a print run.
The destination resolves server-side in four tiers, none of which needs an API key:
- Place ID, as a Maps URL with
query_place_id - A captured
maps?cid=profile share link - A name-and-address Maps search
- The location own page on our site
The reasoning: a Place ID is not permanent. Google reassigns them on merge, rename or re-verification. Keeping the destination server-side makes that a one-line data edit rather than reprinting every sticker.
Tiers 1 to 3 all stay on a google.com/maps host, which is a registered iOS universal link and Android app link, so the operating system opens the Maps app natively — no user-agent sniffing, no interstitial.
A finding worth recording
The operational runbook notes that a Google Business Profile claim is not a prerequisite. Place IDs come from public listing data, and reviews accrue to the listing rather than the claim, so QR-collected reviews are inherited in full when a profile is claimed later. Only replying is blocked.
That let the review programme launch across all six locations while three profiles were still unclaimed.