Ditt lead-ark ser ”fullt” ut, men hälften av raderna är återvändsgränder. Fel webbplatser, saknade kontaktsidor, generiska kataloger och mejladresser som studsar direkt när du trycker på skicka.
Det här är typen av röra som bromsar marketing ops först. Men byråägare som bygger prospektlistor och säljteam som gör veckovis outreach känner av det också. Med automatiserad Sheets lead enrichment förvandlar du en enkel rad med ”bransch + stad + delstat” till en användbar företagssajt och riktiga mejladresser, utan att lägga eftermiddagen i Google.
Det här flödet hämtar leads från Google Sheets, söker med Serper.dev, skrapar sannolika sidor via ScrapingBee, extraherar e-postadresser och skriver tillbaka allt till ditt ark med tydliga statusuppdateringar.
Så fungerar den här automatiseringen
Se hur det här löser problemet:
n8n Workflow Template: Google Sheets + ScrapingBee: berikade leads, klara
flowchart LR
subgraph sg0["Google Sheets Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Scraping Bee"]
n3["<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/>Website Options"]
n4@{ icon: "mdi:play-circle", form: "rounded", label: "Google Sheets Trigger", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If2", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If3", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Information", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Search Companies (Serper.dev)"]
n11["<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 Company & Website"]
n12@{ icon: "mdi:database", form: "rounded", label: "Update Running Status", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Update Missing Information S..", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Add research Results", pos: "b", h: 48 }
n15["<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/>Test pages"]
n16@{ icon: "mdi:database", form: "rounded", label: "Update Finished Status", pos: "b", h: 48 }
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/>Email Extractor"]
n18@{ icon: "mdi:database", form: "rounded", label: "Get Emails", pos: "b", h: 48 }
n19@{ icon: "mdi:database", form: "rounded", label: "Add Emails", pos: "b", h: 48 }
n1 --> n2
n1 --> n0
n5 --> n17
n5 --> n0
n6 --> n18
n6 --> n0
n8 --> n12
n8 --> n13
n7 --> n0
n19 --> n7
n18 --> n19
n15 --> n1
n2 --> n5
n17 --> n6
n0 --> n16
n0 --> n15
n9 --> n10
n3 --> n0
n14 --> n3
n4 --> n8
n12 --> n9
n11 --> n14
n10 --> n11
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 n4 trigger
class n1,n5,n6,n8 decision
class n12,n13,n14,n16,n18,n19 database
class n2,n10,n15 api
class n3,n11,n17 code
classDef customIcon fill:none,stroke:none
class n2,n3,n10,n11,n15,n17 customIcon
Utmaningen: att förvandla ”leads” till kontakter du faktiskt kan mejla
Att bygga en leadlista är enkelt. Att bygga en som är redo för outreach är där tiden försvinner. Du börjar med några kolumner i Google Sheets och öppnar sedan en ny flik för varje rad: söker upp företaget, gissar vilken sajt som är den riktiga, klickar runt för att hitta en kontaktsida och kopierar in allt som ser ut som en mejladress. Multiplicera det med 200 rader. Misstag smyger sig in snabbt, och ärligt talat är det mentalt utmattande eftersom varje företag strukturerar sin sajt olika och kataloger fortsätter dyka upp i sökresultaten.
Det summeras snabbt. Här är var det fallerar i verkligheten.
- Du slösar cirka 5–10 minuter per lead bara på att lista ut den ”riktiga” webbplatsen jämfört med listningar och aggregator-sidor.
- Folk klistrar in fel URL i arket, och det enda felaktiga fältet saboterar hela din outreach-sekvens.
- Mejljakt blir inkonsekvent, så en person hittar kanonbra kontakter medan en annan inte hittar något och ingen vet varför.
- Statusspårning är oftast manuell, vilket betyder dubbletter, missade rader och möten om ”Har vi redan gjort det här?”.
Lösningen: lead enrichment i Google Sheets med Serper.dev + ScrapingBee
Det här flödet startar i ditt Google-ark. När du ”aktiverar” en rad kontrollerar det först att grunderna finns (bransch, stad, delstat). Om något saknas flaggar det raden så att du inte slösar tid på skräpinput. Om raden ser bra ut markerar det status som Running, förbereder sökparametrar som land och språk och skickar sedan en fråga till Serper.dev för att hitta sannolika företagswebbplatser. Därefter genererar det en uppsättning ”site variants” och kandidater till kontaktsidor, validerar URL:erna och skickar de bästa alternativen till ScrapingBee för skrapning. Mejladresser extraheras från de skrapade sidorna, kontrolleras mot vad du redan har i arket och skrivs sedan tillbaka i ett korrekt formaterat, kommaseparerat format. Till sist markeras raden som Finished så att listan håller ordning.
Flödet startar från en Sheets Row Trigger. Därifrån används Serper.dev för att hitta de bästa företagssidorna, och ScrapingBee tar hand om det stökiga: att hämta innehåll på ett stabilt sätt. Utdata är enkel: uppdaterade kolumner i Google Sheets (företagsnamn, URL, mejladresser och status) så att din outreach-lista alltid är redo att använda.
Vad som förändras: före vs. efter
| Det här eliminerar | Effekten du ser |
|---|---|
|
|
Verklig effekt
Säg att du berikar 100 leads varje vecka. Manuellt kan du lägga cirka 8 minuter per lead på att söka, klicka och jaga en användbar mejladress, vilket är ungefär 13 timmar av rutinjobb. Med det här flödet aktiverar du rader i Google Sheets och låter det köra: en minut för att lägga upp kön, sedan söker, validerar, skrapar och uppdaterar automatiseringen arket medan du gör annat. Även om du fortfarande granskar resultatet några minuter i slutet sparar du vanligtvis större delen av den dagen.
Krav
- 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 leads och resultat.
- Serper.dev för att hitta riktiga företagswebbplatser.
- ScrapingBee för att skrapa sidor och extrahera mejladresser.
- Google Sheets API-inloggning (hämta från Google Cloud Console).
- Serper.dev API-nyckel (hämta från din Serper.dev-dashboard).
- ScrapingBee API-nyckel (hämta från din ScrapingBee-dashboard).
Kunskapsnivå: Nybörjare. Du kopplar konton, klistrar in API-nycklar och mappar några kolumner i Google Sheets.
Behöver du hjälp att implementera detta? Prata med en automationsexpert (gratis 15-minuters konsultation).
Flödet i workflowet
En rad i Google Sheets ”aktiveras”. Triggern bevakar ditt ark efter rader du vill processa, så du styr vad som körs och när (smidigt när du först vill städa upp input).
Grundläggande validering av input sker direkt. Om bransch, stad eller delstat saknas skriver workflowet statusen ”Missing information” och går vidare. Inga bortkastade API-anrop.
Serper.dev hittar sannolika företagssidor. n8n skickar en sökförfrågan, tolkar resultaten och lägger till research-rader så att workflowet kan testa flera kandidater i stället för att lita på första länken det ser.
URL:er valideras och sedan skrapar ScrapingBee de bästa alternativen. Workflowet kontrollerar att sidor svarar korrekt, skrapar innehåll och extraherar mejladresser. Om mejladresser finns, slår det upp vad du redan har och uppdaterar posten.
Google Sheets uppdateras och raden avslutas. Du får företagsnamn, URL, kommaseparerade mejladresser och statusen Finished så att arket håller sig strukturerat.
Du kan enkelt ändra land, språk eller antal resultat för att passa olika regioner och nischer. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: konfigurera triggern för Sheets-rader
Ställ in triggern så att den bevakar raduppdateringar i ert indataark.
- Lägg till noden Sheets Row Trigger och ställ in Event på
rowUpdate. - Ställ in Columns To Watch på
Activate. - Ställ in Poll Times på
everyMinute. - Välj rätt Document och Sheet Name för ert indataark.
- Credential Required: Anslut era
googleSheetsTriggerOAuth2Api-credentials.
Steg 2: anslut Google Sheets för status- och dataoperationer
Konfigurera Google Sheets-noderna som uppdaterar status och skriver researchdata.
- I Mark Status Running, ställ in Operation på
update, mappa Client till{{ $json.Client }}och ställ in Status påRunning. - I Flag Missing Data, ställ in Operation på
update, mappa Client till{{ $json.Client }}och ställ in Status påMissing data. - I Append Research Rows, ställ in Operation på
appendoch mappa: City till{{ $('Assign Search Inputs').item.json.city }}, State till{{ $('Assign Search Inputs').item.json.state }}, Client till{{ $json.client }}, Company till{{ $json.company }}och website till{{ $json.Website }}. - I Lookup Existing Emails, ställ in filtret så att det slår upp Company med
{{ $json.company }}. - I Update Email Records, ställ in Operation på
updateoch mappa emails till{{ $json.emails ? $json.emails + ", " + $('Extract Email Addresses').item.json.email : $('Extract Email Addresses').item.json.email }}, samt Company till{{ $('Extract Email Addresses').item.json.company }}. - I Mark Status Finished, ställ in Operation på
update, mappa Client till{{ $('Generate Site Variants').item.json.client }}och ställ in Status påFinished.
Credential Required: Anslut era googleSheetsOAuth2Api-credentials till Mark Status Running och Flag Missing Data.
⚠️ Vanlig fallgrop: De andra Google Sheets-noderna (Append Research Rows, Lookup Existing Emails, Update Email Records, Mark Status Finished) kräver också Google Sheets-credentials, men inga är konfigurerade. Lägg till samma googleSheetsOAuth2Api-credentials på var och en av dem.
Steg 3: sätt upp validering och förberedelse av sökinput
Validera inkommande rader och bygg sökinput för Serper-frågan.
- I Input Validation, säkerställ att de tre villkoren kontrollerar att följande värden inte är tomma:
{{ $json.Client }},{{ $json.City }}och{{ $json.State }}. - Bekräfta att Input Validation skickar giltiga rader till Mark Status Running och ogiltiga rader till Flag Missing Data.
- I Assign Search Inputs, aktivera Keep Only Set och ställ in fält: state till
{{ $('Sheets Row Trigger').item.json.State }}, city till{{ $('Sheets Row Trigger').item.json.City }}, client till{{ $('Sheets Row Trigger').item.json.Client }}, business_type till{{ $node["Sheets Row Trigger"].json["Business Type"] }}, country tillArgentina, country_code tillAR, language tilles-419och result_count till10.
Steg 4: konfigurera sökning och länkparsning
Skicka fråga till Serper och filtrera de organiska resultaten till företagskandidater.
- I Serper Search Request, ställ in URL på
https://google.serper.dev/searchoch Request Method påPOST. - Aktivera JSON Parameters och ställ in Body Parameters JSON på
{ "q": "{{ $json.business_type }} in {{ $json.city }}, {{ $json.state }}, {{ $json.country }}", "num": {{ $json.result_count }}, "gl": "{{ $json.country_code }}", "hl": "{{ $json.language }}" }. - Credential Required: Anslut era
httpHeaderAuth-credentials för Serper API. - Låt Parse Company Links vara som den är för att filtrera bort svartlistade resultat och mappa värdena
company,Website,client,stateochcity.
Steg 5: generera URL-varianter och batchbearbetning
Skapa flera URL-varianter för kontakt/support och iterera igenom dem för scraping.
- Behåll Append Research Rows ansluten efter Parse Company Links för att logga företagskandidater innan scraping.
- I Generate Site Variants, behåll JavaScript-koden som bygger flera URL-sökvägar för varje webbplats.
- I Batch Iterator, lämna standardinställningarna för batchning om ni inte behöver styra genomströmningen.
- Bekräfta flödet: Append Research Rows → Generate Site Variants → Batch Iterator → Validate Page URLs.
⚠️ Vanlig fallgrop: Om ert indataark använder andra kolumnnamn (t.ex. ”website” vs ”Website”), justera mappningen i Append Research Rows och Generate Site Variants därefter.
Steg 6: konfigurera scraping, parsning och e-postuppdateringar
Validera sidor, hämta HTML, extrahera e-postadresser och uppdatera befintliga poster.
- I Validate Page URLs, ställ in URL på
{{ $('Generate Site Variants').item.json.Website }}. - I Scrape Result Check, behåll villkoret som kontrollerar att
{{ $json.error.message }}är tomt innan ni fortsätter att scrapa. - I ScrapingBee Request, ställ in URL på
https://app.scrapingbee.com/api/v1/?api_key=[CONFIGURE_YOUR_API_KEY]={{ $('Generate Site Variants').item.json.Website }}&render_js=trueoch ersätt[CONFIGURE_YOUR_API_KEY]med er ScrapingBee-nyckel. - I Scrape Success Check, behåll villkoret som kontrollerar att
{{ $json.error.message }}är tomt innan ni extraherar e-postadresser. - I Extract Email Addresses, behåll JavaScript-koden som extraherar och avduplicerar e-postadresser från HTML-fältet
data. - I Email Presence Check, använd villkoret inte-tomt på
{{ $('Extract Email Addresses').item.json.email }}för att avgöra om ni ska uppdatera. - Bekräfta uppdateringsflödet: Email Presence Check → Lookup Existing Emails → Update Email Records → Delay Pause → Batch Iterator.
⚠️ Vanlig fallgrop: ScrapingBee-URL:en innehåller en API-nyckel som platshållare. Om ni lämnar [CONFIGURE_YOUR_API_KEY] oförändrad kommer scraping att misslyckas och arbetsflödet loopar tillbaka via Batch Iterator.
Steg 7: testa och aktivera ert arbetsflöde
Verifiera hela enrichment-pipelinen och slå sedan på den för produktionsuppdateringar.
- Kör arbetsflödet manuellt med en testraduppdatering i indataarket och säkerställ att Sheets Row Trigger triggas.
- Kontrollera att Mark Status Running uppdaterar status i indataarket till
Runningeller att Flag Missing Data uppdaterar den tillMissing datanär fält är tomma. - Verifiera att Append Research Rows lägger till resultat i dataarket och att Update Email Records skriver e-postvärden.
- Bekräfta att Mark Status Finished sätter slutstatusen till
Finishedefter batchbearbetning. - Aktivera arbetsflödet genom att slå på reglaget Active i n8n.
Se upp med
- Google Sheets-inloggningar kan löpa ut eller kräva specifika behörigheter. Om det börjar skapa fel, kontrollera först kopplingen för n8n-credentials och dina OAuth-samtycken/inställningar i Google Cloud.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du redigera utdata i all evighet.
Vanliga frågor
Cirka 30 minuter om dina API-nycklar och åtkomst till Google Sheets är klara.
Ja. Du skriver ingen kod, men du behöver mappa kolumnerna i ditt ark och klistra in ett par API-nycklar i n8n.
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å räkna in användningen av Serper.dev och ScrapingBee (båda har gratisnivåer och sedan användningsbaserad prissättning).
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen hosting på en VPS. För egen hosting är Hostinger VPS prisvärd och hanterar n8n bra. Egen hosting ger obegränsade körningar men kräver grundläggande serverhantering.
Börja med att låta country, country_code, language och result_count komma från kolumner i ditt ark, så att varje rad kan styra hur den söker. Du kan också bygga ut blacklist-logiken i ”Generate Site Variants” / filtreringskoden för att undvika kataloger du ogillar. Om du vill ha mer än mejladresser kan du utöka koden i ”Extract Email Addresses” för att fånga telefonnummer eller sociala länkar och skriva tillbaka dem som nya kolumner.
Oftast handlar det om utgångna Google OAuth-uppgifter eller att fel Google-konto är kopplat till n8n-credential. Koppla om Google Sheets i n8n och bekräfta sedan att arket är delat med det kontot och att rätt kalkylark är valt. Om bara uppdateringar misslyckas, kontrollera att dina kolumnnamn matchar vad workflowet förväntar sig (inklusive activate-fältet).
Om du kör egen hosting finns ingen gräns för antal körningar (det är främst din server och API-begränsningar som sätter taket). På n8n Cloud beror kapaciteten på din plans månatliga körningar. I praktiken begränsas workflowet av rate limits i Serper.dev och ScrapingBee, så de flesta team kör det i batcher på några dussin till några hundra leads åt gången.
Ofta, ja, eftersom det här flödet bygger på förgreningslogik (flera kontroller), loopar genom kandidat-URL:er och kodbaserad parsing, vilket lätt blir krångligt och dyrt i många no-code-verktyg. n8n hanterar split-in-batches-loopar snyggt, och du kan köra egen hosting med obegränsade körningar. Zapier eller Make kan fortfarande fungera bra om din process är ”sök en gång, lagra ett resultat”, men det här workflowet är byggt för verklig stökighet: dubbletter, dåliga URL:er och flera sidor per företag. En sak till: att behålla statusfält som Running och Finished i Google Sheets gör överlämningar i ops enklare, och n8n passar det upplägget bra. Om du tvekar, prata med en automationsexpert så kvalitetssäkrar vi din setup.
När det här väl rullar slutar ditt ark vara en önskelista och blir i stället en outreach-kö. Workflowet tar hand om det repetitiva grävarbetet så att du kan fokusera på budskapet och erbjudandet.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.