Google Maps Results Processor — clean, filtered outreach leads avatar

Google Maps Results Processor — clean, filtered outreach leads

Pricing

from $2.00 / 1,000 records processeds

Go to Apify Store
Google Maps Results Processor — clean, filtered outreach leads

Google Maps Results Processor — clean, filtered outreach leads

Turn raw Google Maps Scraper (compass/crawler-google-places) output into clean, flat, filtered, outreach-ready files: CSV, Excel, Instantly, Smartlead, GoHighLevel, HubSpot and dialer formats.

Pricing

from $2.00 / 1,000 records processeds

Rating

0.0

(0)

Developer

Vasram Sonagara

Vasram Sonagara

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Google Maps Results Converter — Clean, Filter, Score & Export Google Maps Scraper Results to CSV, Excel, GoHighLevel, Instantly & HubSpot

Turn raw Google Maps Scraper output into clean, deduplicated, scored outreach leads in seconds — then slice it into EVERY lead list you sell from a single scrape. Flattens 80+ nested fields into spreadsheet-ready columns, normalizes phone numbers to international E.164 format, removes closed businesses and duplicates, scores every lead 0–100, detects what changed since last week's scrape, and exports ready-to-import CSV files for GoHighLevel (GHL), Instantly, Smartlead, HubSpot, Excel, and dialers — no coding required.


What is this Google Maps results converter?

Google Maps Scraper by compass returns deeply nested JSON: opening hours arrays, review distributions, category lists, split review records for popular venues. If you export that raw dataset directly to CSV, your spreadsheet breaks, phone numbers arrive in inconsistent local formats, the same business appears once per search-grid cell, and finding real prospects takes hours of manual work in Excel.

This converter actor fixes all of that in one run:

  1. Flattens 80+ fields into one clean row per business — zero nested arrays, import-ready for any CRM or database.
  2. Deduplicates places that appear in multiple overlapping search areas, and stitches review-split records for venues with more than 5,000 reviews.
  3. Removes permanently & temporarily closed businesses so your lead list only contains active companies.
  4. Normalizes phone numbers to E.164 (+15551234567) using full international phone parsing — US, UK, EU and worldwide formats, dialer-safe.
  5. Filters leads by rating, review count, website presence, phone/email availability, claimed profile status, category, and city.
  6. Scores every lead 0–100 with a deterministic algorithm — no AI costs, no API keys needed.
  7. Exports CSV, Excel (.xlsx), JSON plus CRM-specific files for GoHighLevel, Instantly, Smartlead, HubSpot, and phone dialers.

Quick start (3 steps)

Step 1 — Scrape your Google Maps data

Run Google Maps Scraper (compass/crawler-google-places). When it finishes, copy the Dataset ID from the run page (Storage tab).

Step 2 — Configure this actor

  1. Data source: paste the Dataset ID into Dataset ID (from Google Maps Scraper) — or paste a raw JSON array instead. If both are provided, the Dataset ID takes priority. Multiple cities? Paste several IDs into multiple Dataset IDs to merge them.
  2. Lead type: pick a ready-made preset (see the preset table) — each preset also enforces the filters its title promises. Need every list at once? Select two or more in Multiple lead types in ONE run.
  3. Filters (optional): min rating, min reviews, website presence, phone/email, claimed status, categories, cities.
  4. Export format: csv, excel, gohighlevel, instantly, smartlead, hubspot, json — any combination.
  5. File name (optional): your downloads are named after it, e.g. austin-leads.csv, austin-leads.instantly.csv.
  6. Weekly scraping? (optional) set Baseline Dataset ID to last week's run for delta detection.

Step 3 — Run and download

Click Start. Within seconds open the Storage → Key-Value Store tab and download your cleaned lead files.


Top use cases (one click each)

🌐 Web design & SEO leads — businesses WITHOUT a website

Local businesses with no website are the highest-intent prospects for web design, funnels, and local SEO services.

  • Preset: web-design-prospects — automatically keeps only active businesses with no website and a valid phone number (the preset enforces these filters for you).
  • Manual route: set Website status → Only WITHOUT a website.

