Google Maps Lead Qualifier | Website Gaps + Outreach
Under maintenancePricing
from $4.00 / 1,000 qualified opportunities
Google Maps Lead Qualifier | Website Gaps + Outreach
Under maintenanceTurn Google Maps results or existing business lists into qualified sales opportunities. Audit public websites, detect booking and lead-generation gaps, rank leads by confidence, recommend services, and generate evidence-backed outreach.
Pricing
from $4.00 / 1,000 qualified opportunities
Rating
0.0
(0)
Developer
Murilo Lira
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Share
Find the local businesses worth contacting, not just another list of Google Maps leads.
Turn Google Maps results or existing business lists into qualified sales opportunities. The Actor audits public websites, detects booking and lead-generation gaps, assigns opportunity and confidence scores, recommends a matching service, and generates evidence-backed outreach only when the result meets the qualification contract.
Who this Actor is for
This Actor is designed for:
- marketing agencies;
- web designers and developers;
- local SEO specialists;
- booking-system and CRM consultants;
- automation freelancers;
- outbound sales teams.
It answers five practical questions:
- Which businesses are worth contacting?
- Why is each business an opportunity?
- Which service matches the observed gap?
- How reliable is the conclusion?
- What evidence supports the next action?
The technical Actor slug remains local-business-funnel-gap-finder.
Why this is not another Google Maps scraper
A traditional Maps scraper returns business records. This Actor adds the qualification layer after discovery.
Google Maps data-> website audit-> verified gap detection-> opportunity score-> confidence score-> qualification decision-> recommended service-> evidence-backed outreach
Use one-click Maps discovery, or provide an existing Apify dataset, business list, or domain list.
Quick start
{"inputMode": "maps_search","searchQueries": ["dentists in Miami FL"],"maxResultsPerQuery": 10,"maxTotalResults": 10,"maxDiscoveryCostUsd": "0.50","targetService": "auto","minimumOpportunityScore": 40,"minimumConfidenceScore": 0.75,"onlyReturnOpportunities": true,"generatePitchAngle": true,"generateOutreachForAllResults": false,"outputLanguage": "en"}
Discovery modes
Google Maps search
{"inputMode": "maps_search","searchQueries": ["dentists in Miami FL"],"mapsProviderActorId": "compass/crawler-google-places","maxResultsPerQuery": 10,"maxTotalResults": 10,"maxDiscoveryCostUsd": "0.50"}
Maps mode calls the configured child Actor with hard item, cost, memory, and timeout limits. The provider adapter uses the timeout parameter exposed by the installed Apify client and remains compatible with newer clients that expose run_timeout. The default dataset of the child run is streamed into the audit pipeline.
Existing Apify dataset
{"inputMode": "dataset","apifyDatasetId": "YOUR_DATASET_ID","maxTotalResults": 100,"websiteField": "website","nameField": "title"}
Recognized fallbacks include website, websiteUrl, website_url, title, name, businessName, rating, totalScore, reviewsCount, and reviewCount.
Business objects
{"inputMode": "businesses","businesses": [{"title": "Relax and Smile Dental Care","website": "https://www.relaxandsmile.com/","category": "Dentist","rating": 4.9,"reviewsCount": 500}]}
Domains
{"inputMode": "domains","domains": ["https://www.relaxandsmile.com/"]}
Exactly one source mode is accepted. Conflicting source fields and unknown top-level fields are rejected.
Website audit behavior
The auditor fetches public HTML with httpx. It does not execute JavaScript.
| Outcome | auditStatus | Commercial scoring |
|---|---|---|
| Valid homepage, no secondary failure | success | Enabled |
| Valid homepage, secondary-page failure | partial | Verified checks only |
| Structurally incomplete or commercially unresolved homepage after controlled retries | partial | Disabled, absence checks remain null, score is 0, confidence is capped at 0.35 |
| Timeout, DNS, TLS, 403, 404, 429, 5xx, empty body, or non-HTML homepage | failed | Disabled |
| Source explicitly supplies an empty website field | no_website | Source evidence only |
| Audit disabled or website field missing from source | skipped | Disabled |
A failed secondary page cannot convert a valid homepage into a broken-website opportunity.
The auditor retries homepage responses that are structurally incomplete or commercially sparse. It uses controlled browser header profiles, ranks candidate responses by verified conversion signals and HTML completeness, and selects the most credible response. When every response remains unresolved, the Actor records the page as incomplete instead of treating missing elements as verified sales gaps.
Unknown values
Unknown data is preserved as null.
null = unknown, unavailable, or not checkedfalse = checked and absenttrue = checked and present
A missing source field is not converted to zero or false. In particular:
- an unknown rating is
null, not0; - an unknown review count is
null, not0; - a disabled detector returns
nulland does not affect scoring or outreach; - an unresolved homepage leaves absence detectors as
nulland cannot generate evidence, a service recommendation, or outreach.
Qualification contract
opportunityScore measures the observed size of the commercial gap from 0 to 100.
confidenceScore measures evidence completeness from 0.0 to 1.0.
Default qualification requires:
opportunityScore >= 40confidenceScore >= 0.75auditStatus in success, partial, no_website
Each output includes isQualifiedOpportunity. It is true only when all three conditions are satisfied.
Failed and skipped audits never qualify. Every scoring rule includes a stable rule name, awarded points, and localized human-readable evidence.
By default, outreach is generated only for qualified opportunities. Set generateOutreachForAllResults to true only when you deliberately want outreach for lower-scored results.
Target services
targetService supports:
auto;online_booking;website_redesign;lead_capture;tracking;crm_automation.
A service is recommended only when matching evidence exists.
Languages
outputLanguage supports en, pt-BR, and es.
The selected language controls:
- evidence;
- score-breakdown evidence;
- recommended service;
- opportunity reasons;
- gap summary;
- outreach angle;
- first message.
Output
The Actor exposes two outputs.
Qualified opportunities and audit results
The default dataset contains qualified opportunities by default. Set onlyReturnOpportunities to false to include all audit outcomes.
The primary output link opens the qualified-opportunities view, which prioritizes score, confidence, qualification status, recommended service, gap summary, and first message. With the default onlyReturnOpportunities setting, every row in this view is qualified.
Important fields include:
businessNamecategorywebsiteratingreviewsCountwebsiteDataStatusauditStatusfailureTypebookingDetectedbookingProvidersDetectedbookingUrlscontactFormDetectedcontactPageDetectedchatDetectedwhatsappDetectedctaDetectedhttpsDetectedmobileViewportDetectedgoogleAnalyticsDetectedgoogleTagManagerDetectedmetaPixelDetectedopportunityScoreconfidenceScoreisQualifiedOpportunityscoreBreakdownevidenceserviceToSellopportunityReasonsgapSummaryoutreachAnglefirstMessagepagesCheckederrors
Run summary
The RUN_SUMMARY key-value store record reconciles:
- discovered, normalized, unique, and duplicate records;
- audited, qualified, filtered, pushed, and charged records;
- worker and push failures;
- rejected or unsafe domain inputs and their reasons;
- spending-limit termination;
- child Actor ID, run ID, dataset ID, and status;
- configured Maps cost ceiling and reported child cost.
Domain naming
In domains mode, the Actor starts with a hostname-derived fallback. It then evaluates business names from JSON-LD, Open Graph site metadata, application-name metadata, logo labels, headings, page-title segments, and hostname affinity. Generic SEO phrases, template names, and unclean HTML entities are penalized or rejected before a name is used in output or outreach.
Deduplication
Deduplication uses this priority:
- Google Maps
placeId; - canonical website hostname;
- normalized phone number;
- normalized business name plus a non-empty address.
A business name without an address is not sufficient to merge records, which avoids removing legitimate branches.
Bounded processing
Discovery is streamed. Full business records are retained only in the active batch.
The default batch size is 25 and processing occurs in concurrency-sized waves. When the user spending limit is reached, the Actor does not start the next wave or batch.
Security boundaries
Before each homepage, redirect, or secondary-page request, the Actor:
- accepts only HTTP and HTTPS;
- rejects credentials embedded in URLs;
- validates DNS results;
- blocks private, loopback, link-local, reserved, multicast, and unspecified addresses;
- blocks localhost and metadata targets;
- validates each redirect target;
- limits redirects and response size;
- validates content type;
- crawls secondary pages only on the same normalized hostname.
External booking URLs may be recorded as evidence but are not crawled as internal pages. Unsafe, private, empty, or invalid domain inputs are not requested and are listed in RUN_SUMMARY.rejectedInputs with a reason.
Responsible use
The Actor audits publicly accessible business websites. Users are responsible for complying with applicable privacy, marketing, outreach, and data-protection laws.
Review the evidence and the target jurisdiction's rules before using generated outreach.
Limitations
- JavaScript-rendered forms and widgets may not appear in source HTML.
- Detection is heuristic and should be reviewed before outreach.
- The Maps provider is an external Actor with its own schema and lifecycle.
- DNS is validated immediately before requests, while the HTTP transport performs its own connection-time resolution.
- Dataset storage is append-only, so duplicate source-query merging is complete inside the active batch while identity deduplication remains global.
- Dataset views organize columns but do not apply server-side row filtering. The default
onlyReturnOpportunitiessetting is what guarantees a qualified-only dataset.
Development and validation
python -m compileall src scriptspython -m ruff check .python -m mypy srcpython -m pytest -vpython -m pytest --cov=src --cov-report=term-missingpython -m pytest -m smoke -vpython scripts/validate_schemas.pyapify validate-schemadocker build -t local-business-opportunity-finder .docker run --rm local-business-opportunity-finder
GitHub Actions validates dependency resolution, unit tests, coverage, lint, type contracts, schemas, Docker, and mock integration. Cost-bearing live validation requires an APIFY_TOKEN secret and an explicit spending ceiling.
Support
When reporting a problem, include the Actor run ID, input mode, redacted input, relevant dataset item, expected behavior, and observed behavior.