Att kopiera och klistra in Google Maps-listningar i ett kalkylark låter enkelt. Sedan gör du det i en timme, inser att hälften av “webbplatserna” är skräp, och du har fortfarande inte en enda användbar e-postadress.
Den här Maps lead automation slår hårt mot byråägare och frilansare, eftersom leadvolymen hänger ihop med debiterbar tid. En säljlead i ett småföretag känner också av det, eftersom dålig data ger dålig outreach och bortkastade uppföljningar.
Det här flödet hämtar lokala företag från Google Maps, rensar webbplatserna, extraherar riktiga e-postadresser och lägger en deduplicerad leadlista i Google Sheets. Du får se vad det gör, vad du behöver och hur du får igång det utan att behöva bli en “scraper-detective”.
Så fungerar den här automatiseringen
Här är det kompletta flödet du kommer att sätta upp:
n8n Workflow Template: Google Maps till Google Sheets: felfria leads med e-post
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Basic LLM Chain", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n3@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields3", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n11["<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 Emails"]
n12["<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 URLs"]
n13["<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/>Scrape Site"]
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Out Empties", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Google URLs", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates (2)", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates2", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items3", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Limit1", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out2", pos: "b", h: 48 }
n21@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n22["<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/>Scrape Google Maps"]
n9 --> n11
n8 --> n6
n10 --> n14
n19 --> n18
n4 --> n5
n20 --> n16
n5 --> n8
n13 --> n9
n21 --> n1
n7 --> n6
n12 --> n15
n11 --> n18
n1 --> n4
n6 --> n22
n18 --> n10
n18 --> n13
n3 -.-> n1
n15 --> n17
n14 --> n20
n17 --> n19
n22 --> n12
n16 --> n7
n2 -.-> n1
n0 --> n21
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 trigger
class n1,n2 ai
class n3 aiModel
class n14,n15 decision
class n13,n22 api
class n11,n12 code
classDef customIcon fill:none,stroke:none
class n11,n12,n13,n22 customIcon
Varför det här spelar roll: korrekta lokala leads är plågsamt manuellt
Lokal leadgenerering faller isär i den tråkiga mitten. Du börjar med en nisch och en stad, söker på Google Maps, öppnar listningar, kopierar namn, klistrar in URL:er och upptäcker sedan att webbplatsfältet pekar på en Google-omdirigering, en Facebook-sida eller ingenting alls. Sen kommer delen “hitta en e-post”: klicka runt, gräva i sidfötter och gissa vilket kontaktformulär som kan konvertera. När du är klar ser arket fullt ut, men leads som faktiskt är redo för outreach är få. Och om du gör det här varje vecka blir den mentala belastningen värre än tidskostnaden.
Det bygger snabbt upp. Här är var det brister i praktiken:
- Du lägger cirka 5–10 minuter per företag bara för att få en användbar webbplats och missar ändå uppenbara dubbletter.
- Länkar som ägs av Google och kataloglänkar smyger sig in i arket, så du slösar outreach på “leads” som inte är leads.
- Att jaga e-post blir ett eget projekt, och det är lätt att kopiera fel adress eller fånga en död inkorg.
- Så fort du försöker skala till flera stadsdelar stöter du på captchas, rate limits och inkonsekventa resultat.
Vad du bygger: Google Maps-leads till ett felfritt Google Sheet
Det här n8n-flödet gör “företagstyp + stad” till en delbar leadlista som faktiskt är redo för outreach. Du börjar med att ange din målgrupp (till exempel rörmokare i Los Angeles). OpenAI genererar sedan hyperlokala sökfrågor så att du täcker stadsdelar, inte bara det uppenbara stadsövergripande sökordet. Därefter hämtar flödet Google Maps-resultat, plockar ut företagsdetaljer och webbplatslänkar och tar bort skräpresultat innan de förorenar kalkylarket. Sedan besöker det varje webbplats, laddar ner HTML från startsidan och extraherar e-postadresser med en enkel regex-metod (snabb, förvånansvärt effektiv). Till sist deduplicerar det både webbplatser och e-postadresser så att arket håller sig strukturerat när du kör det igen nästa vecka.
Flödet börjar med dina indata, expanderar dem till en lista av riktade sökningar, scrapar Maps-resultat via Zyte för bättre stabilitet, batchar förfrågningar med korta väntetider så att du inte överbelastar något och avslutar med att skriva kontaktfält som ser validerade ut till Google Sheets.
Det här bygger du
| Det som automatiseras | Det du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du vill ha 100 lokala leads för en nisch i en stad. Manuellt: anta cirka 6 minuter per lead för att kopiera detaljer, verifiera webbplatsen och leta upp en e-postadress. Det är ungefär 10 timmar av distraktionsintensivt arbete. Med det här flödet lägger du cirka 10 minuter på att ställa in företagstyp och stad, och låter sedan flödet köra medan det batchar förfrågningar och besöker webbplatser, vilket vanligtvis landar på 30–45 minuter beroende på volym. Du granskar fortfarande arket, men du granskar i stället för att samla in.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- OpenAI för att generera hyperlokala sökfrågor.
- Zyte API för att scrapa Google Maps pålitligt.
- OpenAI API-nyckel + Zyte API-nyckel (hämta båda i dina OpenAI- och Zyte-dashboards)
Kunskapsnivå: Medel. Du skriver inte kod från grunden, men du bör känna dig bekväm med att lägga till credentials, testa noder och läsa ett Google Sheets-resultat.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Du startar flödet med en stad och en företagstyp. I n8n sätts den inmatningen i ett dedikerat steg “Set City & Business” (eller så kan du senare byta till en webhook om du vill trigga det från ett formulär).
AI breddar din söktäckning. OpenAI genererar en lista med sökfrågor i stadsdelsstil, och sedan delar flödet upp listan i individuella sökningar så att du kan få mer komplett Maps-täckning utan att själv behöva hitta på 30 variationer.
Maps-resultat scrapas och rensas. Varje sökfråga går genom en HTTP-förfrågan (via Zyte), resultaten batchas med korta väntetider och flödet tar bort tomma objekt, Google-ägda länkar och dubbletter innan det gör något annat.
Webbplatser besöks för att extrahera e-post. Flödet hämtar HTML från startsidan, plockar ut sannolika e-postadresser med en regex-baserad parser och deduplicerar sedan igen så att flera sidor inte ger samma kontakt om och om igen.
Du kan enkelt justera sökprompten för att rikta in dig på postnummer i stället för stadsdelar utifrån dina behov. Se den fullständiga implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera manuell trigger
Starta arbetsflödet manuellt så att ni kan styra indata för stad och bransch innan ni genererar sökfrågor.
- Lägg till Manual Start Trigger som arbetsflödets trigger.
- Anslut Manual Start Trigger till Set City & Business.
- I Set City & Business ställer ni in City till
Californiaoch Business tillMarketing Agencies.
Steg 2: anslut OpenAI
Arbetsflödet använder en OpenAI-modell för att generera lokaliserade Google Maps-sökningar.
- Öppna OpenAI Chat Engine.
- Inloggningsuppgifter krävs: anslut era openAiApi-inloggningsuppgifter.
- Bekräfta att modellen är inställd på
gpt-4o-mini.
Steg 3: konfigurera AI-generatorn för sökfrågor
Generera en strukturerad lista med områdesbaserade sökfrågor baserat på indata för stad och bransch.
- Öppna LLM Query Builder och bekräfta att Prompt Type är inställd på
define. - Behåll prompttexten som angiven och säkerställ att den refererar till
{{ $json.City }}och{{ $json.Business }}. - Säkerställ att Structured Result Parser är ansluten som output-parser med Input Schema inställt på
{ "output": ["plumbers+in+chinatown","plumbers+in+westlake"] }. - Anslut LLM Query Builder till Expand Location List.
Steg 4: konfigurera körning av Google Maps-sökningar
Förbered frågeposter, begränsa volymen och begär sökresultat från Google Maps.
- I Expand Location List ställer ni in Field to Split Out till
output.locations. - I Map Query Fields ställer ni in output till
{{ $json['output.locations'] }}och location till{{ $('Set City & Business').item.json.City }}. - I Cap Query Count ställer ni in Max Items till
5. - Anslut Cap Query Count till Batch Through Queries.
- I Request Maps Results ställer ni in URL till
https://www.google.com/maps/search/{{ $json.output }}. - Från Batch Through Queries routar ni utdata till Request Maps Results.
Steg 5: tolka webbplatser och extrahera e-postadresser
Extrahera webbplats-URL:er från Maps-resultat, besök varje webbplats och tolka e-postadresser.
- I Parse Website Links behåller ni JavaScript-koden som extraherar URL:er med regex:en i
jsCode. - I Exclude Google Links verifierar ni att filtren exkluderar
schema,google,ggochgstaticfrån{{ $json.website }}. - Anslut Exclude Google Links till Deduplicate Websites, och därefter till Cap Website Count med Max Items inställt på
20. - I Batch Site Visits säkerställer ni att den tar emot items från Cap Website Count och noterar att Batch Site Visits skickar utdata parallellt till både Pause Before Filtering och Fetch Website Content.
- I Fetch Website Content ställer ni in URL till
{{ $json.website }}och låter omdirigeringar vara avstängda. - I Delay Between Requests ställer ni in Amount till
1för att strypa webbplatsförfrågningar. - I Parse Email Addresses behåller ni JavaScript-koden som extraherar e-postadresser från
$input.first().json.data. - I Remove Empty Results behåller ni villkoret att
{{ $json.emails }}finns, och ansluter sedan till Expand Email List. - I Expand Email List ställer ni in Field to Split Out till
emails, och ansluter sedan till Deduplicate Emails och Assemble Contact Fields. - I Assemble Contact Fields ställer ni in email till
{{ $json.emails }}, search term till{{ $('Batch Through Queries').item.json.output }}och location till{{ $('Batch Through Queries').item.json.location }}.
data, och överväg att öka Delay Between Requests.Steg 6: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att verifiera frågegenerering, webbplatsextrahering och e-posttolkning.
- Klicka på Execute Workflow medan Manual Start Trigger är vald.
- Bekräfta att LLM Query Builder skickar ut en strukturerad lista till Expand Location List.
- Verifiera att Request Maps Results returnerar HTML och att Parse Website Links extraherar URL:er.
- Kontrollera att Parse Email Addresses returnerar en
emails-array och att Assemble Contact Fields skickar ut e-postadress, sökterm och plats. - När allt fungerar, slå på arbetsflödet med Active för användning i produktion.
Felsökningstips
- OpenAI-credentials kan löpa ut eller begränsas av projektinställningar. Om något slutar fungera, kontrollera först status för din OpenAI API-nyckel och dina användningsgränser i OpenAI-dashboarden.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på grund av tomma svar.
- Zyte-förfrågningar kan fallera om din API-nyckel är fel eller om ditt abonnemang är slut på krediter. Kontrollera Zyte-dashboarden för senaste förfrågningsfel och kvot innan du antar att flödeslogiken är fel.
Snabba svar
Cirka 30 minuter om du redan har dina API-nycklar.
Nej. Du kopplar mest credentials och justerar några Set-fält. E-postparsningen använder en inbyggd kodnod, men du kan låta den vara som den är.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna in kostnader för OpenAI- och Zyte-API:er, vilket oftast landar på några dollar per batch vid mindre körningar.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärt och hanterar n8n bra. Egen hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det bör du. Den vanligaste ändringen är att byta OpenAI-prompten i “LLM Query Builder” till format som “tjänst + postnummer” eller “tjänst + förort”, beroende på hur din marknad söker. Du kan också skärpa filtreringen genom att justera logiken i “Exclude Google Links” och uppdatera regexen i “Parse Email Addresses” om du vill exkludera gratisinkorgar eller bara behålla rollbaserade e-postadresser som info@ och sales@.
Oftast är det en ogiltig API-nyckel eller att du har slut på Zyte-krediter. Uppdatera Zyte-credential som används av HTTP Request-noderna och kör sedan om en enskild sökfråga för att bekräfta. Om det fungerar för en sökfråga men fallerar i batcher kan du också slå i rate limits, så öka väntetiden i “Delay Between Requests”.
Om du kör n8n med egen hosting finns ingen körningsgräns, och kapaciteten beror mest på din server samt dina Zyte-/OpenAI-gränser. På n8n Cloud är det praktiska taket antalet månatliga körningar i din plan, och det här flödet kan använda många körningar om du scrapar många sökfrågor och besöker många webbplatser. I det dagliga brukar team köra detta i batcher på några dussin upp till ett par hundra företag per nisch för att det ska vara stabilt och lätt att granska.
För den här typen av scrape-och-rensa-flöde är n8n oftast bättre. Du behöver batchning, väntetider, deduplicering och lite anpassad parsning, och de stegen blir dyra eller klumpiga i verktyg som prissätter per task. n8n ger dig också möjligheten till egen hosting, vilket spelar roll när du hämtar leads regelbundet. Zapier eller Make kan fortfarande fungera om du bara vill flytta redan felfri data mellan appar. Om du är osäker, prata med en automationsexpert så ritar vi upp den billigaste vägen.
När det här väl rullar slutar lokal leadgenerering att vara ett veckovis slit. Du får felfri data, snabbare, och din outreach-tid går äntligen till samtal i stället för copy-paste.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.