⭐ Reputation management leads — low-rated businesses

Businesses losing customers to unanswered negative reviews need review software and response automation.

  • Preset: reputation-prospects — automatically keeps active businesses rated below 4.0 stars.
  • Manual route: set the API-only filters_ratingBelow field to 4.0, or Minimum rating plus a review on unanswered negatives.

📍 Unclaimed Google Business Profiles (GMB/GMP optimization leads)

Unclaimed listings rank worse and can be hijacked — perfect for GBP verification and optimization services.

  • Set Google Profile claimed status → Only UNCLAIMED profiles.

📞 Cold calling lists — dialer-ready phone numbers

  • Preset: cold-calling — keeps only places with a phone number, normalized to E.164 (+1…, +44…), with hours and full address columns.
  • Dialer export: add dialer to export formats (API) for a power-dialer friendly file.

✉️ Cold email lists — Instantly & Smartlead campaign CSVs

  • Preset: cold-email — contact names, emails, and personalization columns.
  • Select instantly or smartlead in Export formats for campaign files with custom variables ({{leadScore}}, {{categoryName}}, {{city}}) already mapped.
  • ⚠️ Emails require the upstream scraper run to have scrapeContacts enabled (see FAQ).

🚀 One-click GoHighLevel (GHL) contact import

Select gohighlevel in export formats: first/last names derived from the business title, E.164 phones, no-contact rows excluded, ready for the GHL contacts CSV importer.


One run, every lead list (multi-segment export)

Most agencies sell several services — websites, reputation, cold calling, cold email — but a scraper gives you one raw dump and changing filters there means paying for a full re-scrape and waiting again.

Fill Multiple lead types in ONE run (fields_presets) with two or more presets and this actor produces a complete file-set per lead type from the same scrape, each with its promised filters enforced:

  • leads.web-design-prospects.csv — active businesses with no website + phone
  • leads.reputation-prospects.csv — rated below 4.0
  • leads.cold-calling.csv / leads.cold-email.instantly.csv / … — every format you selected, per segment
  • leads.segments.csv — one overview table: records, with-phone, with-email, without-website, average lead score per segment (also added as a Segments sheet inside every Excel file)

One scrape in → every campaign list out. Leave the field empty and behavior is exactly the classic single-list flow.

Master list & delta detection (see what changed since last scrape)

Scrape the same city every week? Point Baseline Dataset ID (delta_baselineDatasetId) at last week's scraper run and this actor diffs the two scrapes by Google's own place IDs, reporting:

  • 🆕 new businesses — exported as {fileName}.new.csv (in every selected format) so you call them first
  • 🚫 closed since last run and 🔁 reopened places
  • 📍 claimed-status changes — now-unclaimed profiles are fresh GBP-optimization leads; now-claimed means your client (or a competitor) acted
  • 👻 missing from this scrape — places that vanished from this week's results

All counts land in the run summary and the Excel Summary sheet. API users can also pass a previous JSON export via delta_baselineJson. Comparisons use dedup-time place keys, so overlapping search grids and split review records never skew the diff.

Stop paying for scraper filters

The Google Maps Scraper charges ~$0.001 per place, per filter, per run for rating/website/closed filters — and every changed mind is another paid re-scrape:

Scraper filter add-onsThis actor
Cost~$0.001 × places × filters, every runIncluded — you already own the data
Changing your mindFull re-scrape (minutes + cost)Instant re-slice of the same dataset
10,000 places × 3 filters~$30 extra per run$0 extra (Apify compute only)

Scrape broad once (no filter add-ons, keep skipClosedPlaces off), then slice, filter, score and export unlimited lists here. The run log even detects when your upstream scrape already paid for a skip-closed filter and tells you how to avoid it next time.

Merge multiple scraper runs into one master list

