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 + Supabase: berikade leads att ringa

Rickard Andersson Partner, Nodenordic.se

Att kopiera företag från Google Maps är tidsödande. Sedan måste du fortfarande rensa listan, ta bort dubbletter, lista ut vem du ska ringa först och skriva något som inte låter som en robot.

Den här automatiseringen för Google Maps leads slår hårdast mot säljteam, men marknadsförare som bygger lokala listor och byråägare som gör outbound åt kunder känner också av det. Resultatet är enkelt: leads hamnar i Supabase redan berikade, med ett samtalsmanus du faktiskt kan använda.

Nedan ser du hur flödet gör om ett enda formulärinskick till en ringklar databas, vad det tar bort från din process och vad du ska se upp med när du kör det i större skala.

Så fungerar den här automatiseringen

Se hur detta löser problemet:

n8n Workflow Template: Google Maps + Supabase: berikade leads att ringa

Utmaningen: att förvandla Google Maps-resultat till leads som är redo för outreach

Google Maps är bra för att hitta företag. Det är uselt för att göra de fynden till en strukturerad, användbar leadlista. Du fastnar i en rörig mix av scraping, manuell kopiera-klistra, ”är det här rätt telefonnummer?” och att återskapa sammanhang du redan såg i listningen. Och om du vill personalisera måste du öppna webbplatser en och en bara för att skriva en vettig öppning. Efter några dussin leads blir hela processen långsam, felbenägen och ärligt talat irriterande.

Det blir snabbt mycket. Här är var det faller isär när du försöker göra det konsekvent.

  • Att hämta företag från Maps och formatera dem för ett CRM tar cirka 2 timmar per batch om du bryr dig om kvalitet.
  • Dubbletter smyger sig in eftersom samma företag dyker upp i flera nästan identiska sökningar, vilket gör att säljare slösar tid på att ringa två gånger.
  • Du ringer ”kallt” eftersom det saknas en snabb sammanfattning av vad företaget gör eller vad du ska nämna i första samtalet.
  • När listan ligger i kalkylark och inkorgar blir uppföljning och fördelning av leads ett veckovis städprojekt.

Lösningen: Google Maps-scraping, AI-berikning och Supabase-upserts

Det här flödet startar med ett enkelt formulär där du anger en startplats i Google Maps, ett sökord och ett land. Därifrån startar Bright Data ett scrapingjobb i Maps och flödet övervakar automatiskt extraktionen tills snapshoten är klar. När resultaten kommer tillbaka strukturerar automatiseringen varje företagspost, sätter en rimlig item-gräns och processar leads i batchar så att den inte kollapsar när du hämtar en stor lista. För leads som har en webbplats scrapar och sammanfattar den webbplatsinnehållet och använder sedan en LLM (via Bright Data MCP och LangChain-noder) för att generera ett personligt cold call-manus och samtalspunkter. Till sist upsertas allt in i Supabase, så att en ny körning uppdaterar befintliga leads i stället för att skapa dubbletter.

Flödet börjar när ditt formulär skickas in. Sedan kör det en scrape-och-vänta-loop tills Bright Datas snapshot är klar, berikar varje lead (webbplats-sammanfattning när den finns) och genererar samtalsmanuset. Supabase blir den enda platsen där ”hittade det på Maps” blir till ”redo att ringa”.

Vad som ändras: före vs. efter

Effekt i verkligheten

Säg att du behöver 100 lokala leads för ”takläggning” i ett storstadsområde. Manuellt tar även en snabb process kanske 2 minuter per lead för att kopiera detaljer, kolla webbplatsen och skriva en grundläggande öppning, vilket blir cirka 3 timmar. Med det här flödet skickar du formuläret på ungefär 2 minuter och låter sedan Bright Data köra och AI:n generera manus medan du gör annat. Oftast kommer du tillbaka till en Supabase-tabell full av berikade leads utan att spendera eftermiddagen i flikar.

Krav

  • n8n-instans (prova n8n Cloud gratis)
  • Self-hosting-alternativ om du föredrar det (Hostinger fungerar bra)
  • Bright Data för scrapingjobb i Google Maps
  • Supabase för att lagra och upserta leadposter
  • LLM API-nyckel (hämta den från OpenAI eller Google Gemini)

