A competitor map is not a rank report
Open two tabs. In one, search "immigration lawyer" as if you're standing in downtown Vancouver. In the other, run the same query from Surrey, 25 kilometres east. The three firms in the local pack are usually not the same three. Sometimes one name carries over, and that's it. That gap, who Google shows in the pack here versus there, is the thing worth mapping. A single rank number can't show it, because there is no single rank.
The pack is small. Google returns a map with three or more local businesses in response to local queries, and in practice it's built around three slots. Three businesses by default. Miss those three and you're stranded behind a "More places" link nobody clicks. So a competitor map isn't a roster of everyone who ranks. It's a record of which three names win each patch of ground, and how those winners rotate as you move across the map.
Build the grid before you build the map
Pick your query, then pick your points. For a service-area business in Metro Vancouver I'll usually drop a handful: downtown Vancouver, Burnaby, Richmond, Surrey, North Vancouver, maybe Coquitlam. Each point gets its own geo-targeted search. The winners at each point are your data. Line them up and the pattern shows itself. One firm owns the core, a different one owns the eastern suburbs, and a third only ever surfaces near the airport.
The mechanism behind all of this is one URL parameter. UULE tells Google which location to use when ranking results. Add it to a Search URL and the results come back personalised as if you'd searched from that spot, which is what makes it useful for local research, rank tracking, and SERP scraping. The value isn't arbitrary. UULE v1 Base64-encodes a Google canonical location name, something like "Austin, Texas, United States", into a URL-safe string. That canonical name has to come from Google's own vocabulary. uule is fussy about the exact string, down to the comma and the province spelling.
Two more parameters ride along. gl sets the country context; hl sets the interface language. For a Canadian map you want gl on ca and hl on en, or fr if the market you're auditing runs in French. You can compare two locations without touching any of this by hand. The tool builds the canonical name, the encoding, and the gl/hl pairing, then hands back the SERP.
Why bother with uule instead of just typing the city into the box? Because they aren't the same request. Add "in Dallas" to a query and Google still treats your real geolocation as the dominant signal. UULE overrides that. It's the only reliable way to see what someone in another city actually sees. Type "plumber Surrey" from your desk in Burnaby and you get a Burnaby-flavoured guess at Surrey. Encode Surrey into uule and you get Surrey.
What the winners rotating tells you
Say you run "electrician" across six Metro Vancouver points and one company holds three of them while never appearing in the other three. That's not a weak competitor. That's a competitor with a proximity moat around specific neighbourhoods. The reason sits in how the pack gets decided: each location competes independently. A multi-location brand gets a separate shot per physical address for searches in that address's area, so one company can win different geographic queries with different pins. Proximity is doing the heavy lifting, but it's not alone. Google weighs how close your location is to the searcher alongside how relevant and prominent your business is.
Map enough points and you can read intent off the grid. A competitor whose pins cluster tight is one shopfront pulling from its immediate radius. A competitor who shows up in five scattered suburbs under the same brand is running multiple listings, either a franchise footprint or a service-area outfit registered widely. Those are two different threats, and you'd fight them differently. The map is what lets you tell them apart before you commit a budget.
The gaps matter as much as the wins. If a query returns a full pack in Vancouver and Burnaby but goes thin in North Vancouver, fewer businesses, weaker names, that's an underserved point on your own map. In my publisher years the softest patches were always the ones nobody had bothered to check, because everyone was rank-tracking from one location and calling it done.
The canonical name is where maps break
Get the location string wrong and the whole grid quietly lies to you. Google won't throw an error. It'll ignore the malformed uule and fall back to something else, and you'll be comparing two SERPs that are secretly the same one. If the two result sets come back identical or near-identical, the uule is being ignored, and the canonical name needs a character-by-character check against the CSV. "Burnaby, BC" is not the string Google wants. "Burnaby, British Columbia, Canada" might be. The names come straight from Google's own geo dataset, the canonical name of a location. Check Google's geotargeting appendix, or pull the name off Google Maps.
There's a verification tell built into the page, and it's worth knowing its limits. Google sometimes renders a "Results for [city]" banner above the SERP. When it shows, the uule is being honoured. When it doesn't show, the uule may still be working fine. The banner is a UI decision, not a protocol-level status signal. Treat it as good news when you see it and as nothing at all when you don't.
Signed-in browsing is the other trap. Search while logged into a Google account and the account's own location history can override uule for some query classes, particularly Knowledge Panel queries and anything that fires personalised results. Run your competitor map from a clean, signed-out session, or you're mapping your own Google account instead of the market.
One more moving part, because it changes what the pack even looks like on the page. Google killed the num parameter in September 2025 with no warning. Pagination past the first ten organic results shifted, and AI Overviews now shove the classic listings down in a lot of markets. For a local-pack map this matters less, since the pack sits above all of it, but if you're also logging the organic block underneath, know the page you're screenshotting today isn't the page you screenshotted two years ago.
A competitor map made this way ages well because it's built on what Google actually rendered at each point, not on some city-wide average someone computed. Re-run the same grid next quarter and the movement between the two maps is your real competitive intelligence: who advanced east, who lost the airport, who turned up in a suburb they didn't hold before.
Sources
- Rank Math — What is Local Pack?
- PinMeTo — Local Pack: What It Is & How to Rank in Google's Map Results
- OpenWeb Ninja — UULE Generator & Decoder
- OpenWeb Ninja — Google Search Parameters: Developer Reference
- Wiremo — Free Google SERP Position Checker / UULE Generator
- SearchOperators — uule Google: Simulate a Search From Any City Without a VPN
- GitHub — petrpatek/create-uule
- Bright Data — Google Search URL Parameters: 2026 Full List
