Behöver ert företag hjälp med att implementera AI? Kontakta oss och få prisoffert här →
AI Skolan
januari 22, 2026

Google Maps till Google Sheets: rensade leadlistor

Rickard Andersson Partner, Nodenordic.se

Att hämta leads från Google Maps låter enkelt tills du har 40 flikar öppna, kopierar adresser och fortfarande inte är säker på vad du redan har skrapat förra veckan. Det som verkligen dödar tiden är omarbetet: dubbletter, halvifyllda rader och ”vi städar det senare”-kalkylark som aldrig blir städade.

Marknadschefer känner av det här när pipeline-målen närmar sig. En lokal tjänsteföretagare känner av det när samtalen går ner. Och en byrå som gör lokal SEO-outreach? Samma huvudvärk. Den här automationen för Google Maps-leads hämtar företag per postnummer och kategori direkt till Google Sheets, avduplicerar och loggar körstatus så att listan förblir användbar.

Nedan ser du hur flödet körs, vad som automatiseras och vad du behöver för att sätta upp det utan att göra det till ett vetenskapsprojekt.

Så fungerar den här automationen

Hela n8n-flödet, från trigger till slutresultat:

n8n Workflow Template: Google Maps till Google Sheets: rensade leadlistor

Problemet: lead-listor från Google Maps blir röriga snabbt

Om du någon gång har byggt en ”snabb” lead-lista från Google Maps manuellt vet du hur det brukar gå. Du börjar med ett postnummer, lägger sedan till tre till eftersom resultaten ser tunna ut. Sedan lägger du till kategorier, eftersom ”tandläkare” inte är samma sak som ”kosmetisk tandläkare”. Plötsligt jonglerar du sökningar, kopierar företagsnamn, bråkar med formatering och hoppas att du inte klistrade in samma ställe två gånger. Även om du använder en skrapare eller export, slutar du ändå med att städa rader, ta bort dubbletter och försöka komma ihåg vad du redan har kört.

Friktionen växer snabbt. Här är var det brukar fallera.

  • Att kopiera listningar till ett kalkylark tar så lång tid att du undviker att uppdatera listan tills den är inaktuell.
  • Dubbletter smyger sig in mellan postnummer och underkategorier, så säljarna slösar tid på att kontakta samma företag två gånger.
  • Rate limits och misslyckade förfrågningar tvingar fram omkörningar, och omkörningar skapar ännu fler dubbla rader när spårningen är manuell.
  • Utan körstatus kan du inte se vad som är klart, vad som väntar och vad som i tysthet misslyckades i går.

Lösningen: hämta Google Maps-leads till Sheets och håll dem felfria

Det här n8n-flödet gör prospektering i Google Maps till ett repeterbart system. Det börjar med att läsa dina indata från Google Sheets: en lista med postnummer (till exempel en flik ”AZ Zips”) och en lista med kategorier eller underkategorier (som ”Google Maps Categories”). För varje postnummer + kategori-par skickar det en Google Places API-förfrågan (places.searchText) för att hämta företag som matchar. Resultaten expanderas till enskilda poster, normaliseras till en konsekvent struktur och avdupliceras sedan så att samma ställe inte dyker upp två gånger när det förekommer i flera sökningar. Slutligen uppdaterar flödet eller lägger till rader i Google Sheets och uppdaterar körstatus så att du kan se vad som lyckades, vad som inte gav något och vad som behövde försökas igen.

Det kan köras enligt schema, startas manuellt eller triggas av ett annat flöde. Under körningen används batchning plus retry-logik med exponentiell backoff och väntetider så att rate limiting inte sabbar körningen. När det är klart ser ditt kalkylark ut som en lead-lista, inte en dump.

Det du får: automation vs. resultat

Exempel: så här ser det ut

Säg att du riktar in dig på 20 postnummer och 5 tjänstekategorier. Manuellt tar även en ”snabb” process (sök, skumma, kopiera namn/telefon/webb, klistra in, formatera) kanske 3 minuter per listning, och du behöver ofta hämta 200 leads för att få en användbar lista. Det är runt 10 timmar monotont arbete, plus städning. Med det här flödet lägger du postnummer och kategorier i Sheets och kör; uppsättningen tar några minuter, sedan bearbetas allt i bakgrunden med batchning och omförsök. Du får normalt samma lead-lista i en körning, med dubbletter borttagna och status loggad.

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 postnummer, kategorier och leads
  • Google Places API för företagsresultat från Google Maps
  • Google OAuth-inloggningsuppgifter + API-åtkomst (från Google Cloud Console)

