Leadlistor faller isär i den röriga mitten. Du börjar med en bra sökning, men så blir det fliköverflöd, copy-paste-fel och “vi rensar det senare”-data som aldrig blir rensad.
Det här är den typ av Google Maps-leads-automation som sparar SDR:er timmar, men lokala marknadsföringsbyråer och solokonsulter känner också av lättnaden. I stället för att bygga listor för hand kan du generera ett berikat ark på beställning, med dubbletter borttagna innan de hinner slösa din tid.
Nedan ser du hur flödet hämtar företag från Google Sök och Google Maps, skrapar kontaktuppgifter från deras webbplatser och loggar felfria rader i Google Sheets så att du kan börja med outreach samma dag.
Så fungerar automationen
Hela n8n-flödet, från trigger till slutresultat:
n8n Workflow Template: Google Maps till Google Sheets, leads vid begäran
flowchart LR
subgraph sg0["When chat message received Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When chat message received", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", 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/code.svg' width='40' height='40' /></div><br/>Extract URLs"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Scrape Google Maps"]
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Google URLs", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet1", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates3", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet2", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items1", pos: "b", h: 48 }
n14["<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/>Setting Pagination"]
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop for Multiple Page Search", pos: "b", h: 48 }
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/>Custom Google Search API"]
n17["<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/>Flatten Output Items"]
n18["<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/>Information Extraction"]
n19@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates From Searc..", pos: "b", h: 48 }
n20["<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 Site2"]
n21@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Site scrapped", 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/code.svg' width='40' height='40' /></div><br/>Extract Required Fields"]
n23@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set All Fields", pos: "b", h: 48 }
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set URL for Validation", pos: "b", h: 48 }
n25["<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/merge.svg' width='40' height='40' /></div><br/>Not Duplicate Search Results"]
n26@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Site Exists", pos: "b", h: 48 }
n27@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Exclude Articles and Blogs", pos: "b", h: 48 }
n28@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates For Sheets", pos: "b", h: 48 }
n29@{ icon: "mdi:database", form: "rounded", label: "Add Search Results in Sheets", pos: "b", h: 48 }
n30["<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/>Prepare Query for Maps"]
n31["<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 Map Sites"]
n32["<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 Information"]
n33@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set URL Validaiton", pos: "b", h: 48 }
n34["<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/merge.svg' width='40' height='40' /></div><br/>Validating Unique Results"]
n35@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Site exists", pos: "b", h: 48 }
n1 --> n2
n1 --> n13
n8 --> n32
n5 --> n7
n20 --> n21
n26 --> n27
n35 --> n11
n23 --> n13
n4 --> n34
n4 --> n31
n21 --> n22
n21 --> n13
n13 --> n25
n13 --> n20
n31 --> n8
n3 --> n4
n7 --> n3
n11 --> n12
n6 --> n5
n33 --> n34
n14 --> n15
n32 --> n4
n9 --> n24
n17 --> n18
n10 --> n33
n18 --> n19
n30 --> n6
n24 --> n25
n22 --> n23
n16 --> n17
n34 --> n35
n27 --> n28
n0 --> n14
n0 --> n9
n0 --> n30
n0 --> n10
n25 --> n26
n28 --> n29
n15 --> n1
n15 --> n16
n19 --> n15
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,n7,n21,n26,n27,n35 decision
class n2,n9,n10,n12,n29 database
class n6,n16,n20,n31 api
class n5,n14,n17,n18,n22,n30,n32 code
classDef customIcon fill:none,stroke:none
class n5,n6,n14,n16,n17,n18,n20,n22,n25,n30,n31,n32,n34 customIcon
Problemet: leadlistor blir smutsiga innan du ens skickar första mejlet
Om du någon gång har försökt bygga en “snabb” prospektlista från Google känner du redan igen fällan. De första 10 resultaten ser lovande ut. Sedan inser du att hälften av företagen är samma bolag som dyker upp på olika ställen, den andra hälften saknar synlig e-post, och telefonnumren är inkonsekventa (sidfoten, kontaktsidan, en slumpmässig kataloglistning). Nu gör du detektivarbete i stället för outreach. Och eftersom datan är utspridd kan du inte enkelt spåra vilken sökfråga som skapade leadet, vilket gör att nästa lista drar in samma företag igen.
Friktionen byggs på. Här är var det fallerar.
- Att kopiera namn, URL:er och telefonnummer till ett kalkylark tar cirka 2 timmar för en lista med 100 leads.
- Dubbletter smyger in när Google Maps och organisk sök överlappar, så reps slösar tid på att “kvalificera om” samma företag två gånger.
- Kontaktuppgifter är gömda på webbplatsen, vilket tvingar fram manuell klickning genom menyer, popups och kontaktsidor.
- Listkvaliteten är ojämn, så din outreach ser slarvig ut och svarsfrekvensen sjunker av skäl du inte snabbt kan felsöka.
Lösningen: chattstyrd skrapning som skriver felfria leads till Google Sheets
Det här flödet gör leadgenerering till en enkel begäran: du skriver en sökfråga i ett chattgränssnitt (som “dentists in New York”), och n8n gör grovjobbet. Det hämtar resultat från två ställen samtidigt: Google Sök (via Google Custom Search API) och Google Maps (via skrapning). Sedan samlar det in varje företagswebbplats som hittas, besöker sidorna och extraherar kontaktuppgifter från sidans HTML. Det är här det blir praktiskt: det letar efter e-postadresser, telefonnummer och sociala länkar så att du slipper leta. Innan något hamnar i ditt kalkylark avdubblettar flödet leads och kontrollerar ditt befintliga Google-ark, så att du behåller en felfri rad per företag.
Flödet startar med din chattfråga, loopar sedan genom flera söksidor och Maps-resultat för att bygga en sammanslagen leadpool. Därefter skrapar det varje webbplats, extraherar kontaktuppgifter, slår ihop resultaten och lägger till endast unika rader i Google Sheets, tillsammans med den ursprungliga sökfrågan för spårning.
Vad du får: automation vs. resultat
| Det här flödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här ser det ut
Säg att du behöver 150 lokala leads för en ny kampanj. Manuellt, om du lägger cirka 1 minut per lead på att kopiera företagsnamn, URL och telefon, plus ytterligare en minut på att klicka runt för att hitta en e-postadress, blir det ungefär 5 timmar av pilljobb. Med det här flödet klistrar du in en sökfråga i chatten, låter det samla resultat från Sök och Maps och väntar tills skrapningen är klar. Du granskar fortfarande arket, men “bygga listan”-delen blir en snabb kontroll i stället för ett halvdagsprojekt.
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 den berikade leadlistan
- Google Custom Search API för att hämta resultat från Google Sök
- API-nyckel + Search Engine ID (cx) (hämta dem från Google Cloud och Programmable Search Engine)
Kunskapsnivå: Medel. Du kopplar främst konton och klistrar in API-uppgifter, men du bör vara bekväm med att testköra och justera några inställningar.
Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuterskonsultation).
Så fungerar det
Du börjar med en chattfråga. En användare skriver något i stil med “roofers in Austin” i flödets chattgränssnitt (drivet av n8n LangChain chat trigger). Meddelandet blir “arbetsordern” för hela körningen.
Resultat från Sök och Maps samlas in parallellt. En gren bygger en pagineringslista och anropar Google Custom Search API över flera sidor. En annan gren formaterar en Maps-fråga, skrapar Google Maps, parsar länkar och filtrerar ner dem till företagens webbplatser.
Webbplatser skrapas och kontaktuppgifter extraheras. För varje unik URL hämtar flödet HTML:en, kontrollerar att skrapningen lyckas och kör anpassad parsning för att plocka ut e-postadresser, telefonnummer och sociala länkar. Det sätter också ihop konsekventa leadfält så att arket förblir prydligt.
Dubbletter tas bort innan något skrivs till arket. Flödet hämtar befintliga rader i Google Sheets, kontrollerar om URL:en redan finns, filtrerar bort innehållstyper som inte är användbara och lägger bara till felfria, nya leads tillsammans med den ursprungliga sökfrågan.
Du kan enkelt ändra sökfrågans format för att rikta in dig på andra städer, nischer eller nyckelord utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: konfigurera chattriggern
Konfigurera intaget så att arbetsflödet kan ta emot en sökfråga och starta processen för lead-insamling.
- Lägg till noden Chat Intake Trigger som trigger.
- Lämna Options tomt eller anpassa om ni vill begränsa eller formatera chattinmatningar.
- Observera att Chat Intake Trigger skickar vidare till fyra noder parallellt: Build Pagination List, Fetch Sheet Rows, Format Maps Query och Fetch Sheet Rows Alt.
{{$('Chat Intake Trigger').item.json.chatInput}} för sökning och loggning.Steg 2: anslut Google Sheets
Dessa noder läser och lägger till lead-poster i ert kalkylark. Konfigurera samma dokument och blad i alla Google Sheets-noder.
- Öppna Fetch Sheet Rows och ställ in Document till
[YOUR_ID]och Sheet Name tillgid=0. - Upprepa samma dokument- och bladinställningar i Fetch Sheet Rows Alt.
- I Append Lead Row, säkerställ att kolumnmappningarna matchar uttrycken som
{{$json.URL}},{{$json["Business Name"]}}och{{$('Chat Intake Trigger').item.json.chatInput}}. - I Append Enriched Lead, bekräfta att Type är inställt på
websiteoch mappa fält som{{$json.businessName}}och{{$json.email1}}. - I Write Leads to Sheet, bekräfta att mappningar som
{{$json.URL}},{{$json.Name}}och{{$json.Email1}}är i linje med era bladkolumner.
Steg 3: sätt upp paginering och intag för Google-sökning
Den här grenen paginerar genom resultat från Google Custom Search API och extraherar grundläggande lead-fält.
- I Build Pagination List, behåll JavaScript-arrayen med startindex som
[ 1, 11, 21, 31]. - Säkerställ att Page Loop Handler delar upp batcher från Build Pagination List och routar till Google Search Request.
- I Google Search Request, ställ in frågeparametrarna: key till
[CONFIGURE_YOUR_API_KEY], cx till[YOUR_ID], q till{{$('Chat Intake Trigger').item.json.chatInput}}och start till{{$json.start}}. - Behåll Flatten Search Items och Extract Search Fields som de är för att omvandla API-svar till lead-poster.
- Använd Dedup Search Results för att ta bort dubbletter genom att sätta Fields to Compare till
=URL.
[CONFIGURE_YOUR_API_KEY] eller [YOUR_ID] i Google Search Request kommer API-anropet att misslyckas. Ersätt dem med era Custom Search-credentials.Steg 4: konfigurera pipeline för Maps-sökning och filtrering
Den här grenen skrapar Google Maps-resultat, filtrerar bort irrelevanta länkar och förbereder webbplatser för skrapning.
- I Format Maps Query, behåll skriptet som bygger
searchQuerygenom att ersätta mellanslag med+. - Ställ in Maps Search Scraper URL till
=https://www.google.com/maps/search/{{$json.searchQuery}}. - I Parse Map Links, behåll regex-logiken som extraherar URL:er från
$input.first().json.data. - I Filter Map Links, behåll de fyra notContains-kontrollerna för
schema,google,ggochgstaticmed{{$json.website}}. - Routa via Eliminate Map Duplicates och Iterate Map URLs till batchbearbetning för skrapning.
Steg 5: skrapa och berika lead-data
Det här steget skrapar webbplatser, extraherar kontaktuppgifter och sammanställer berikade lead-poster.
- I Scrape Lead Site, behåll URL som
{{$json.URL}}och Response Format som text för HTML-tolkning. - Använd Scrape Success Check för att validera att
{{$json.data}}finns innan extraktion. - Behåll Extract Contact Details som den är för att tolka e-post, telefonnummer och sociala länkar från HTML.
- I Assemble Lead Data, behåll tilldelningar som Name satt till
{{$('Iterate Search Leads').item.json["Business Name"]}}och Email 2 till{{$json.email2}}. - I Maps-grenen, behåll Delay Throttle Amount satt till
1för att minska risken för rate limiting. - Använd Parse Map Contacts för att extrahera företagsdata från HTML-innehållet som returneras av Scrape Map Websites.
Steg 6: tillämpa deduplicering och villkorsstyrd routing
Flera kontroller och sammanslagningar säkerställer att endast unika, giltiga leads går vidare till ert blad.
- Använd Merge Unique Search med Fields to Match inställt på
['URL']och Join Mode inställt påkeepNonMatches. - Ställ in URL Exists Check för att validera att
{{$json.URL}}finns innan innehållsfiltrering. - Konfigurera Filter Content Types för att behålla icke-artikelinnehåll med hjälp av de befintliga villkoren på
{{$json.Type}}. - Kör Dedup Before Sheet för att ta bort dubbletter innan skrivning via Write Leads to Sheet.
- I Maps-flödet, använd Merge Unique Maps och URL Exists Check 2 för att validera unika URL:er före Final Deduplication.
Steg 7: konfigurera utdata till Sheets
Två utdata skriver lead-data: omedelbara poster från sökresultat och berikade poster baserade på webbplatsdata.
- I Write Leads to Sheet, bekräfta att mappningen använder
{{$json.URL}},{{$json.Name}}och{{$json.Email1}}. - I Append Enriched Lead, bekräfta att mappningen använder
{{$json.businessName}},{{$json.email1}}och{{$json.phone}}. - Använd Append Lead Row för att fånga sökresultat där e-post finns; flödet är Email Present Check → Append Lead Row.
Steg 8: testa och aktivera ert arbetsflöde
Verifiera varje gren och bekräfta att rader läggs till i ert Google Sheet innan ni aktiverar.
- Klicka på Execute Workflow och ange en chattinmatning (t.ex. en branschkategori och plats) i Chat Intake Trigger.
- Verifiera att Chat Intake Trigger skickar vidare till Build Pagination List, Fetch Sheet Rows, Format Maps Query och Fetch Sheet Rows Alt parallellt.
- Kontrollera att Write Leads to Sheet och Append Enriched Lead lägger till rader i ert kalkylark med ifyllda fält.
- När det fungerar, slå på arbetsflödet till Active för att köra i produktion.
Vanliga fallgropar
- Inloggningsuppgifter för Google Custom Search API kan löpa ut eller begränsas. Om det skapar fel, kontrollera först din Google Cloud API-nyckel och om Custom Search API är aktiverat i projektet.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder misslyckas på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du att redigera utdata för alltid.
Vanliga frågor
Cirka 30–60 minuter om din Google API-åtkomst är klar.
Nej. Du kopplar Google-konton, klistrar in API-uppgifter och testkör några gånger.
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å ta hänsyn till användningen av Google Custom Search API, som beror på din frågevolym.
Två alternativ: n8n Cloud (hanterat, enklast att sätta upp) 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 mest en fråga om att ändra sökfrågan. Uppdatera formatet för chattfrågan och, vid behov, justera kodnoden “Format Maps Query” så att din Maps-skrapning träffar rätt platsbegrepp. Du kan också justera if-noden “Filter Content Types” för att hoppa över irrelevanta URL:er (som PDF:er eller katalogsidor). Vanliga anpassningar är att lägga till branschnyckelord, tvinga ett stad/delstat-mönster och skriva till en separat Google Sheet-flik per kampanj.
Oftast är det en utgången Google OAuth-anslutning i n8n eller fel behörigheter för kalkylarket. Återanslut din Google Sheets-autentisering i n8n och bekräfta sedan att exakt Spreadsheet (Document ID) och Sheet Name fortfarande finns. Om du nyligen duplicerade ett ark kan flödet fortfarande peka på den gamla filen. Kontrollera också om din Google Workspace-admin begränsar API-åtkomst, eftersom det kan blockera skrivningar även när inloggningen “fungerar”.
Det beror främst på dina gränser i Google Custom Search API och hur aggressiva dina batch-/wait-inställningar är. På n8n Cloud har Starter-planen ett månatligt tak för körningar (högre planer stödjer mer). Om du hostar själv finns ingen körningsgräns, men din server och Googles rate limits spelar fortfarande roll. I praktiken kör många team batchar på några hundra leads per sökfråga för att hålla skrapningen stabil och undvika timeouts.
För just det här jobbet är n8n oftast bättre, eftersom skrapning, loopar, avdubblettning och villkorslogik snabbt blir komplext. Zapier och Make kan lösa delar av det, men du stöter ofta på begränsningar när du lägger till paginering, batchning och webbplatsparsning. n8n ger dig också möjlighet till egen hosting, vilket kan vara viktigt när du kör stora prospekteringsuttag. Om du bara vill ha “ny rad i arket när ett formulär skickas in”, håll det enkelt och använd det du redan betalar för. Prata med en automationsexpert om du vill ha hjälp att välja den renaste vägen.
När detta väl rullar slutar listbygge att vara ett projekt. Det blir en snabb begäran, ett strukturerat ark och en kortare väg till riktiga samtal.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.