Att bygga en lokal leadlista låter enkelt tills du sitter tre flikar in, kopierar och klistrar in företagsnamn, rättar konstig formatering och ändå saknar hälften av e-postadresserna. Då inser du att du redan har skrapat samma ställen förra veckan. Igen.
Det här drabbar marknadsförare som kör lokala kampanjer först, men byråägare och konsulter som prospekterar känner av det också. Automatisering av Google Maps-leads gör den röriga, manuella “researchdagen” till ett repeterbart arbetsflöde som levererar ett strukturerat kalkylark du faktiskt kan använda.
Det här arbetsflödet hämtar prospekt från Google Maps via SerpAPI, skrapar varje webbplats med Apify, använder GPT‑4o för att extrahera offentliga e-postadresser och skriver sedan allt till Google Sheets samtidigt som sökningar markeras som klara. Du får se vad det gör, varför det spelar roll och vad du bör tänka på innan du kör det.
Så fungerar den här automatiseringen
Se hur det här löser problemet:
n8n Workflow Template: Google Sheets + Apify: rensa Google Maps-leadlistor
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:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Execute Workflow", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Extract Search Terms", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Keep Unprocessed Rows", 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/>Filter to first row"]
n8@{ icon: "mdi:database", form: "rounded", label: "Mark Row as Completed", pos: "b", h: 48 }
n9@{ icon: "mdi:web", form: "rounded", label: "Search Google Maps", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Format output as table"]
n11@{ icon: "mdi:database", form: "rounded", label: "Save Emails to Sheet", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Scrape Web Page"]
n13@{ icon: "mdi:robot", form: "rounded", label: "Extract Email - AI Agent", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Reduce to 1 row", pos: "b", h: 48 }
n3 --> n11
n3 --> n14
n3 --> n12
n14 --> n4
n12 --> n13
n1 -.-> n13
n9 --> n10
n7 --> n8
n7 --> n9
n5 --> n6
n6 --> n7
n10 --> n3
n13 --> n3
n2 -.-> n13
n0 --> n5
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 n2,n13 ai
class n1 aiModel
class n6 decision
class n5,n8,n11 database
class n9,n12 api
class n7,n10 code
classDef customIcon fill:none,stroke:none
class n7,n10,n12 customIcon
Utmaningen: strukturerade leadlistor från rörig lokal data
Lokal prospektering havererar på tråkiga, dyra sätt. Du söker i Google Maps, öppnar listningar en och en, kopierar ett telefonnummer som är formaterat på fem olika sätt och klistrar in en adress som inte passar dina CRM-fält. Sedan går du till webbplatsen och hoppas att det finns en e-postadress någonstans, men hittar bara ett kontaktformulär och ett dussin sidor att gå igenom. När du väl har byggt en “hyfsad” lista är den inaktuell, full av dubbletter och du litar ärligt talat inte tillräckligt på den för att köra outreach i skala.
Det är inte ett stort haveri. Det är högen av små friktioner som håller dig fast i kalkylarks-skärselden.
- Du gör om samma söktermer eftersom det inte finns någon pålitlig “bearbetad”-flagga.
- Manuell kopiera/klistra in skapar subtila fel, så din outreach studsar eller så misslyckas CRM-importer.
- E-postjakt blir flik-hoppande, och bästa utfallet är ändå “kanske hittade vi en”.
- Din lista blir en engångsprodukt i stället för ett system du kan köra varje vecka.
Lösningen: Google Maps-sökning + webbskrapning + e-postextrahering
Det här arbetsflödet börjar med en enkel “single source of truth”: en flik i Google Sheet som heter “Searches” där du sparar söktermer och platser. När du kör det läser det bara rader som inte är markerade som Complete, så du fortsätter inte att hämta samma prospekt. För varje par av sökterm + område frågar SerpAPI Google Maps och returnerar grundläggande företagsdetaljer som namn, webbplats, adress och telefon. Därefter besöker arbetsflödet varje webbplats via Apifys Fast Website Content Crawler och skickar sedan det skrapade innehållet till en GPT‑4o AI Agent som specifikt letar efter offentligt angivna e-postadresser. Till sist skrivs allt till en “Results”-flik och den ursprungliga sökraden markeras som Complete så att arbetsflödet kan köras om på ett säkert sätt.
Flödet är medvetet enkelt. Google Sheets ger kön, SerpAPI levererar Maps-datan, Apify hämtar sidinnehåll och GPT‑4o extraherar en e-postadress när den finns. Du får en prydlig resultattabell redo för outreach eller CRM-import, inte ett halvfärdigt researchprojekt.
Vad som förändras: före vs. efter
| Det här tar bort | Effekt du märker |
|---|---|
|
|
Praktisk effekt
Säg att du kör 10 sökningar i veckan (som “tandläkare” i 10 förorter) och vanligtvis samlar 20 prospekt per sökning. Manuellt tar även en snabb genomgång kanske 5 minuter per företag mellan Maps, webbplatsen och att klistra in i Sheets, vilket blir cirka 15 timmar för 200 leads. Med det här arbetsflödet lägger du runt 20 minuter på att sätta upp de 10 raderna i “Searches”-fliken och låter sedan automatiseringen köra medan den hämtar, skrapar och skriver resultat. Du kommer fortfarande granska outputen, men du gör inte längre 200 små, repetitiva uppgifter.
Krav
- n8n-instans (prova 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 resultat.
- SerpAPI för sökresultat från Google Maps.
- Apify för att crawla företagswebbplatser efter sidinnehåll.
- OpenAI API-nyckel (hämta den från OpenAI-plattformens dashboard).
Kunskapsnivå: Medel. Du kopplar konton, installerar nödvändiga community-noder och klistrar in några API-nycklar på rätt ställen.
Behöver du hjälp att implementera detta? Prata med en automatiseringsexpert (gratis 15-minuters konsultation).
Flödet i arbetsflödet
Google Sheets startar allt. När du kör arbetsflödet läser det rader från din “Searches”-flik och filtrerar bort allt som redan är markerat som Complete, så att det bara bearbetar nya sökningar.
Varje sökterm blir en Google Maps-fråga. Arbetsflödet skickar sökterm + plats till SerpAPI och formaterar sedan svaret till en konsekvent “resultattabell”-struktur (namn, webbplats, adress, telefon och den ursprungliga sökkontexten).
Webbplatser hämtas och skannas efter e-post. Med en HTTP-förfrågan till Apifys crawler hämtas sidinnehåll för varje webbplats. Därefter extraherar GPT‑4o AI Agent eventuella offentligt angivna e-postadresser och returnerar strukturerad JSON så att du slipper tolka rörig text.
Allt landar tillbaka i Google Sheets (och kan även skickas vidare till ett CRM). Arbetsflödet skriver varje berikad rad till din “Results”-flik och uppdaterar statusen på källraden till Complete. Det finns också noder som stödjer att skicka leads till verktyg som Pipedrive om du vill gå direkt från research till pipeline.
Du kan enkelt ändra kolumnerna i “Searches” för att lägga till nisch-taggar, tilldelning av säljare eller kampanjnamn, och sedan skriva de fälten till Results-outputen. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera den manuella triggern
Det här arbetsflödet startar vid behov och gör att ni kan köra en batch med sökningar manuellt och bearbeta resultaten.
- Lägg till noden Manual Execution Start som din trigger.
- Lämna alla inställningar som standard i Manual Execution Start (inga parametrar krävs).
- Koppla Manual Execution Start till Retrieve Search Phrases.
Steg 2: anslut Google Sheets
Dessa noder hämtar sökfraser, uppdaterar bearbetningsstatus och lagrar extraherade e-postadresser.
- Öppna Retrieve Search Phrases och ställ in Document till
[YOUR_ID]och Sheet tillgid=0(Sökningar). - Autentiseringsuppgifter krävs: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter i Retrieve Search Phrases.
- Öppna Update Row Status och behåll Operation som
appendOrUpdatemed Matching Columns inställt påSearch. - Verifiera att kolumnmappningen i Update Row Status inkluderar Search satt till
{{ $json.Search }}och Complete satt tillYes. - Autentiseringsuppgifter krävs: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter i Update Row Status.
- Öppna Store Emails in Sheet och behåll Operation som
appendOrUpdate, Sheet inställt på1470668196(Resultat) och Document inställt på[YOUR_ID]. - Säkerställ att kolumnmappningarna i Store Emails in Sheet inkluderar:
- Area →
{{ $('Retrieve Search Phrases').item.json.Area }} - Search →
{{ $('Retrieve Search Phrases').item.json.Search }} - Search Name →
{{ $('Retrieve Search Phrases').item.json['Area Name'] }} - title →
{{ $('Format Results Table').item.json.title }} - website →
{{ $('Format Results Table').item.json.website }} - address →
{{ $('Format Results Table').item.json.address }} - phone →
{{ $('Format Results Table').item.json.phone }} - email (Manual Entry) →
{{ $json.output.email }}
- Area →
- Autentiseringsuppgifter krävs: Anslut era googleSheetsOAuth2Api-autentiseringsuppgifter i Store Emails in Sheet.
Steg 3: konfigurera sökfiltrering och routning
Det här avsnittet filtrerar fram ofullständiga rader, väljer en enda sökfras och förgrenar i parallella spår.
- I Filter Pending Rows, ställ in villkoret Complete till is empty med
{{ $json.Complete }}. - I Select First Record, behåll koden som
return [items[0]];för att bearbeta en sökning i taget. - Koppla Retrieve Search Phrases → Filter Pending Rows → Select First Record.
- Säkerställ att Select First Record skickar utdata till både Update Row Status och Query Google Maps parallellt.
Steg 4: konfigurera Google Maps-sökning och tolkning av resultat
Det här segmentet frågar Google Maps via SerpApi och formaterar resultaten till individuella poster.
- Öppna Query Google Maps och ställ in Operation till
google_maps. - Ställ in q till
{{ $json.Search }}och ll till{{ $json.Area }}i Query Google Maps. - Autentiseringsuppgifter krävs: Anslut era serpApi-autentiseringsuppgifter i Query Google Maps.
- I Format Results Table, behåll JavaScript-koden som rensar webbplats-URL:er och skickar ut
title,website,addressochphonesom separata items. - Koppla Query Google Maps → Format Results Table → Iterate Through Records.
Steg 5: konfigurera hämtning av webbinnehåll och AI-extraktion av e-post
I det här steget crawlas varje företags webbplats och en e-postadress extraheras med hjälp av AI.
- I Fetch Web Content, ställ in URL till
=https://api.apify.com/v2/acts/6sigmag~fast-website-content-crawler/run-sync-get-dataset-items. - Ställ in Method till POST och JSON Body till
{"startUrls":[ "{{ $json.website }}" ]}i Fetch Web Content. - Autentiseringsuppgifter krävs: Anslut era httpQueryAuth-autentiseringsuppgifter i Fetch Web Content.
- I AI Email Extractor, ställ in Text till
{{ $json.text }}och behåll Prompt Type som define med Has Output Parser aktiverat. - Säkerställ att OpenAI Chat Engine är ansluten som språkmodell för AI Email Extractor och att Structured Output Decoder är ansluten som output parser.
- Autentiseringsuppgifter krävs: Anslut era openAiApi-autentiseringsuppgifter i OpenAI Chat Engine (autentiseringsuppgifter läggs till på den överordnade modellen, inte i parsern).
- Behåll schemat i Structured Output Decoder som
{ "email": "emailaddress" }för att standardisera utdata. - Koppla Iterate Through Records → Fetch Web Content → AI Email Extractor → Iterate Through Records (andra utdata-loopen).
Steg 6: konfigurera parallella utdata och sub-workflow
Resultaten sparas i arket samtidigt som en sammanfattning skickas till ett sub-workflow.
- Bekräfta att Iterate Through Records skickar utdata till både Store Emails in Sheet och Summarize Single Row parallellt.
- I Summarize Single Row, behåll Fields to Summarize inställt så att det inkluderar
title. - Öppna Run Sub-Workflow (Configure Required) och välj ett Workflow i Workflow ID.
- Koppla Summarize Single Row → Run Sub-Workflow (Configure Required).
Steg 7: testa och aktivera ert arbetsflöde
Verifiera att hela körningen fungerar och aktivera sedan arbetsflödet för löpande användning.
- Klicka på Execute Workflow för att köra Manual Execution Start och bearbeta en väntande sökning.
- Verifiera att Update Row Status markerar raden som Complete med
Yes. - Bekräfta att Store Emails in Sheet skriver poster med förväntade fält, inklusive
email (Manual Entry). - Kontrollera att AI Email Extractor skickar ut antingen en e-postadress eller
nullioutput.email. - Om allt ser korrekt ut, växla arbetsflödet till Active för användning i produktion.
Se upp med
- Google Sheets-åtkomst fallerar oftare än man tror. Om rader slutar uppdateras: kontrollera din Google OAuth-anslutning i n8n och bekräfta att kontot fortfarande har redigeringsåtkomst till arket.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstiderna. Öka väntetiden om efterföljande noder misslyckas på tomma svar.
- SerpAPI och Apify har båda användningsgränser. Om arbetsflödet plötsligt returnerar partiella resultat: kontrollera din SerpAPI-dashboard för rate limiting och dina Apify-körningar för misslyckade crawls, och minska sedan batchstorleken.
Vanliga frågor
Cirka en timme om du redan har API-nycklarna och en kopia av Google Sheet-mallen.
Ja, men du vill ha någon som är bekväm med att koppla konton och API-nycklar. Det svåraste är oftast att installera community-noderna och säkerställa att kolumnerna i Google Sheet matchar.
Ja. n8n har ett gratis self-hosted-alternativ 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 SerpAPI, Apify och OpenAI-användning.
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 hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serveradministration.
Det kan du. Byt ut strukturen i Google Sheets “Searches” så att den inkluderar vertikal-taggar (som “brådskande” eller “högt värde”), och mappa sedan de fälten till steget “Store Emails in Sheet” så att varje resultat förblir segmenterat. Om du föredrar en annan crawler kan du ersätta Apify-förfrågan “Fetch Web Content” med en annan scraper så länge den returnerar HTML eller sidtext till AI Email Extractor. Och om du vill ha ett CRM-först-flöde kan du skicka rader till Pipedrive efter e-postextraheringen i stället för att vänta på en manuell import.
Oftast har OAuth-tokenen gått ut eller så har Google-kontot du autentiserade med tappat åtkomst till arket. Återanslut Google Sheets-autentiseringen i n8n, öppna sedan kalkylarket och bekräfta att samma konto kan redigera både flikarna “Searches” och “Results”.
Om du self-hostar beror kapaciteten främst på din server samt dina SerpAPI/Apify-gränser. På n8n Cloud beror det på din plans tillåtna antal körningar, och det här arbetsflödet kan förbruka flera körningar per körning eftersom det loopar genom resultaten. I praktiken börjar de flesta team med några sökningar per dag, bekräftar datakvaliteten och skalar sedan upp när de är trygga med rate limits och kostnader.
Ofta, ja. Det här arbetsflödet bygger på loopar, strukturerad tolkning och ett AI Agent-steg, vilket är där Zapier/Make-upplägg kan bli sköra eller dyra när volymen växer. n8n ger dig också self-hosting, så du kan köra stora batcher utan att betala per task. Nackdelen är uppsättning: du hanterar fler rörliga delar (community-noder, API-nycklar, datastruktur). Prata med en automatiseringsexpert om du vill ha en snabb rekommendation baserad på din veckovolym av leads.
När det här väl rullar blir din leadlista något du tar fram vid begäran, inte något du bävar inför. Arbetsflödet gör det repetitiva grävandet så att du kan lägga tiden på targeting, budskap och uppföljning.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.