Kunskapsnivå: Medel. Du kopplar Google-inloggning och klistrar in en sheet-URL, och justerar sedan en query-sträng för din nisch.

Vill du inte sätta upp detta själv? Prata med en automationsexpert (gratis 15-minuters konsultation).

Så funkar det

En trigger startar körningen. Du kan starta den manuellt, köra den enligt schema eller starta den från en annan körning i ett flöde. Den flexibiliteten är viktig om du vill göra veckovisa uppdateringar eller ha kontroll med ”kör nu”.

Dina indata kommer från Google Sheets. Flödet hämtar din postnummerlista och din underkategorilista, filtrerar dem och begränsar hur många som bearbetas samtidigt så att körningen förblir stabil.

Data från Google Maps hämtas och struktureras. För varje postnummer + kategori-par skickas en HTTP-förfrågan till Google Places-endpointen. Svaren expanderas till individuella platser, mappas till konsekventa fält och dubbletter tas bort innan något skrivs.

Resultaten skrivs tillbaka med statusspårning. Flödet gör upsert av lead-rader i Google Sheets och markerar sedan statusrader som lyckade (eller hanterar fall med ”tomt svar”). Om API:t rate-limit:ar dig väntar flödet och försöker igen med exponentiell backoff i stället för att krascha och tvinga dig att köra om allt.

Du kan enkelt ändra kategorilistan eller query-texten för att rikta in dig på andra nischer och sedan återanvända samma flöde varje gång. Se hela implementationsguiden nedan för anpassningsalternativ.

Steg-för-steg-guide för implementering

Steg 1: konfigurera den manuella triggern

Konfigurera arbetsflödets startpunkter så att ni kan köra det manuellt, enligt schema eller från ett annat arbetsflöde.

  1. Lägg till och låt Manual Launch Trigger vara aktiverad för körningar vid behov.
  2. Aktivera valfritt Scheduled Interval Trigger och ställ in Interval till 15 minutes om ni vill ha automatiska körningar.
  3. Aktivera valfritt Workflow Run Trigger om detta arbetsflöde kommer att anropas från ett annat arbetsflöde.
  4. Koppla varje trigger till Configure Inputs enligt arbetsflödet.

Ha bara en trigger aktiverad under den initiala testningen för att undvika överlappande körningar.

Steg 2: anslut Google Sheets

Auktorisera Google Sheets så att arbetsflödet kan läsa postnummer och kategorier samt skriva tillbaka resultat.

  1. Öppna Fetch Zip Code Sheet och välj er Google Sheets-anslutning. Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-inloggningsuppgifter.
  2. Öppna Fetch Subcategory Sheet och välj samma Google Sheets-anslutning. Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-inloggningsuppgifter.
  3. Öppna Upsert Lead Rows, Retrieve Status Rows och Mark Status Successful och välj samma Google Sheets-anslutning. Inloggningsuppgifter krävs: Anslut era googleSheetsOAuth2Api-inloggningsuppgifter.
  4. Bekräfta att Upsert Lead Rows använder Sheet Name =Results och Operation appendOrUpdate.

⚠️ Vanlig fallgrop: Om er sheet-URL ändras, uppdatera Configure Inputs så att alla Google Sheets-noder får rätt dokument.

Steg 3: konfigurera input och dataprepp

Definiera vilket kalkylark och vilka flikar som ska användas och förbered sedan postnummer- och kategoriposter för batchning.

  1. I Configure Inputs ställer ni in gs_url till ert kalkylarks-URL, catSheet till Google Maps Categories och sheet till AZ Zips.
  2. I Fetch Zip Code Sheet bekräftar ni att Sheet Name använder ={{ $('Configure Inputs').item.json.sheet }} och att Document ID använder ={{ $('Configure Inputs').item.json.gs_url }}.
  3. I Fetch Subcategory Sheet bekräftar ni att Sheet Name använder ={{ $('Configure Inputs').item.json.catSheet }} och att Document ID använder ={{ $('Configure Inputs').item.json.gs_url }}.
  4. I Filter Zip Records behåller ni villkoret som inkluderar rader där ={{ $json.status }} är tomt.
  5. I Filter Subcategory Records behåller ni villkoret som exkluderar rader där ={{ $json.STATUS }} är lika med Ignore.
  6. I Assign Row Index mappar ni row_number till ={{ $json.row_number }} och använder sedan Split Row Numbers med Field to Split Out row_number.
  7. I Limit Records ställer ni in Max Items till 3 och kopplar sedan till Iterate Zip Batches och Iterate Subcategory Batches enligt bilden.