Agencies scrape city by city. Paste several Dataset IDs into …or multiple Dataset IDs (source_datasetIds) and every run is merged into one deduplicated master list — the same business found in two city datasets is kept once (best copy wins, reviews stitched). Combine with any filters, presets and export formats. Perfect for territory rollups and weekly master-list refreshes.

Forward compatible — compass output changes can't break your runs

When the upstream scraper adds new fields tomorrow, this actor keeps working: unknown scalar fields are detected, logged once, and passed through to the dataset untouched (see the compatibility section of the run summary), and a single malformed record is skipped with a traceable issue instead of failing the run. Structured arrays from new fields are simply ignored rather than crashing the export.


Column presets & lead types

Presets select the best columns and enforce the filters promised in their name (enforced values override manually set conflicting filters — the run log states every enforcement).

PresetBest forColumns includedFilters enforced
simple-leadsClean general lead listsName, category, phone (E.164), website, address, city, state, rating, reviews, Maps link, claimed flag—
lead-scoringPrioritized agency prospectingEverything in simple leads + lead score, lead type, Bayesian rating, completeness %—
web-design-prospectsWeb design / dev agenciesName, website flag, phone, rating, reviews, city, Maps linkno website, has phone, closed removed
reputation-prospectsReputation software & servicesName, phone, rating, reviews, negative %, unanswered negatives, latest review, cityrating below 4.0, closed removed
cold-callingCall centers & phone outreachName, E.164 phone, phone-valid flag, hours, address, rating, Maps linkhas phone, closed removed
cold-emailInstantly / Smartlead campaignsEmail, contact names, phone, website, category, city, AI opener (optional), Maps link, claimed flaghas email, closed removed
full-flatAnalysts & data warehousesAll 80+ flattened columns, nothing omitted—
customPower users (API)Any subset via fields_customColumns—

Filters reference

FilterFieldValues / meaning
Website statusfilters_websitePresenceany, withWebsite, withoutWebsite
Minimum ratingfilters_minRating1.0–5.0, keeps totalScore ≥ value; records with no rating only pass when no threshold is set
Minimum reviewsfilters_minReviewskeeps reviewsCount ≥ value
Has phonefilters_hasPhonetrue = only places with a valid phone
Has emailfilters_hasEmailtrue = only places with an email (needs scrapeContacts) — auto-skipped with a warning if the source data contains no emails
Claimed statusfilters_claimedany, claimed, unclaimed
Categoriesfilters_categoriesIncludekeep only these categories (case-insensitive)
Citiesfilters_citiessmart matching: exact match, diacritics ignored, "New York City" also matches "New York"

Additional filters (API only): filters_maxRating, filters_maxReviews, filters_ratingBelow, filters_categoriesExclude, filters_categoryMatch, filters_states, filters_postalCodes, filters_excludeAds, filters_excludeChains, filters_minUnansweredNegatives, filters_latestReviewWithinDays, filters_hasSocialProfiles, filters_externalPlaces, filters_openAtScrapeTime.


Cleaning & deduplication

SettingDefaultWhat it does
dedup_enabledtrueMerges duplicate places across overlapping search grids. Key chain: placeId → cid → fid → externalId → title+address (directory children are never merged into their parent).
dedup_keep (API)firstfirst, last, or best (most reviews → best rank → non-closed copy). A closed copy never wins when an open duplicate exists.
dedup_mergeReviews (API)trueStitches review-split records (venues with >5,000 reviews are exported by the scraper as multiple rows).
clean_removeClosedtrueDrops permanently/temporarily closed businesses (handles both boolean and string flags).
clean_normalizePhonestrueE.164 via full international parsing using the record's countryCode — handles UK/EU trunk prefixes, US formats, extensions.
clean_removeNoContact (API)falseDrops records with neither phone, email, nor website.
clean_splitAddresses (API)trueSplits the raw address into street, city, state, ZIP columns.

Scale: up to 100,000 records per run. For large jobs always use the Dataset ID — data streams through in two passes instead of being pasted into the input.


Algorithmic lead scoring (no AI, no extra cost)