Svårighetsnivå: Medel. Du kopplar in credentials och skapar en Supabase/Postgres-tabell en gång.

Behöver du hjälp att implementera detta? Prata med en automationsexpert (gratis 15-minuters konsultation).

Flödet steg för steg

Formulärinskick startar allt. Du skickar in en startplats (ofta en Maps-URL), ett sökord och ett land, och flödet tolkar koordinater så att sökningen blir konsekvent.

Bright Data kör Maps-extraktionen. n8n skickar begäran och loopar sedan genom en övervaka-och-kontrollera-cykel. Om snapshoten inte är klar ännu väntar den och försöker igen tills den är det (med en räknare för att undvika oändliga körningar).

Leadposter blir korrekt formaterade och berikade. Flödet strukturerar företagsdatan, tillämpar en item-gräns och processar leads i batchar. Om ett företag har en webbplats scrapar och sammanfattar det den och mappar sedan insikterna till fält du kan lagra.

AI genererar samtalsmanuset. Med hjälp av en LLM (Gemini- och/eller OpenAI-noder finns i det här flödet) skapar den ett personligt cold call-manus plus samtalspunkter och slår sedan ihop allt till en post.

Supabase hålls uppdaterat. Varje lead upsertas till din databastabell, så omkörningar uppdaterar detaljer i stället för att mångdubbla rader. Du kan enkelt justera sökordet, item-gränsen eller prompten för manuset så att det passar din nisch och din outreach-stil. Se hela implementeringsguiden nedan för anpassningsmöjligheter.

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

Steg 1: Konfigurera den manuella triggern

Det här arbetsflödet kan startas manuellt för konfigurering och tar även emot användarinmatning via ett formulär. Konfigurera båda ingångarna så att ni kan skapa databastabellen och samla in parametrar för scraping.

  1. Öppna Manual Start Trigger och bekräfta att den är aktiverad för testning (obs: den är inaktiverad i JSON:en).
  2. Öppna Form Submission Trigger och ställ in Form Title till Maps Extractor.
  3. I Form Submission Trigger, verifiera fälten och platshållarna för Location URL, Keyword Search, Country och My company's segment.
  4. Ställ in Button Label till Scrape och Form Submitted Text till Scraping started 🔎.

⚠️ Vanlig fallgrop: Formulärinstruktionerna kräver en fullständig Google Maps-URL från webbläsarens adressfält, inte en ”Dela”-länk. Att använda en delningslänk kan göra att tolkningen av koordinater slutar fungera.

Steg 2: Anslut PostgreSQL-lagring

Sätt upp databastabellen och upsert-logiken som lagrar berikade företagsposter.

  1. Öppna Create Storage Table och ställ in Operation till executeQuery.
  2. Klistra in hela SQL:en i Query exakt som visat, med start på CREATE TABLE business_scraping_result (...).
  3. Inloggning krävs: Anslut era postgres-uppgifter i Create Storage Table.
  4. Öppna Upsert Database Row och säkerställ att Table är business_scraping_result i public-schemat.
  5. Inloggning krävs: Anslut era postgres-uppgifter i Upsert Database Row.
  6. Bekräfta att de mappade kolumnerna använder uttryck som {{ $('Combine Records').item.json.company.name }} och {{ $json.text }} för sales_helper.

Steg 3: Anslut Bright Data-extraktion och återförsöksslinga