Att behålla Limit Records3 är användbart för initial testning innan ni skalar upp.

Steg 4: konfigurera anropet till Google Places API och bearbetning av platser

Bygg Places-frågan utifrån underkategori och postnummer och expandera samt avduplicera därefter resultaten.

  1. I Assign Zip Code mappar ni zip till ={{ $('Iterate Zip Batches').first().json.zip }}.
  2. Öppna Google Places API Call och ställ in URL till https://places.googleapis.com/v1/places:searchText, Method till POST och Authentication till Predefined Credential Type. Inloggningsuppgifter krävs: Anslut era googleOAuth2Api-inloggningsuppgifter.
  3. I Google Places API Call ställer ni in Body ParameterstextQuery till ={{ $('Map Subcategory Field').item.json.Subcategory }} {{ $json.zip }} och låter headern X-Goog-FieldMask vara kvar med befintligt värde.
  4. I Check Empty Response behåller ni villkoret som kontrollerar att ={{ $json.body }} är tomt; true-grenen loopar till Iterate Subcategory Batches och false-grenen fortsätter till Expand Places List.
  5. I Expand Places List behåller ni JavaScript-koden som gör om body.places till enskilda items.
  6. I Map Place Identifier mappar ni places.id till ={{ $json.place.id }} och i Remove Duplicate Places ställer ni in Fields to Compare till place.id,places.id.

Om API:t returnerar tomma svar, verifiera era scopes för Google Places API-nyckeln och era billing-inställningar.

Steg 5: konfigurera output och statusuppdateringar

Skriv unika platser till resultatsheeten och markera bearbetade kombinationer av postnummer/underkategori.

  1. I Upsert Lead Rows bekräftar ni mappade fält som phone ={{ $json.place.nationalPhoneNumber }}, title ={{ $json.place.displayName.text }}, place_id ={{ $json.place.id }} och gps_coordinates ={"latitude":{{ $json.place.location.latitude }},"longitude":{{ $json.place.location.longitude }}}.
  2. I Retrieve Status Rows behåller ni Sheet Name som ={{ $('Configure Inputs').first().json.sheet }} och Document ID som ={{ $('Configure Inputs').first().json.gs_url }}.
  3. I Mark Status Successful behåller ni Operation update och bekräftar mappningarna: zip ={{ $('Assign Zip Code').first().json.zip }}, status scraped och subcat ={{ $('Map Subcategory Field').first().json.Subcategory }}.

Steg 6: lägg till felhantering

Använd exponentiell backoff och retry-gränser för att hantera throttling från Google Sheets och API:et på ett robust sätt.

  1. Behåll Retry Backoff Logic, Retry Backoff Logic B och Retry Backoff Logic C i läget runOnceForEachItem med det medföljande JavaScriptet.
  2. I Delay Before Retry A, Delay Before Retry B och Delay Before Retry C ställer ni in Amount till ={{ $json["waitTime"] }}.
  3. I Validate Retry Limit A, Validate Retry Limit B och Validate Retry Limit C behåller ni villkoret som kontrollerar att ={{ $('Retry Backoff Logic').item.json["retryCount"] }} (och B/C-motsvarigheter) är större än 10.
  4. Säkerställ att true-grenen för varje validator leder till Abort With Error A, Abort With Error B eller Abort With Error C med felmeddelandet Google Sheets API Limit has been triggered and the workflow has stopped.

⚠️ Vanlig fallgrop: Om retries loopar utan stopp, verifiera att validator-anslutningarna går till rätt Abort With Error-noder.

Steg 7: testa och aktivera ert arbetsflöde

