Google Maps Multi-Location Brand & Franchise Finder avatar

Google Maps Multi-Location Brand & Franchise Finder

Pricing

from $2.40 / 1,000 location-results

Go to Apify Store
Google Maps Multi-Location Brand & Franchise Finder

Google Maps Multi-Location Brand & Franchise Finder

Map an entire brand's footprint in minutes. This actor uses smart geographic gridding to find every location of a chain or franchise across cities and countries. Perfect for market analysis and competitor research.

Pricing

from $2.40 / 1,000 location-results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Share

Google Maps Multi-Location Brand & Franchise Finder

Map an entire brand's footprint in minutes. Give the actor a list of brand names and the regions you care about — it discovers every Google Maps location of those chains or franchises, fuzzy-matches the name to filter out unrelated businesses, and deduplicates by Google place_id so overlapping search areas never double up. Output is a flat 14-column row per location, ready for CSV/Excel.

Built for market researchers, real-estate analysts, site-selection teams, franchise auditors, and competitor-intelligence workflows.

What it does

For every (brand × area) combination in your input the actor:

  1. Opens a Google Maps text search for "{brand} in {area}".
  2. Scrolls the results feed to the end-marker (or until your maxResults cap).
  3. Extracts each location card — name, address fragment, lat/lng, phone, website, place_id, open status.
  4. Fuzzy-matches the brand name (default threshold 0.8): Starbucks Reserve - Empire State Building keeps; Starbucks Auto Repair drops.
  5. Filters out permanently closed locations (and temporarily closed too, unless you opt in).
  6. Deduplicates by Google place_id across all searches, so overlapping areas don't double-charge.
  7. Pushes the row to the dataset and charges one location-result event.

Single-phase pipeline, no website crawling — fast and predictable.

📥 Sample inputs

Single brand, multiple boroughs

{
"brandNames": ["Starbucks"],
"searchArea": ["Manhattan, NY", "Brooklyn, NY", "Queens, NY"],
"maxResults": 500,
"strictMatching": true,
"includeTemporarilyClosed": false,
"proxyConfiguration": { "useApifyProxy": true }
}

Multiple competing brands across cities

{
"brandNames": ["McDonald's", "Burger King", "Wendy's"],
"searchArea": ["Austin, TX", "Dallas, TX", "Houston, TX"],
"maxResults": 1000,
"strictMatching": true,
"includeTemporarilyClosed": false,
"proxyConfiguration": { "useApifyProxy": true }
}

International franchise sweep with strict matching off

{
"brandNames": ["Hilton"],
"searchArea": ["London, UK", "Paris, France", "Berlin, Germany"],
"maxResults": 200,
"strictMatching": false,
"includeTemporarilyClosed": true,
"proxyConfiguration": { "useApifyProxy": true }
}

📤 Output

Each result is a flat 14-field row.

Brand locations table view

FieldTypeDescription
place_idstringUnique Google place identifier — the dedup key.
brand_namestringThe input brand the search was run for.
store_namestringOfficial Google Maps name of the location.
full_addressstringAddress fragment as shown on the result card (typically street).
citystringParsed from address when a full multi-segment address is present.
statestringParsed from address when present.
countrystringParsed from address when present.
latitudenumberDecimal degrees, from the listing URL.
longitudenumberDecimal degrees, from the listing URL.
phonestringPhone number when shown on the card.
websitestringOfficial store URL when linked from the card.
is_verifiedboolean / nullReserved for v1.1 (Google claim/verified badge). Currently null.
match_confidencenumber0.0-1.0 brand-name match score (≥ 0.8 to pass strictMatching).
is_open_statusstringopen_now, closed_now, temporarily_closed, or unknown.
scraped_atstringISO 8601 timestamp.

Sample output record (Brand locations · table / JSON)

{
"place_id": "0x89c259941b4ec91f:0xc4f3e8da38e8d2b9",
"brand_name": "Starbucks",
"store_name": "Starbucks Reserve - Empire State Building",
"full_address": "350 5th Ave",
"city": "",
"state": "",
"country": "",
"latitude": 40.74839,
"longitude": -73.98489,
"phone": "(332) 209-4785",
"website": "https://www.starbucksreserve.com/locations/empire-state-building",
"is_verified": null,
"match_confidence": 0.95,
"is_open_status": "closed_now",
"scraped_at": "2026-05-10T06:36:13.848Z"
}

A RUN_SUMMARY record is also written to the default key-value store with counters: brands_searched, areas_covered, total_search_pairs, successful_searches, failed_searches, raw_results_found, total_locations_found, duplicates_removed, filtered_out_mismatch, filtered_out_closed, charged_events, cap_warnings, runtime_seconds, scraped_at.

A note on city / state / country

Google Maps result cards typically show only the street fragment of an address (e.g. 350 5th Ave), not the full multi-line address. The actor parses the segments it can see — when the card includes a full address with city/state/country, those fields populate; when it doesn't, they're left blank rather than being mis-filled with the street. The latitude / longitude and place_id always identify the exact location regardless.

💵 Pricing

Pay-Per-Event. One event:

  • location-result — charged once per unique brand location pushed to the dataset (place_id-deduplicated, brand-matched, not permanently closed).

You can set a per-run spending cap on the Apify console; the actor honours it and stops pushing as soon as the cap is reached.

🚦 Proxy policy

Use Apify Datacenter proxy or no proxy for normal runs — both work reliably for Google Maps text search at this actor's conservative concurrency.

Apify Residential proxy is not supported. The actor will fail at startup if apifyProxyGroups includes RESIDENTIAL. Reason: in pay-per-event actors, residential bandwidth (~/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's Custom proxy URLs field — that traffic goes through your provider, not Apify, and is unaffected:

http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777

🗺️ Tips for full coverage

Google Maps caps each text search at roughly 120-200 results. To map every store of a large brand:

  • Provide reasonably-sized searchArea entries (e.g. boroughs, cities, or districts — not whole countries).
  • The actor logs a cap_warnings counter when a single search returns enough results to suggest the cap was hit; subdivide that area into smaller pieces and re-run.
  • Overlapping areas are safe — place_id deduplication prevents double-charging.

Changelog

  • 1.0 — Initial release. Brand × area cross-product search, fuzzy brand-match filter (threshold 0.8), place_id-first dedup, single PPE event (location-result), Apify residential blocked at startup with BYO custom-proxy support.