Konfigurera Bright Data-anropet, övervakningen och återförsöksslingan som hämtar företagsdata från Google Maps.

  1. Öppna Parse Coordinates from URL och bekräfta att latitude är satt till {{ $json['Location URL'].match(/@(-?\d+\.\d+),(-?\d+\.\d+)/)[1] }} och longitude till {{ $json['Location URL'].match(/@(-?\d+\.\d+),(-?\d+\.\d+)/)[2] }}.
  2. Öppna Bright Data Request och ställ in URL till https://api.brightdata.com/datasets/v3/trigger med Method POST.
  3. Ställ in JSON Body till det angivna array-uttrycket, inklusive {{ $json.Country }}, {{ $json['Keyword Search'] }} och {{ $json.longitude.toNumber() }}.
  4. I Bright Data Request, uppdatera frågeparametrar som dataset_id till ert Bright Data dataset-ID.
  5. Inloggning krävs: Anslut era brightdataApi-uppgifter i Bright Data Request.
  6. Öppna Monitor Extraction Progress och Fetch Snapshot Data och bekräfta att snapshot_id är satt till {{ $('Bright Data Request').item.json.snapshot_id }}.
  7. Inloggning krävs: Anslut era brightdataApi-uppgifter i Monitor Extraction Progress och Fetch Snapshot Data.
  8. Kontrollera återförsöksslingan: Pause Before Retry använder Amount 10, Delay Cycle använder 60 och Retry Limit Check jämför {{ $('Pass Through Step').last().json.count }} med 10.

⚠️ Vanlig fallgrop: Om Bright Data-datasetet fortfarande är ”building” kommer arbetsflödet att loopa mellan Snapshot Ready Check och Pause Before Retry. Verifiera er datasetkonfiguration och er kvot för att undvika oändliga återförsök.

Steg 4: Sätt upp datastrukturering och batchning

Normalisera fält, begränsa antalet poster och bearbeta objekt i batchar för efterföljande berikning.

  1. Öppna Structure Business Data och bekräfta mappade fält som company.name{{ $json.name }} och company.open_website{{ $json.open_website }}.
  2. Ställ in Apply Item Limit till Max Items 15 för att sätta ett tak på antalet företag som bearbetas.
  3. Använd Batch Item Loop för att iterera igenom varje objekt efter begränsningen.
  4. Verifiera att Website Availability Check använder uttrycket {{ $json?.company?.open_website }} för att skicka objekt med webbplats vidare till berikning.

Steg 5: Sätt upp AI-berikning och generering av samtalsmanus

Konfigurera scraping-agenten och kedjan för generering av samtalsmanus med de anslutna AI-modellerna och verktyget.

  1. Öppna Scrape and Summarize och behåll Text-prompten som Use the tool 'scrape_as_markdown' with the url: {{ $json.company.open_website }}.
  2. Öppna Markdown Scraper Tool och ställ in Endpoint URL till https://mcp.brightdata.com/mcp?token=[CONFIGURE_YOUR_TOKEN], och ersätt sedan [CONFIGURE_YOUR_TOKEN] med er Bright Data MCP-token.
  3. Anslut OpenAI Mini Chat som språkmodell för Scrape and Summarize och säkerställ att autentiseringsuppgifter har lagts till i OpenAI Mini Chat.
  4. Inloggning krävs: Anslut era openAiApi-uppgifter i OpenAI Mini Chat.
  5. Öppna Generate Call Script och ställ in Text till {{ JSON.stringify($json) }}.
  6. Anslut Gemini Chat Model som språkmodell för Generate Call Script.
  7. Inloggning krävs: Anslut era googlePalmApi-uppgifter i Gemini Chat Model.

⚠️ Vanlig fallgrop: Markdown Scraper Tool är en verktygs-subnod. Autentiseringsuppgifter och tokens ska konfigureras på både verktygsnivå och på den överordnade AI-nodnivån – säkerställ att token är giltig och åtkomlig när Scrape and Summarize körs.

Steg 6: Konfigurera sammanslagning av poster och utdata-mappning

Kombinera den scrape:ade sammanfattningen med den ursprungliga företagsdatan och skicka den vidare till databasens upsert.

  1. Öppna Map Summary Fields och bekräfta att summary använder {{ $json.output }} och att company använder {{ $('Apply Item Limit').item.json.company }}.
  2. Behåll Combine Records som sammanslagningspunkt före Generate Call Script.
  3. Verifiera att Website Availability Check skickar ”false”-vägen till Combine Records så att objekt utan webbplatser fortfarande behandlas.

Steg 7: Testa och aktivera ert arbetsflöde