Kör ett manuellt test för att bekräfta att arbetsflödet läser inputs, anropar API:et och skriver resultat korrekt.

  1. Klicka på Execute WorkflowManual Launch Trigger för att starta en testkörning.
  2. Bekräfta att Google Places API Call returnerar ett svar och att Expand Places List skapar ett item per plats.
  3. Verifiera att nya rader dyker upp i sheeten Results via Upsert Lead Rows och att statusuppdateringar skrivs av Mark Status Successful.
  4. När ni är nöjda aktiverar ni Scheduled Interval Trigger eller behåller manuella körningar beroende på era behov i produktion.
🔒

Lås upp fullständig steg-för-steg-guide

Få den kompletta implementeringsguiden + nedladdningsbar mall

Vanliga fallgropar

  • Google-inloggningar kan löpa ut eller kräva specifika behörigheter. Om saker går sönder, kontrollera först OAuth consent screen och API-åtkomst (Maps + Sheets) i Google Cloud Console.
  • Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder fallerar på tomma svar.
  • Standardprompter i AI-noder är generiska. Lägg in ert varumärkesspråk tidigt, annars kommer du att sitta och redigera output för alltid.

Vanliga frågor

Hur lång tid tar det att sätta upp den här automationen för Google Maps-leads?

Cirka 30 minuter om ditt Google Cloud-projekt redan är uppsatt.

Behöver jag kunna koda för att automatisera Google Maps-leads?

Nej. Du kopplar främst inloggningar och redigerar ett par query-fält i n8n.

Är n8n gratis att använda för det här flödet för Google Maps-leads?

Ja. n8n har ett gratisalternativ för egen hosting och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volymer. Du behöver också räkna med kostnader för användning av Google Maps/Places API från Google Cloud.

Var kan jag hosta n8n för att köra den här automationen?

Två alternativ: n8n Cloud (hanterat, enklast uppsättning) 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.

Kan jag anpassa den här automationen för Google Maps-leads för olika städer eller nischer?

Ja, och det är hela poängen. Uppdatera postnummerlistan i ditt ”AZ Zips”-ark (eller motsvarande), och justera sedan underkategorierna i ditt kategoriark. I flödet justerar du textQuery i noden Google Places API Call så att den matchar din nisch (till exempel ”pediatric dentist in 85016” jämfört med ”dentist in 85016”).

Varför misslyckas min Google Sheets-anslutning i det här flödet?

Oftast är det ett OAuth-problem: fel Google-konto, utgånget samtycke eller att Google Sheets API inte är aktiverat i ditt Cloud-projekt. Återanslut Google OAuth-uppgiften i n8n och bekräfta sedan att arket är delat med samma konto som du autentiserade med. Om det bara fallerar i vissa steg, kontrollera noden som läser postnummer-/kategori-flikarna, eftersom saknade fliknamn eller ändrad sheet-struktur också kan skapa fel.

Hur många leads kan den här automationen för Google Maps-leads hantera?

Det beror på din quota i Google Places API och hur många postnummer/kategori-kombinationer du kör, men de flesta små team hämtar utan problem några hundra till några tusen rader per körning. Begränsningarna i n8n Cloud-planer beror på din exekveringskvot, och egen hosting tar bort exekveringstak (din server blir begränsningen). Flödet använder redan batchning och backoff-omförsök, vilket gör att det klarar större jobb utan att falla ihop.

Är den här automationen för Google Maps-leads bättre än att använda Zapier eller Make?

Ofta, ja. Det här flödet bygger på loopar, batchning, avduplicering och retry-logik med backoff, och de detaljerna spelar roll när du använder ett API med kvoter. I n8n kan du grena och hantera fall med ”tomt svar” utan att betala extra per steg, och du kan köra med egen hosting om du vill köra många jobb. Zapier eller Make kan fortfarande fungera för enklare hämtningar, men de blir dyra eller sköra när du lägger till nästlade loopar över postnummer och kategorier. Om du vill ha en snabb rekommendation för din setup, Prata med en automationsexpert.

När detta väl rullar slutar din lead-lista att vara ett engångsprojekt och blir i stället ett system du kan uppdatera enligt schema. Flödet tar hand om de repetitiva delarna så att du kan lägga tiden på att faktiskt kontakta prospekten.

Kontakta oss

Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.

×

Använd mall

Få direkt tillgång till denna n8n-arbetsflödes JSON-fil

Launch login modal Launch register modal