Every record is scored 0–100 by a deterministic engine — the same list always produces the same scores:

Base signals (every record):

SignalPointsWhy it matters
Valid phone (E.164)+15Reachable lead
Has website+10Online presence
Has email+10Direct outreach channel
100+ reviews+15Established business
50–99 reviews+10Growing business
Rating ≥ 4.8+10Top performer
Rating ≥ 4.0+5Good reputation

Agency opportunity gaps (awarded only when the business is reachable — has phone, email, or 5+ reviews):

SignalPointsWhy it matters
No website+30High-ticket web design / funnel prospect
Unclaimed listing+25GBP optimization candidate
Rating < 4.0 with 20+ reviews+20Reputation management prospect
Rating ≥ 4.5 with < 15 reviews+15Great service, needs review generation
Fewer than 5 photos+10Incomplete profile — SEO/photography services
Missing opening hours+10Poor profile hygiene

Built-in analytics: Bayesian weighted rating (a 4.8★ with 800 reviews properly outranks a 5.0★ with 1), profile completeness %, owner response rate on negative reviews, and a review polarization index. Configure via API fields scoring_enabled and scoring_enableResponseRate.


AI enhancements (optional, off by default)

Set ai.provider to openai (your ai.openaiApiKey or the OPENAI_API_KEY env var) or apify-openai (billed via Apify) to generate pain-point summaries, praise points, personalized cold-email opening lines, and business summaries. Deterministic output is always kept as a fallback — an AI outage never breaks your export. ai.maxRecords caps billed calls; 0 disables AI entirely.


Export formats & file names

FormatKey in Key-Value StoreNotes
csv<fileName>.csvUTF-8 with BOM — opens perfectly in Excel with emojis & accents
excel<fileName>.xlsxStyled header, frozen top row, Summary sheet, formula-injection-safe cells
json<fileName>.jsonFull flat records
gohighlevel<fileName>.gohighlevel.csvGHL contacts importer mapping, no-contact rows excluded
instantly<fileName>.instantly.csvInstantly campaign upload with custom variables
smartlead<fileName>.smartlead.csvSmartlead campaign upload
hubspot<fileName>.hubspot.csvHubSpot contact import — rows without an email are excluded
dialer<fileName>.dialer.csvPower-dialer friendly (API)

fileName comes from output_fileName (invalid characters are stripped, e.g. austin leads! → austin-leads.csv). All CSV/Excel cells are sanitized against spreadsheet formula injection, and E.164 phone numbers stay import-clean.

📌 Where to find your files: CRM-specific exports (.gohighlevel.csv, .instantly.csv, etc.), the styled Excel workbook, and BOM-encoded CSV are in Storage → Key-Value Store. The default Output tab in Apify Console shows the raw flat dataset — use the built-in views (Cleaned leads, Reputation & reviews, Full detail, Lead scoring) to browse it interactively.

Every run also writes run-summary (counts, filter breakdown, timings, issues) and issues.json to the Key-Value Store, pushes all flat records to the dataset, and persists a failure summary even if the run aborts midway.


Input parameters guide

1. Data source (source_*)

  • source_datasetId — Dataset ID of a Google Maps Scraper run (recommended).
  • source_datasetIds — SEVERAL Dataset IDs merged + deduplicated into one master list (takes priority over the single ID).
  • source_scrapedDataJson — paste a raw JSON array, a single place object, or a wrapper ({"items": [...]}).
  • source_datasetUrl — full dataset items URL (API).
  • Precedence: Dataset IDs > pasted JSON > Dataset URL.

2. Lead type

  • fields_preset — one of the presets above (default simple-leads).
  • fields_presets — TWO OR MORE presets → one file-set per lead type + segments summary (multi-segment export).
  • fields_customColumns / fields_rename — custom column selection & renaming (API).

3. Cleaning & deduplication

  • dedup_enabled, dedup_keep, dedup_mergeReviews, dedup_againstDatasetId (API).
  • clean_removeClosed, clean_removeNoContact, clean_normalizePhones, clean_splitAddresses.

