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
flowchart LR
subgraph sg0["Form Submission Flow"]
direction LR
n2["<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/form.svg' width='40' height='40' /></div><br/>Form Submission Trigger"]
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Parse Coordinates from URL", pos: "b", h: 48 }
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/>Bright Data Request"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Initialize Counter", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Pass Through Step", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Monitor Extraction Progress", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Request Status", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Fetch Snapshot Data", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Snapshot Ready Check", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Pause Before Retry", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Structure Business Data", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Apply Item Limit", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Batch Item Loop", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Website Availability Check", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Scrape and Summarize", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Summary Fields", pos: "b", h: 48 }
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/merge.svg' width='40' height='40' /></div><br/>Combine Records"]
n19@{ icon: "mdi:robot", form: "rounded", label: "Generate Call Script", pos: "b", h: 48 }
n20@{ icon: "mdi:brain", form: "rounded", label: "Gemini Chat Model", pos: "b", h: 48 }
n21["<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/postgres.svg' width='40' height='40' /></div><br/>Upsert Database Row"]
n22@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Retry Limit Check", pos: "b", h: 48 }
n23@{ icon: "mdi:cog", form: "rounded", label: "Delay Cycle", pos: "b", h: 48 }
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Increase Counter", pos: "b", h: 48 }
n25@{ icon: "mdi:wrench", form: "rounded", label: "Markdown Scraper Tool", pos: "b", h: 48 }
n26@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Mini Chat", pos: "b", h: 48 }
n11 --> n9
n18 --> n19
n23 --> n24
n5 --> n6
n13 --> n14
n17 --> n18
n26 -.-> n16
n12 --> n13
n14 --> n15
n24 --> n6
n8 --> n9
n8 --> n22
n19 --> n21
n2 --> n3
n16 --> n17
n25 -.-> n16
n22 --> n23
n21 --> n14
n15 --> n16
n15 --> n18
n20 -.-> n19
n6 --> n7
n4 --> n5
n10 --> n12
n10 --> n11
n9 --> n10
n7 --> n8
n3 --> n4
end
subgraph sg1["Manual Start Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Start Trigger", pos: "b", h: 48 }
n1["<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/postgres.svg' width='40' height='40' /></div><br/>Create Storage Table"]
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 n2,n0 trigger
class n16,n19 ai
class n20,n26 aiModel
class n25 ai
class n8,n10,n15,n22 decision
class n21,n1 database
class n4 api
class n0 disabled
classDef customIcon fill:none,stroke:none
class n2,n4,n18,n21,n1 customIcon
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
| Det här elimineras | Effekten du kommer att märka |
|---|---|
|
|
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.
- Öppna Manual Start Trigger och bekräfta att den är aktiverad för testning (obs: den är inaktiverad i JSON:en).
- Öppna Form Submission Trigger och ställ in Form Title till
Maps Extractor. - I Form Submission Trigger, verifiera fälten och platshållarna för Location URL, Keyword Search, Country och My company's segment.
- Ställ in Button Label till
Scrapeoch Form Submitted Text tillScraping 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.
- Öppna Create Storage Table och ställ in Operation till
executeQuery. - Klistra in hela SQL:en i Query exakt som visat, med start på
CREATE TABLE business_scraping_result (...). - Inloggning krävs: Anslut era postgres-uppgifter i Create Storage Table.
- Öppna Upsert Database Row och säkerställ att Table är
business_scraping_resultipublic-schemat. - Inloggning krävs: Anslut era postgres-uppgifter i Upsert Database Row.
- 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.
- Ö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] }}. - Öppna Bright Data Request och ställ in URL till
https://api.brightdata.com/datasets/v3/triggermed MethodPOST. - Ställ in JSON Body till det angivna array-uttrycket, inklusive
{{ $json.Country }},{{ $json['Keyword Search'] }}och{{ $json.longitude.toNumber() }}. - I Bright Data Request, uppdatera frågeparametrar som dataset_id till ert Bright Data dataset-ID.
- Inloggning krävs: Anslut era brightdataApi-uppgifter i Bright Data Request.
- Öppna Monitor Extraction Progress och Fetch Snapshot Data och bekräfta att snapshot_id är satt till
{{ $('Bright Data Request').item.json.snapshot_id }}. - Inloggning krävs: Anslut era brightdataApi-uppgifter i Monitor Extraction Progress och Fetch Snapshot Data.
- Kontrollera återförsöksslingan: Pause Before Retry använder Amount
10, Delay Cycle använder60och Retry Limit Check jämför{{ $('Pass Through Step').last().json.count }}med10.
⚠️ 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.
- Öppna Structure Business Data och bekräfta mappade fält som company.name →
{{ $json.name }}och company.open_website →{{ $json.open_website }}. - Ställ in Apply Item Limit till Max Items
15för att sätta ett tak på antalet företag som bearbetas. - Använd Batch Item Loop för att iterera igenom varje objekt efter begränsningen.
- 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.
- Öppna Scrape and Summarize och behåll Text-prompten som
Use the tool 'scrape_as_markdown' with the url: {{ $json.company.open_website }}. - Ö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. - 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.
- Inloggning krävs: Anslut era openAiApi-uppgifter i OpenAI Mini Chat.
- Öppna Generate Call Script och ställ in Text till
{{ JSON.stringify($json) }}. - Anslut Gemini Chat Model som språkmodell för Generate Call Script.
- 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.
- Öppna Map Summary Fields och bekräfta att summary använder
{{ $json.output }}och att company använder{{ $('Apply Item Limit').item.json.company }}. - Behåll Combine Records som sammanslagningspunkt före Generate Call Script.
- 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.
- Klicka på Manual Start Trigger för att köra Create Storage Table och bekräfta att databastabellen skapas.
- Skicka in formuläret i Form Submission Trigger med en giltig Google Maps-URL, sökord, land och företagssegment.
- Följ körningen: Bright Data Request ska returnera ett
snapshot_idoch loopen ska gå vidare till Fetch Snapshot Data efter att redo-kontrollerna passerats. - Bekräfta lyckat resultat: Upsert Database Row ska infoga/uppdatera poster med page_summary och sales_helper ifyllda.
- När allt är validerat, aktivera arbetsflödet så att Form Submission Trigger kan köras kontinuerligt i produktion.
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
Oftast cirka en timme när dina Bright Data- och Supabase-credentials är klara.
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.
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.
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.
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”.
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.
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.
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.