Att skrapa leads från Google Maps manuellt ser enkelt ut tills du har gjort det i en timme. Sedan blir det flikar överallt, copy-paste-missar och en “lista” du inte riktigt litar på.
Det här är den typen av röra som byråägare känner av under outreach-rusher, och som marknadsförare som bygger lokala kampanjer springer in i hela tiden. Till och med en liten företagare som försöker få till samarbeten kan använda den här Maps lead-automationen för att bygga en strukturerad lista med färre dubbletter och faktiska kontaktvägar.
Du får se hur arbetsflödet hämtar Google Maps-resultat med SerpAPI, sparar dem i Google Sheets och sedan hittar generiska mejladresser (som contact@) med EmailListVerify så att din outreach kan komma igång snabbare.
Så här fungerar automationsflödet
Hela n8n-flödet, från trigger till slutlig output:
n8n Workflow Template: SerpAPI + Google Sheets: rensade Google Maps-leads
flowchart LR
subgraph sg0["When clicking "Execute Workflow" Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking 'Execute Workf..", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Extract next start value"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Merge all values from SERPAPI"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Transform data in the right .."]
n4@{ icon: "mdi:database", form: "rounded", label: "Add rows in Google Sheets", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>SERPAPI - Scrape Google Maps.."]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/itemLists.svg' width='40' height='40' /></div><br/>Remove duplicate items"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/itemLists.svg' width='40' height='40' /></div><br/>Split out items"]
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Remove empty values", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Get searches..", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract keyword and location..", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Continue IF Loop is complete", pos: "b", h: 48 }
n12@{ icon: "mdi:play-circle", form: "rounded", label: "Run workflow once a week", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Save google map data to goog..", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if the listing has a w..", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Transform website into domai.."]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Use EmailListVerify API to f.."]
n7 --> n8
n8 --> n3
n6 --> n13
n1 --> n11
n12 --> n9
n11 --> n5
n11 --> n2
n2 --> n7
n5 --> n1
n0 --> n9
n14 --> n15
n3 --> n6
n15 --> n16
n13 --> n14
n10 --> n5
n9 --> n10
n16 --> n4
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0,n12 trigger
class n8,n11,n14 decision
class n4,n9,n13 database
class n5,n16 api
class n1,n2,n3,n15 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3,n5,n6,n7,n15,n16 customIcon
Problemet: Google Maps-leads är stökiga att samla in
Google Maps är fullt av bra lokala företagsleads, men det jobbiga är att få in datan i en outreach-lista som går att använda. Du söker, öppnar profiler, kopierar namn, hämtar telefonnummer, letar efter webbplatser och upprepar. Och efter allt det arbetet sitter du ändå med dubbletter, saknade fält och rader som inte går att kontakta eftersom det saknas mejl. Värst av allt är osäkerheten. Du vet inte om listan är komplett, och du vill inte slösa en dag på att mejla återvändsgränder.
Det skenar snabbt. Här är var det faller isär i verkligheten.
- Att kopiera 30–50 listningar till ett kalkylark tar ett par timmar, och det är lätt att klistra in ett telefonnummer på fel rad.
- Dubbletter smyger sig in när du kör flera sökningar i närliggande städer, vilket gör att du kontaktar samma företag två gånger.
- De flesta team har inget konsekvent sätt att hålla koll på offset och paginering, så resultaten tar tyst slut innan du når den verkliga volymen.
- Även med en strukturerad lista är nästa varv att hitta kontaktmejl ännu en omgång flik-hoppande som dödar momentum.
Lösningen: SerpAPI → Sheets → mejlupptäckt, automatiskt
Det här flödet tar en enkel input (dina Google Maps-sökfrågor i ett Google Sheet) och gör om den till en leadlista som är redo för outreach. Det startar på schema eller via en manuell körning, läser in dina sökingångar och skickar dem till SerpAPI för att skrapa Google Maps-resultat. Resultaten städas upp till ett konsekvent format, filtreras så att tomma poster inte smutsar ner datan och avdubblettas så att du inte jagar samma ställe två gånger. Därefter sparar flödet de strukturerade “platserna” i ett ark, kontrollerar om varje plats har en webbplats och extraherar domänen när den finns. Till sist anropar det EmailListVerify för att hitta ett generiskt kontaktmejl och lägger tillbaka mejlraderna i Google Sheets.
Flödet börjar med dina sparade sökningar i Google Sheets. SerpAPI hämtar listningar från Google Maps och n8n hanterar paginering så att du fortsätter samla resultat i stället för att stanna tidigt. Efter avdubblettning och webbplatskontroller fyller EmailListVerify i kontaktmejl och allt hamnar tillbaka i Sheets för outreach.
Det du får: automation vs. resultat
| Vad det här flödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du riktar in dig på 3 städer och 2 kategorier (som “restauranger” och “hotell”), så du kör 6 Google Maps-sökningar varje vecka och samlar in cirka 30 leads per sökning. Om du gör det manuellt kanske du lägger ungefär 2 minuter per lead på att kopiera detaljer och kontrollera om det finns en webbplats, vilket blir cirka 6 timmar för 180 leads. Med det här flödet uppdaterar du sökingångarna i Google Sheets (kanske 10 minuter), låter SerpAPI hämta resultat, och sedan fyller EmailListVerify i generiska mejl automatiskt. Du granskar fortfarande arket, men du granskar data i stället för att bygga den från grunden.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att lagra sökningar och lead-output
- SerpAPI för att skrapa Google Maps-resultat
- EmailListVerify API-nyckel (hämta den i din EmailListVerify-dashboard)
Kunskapsnivå: Medel. Du kopplar konton, lägger in API-nycklar och bekräftar att kolumnerna i arket matchar vad flödet förväntar sig.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
Din söklista triggar körningen. Flödet startar antingen på ett veckoschema eller när du klickar på manuell körning. Det läser direkt in dina förberedda sökingångar från Google Sheets.
SerpAPI hämtar Google Maps-resultat. n8n bygger query-parametrarna, skickar begäran via ett HTTP-anrop och aggregerar sedan resultaten över flera sidor med en offset-loop så att du inte stannar på första sidan.
Resultaten struktureras och avdubblettas. Flödet expanderar posterna, filtrerar bort tomma records, normaliserar fält till en konsekvent struktur och tar bort dubbletter innan “platserna” sparas i ditt ark.
Mejlupptäckt körs bara där det är relevant. Om en listning har en webbplats extraherar flödet domänen och skickar den till EmailListVerify. De upptäckta mejlraderna läggs tillbaka i Google Sheets så att outreach kan starta.
Du kan enkelt ändra kolumnerna för Google Sheets-input så att de matchar dina egna namn, eller byta schematid efter behov. Se hela implementeringsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera manuella och schemalagda triggers
Ställ in hur workflowet startar, antingen manuellt för testning eller enligt ett veckoschema för körningar i produktion.
- Öppna Manual Run Trigger för att tillåta körningar på begäran under uppsättning och testning.
- Öppna Weekly Schedule Start och ställ in regelintervallet till
weeksför att köra veckovis. - Bekräfta att båda triggers är kopplade till Load Search Inputs så att startpunkten är konsekvent för manuella och schemalagda körningar.
Steg 2: Anslut Google Sheets för indata och lagring
Läs in sök-URL:er och lagra resultaten i Google Sheets.
- I Load Search Inputs ställer ni in Document till
https://docs.google.com/spreadsheets/d/[YOUR_ID]/edit#gid=[YOUR_ID]och väljer arketAdd your search url here. Credential Required: Anslut eragoogleSheetsOAuth2Api-credentials. - I Store Places Sheet ställer ni in Operation till
appendOrUpdate, väljer arketResultsoch säkerställer att kolumnerna mappar till uttryck som{{ $json.title }}och{{ $json.place_id }}. Credential Required: Anslut eragoogleSheetsOAuth2Api-credentials. - I Append Email Rows ställer ni in Operation till
appendOrUpdate, väljer arketEmailsoch behåller uttrycken för kolumnmappningen, till exempel{{ $json.email }}och{{ $json.domain }}. Credential Required: Anslut eragoogleSheetsOAuth2Api-credentials.
Steg 3: Sätt upp URL-tolkning och förberedelse av sökfråga
Omvandla indata-URL:er till keyword- och geo-parametrar för API-frågan.
- I Parse URL Parameters ställer ni in keyword till
{{ $json.URL.match(/\/search\/(.*?)\//)[1] }}. - I Parse URL Parameters ställer ni in geo till
{{ $json.URL.match(/(@[^\?\/]+)/)[1]}}. - Verifiera att Load Search Inputs skickar utdata till Parse URL Parameters, och därefter till Google Maps API Query.
Steg 4: Konfigurera pagineringsloopen för Google Maps API
Använd SerpApi för att hämta flera sidor med resultat och aggregera dem.
- I Google Maps API Query ställer ni in URL till
https://serpapi.com/search.jsonoch aktiverar Send Query med parametrarna:engine=google_maps,q={{$json?.search_parameters?.q || $json.keyword }},ll={{ $json?.search_parameters?.ll|| $json.geo }},type=search,start={{ $json.start|| 0 }}. Credential Required: Anslut eraserpApi-credentials. - I Derive Next Offset behåller ni JS-koden som extraherar
startfrånserpapi_pagination.nextför att driva pagineringen. - I Pagination Loop Check säkerställer ni att villkoren kontrollerar att
{{ $json.search_parameters.start }}och{{ $json.serpapi_pagination.next }}inte är tomma, skickar true-resultat tillbaka till Google Maps API Query och false-resultat till Aggregate Serp Results. - I Aggregate Serp Results behåller ni JS-koden som samlar in alla
local_resultsfrån Google Maps API Query.
Steg 5: Rensa, normalisera och lagra platsdata
Expandera de aggregerade resultaten, ta bort tomma poster, normalisera data och avduplicera platser innan ni lagrar dem.
- I Expand Result Items ställer ni in Field to Split Out till
allData. - I Filter Empty Records ställer ni in villkoret Value 1 till
{{ $json[0] }}med OperationisNotEmpty. - I Normalize Data Shape behåller ni JS-koden som sammanfogar items till en enda array och filtrerar bort null-värden.
- I Deduplicate Places ställer ni in Operation till
removeDuplicatesmed Fields to Compare satt tillplace_id. - Bekräfta att sekvensen följer: Aggregate Serp Results → Expand Result Items → Filter Empty Records → Normalize Data Shape → Deduplicate Places → Store Places Sheet.
Steg 6: Konfigurera e-postuppslagning och lägg till resultat
Extrahera webbplatsdomänen, begär kontaktadresser och lägg till verifierade e-postadresser i utdataarket.
- I Validate Website Exists behåller ni villkoret att
{{ $json.website }}inte börjar med[undefined]för att filtrera giltiga webbplatser. - I Extract Domain Name behåller ni JS-koden som tolkar domänen och tar bort
www.om den finns. - I Email Lookup Request ställer ni in URL till
https://api.emaillistverify.com/api/findContact, Method tillPOSToch JSON Body till{ "domain": "{{ $json.domain }}" }. Credential Required: Anslut erahttpHeaderAuth-credentials. - Säkerställ att flödet fortsätter från Email Lookup Request till Append Email Rows.
website-fält för varje plats.Steg 7: Testa och aktivera ert workflow
Kör ett manuellt test för att verifiera att workflowet hämtar data, avduplicerar den och lägger till e-postresultat i Sheets.
- Klicka på Manual Run Trigger för att starta en testkörning.
- Bekräfta att Store Places Sheet skriver rader till arket
Resultsoch att Append Email Rows skriver till arketEmails. - Kontrollera att Pagination Loop Check avslutas vid Aggregate Serp Results när det inte finns någon ytterligare paginering.
- När ni är nöjda, växla workflowet till Active så att Weekly Schedule Start körs automatiskt.
Vanliga fallgropar
- Google Sheets-autentisering kan löpa ut eller kräva specifika behörigheter. Om det skapar fel, kontrollera först statusen för n8n-credentials och delningsinställningarna för målarket.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om noder längre fram misslyckas på grund av tomma svar.
- SerpAPI-anrop kan misslyckas tyst när parametrar ändras eller när du slår i planbegränsningar. Om ditt output-ark plötsligt ser tunt ut, granska SerpAPI-svaret i HTTP Request-noden och bekräfta att du fortfarande ligger under din månatliga sökquota.
Vanliga frågor
Cirka 30 minuter om dina Sheets och API-nycklar är redo.
Nej. Du kopplar främst konton och klistrar in API-nycklar. Den enda “tekniska” delen är att se till att kolumnerna i ditt Google Sheet matchar flödets förväntningar.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på $20/månad för högre volymer. Du behöver också räkna in SerpAPI-begränsningar (250 sökningar/månad på gratisplanen) och EmailListVerify-kostnader (från cirka $0.05 per mejl).
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och klarar n8n bra. Self-hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är mest en Google Sheets-ändring. Lägg till fler rader i ditt “search inputs”-ark (olika kategorier, städer eller radie-termer), så loopar flödet igenom dem vid den schemalagda körningen. Om du vill ha separata output-flikar per kategori kan du duplicera logiken i “Store Places Sheet” / “Append Email Rows” och routa baserat på query-fältet.
Oftast är det behörigheter. Återanslut Google Sheets-credential i n8n och bekräfta sedan att det specifika kalkylarket är delat med det Google-konto som är kopplat. Kontrollera också att arknamnet och fliknamnen fortfarande matchar det flödet refererar till, eftersom ett flikbyte i namn kan stoppa skrivningar direkt.
På n8n Cloud Starter kan du köra en bra mängd veckovis skrapning för mindre kampanjer, men den verkliga begränsningen är din SerpAPI-plan och hur många sökningar du kör. Om du self-hostar finns ingen körningsgräns från n8n i sig, så skalning handlar främst om API-kvoter och serverstorlek. I praktiken börjar de flesta team med några hundra leads per vecka och breddar sedan sökningarna när de litar på outputen.
Ofta, ja. Det här flödet bygger på loopar, paginering, avdubblettning och villkorskontroller (som “finns det en webbplats?”), vilket n8n hanterar snyggt utan att varje extra gren blir en kostnadsfråga. Self-hosting är också viktigt om du planerar att skala skrapkörningar. Zapier eller Make kan vara enklare för ett litet tvåstegsflöde, men de blir klumpiga när du hanterar batchar av resultat och normaliserar data. Vill du ha hjälp att välja rätt upplägg för din outreach-volym kan du prata med en automationsexpert.
Du får ett lead-ark du faktiskt kan använda, inte ett du måste sitta och passa. Sätt upp det en gång, kör det varje vecka och håll din outreach i rullning.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.