Google Maps Lead Scraper & SMB Audit
Pricing
from $1.00 / 1,000 results
Google Maps Lead Scraper & SMB Audit
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Muhammad Sajid Izzulhaq
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
UMKM Lead Generator — Google Maps
Actor Apify yang mencari UMKM yang belum punya website, lalu memberi skor urutan prioritas supaya Anda tahu siapa yang perlu dihubungi lebih dulu.
Cocok untuk siapa: freelance web developer, digital agency, dan siapa pun yang menj jasa pembuatan website atau landing page ke UMKM.
Masalah yang diselesaikan
Mencari calon klien secara manual di Google Maps itu melelahkan. Kalau Anda cari "warung kopi", rata-rata 19 dari 20 hasil tidak punya website sama sekali — dan sebagian besar tidak punya nomor telepon yang bisa dihubungi. Actor ini menyaring dua masalah itu sekaligus, lalu menandai mana yang paling layak dikejar.
Yang dilakukan actor
- Mengambil hasil pencarian Google Maps lewat endpoint JSON internal
(
tbm=map). Tanpa headless browser, jadi jauh lebih cepat dan murah. - Mengekstrak nama, alamat, rating, jumlah ulasan, kategori, koordinat, nomor telepon, dan website.
- Menghitung
gapScore0-100 untuk setiap bisnis, dengangapReasondalam Bahasa Indonesia yang bisa langsung Anda pakai saat menelepon. - Mengembalikan hanya lead yang layak: tidak punya website sendiri dan punya nomor telepon publik.
Input
location itu bukan hiasan: nama kota di situ menggeser pusat pencarian.
Filter geografis Google ada di dalam pb pada !2d{lng}!3d{lat}, jadi kalau
kotanya tidak dipetakan ke koordinat yang benar, hasilnya salah kota tanpa
warning.
Yang dilakukan actor dengan location:
- dicocokkan ke tabel kota offline (819 nama: 217 kota Indonesia + kota besar
dunia), case/spasi/awalan
kotatidak berpengaruh; - dipakai sebagai titik tengah pencarian, bukan cuma tambahan di query;
- dipakai juga untuk memperingatkan kalau
countryCodetidak cocok.
Kalau nama kotanya tidak ada di tabel, actor berhenti dengan pesan jelas —
lebih baik gagal daripada mengirim lead salah kota. Wilayah yang ada di tabel
melewati lat/lng, atau tambahkan kotanya ke
packages/gmaps-core/src/gmaps_core/data/cities.json.
| Field | Tipe | Default | Keterangan |
|---|---|---|---|
searchStrings | list of string | ["Kopi"] | Kata kunci. Actor menggabungkannya dengan location. |
location | string | wajib | Kota yang jadi pusat pemindaian, mis. Jakarta. Dicocokkan ke tabel kota offline. |
lat / lng | number | kosong | Titik tengah manual. Kosongkan kecuali tahu persis koordinatnya. |
radiusKm | number | 30 | Radius dari titik tengah. |
maxItems | integer | 20 | Total hasil per kata kunci (1-480). Dipecah otomatis jadi beberapa request. |
language | string | id | Kode bahasa respons Google, mis. id atau en. |
countryCode | string | id | Kode negara respons Google, mis. id atau jp. |
onlyGapLeads | boolean | true | Hanya lead tanpa website + bertelepon. |
minGapScore | integer | 0 | Buang lead di bawah skor ini. |
includeUnproven | boolean | false | Sertakan bisnis tanpa rating. |
includeRaw | boolean | false | Kembalikan semua tempat, bukan hanya lead. |
debugDump | boolean | false | Simpan payload Google mentah ke key-value store. |
Output
Tiga keluaran sekaligus:
| Tujuan | Lokasi di halaman run | Isi |
|---|---|---|
| Spreadsheet | key-value store default, record leads.xlsx | 2 sheet: Leads dan Ringkasan. |
| Data mentah | dataset | Satu baris per tempat, bisa disaring di UI Apify. |
| Ringkasan run | key-value store default, record SUMMARY | Statistik dan parameter run. |
Dataset punya dua tampilan, dipilih dari dropdown di atas tabel:
| Tampilan | Isi |
|---|---|
Leads | 15 kolom untuk menghubungi calon klien, urut dari skor tertinggi. |
Semua tempat | 24 kolom lengkap, termasuk yang sudah punya website sendiri. |
Setiap kolom punya judul Bahasa Indonesia, dan Prioritas memakai nilai
Panas / Hangat / Dingin — bukan hot / warm / cold yang cuma
penting di kode.
Isi spreadsheet
Sheet Leads memuat semua tempat yang dipindai (bukan hanya lead), diurutkan
sesuai skor. Handy karena yang butuh filtering bisa pakai dropdown Autofilter:
No, Nama, Kategori, Rating, Ulasan, Telepon, WhatsApp, Kota,
Kecamatan, Alamat, Website, Skor Gap, Prioritas,
Alasan (script jualan), Buka di Maps, Penawaran.
Beberapa detail yang disengaja:
- Telepon ditulis sebagai teks. Kalau jadi angka, Excel membuang nol di depan dan nomor jadi tidak bisa dihubungi.
- Kolom WhatsApp adalah tautan
wa.mesiap klik, tapi hanya untuk nomor HP. Nomor tetap tidak bisa dipakai WhatsApp, jadi dikosongkan. - Alasan dan Penawaran sudah Bahasa Indonesia, bisa langsung dibacakan saat menelepon.
Sheet Ringkasan berisi konfigurasi run, jumlah lead per prioritas, dan
seberapa banyak yang punya nomor telepon.
Field di dataset
| Field | Keterangan |
|---|---|
title, address, rating, review_count, category | Data dasar bisnis. |
phone, phoneInternational, phoneDigits | Nomor telepon dalam tiga format. |
website | URL website kalau ada. |
websiteKind | own (punya website sendiri), social (cuma akun social), none. |
gapScore | 0-100. Makin tinggi makin layak dikejar. |
gapTier | hot / warm / cold / none. |
isGapLead | true bila layak dihubungi untuk jasa website. |
gapReason | Alasan Bahasa Indonesia, siap dibacakan ke prospek. |
suggestedOffer | Rekomendasi materi penawaran. |
place_url, reviews_url, lat, lng | Untuk verifikasi manual. |
Cara skor dihitung
Tiga komponen, semuanya transparan:
| Komponen | Nilai | Logika |
|---|---|---|
| Celah digital | 0-40 | Tidak ada web (40), cuma social (32), sudah punya web (0). |
| Reputasi | 0-47 | Rating hanya dihitung di atas 3,5; ulasan memakai skala logaritmik. |
| Bisa dihubungi | 0-15 | Punya nomor telepon publik. |
Dua penyesuaian yang disengaja:
- Rating di bawah 3,5 dapat 0 poin. Bisnis lemah adalah risiko, bukan peluang.
- Ulasan sangat banyak (>3.000) dikurangi 8 poin. Hal tersebut sudah bercabang, sehingga lebih sulit dijual jasa website pribadi.
Contoh output
{"no": 1,"title": "BARBIE LAUNDRY","address": "Jl. Puntik Kemuning No.88, Peanut, Tj. Karang Timur","rating": 4.7,"review_count": 464,"phone": "0812-7923-7715","phoneInternational": "+62 812-7923-7715","phoneDigits": "081279237715","website": "","websiteKind": "none","hasPhone": true,"hasWebsite": false,"contactable": true,"gapScore": 93,"gapTier": "hot","isGapLead": true,"gapReason": "Tidak punya website sama sekali. Reputasi sudah bagus (rating 4.7, 464 ulasan). Ada nomor telepon publik sehingga bisa langsung dihubungi.","suggestedOffer": "Website + Google Business Profile + landing page promo - tawarkan social proof dari ulasan yang sudah banyak"}
Contoh menjalankan
apify run umkm-google-maps \--input '{"searchStrings":["warung kopi","laundry"],"location":"Bandar Lampung","maxItems":40}'# Kota lainapify run umkm-google-maps \--input '{"searchStrings":["kopi"],"location":"Jakarta","maxItems":100}'# Kota luar negeri: sesuaikan countryCode, kalau tidak kolom Ulasannya# mengikuti bahasa Indonesiaapify run umkm-google-maps \--input '{"searchStrings":["coffee"],"location":"Tokyo","countryCode":"jp","language":"en"}'
Proxy (opsional)
Kalau kena rate limit, actor bisa scraping lewat proxy. Kredensialnya tidak
pernah ada di input schema — hanya lewat environment variable SCRAPER_PROXY
dengan format http://user:pass@host:port.
Untuk run di Apify, atur lewat Console → actor ini → Environment
variables, bukan lewat actor.json dan bukan lewat input run. Isi
actor.json hanya dipakai saat deploy pakai Apify CLI; deploy dari GitHub
mengambil nilainya dari Console.
Untuk run lokal, set saja di shell:
$export SCRAPER_PROXY="http://user:pass@host:port"
Kalau kosong, actor berjalan tanpa proxy.
Catatan teknis
Scraping memakai curl_cffi untuk memalsukan sidik jari TLS seperti Chrome.
Tanpa itu, Google memblokir request di level jaringan. Rate limiting 1,5-3
detik plus exponential backoff sudah menyatu di dalam kode dan tidak bisa
dimatikan.
Struktur indeks field Google ada di
packages/gmaps-core/src/gmaps_core/indexes.py — satu-satunya tempat yang
perlu diubah kalau Google mengubah responsnya.
Batasan
- Maksimal 40 hasil per request (batas Google), jadi
maxItemsdipecah otomatis. Batas kerasmaxItems= 480 per kata kunci. Kalau hasilnya kurang darimaxItems, berarti memang tidak ada tempat lagi di area itu — bukan scraping-nya gagal. locationharus berupa nama kota yang ada di tabel. Alamat jalan, nama formatted, atau nama kelurahan (Kemang,Kemang, Jatiasih) tidak dikenali. Pakailat/lnguntuk kasus seperti itu.- Nomor telepon hanya ada kalau pemilik usaha menempelkannya secara publik di profil Google Business. Actor tidak menebak atau mengarang nomor.
- Data berasal dari Google Maps. Patuhi ketentuan layanan Google, dan jangan memakai actor ini untuk mengumpulkan data pribadi yang tidak dipublikasikan pemilik usaha.