4. Filters — see the filters reference.

5. Scoring — scoring_enabled (default true), scoring_enableResponseRate.

6. AI — ai.provider, ai.openaiApiKey, ai.model, ai.maxRecords, plus feature toggles ai.generatePainPoints, ai.generatePraisePoints, ai.generateOpeningLine, ai.generateOwnerName, ai.generateSummary (flat or nested under ai) — see section above.

7. Output — output_formats, output_fileName, plus API options output_delimiter, output_quoteAll, output_includeSummarySheet, output_ghlRequireContact, output_instantlyExtraVariables.

8. Delta detection — delta_baselineDatasetId (previous scrape's Dataset ID) or API-only delta_baselineJson (pasted previous JSON). Produces change counts + {fileName}.new exports.


Why use this instead of a spreadsheet?

  • No broken CSVs — nested arrays, hours, and review distributions are flattened into real columns, not smashed into one cell.
  • No duplicate rows — grid searches overlap; dedup collapses them by Google's own place IDs (and merges multiple scraper runs into one master list).
  • No dead leads — closed businesses and no-contact records are dropped before you pay for outreach.
  • No manual scoring — the 0–100 score and Bayesian rating tell you who to call first.
  • No import errors — CRM-specific files ship with the exact column names GoHighLevel, Instantly, Smartlead, and HubSpot expect, phones in E.164, and Excel-safe encoding.
  • No wasted scraper spend — filter add-ons cost ~$0.001/place/filter per run on the scraper; here every filter, re-slice and new list is free and instant.

FAQ

Does this actor scrape Google Maps?

No — and that's the point. This Apify actor processes data already scraped by Google Maps Scraper. No browser, no Google blocking, no proxy costs: runs finish in seconds and cost pennies.

How much does it cost to run?

You pay Apify platform usage for the short run (it's CPU-light) plus this actor's own pricing model (see the Pricing tab on Apify Store). There are no per-lead AI costs unless you explicitly enable ai.provider.

How many records can it process?

Up to 100,000 records per run. Use the Dataset ID input for anything large — pasting JSON is meant for quick, small jobs.

Why are emails missing from my output?

Google Maps doesn't expose emails directly. Enable scrapeContacts on the upstream Google Maps Scraper run, then emails flow through automatically. This actor warns you when your source data contains no email fields at all instead of silently returning zero rows.

What happens if I leave both the Dataset ID and pasted JSON filled?

The Dataset ID wins and the pasted JSON is ignored (logged clearly). This protects you from the leftover sample row in the input editor.

Are non-US phone numbers supported?

Yes. Phone numbers are parsed with full international rules using each record's country code — UK 020 7946 0958 becomes +442079460958, German and EU trunk prefixes are handled, and invalid numbers are flagged instead of silently exported.

Can it run automatically after my scraper finishes?

Yes — chain it with Apify webhooks or the Integrations tab so every scraper run is converted without manual steps.

Can I get multiple lead lists from one scrape?

Yes — that's the multi-segment export. Set fields_presets to two or more presets and you get a separate file-set per lead type (web-design, reputation, cold-calling, cold-email…) plus a segments summary, all from the same dataset — no re-scraping, no extra scraper cost.

How do I track new businesses week over week?

Set delta_baselineDatasetId to the previous week's scraper run. Every run then reports new businesses, closures, reopenings and claimed-status changes against that baseline, and exports the new businesses as {fileName}.new.csv. Chain it with a weekly schedule and you have a hands-off lead-refresh pipeline.

Which preset should I choose?

Start with simple-leads. If you sell websites pick web-design-prospects, if you sell review/reputation services pick reputation-prospects, for phone outreach pick cold-calling, for email campaigns pick cold-email, and use full-flat when you want every column for analysis.


Support & feedback

Found a bug or need a new CRM format? Open an issue on the Issues tab of this actor — requests for new export formats and filter ideas are welcome!