Din leadlista ser “klar” ut tills du öppnar den. Halva raderna saknar e-post, några webbplatser är nere, och du slutar med att klicka runt som om det vore ditt jobb (för det är det ju, om vi ska vara ärliga).
E-postskrapning från Maps märks som mest när du bygger lokal outreach i stor skala. En marknadschef som försöker fylla pipelinen känner det. En liten byråägare som gör lead gen åt kunder känner det också. Samma problem, olika press.
Det här n8n-flödet tar Google Maps-leads som redan ligger i Google Sheets, crawler varje företags webbplats, hittar e-postadresser och skriver tillbaka dem i arket (eller markerar “Not Found”). Du får se hur det fungerar, vad du behöver och vilka resultat du kan förvänta dig.
Så fungerar den här automationen
Det kompletta n8n-flödet, från trigger till slutresultat:
n8n Workflow Template: Google maps till Google sheets med ifyllda mejl
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@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
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/>Code"]
n4["<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/>HTTP Request"]
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/code.svg' width='40' height='40' /></div><br/>Extract Pages"]
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch internal page"]
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/code.svg' width='40' height='40' /></div><br/>Extract Email"]
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email Found Internal", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email Found", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Email Updated", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Email Updated Internal", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Email Not Found", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n15 --> n3
n15 --> n14
n3 --> n11
n6 --> n7
n11 --> n12
n11 --> n5
n4 --> n15
n4 --> n14
n12 --> n2
n9 --> n10
n5 --> n6
n14 --> n2
n2 --> n4
n7 --> n14
n7 --> n8
n8 --> n9
n1 --> n2
n10 --> n13
n10 --> n7
n13 --> n2
n0 --> n1
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 n10,n11,n15 decision
class n1,n12,n13,n14 database
class n4,n8 api
class n3,n5,n9 code
classDef customIcon fill:none,stroke:none
class n3,n4,n5,n8,n9 customIcon
Problemet: leadlistor med saknade e-postadresser stoppar outreach
Att skrapa företag från Google Maps är den enkla delen. Den långsamma delen är att förvandla “en lista med platser” till “en lista du faktiskt kan kontakta”. Du öppnar varje webbplats, letar efter en kontaktsida, kopierar en e-postadress, klistrar in den i Sheets och upprepar tills du blir avtrubbad. Vissa sajter gömmer e-post bakom formulär, vissa visar den bara på undersidor, och vissa hade aldrig en riktig webbplats från början. Efter en timme har du ett rörigt ark, ett dussin flikar och fortfarande inget konsekvent sätt att spåra vad du redan har kollat.
Det drar snabbt iväg. Här är var det fallerar.
- Du bränner cirka 5 minuter per lead bara på att hitta en enda e-postadress.
- Folk dubbelkollar samma rader eftersom “Processed for Email” inte uppdateras konsekvent.
- Team missar enkla vinster eftersom e-post ofta finns på interna sidor, inte på startsidan.
- Fel smyger sig in vid kopiera-klistra, och de misstagen syns senare som studsade kampanjer.
Lösningen: crawla varje sajt och skriv tillbaka e-post till Sheets
Det här flödet utgår från leads som du redan har skrapat från Google Maps till Google Sheets (med ett gratis webbläsartillägg). När du kör det hämtar n8n rader från ditt ark, jobbar igenom dem i kontrollerade batcher och besöker varje företags webbplats. Den kontrollerar först huvudsidan och bygger sedan smart en lista över interna sidor att crawla (tänk kontakt, om oss, integritet och andra sannolika ställen). När varje sida hämtas skannar den efter e-postmönster, filtrerar bort skräp och verifierar om det som hittats ser ut som en riktig intern e-postadress. Hittar den en uppdaterar den exakt rätt rad i Google Sheets. Hittar den ingen markerar den leaden som “Not Found”, så du kan sluta gissa och gå vidare.
Flödet startas med en manuell körningstrigger, så du styr när en lista bearbetas. Det läser ditt ark, crawler sajter med HTTP-förfrågningar och använder enkla logikkontroller (If-noder) för att avgöra om en e-post ska skrivas tillbaka eller om en miss ska loggas. Allt slutar där du började: ditt Google Sheet är nu redo för outreach.
Vad 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 skrapar 300 rörmokare i en stad från Google Maps till ett ark. Att manuellt hitta e-post på cirka 5 minuter per företag blir ungefär 25 timmar av klickande, kopierande och tvekan. Med det här flödet lägger du kanske 10 minuter på att förbereda arket och starta körningen, och låter sedan den crawla i bakgrunden medan du gör riktigt arbete. Även om crawlningen tar några timmar att bli klar behöver du inte passa den, och varje rad slutar med en e-postadress eller ett tydligt “Not Found”.
Det här behöver du
- 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 leads och skriva tillbaka resultat.
- Webbläsartillägg för Google Maps-skrapning för att fylla det första arket.
- Google-kontouppgifter (auktorisera Google Sheets i n8n).
Kunskapsnivå: Medel. Du importerar flödet, kopplar Google-uppgifter och justerar ett par fältnamn så att de matchar ditt ark.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuterskonsultation).
Så fungerar det
Du startar det när arket är klart. Flödet använder en manuell trigger, vilket betyder att du kör det efter att du har skrapat Google Maps-listningar till Google Sheets och satt “Processed for Email” till något i stil med Pending.
Det hämtar rader och jobbar i batcher. n8n hämtar raderna i ditt ark och loopar igenom dem i kontrollerade chunkar, så att du kan bearbeta hundratals företag utan att belasta webbplatser samtidigt.
Varje webbplats crawl’as, inte bara besöks. Först hämtas webbplatsens huvud-URL med HTTP-förfrågningar, sedan tas en lista fram över interna sidor att kontrollera. De sidorna hämtas också, och ett parsningsteg söker i HTML:en efter e-postadresser som ser legitima ut.
Ditt Google Sheet uppdateras löpande. När en e-post hittas uppdaterar flödet rätt rad (och kan även logga fynd från interna sidor). Om inget hittas efter crawlningen skriver den tillbaka “Not Found” så att din outreach-lista förblir ärlig.
Du kan enkelt ändra vad som räknas som “Processed”, vilka sidor den prioriterar att crawla eller hur den formaterar e-postfältet utifrån dina behov. Se den fullständiga implementationsguiden nedan för alternativ för anpassning.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera den manuella triggern
Det här arbetsflödet startar med en manuell körning för testning och körningar vid behov.
- Lägg till noden Manual Run Trigger som arbetsflödets trigger.
- Koppla Manual Run Trigger till Retrieve Sheet Rows för att starta dataflödet.
Steg 2: Anslut Google Sheets
Dessa noder läser och uppdaterar e-postdata i ert kalkylark.
- Öppna Retrieve Sheet Rows och konfigurera kalkylarket och fliken ni vill läsa.
- Öppna Update Sheet Email och mappa fälten för att uppdatera saknade e-postadresser i originalarket.
- Öppna Update Internal Email och mappa fält för att uppdatera interna e-postvärden från tolkade sidor.
- Öppna Log Missing Email och konfigurera målarket för loggning av saknade e-postadresser.
- Credential Required: Anslut era Google Sheets-inloggningsuppgifter i Retrieve Sheet Rows, Update Sheet Email, Update Internal Email och Log Missing Email.
Steg 3: Sätt upp batchbearbetning och transformationer
Dessa noder itererar igenom poster och förbereder data för efterföljande kontroller.
- I Batch Iterate Records ställer ni in batchstorleken för att styra hur många rader som behandlas per loop.
- Använd Transform Script för att normalisera eller omforma varje post innan validering.
- Ställ in Check Email Presence för att dela upp poster som redan har en e-postadress från dem som behöver berikning.
- Bekräfta flödet: Transform Script → Check Email Presence → Update Sheet Email.
Steg 4: Konfigurera extern och intern e-postberikning
Den här grenen berikar saknade e-postadresser med externa och interna siduppslag.
- Konfigurera External API Call för att begära kontaktdata från er externa tjänst.
- Ställ in Branch Decision för att avgöra om ni ska fortsätta med berikning eller logga saknade e-postadresser.
- I Derive Page List genererar ni en lista med interna sidor att söka efter e-postadresser på.
- Använd Separate Items och Batch Iterate Inner för att iterera igenom varje intern sid-URL.
- Konfigurera Fetch Internal Page för att hämta sidans HTML och parsa sedan e-postadresser i Parse Email Address.
- Ställ in Verify Internal Email för att routa giltiga e-postadresser till Update Internal Email och ogiltiga tillbaka till Batch Iterate Inner.
- Credential Required: Anslut era inloggningsuppgifter för HTTP Request i External API Call och Fetch Internal Page om era endpoints kräver autentisering.
continueErrorOutput. Lägg till tydlig loggning i Log Missing Email för att spåra API-fel.Steg 5: Konfigurera utdatauppdateringar
Säkerställ att uppdateringar loopar tillbaka till batchiteratorn för kontinuerlig bearbetning.
- Bekräfta att Update Sheet Email kopplar tillbaka till Batch Iterate Records för att fortsätta batchloopen.
- Bekräfta att Update Internal Email kopplar tillbaka till Batch Iterate Records efter att en e-postadress hittats.
- Verifiera att Log Missing Email kopplar tillbaka till Batch Iterate Records för att gå vidare till nästa post.
Steg 6: Testa och aktivera ert arbetsflöde
Kör ett manuellt test för att validera dataflöde och uppdateringar innan ni använder det i produktion.
- Klicka på Execute Workflow från Manual Run Trigger för att testa hela processen.
- Bekräfta att rader läses in i Retrieve Sheet Rows och bearbetas via Batch Iterate Records.
- Kontrollera att e-postuppdateringar syns i kalkylarket via Update Sheet Email och Update Internal Email, och att saknade e-postadresser loggas av Log Missing Email.
- När testerna lyckas, spara arbetsflödet och växla det till Active för produktionsanvändning.
Vanliga fallgropar
- Google Sheets-inloggningen kan löpa ut eller kräva specifika behörigheter. Om något skapar fel, kontrollera status för behörigheten i n8n och bekräfta först att kalkylarket är delat med det auktoriserade Google-kontot.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Skrapning med HTTP Request kan misslyckas på sajter med aggressivt bot-skydd eller udda omdirigeringar. Om du ser många “Not Found” för företag som tydligt har kontaktmail, kontrollera HTTP-svarskoder och headers i kördata för request-noden.
Vanliga frågor
Cirka 30 minuter om ditt Google Sheet redan är formaterat.
Nej. Du kopplar mest konton och matchar dina kolumnnamn. Kodstegen ingår redan i flödet.
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 med vanliga hostingkostnader om du kör egen hosting, men själva skrapningen kräver inget betalt tredjeparts-API.
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 dig obegränsat antal körningar men kräver grundläggande serverhantering.
Ja, och det är en av de bästa anledningarna att använda det. Du kan ändra vilka rader som plockas upp i steget “Retrieve Sheet Rows” (till exempel bara en specifik stad-flik eller bara “Pending”-leads), och du kan justera logiken i “Derive Page List” för att prioritera sidor som /contact, /about eller /impressum beroende på land. Vanliga anpassningar är att hoppa över vissa domäner, begränsa antalet interna sidor per sajt och skriva en förtroendenotering i en separat kolumn.
Oftast beror det på att Google-auktoriseringen i n8n har löpt ut eller att kalkylarket inte är åtkomligt för det kopplade Google-kontot. Återanslut Google Sheets-behörigheten och bekräfta sedan att exakt kalkylarksnamn och fliknamn fortfarande matchar vad noden förväntar sig. Om det bara misslyckas vid uppdateringar, kontrollera att flödet skriver till en kolumn som faktiskt finns (och att rubriken är stavad på samma sätt). Se även upp med skyddade intervall i Sheets, som tyst kan blockera ändringar.
Om du kör n8n med egen hosting finns ingen körningsgräns (det handlar mest om din server och hur aggressivt du crawler). I praktiken kör många team några hundra till några tusen leads per dag genom att hålla batcherna små och låta flödet gå kontinuerligt. På n8n Cloud beror gränsen på planens månatliga körningar, så mycket stora listor kan kräva en betald nivå.
Ofta, ja. Det här flödet bygger på loopar, förgreningar och webbplats-crawlning, vilket är krångligt (och vanligtvis dyrt) i verktyg som tar betalt per task och motverkar komplex logik. n8n är också enklare att köra med egen hosting, vilket är viktigt när du bearbetar stora listor. Zapier eller Make kan fortfarande vara bra om du bara vill ha ett enkelt flöde av typen “ny rad i Sheets → skicka en Slack-notis”. Om du är osäker, prata med en automationsexpert och få en snabb rekommendation baserat på din volym.
När det här väl rullar slutar ditt Google Maps-ark att vara “ett researchprojekt” och blir en fungerande outreach-lista. Sätt upp det en gång och lägg sedan tiden på budskap och uppföljning i stället för skattjakt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.