Kör ett manuellt test och aktivera därefter formulärtriggern för användning i produktion.

  1. Klicka på Manual Start Trigger för att köra Create Storage Table och bekräfta att databastabellen skapas.
  2. Skicka in formuläret i Form Submission Trigger med en giltig Google Maps-URL, sökord, land och företagssegment.
  3. Följ körningen: Bright Data Request ska returnera ett snapshot_id och loopen ska gå vidare till Fetch Snapshot Data efter att redo-kontrollerna passerats.
  4. Bekräfta lyckat resultat: Upsert Database Row ska infoga/uppdatera poster med page_summary och sales_helper ifyllda.
  5. När allt är validerat, aktivera arbetsflödet så att Form Submission Trigger kan köras kontinuerligt i produktion.
🔒

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

Få den kompletta implementeringsguiden + nedladdningsbar mall

Se upp med

  • Bright Data-credentials kan löpa ut eller kräva specifika behörigheter. Om något slutar fungera, kontrollera först din Bright Data-token och workspace-åtkomst i Bright Data-dashboarden.
  • 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 er tonalitet tidigt, annars kommer du att sitta och redigera utdata i all evighet.

Vanliga frågor

Hur snabbt kan jag implementera den här automatiseringen för Google Maps leads?

Oftast cirka en timme när dina Bright Data- och Supabase-credentials är klara.

Kan icke-tekniska team implementera den här lead-berikningen för Google Maps?

Ja, men någon måste sätta upp Supabase-tabellen första gången. Efter det är det bara att skicka in formuläret och granska resultaten.

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

Ja. n8n har ett gratis self-hosted-alternativ 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 in Bright Data-användning samt dina LLM API-kostnader.

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

Två alternativ: n8n Cloud (managed, 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 obegränsade körningar men kräver grundläggande serverdrift.

Hur anpassar jag den här automatiseringslösningen för Google Maps leads till mina specifika utmaningar?

Du kan anpassa den på tre praktiska ställen. Ändra noden ”Apply Item Limit” för att styra leadvolym, justera ”Scrape and Summarize” för att fånga de signaler du bryr dig om (tjänster, priser, platser) och skriv om prompten i ”Generate Call Script” så att den matchar ditt erbjudande och din ton. Om du föredrar en modell kan du också växla mellan Gemini- och OpenAI-chatmodellnoderna utan att ändra hela flödet. Det är oftast snabbaste sättet att gå från generiska manus till ”det här låter som vi”.

Varför misslyckas min Bright Data-anslutning i det här flödet?

För det mesta beror det på en utgången token eller saknade behörigheter på Bright Data-sidan. Skapa en ny API-nyckel (eller MCP-credentials), uppdatera den i n8n och kör sedan om begäran och följ monitor-steget för att bekräfta att jobbet faktiskt skapas. Om det startar och sedan stannar kan du slå i kontogränser eller så tar snapshoten längre tid än din nuvarande väntcykel, så tiden i ”Pause Before Retry” behöver ökas.

Vilken kapacitet har den här automatiseringslösningen för Google Maps leads?

Om du self-hostar n8n finns ingen hård gräns för antal körningar (det beror på din server). På n8n Cloud styr din plan antalet körningar per månad, och det här flödet kan förbruka mycket om du berikar stora batchar eftersom det loopar och processar items i chunkar. I praktiken kör de flesta små team detta veckovis eller dagligen för tiotals till några hundra leads per körning och skalar upp när prompter och databasfält är stabila.

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

Ofta, ja, eftersom flödet behöver loopar, väntan, grenlogik och databas-upserts, och n8n hanterar det utan att din faktura blir en obehaglig överraskning. Zapier eller Make kan fungera för enkla ”fånga ett lead och lägg till en rad”-automatiseringar, men så fort du lägger till kontroller av scraping-progress och AI-berikning blir det rörigt. n8n är också enklare att self-hosta, vilket spelar roll om du planerar att köra hög volym. Ärligt talat: om du bara gör lätt listbyggande kan du föredra de enklare verktygen. Prata med en automationsexpert om du är osäker på vad som passar.

När detta väl rullar slutar leadbygge vara en halvdagsuppgift och blir en repeterbar input till din outreach-maskin. Sätt upp det, trimma prompterna och låt Supabase vara redo inför nästa ringblock.

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