Du hittar en lista med företag på Google Maps, och sedan börjar den långsamma delen. Klicka runt i profiler, leta efter webbplatser, skanna sidor efter kontaktuppgifter, kopiera e-postadresser och hoppas att du inte klistrade in samma adress två gånger.
Maps email scraping blir aktuellt när du behöver volym i din outreach utan krångel. Marknadschefer märker det när kampanjer stannar av. Byråägare märker det när lead-leveransen blir en veckovis brandkårsutryckning. Och solooperatörer som jobbar med lokal SEO eller cold email hamnar i admin i stället för att sälja.
Det här arbetsflödet hämtar Google Maps-listningar, hittar företagens webbplatser, extraherar e-postadresser, rensar dubletter och lägger sedan till en prydlig lista i Google Sheets. Du får se hur det fungerar, vad du behöver och vad du ska justera så att outputen faktiskt går att använda för outreach.
Så fungerar den här automatiseringen
Här är hela arbetsflödet du kommer att sätta upp:
n8n Workflow Template: Google Maps till Google Sheets, rensade e-postar
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:cog", form: "rounded", label: "Remove Duplicates", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Extract Emails"]
n8["<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"]
n9["<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"]
n10["<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"]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Out Empties", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Google URLs", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates (2)", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Add to Sheet (or whatever yo..", pos: "b", h: 48 }
n3 --> n7
n4 --> n2
n5 --> n11
n6 --> n13
n10 --> n3
n8 --> n12
n7 --> n2
n2 --> n5
n2 --> n10
n1 --> n4
n12 --> n1
n11 --> n6
n9 --> n8
n13 --> n14
n0 --> n9
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 n11,n12 decision
class n14 database
class n9,n10 api
class n7,n8 code
classDef customIcon fill:none,stroke:none
class n7,n8,n9,n10 customIcon
Varför det här spelar roll: korrekta outreach-listor är svårare än de ser ut
Lead-listor fallerar av tråkiga skäl. Du skrapar “dentists in Calgary”, får en hög med listningar och inser sedan att hälften av webbplatserna inte laddar korrekt, vissa e-postadresser är bilder och många resultat är bara Google-domäner som du aldrig ville ha. Sedan måste du fortfarande avduplicera. Och om du gör det här varje vecka blir det en ritual av flikar, copy-paste och “vänta… kontaktade vi dem redan?” Kostnaden är inte bara tid. Det är momentum. När listbygge gör ont går outreach långsammare och kampanjer startar sent.
Det skenar snabbt. Här är var processen brukar fallera.
- Du lägger cirka 5 minuter per företag på att hoppa mellan Maps, webbplatsen och en “Kontakt”-sida.
- Dubletter smyger in eftersom olika listningar pekar på samma sajt, eller samma e-postadress dyker upp på flera sidor.
- Listor blir brusiga när din “skrapning” inkluderar Google-relaterade URL:er, döda domäner och tomma sidor.
- Även när du får tag på e-post hamnar de i ett rörigt kalkylark som fortfarande behöver städas innan du kan skicka något.
Vad du bygger: Google Maps → webbplatsmejl → rensat Sheet
Det här arbetsflödet förvandlar en enkel Google Maps-sökning till en mer strukturerad, outreach-klar e-postlista i Google Sheets. Du börjar med en flik “searches” där varje rad innehåller en sökning som “Calgary dentist” eller “Miami lawyers”. När du kör arbetsflödet hämtar n8n Google Maps-resultatsidan för den sökningen via HTTP och använder sedan anpassad parsning för att plocka ut länkar till företagens webbplatser (inte Google-URL:er). Därefter loopar det igenom sajterna i kontrollerade batchar, väntar mellan förfrågningar för att minska risken för blockering, och laddar ner varje webbplats HTML. Ur den HTML:en extraherar arbetsflödet e-postadresser med mönstermatchning, filtrerar bort tomma resultat, expanderar listan till enskilda e-postposter och avduplicerar så att du inte lagrar samma adress flera gånger. Till sist lägger det till de rensade e-postadresserna i en flik “emails” i Google Sheets.
Arbetsflödet startar med en manuell körning medan du testar, och hämtar sedan Maps-listningar via HTTP-förfrågningar. Efter det tar det fram riktiga företagswebbplatser, skrapar varje sajt med hastighetsbegränsning och skriver bara validerade, avduplicerade e-postadresser till ditt ark.
Vad du bygger
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du bygger en lista för en stad och en nisch och du vill ha 150 företag. Manuellt, med ungefär 5 minuter per företag för att öppna Maps, klicka vidare, hitta sajten och leta efter en e-postadress, blir det cirka 12 timmar klickande (och du måste fortfarande avduplicera). Med det här arbetsflödet kan du lägga in sökningen i Google Sheets, köra det och låta det processa i bakgrunden i ungefär en till två timmar beroende på batchning och webbplatsers hastighet. Du väntar mest, inte jobbar, och din flik “emails” fylls på under tiden.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen hosting om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att lagra sökningar och rensade e-postadresser.
- Åtkomst till HTTP Request för att hämta Maps- och webbplats-HTML.
- Google OAuth-uppgifter (skapa i Google Cloud Console och anslut sedan i n8n).
Nivå: Medel. Du bygger ingen app, men du bör vara bekväm med att klistra in kodsnuttar och justera några node-inställningar.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Du kör en sökning från ditt ark. Arbetsflödet startar med en manuell trigger medan du testar, och hämtar sedan din Google Maps-sökning (t.ex. stad + bransch) och laddar ner Maps-resultatsidan via HTTP.
Webbplatslänkar extraheras och rensas. Ett kodsteg parsar Maps-HTML:en, tar fram troliga URL:er till företagswebbplatser, filtrerar bort Google-ägda domäner och tar sedan bort dubletter så att du inte skrapar samma sajt om och om igen.
Sajter skrapas i kontrollerade batchar. n8n loopar igenom webbplatslistan med Split in Batches, lägger in väntesteg mellan förfrågningar och hämtar varje sajts HTML. Den här hastighetsbegränsningen är skillnaden mellan “fungerar för 20 sajter” och “fortsätter fungera efter lunch”.
E-postadresser extraheras, valideras och sparas. Ett annat kodsteg hittar e-postmönster i HTML:en, tomma resultat kastas, poster expanderas så att varje e-postadress blir en egen rad, dubletter tas bort och den slutliga uppsättningen läggs till i din Google Sheets-flik “emails”.
Du kan enkelt ändra sökfrågorna och batch-beteendet för att matcha din volym och risktolerans. Se den fullständiga implementationsguiden nedan för alternativ för anpassning.
Steg-för-steg-guide för implementation
Steg 1: konfigurera den manuella triggern
Konfigurera arbetsflödets startpunkt så att ni kan köra flödet manuellt medan ni validerar scraping, parsning och att data läggs till i kalkylarket.
- Lägg till noden Manual Launch Trigger som första nod på arbetsytan.
- Lämna standardinställningarna för Manual Launch Trigger för att möjliggöra testning vid behov.
- Koppla Manual Launch Trigger till Fetch Maps Listings för att starta scraping-pipelinen.
Steg 2: konfigurera hämtning av Maps-listningar
Hämta HTML för Google Maps-listningar och extrahera kandidat-URL:er till webbplatser för vidare bearbetning.
- Öppna Fetch Maps Listings och ställ in URL till
https://www.google.com/maps/search/calgary+dentists. - Bekräfta att Fetch Maps Listings är kopplad till Derive Website Links i flödet.
- I Derive Website Links, behåll den angivna jsCode för att parsa URL:er från
$input.first().json.data. - Routa Derive Website Links till Exclude Google Domains för att filtrera bort oönskade domäner.
Körflöde: Manual Launch Trigger → Fetch Maps Listings → Derive Website Links → Exclude Google Domains → Deduplicate Sites → Cap Batch Size → Iterate Website Batch
Steg 3: filtrera och batcha webbplatsmål
Ta bort Google-relaterade URL:er, avduplicera mål och begränsa batchstorleken för att undvika att överbelasta webbplatser.
- I Exclude Google Domains, verifiera att de fyra villkoren är inställda på notContains med
schema,google,ggochgstaticmot{{ $json.website }}. - Säkerställ att Exclude Google Domains skickar vidare till Deduplicate Sites för att ta bort dubblett-URL:er.
- Öppna Cap Batch Size och ställ in Max Items till
10. - Koppla Cap Batch Size till Iterate Website Batch för att bearbeta webbplatser i batchar.
Steg 4: hämta HTML och parsa e-postadresser
Hämta varje webbplats HTML, tillämpa fördröjningar och extrahera e-postadresser med den angivna koden och filtren.
- I Iterate Website Batch, bekräfta att den skickar vidare till både Delay Before Scrape och Retrieve Site HTML.
- Ställ in Retrieve Site HTML URL till
{{ $json.website }}och behåll omdirigeringar inaktiverade enligt konfigurationen. - I Delay After Fetch, ställ in Amount till
1för att pausa mellan HTML-hämtning och parsning. - I Parse Email Addresses, behåll den angivna jsCode som extraherar e-postadresser och returnerar
{json: {emails:emails}}. - Säkerställ att Delay After Fetch routar till Parse Email Addresses, och därefter till Iterate Website Batch enligt körflödet.
data kommer Parse Email Addresses att returnera null för e-postadresser. Verifiera att Retrieve Site HTML returnerar HTML i json.data.Steg 5: rensa och expandera e-postresultat
Filtrera bort tomma e-postarrayer, dela upp e-postadresser till individuella items och avduplicera innan ni sparar.
- Öppna Discard Empty Emails och verifiera att array-villkoret exists är inställt till
{{ $json.emails }}. - Ställ in Expand Email Items Field To Split Out till
emails. - Koppla Expand Email Items till Deduplicate Emails för att ta bort dubbletter innan lagring.
Steg 6: anslut utdata till Google Sheets
Lägg till rensade e-postadresser i ert Google-kalkylark för beständig lagring.
- Öppna Append Emails to Sheet och ställ in Operation till
append. - Ställ in Document till ert målkalkylark via Document ID (ersätt
[YOUR_ID]). - Välj Sheet Name som
Email Sheet(värdegid=0). - Mappa emails till
{{ $json.emails }}i kolumnmappningen. - Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-uppgifter i Append Emails to Sheet.
Steg 7: testa och aktivera ert arbetsflöde
Kör ett manuellt test för att verifiera extraktion, filtrering och att rader läggs till i kalkylarket innan ni går live.
- Klicka på Execute Workflow för att köra från Manual Launch Trigger.
- Bekräfta att Fetch Maps Listings returnerar data och att Derive Website Links skickar ut webbplats-items.
- Verifiera att Parse Email Addresses skapar en
emails-array och att Discard Empty Emails filtrerar korrekt. - Kontrollera att Append Emails to Sheet lägger till rader i ert Google-kalkylark med nya e-postadresser.
- När allt är verifierat, slå på arbetsflödet Active för användning i produktion.
Felsökningstips
- Google Sheets-autentisering kan gå ut eller kräva specifika behörigheter. Om saker slutar fungera: kontrollera först credential-väljaren i Google Sheets-noden och ditt Google-kontos OAuth-åtkomst i consent-skärmen.
- Om du använder Wait-noder eller extern rendering av webbplatser varierar processtiderna. Öka väntetiden om noder längre ned fallerar på tomma svar.
- Regexen för e-postextraktion fångar mycket, inklusive skräp som “example@domain”. Lägg till egna filtreringsregler i “Discard Empty Emails” eller i parsningkoden om du fortsätter se platshållare.
Snabba svar
Cirka 1–2 timmar, mest för att sätta upp Sheets och testa små batchar.
Nej. Du klistrar in färdigskriven JavaScript i arbetsflödets kodnoder och justerar några variabler.
Ja. n8n har ett gratis alternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer startar på 20 USD/månad för högre volym. Du behöver också räkna med 0 USD i API-avgifter här, eftersom arbetsflödet använder HTTP-skrapning i stället för betalda lead-API:er.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och hanterar n8n bra. Egen hosting ger obegränsat antal körningar men kräver grundläggande serveradministration.
Ja, och det bör du sannolikt göra. Du kan ändra vad som söks genom att redigera Google Sheets-fliken “searches” och sedan justera gränsen i “Cap Batch Size” samt Wait-noderna för att skrapa mer aggressivt eller mer säkert. Om du vill ha rikare resultat kan du bygga ut logiken i “Retrieve Site HTML” så att den även hämtar en /contact- eller /about-sida när startsidan saknar e-post. Du kan också justera koden i “Parse Email Addresses” för att exkludera rollkonton du inte vill ha (som careers@ eller noreply@).
Oftast handlar det om utgången OAuth-åtkomst eller att fel Google-konto är anslutet. Återanslut Google Sheets-credential i n8n och bekräfta sedan att Sheet ID matchar i varje Sheets-node. Kontrollera också delningsbehörigheter på själva kalkylarket; om kontot inte kan redigera kommer append att misslyckas även om läsning fungerar. Om det bara fallerar ibland kan du slå i Googles request-limiter vid stora körningar, så sänk batchstorleken och lägg till lite mer väntetid.
I egenhostad n8n finns ingen körningsgräns, så volymen beror främst på din server och hur konservativa dina fördröjningar är.
Ofta, ja. Det här arbetsflödet bygger på HTML-skrapning, loopar i batchar, anpassad parsning och avdupliceringslogik, vilket är precis där Zapier kan bli både klumpigt och dyrt. n8n gör det enklare att styra hastighetsbegränsning med Wait-noder, och kodstegen gör att du kan anpassa när Googles sidstruktur ändras. Nackdelen är att du gör lite mer initial uppsättning och testning. Om du bara behöver ett lätt flöde som “spara listningar i en tabell” kan Zapier eller Make gå snabbare. Prata med en automationsexpert om du vill ha hjälp att välja.
När det här väl rullar slutar listbygge att vara flaskhalsen. Arbetsflödet sköter den repetitiva städningen så att du kan fokusera på målgruppsurval och budskap.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.