Du bygger en genomtänkt kontaktlista, trycker på skicka … och inser sedan att du mejlade samma HR-kontakt två gånger, bifogade fel fil eller gick över en säker daglig volym. Det blir rörigt – och det går att undvika.
Rekryterare märker direkt när uppföljningar blir obekväma. HR-koordinatorer tappar timmar på att jaga vad som skickades och till vem. Och en grundare som rekryterar vid sidan av fastnar i inkorgsadministration. Den här HR outreach automation gör utskicken konsekventa, lagom taktade och loggade – utan att du behöver sitta och vakta varje mejl.
Du sätter upp ett n8n-flöde som hämtar rader från Google Sheets, tar bort dubletter, validerar mejladresser, tillämpar sändningsgränser, bifogar ett CV, skickar via Gmail och skriver sedan tillbaka resultatet till Sheets.
Så fungerar automatiseringen
Här är hela flödet du kommer att sätta upp:
n8n Workflow Template: Google Sheets + Gmail: HR-utskick, inga dubletter
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Email Validation1", 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/code.svg' width='40' height='40' /></div><br/>Rate Limiter"]
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/code.svg' width='40' height='40' /></div><br/>Email Creator"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Download Resume"]
n4@{ icon: "mdi:message-outline", form: "rounded", label: "Send Gmail", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Google Sheets - Read HR Data", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Remove Duplicates", pos: "b", h: 48 }
n7["<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/>Update Counter1"]
n8["<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/>Handle Failures1"]
n9@{ icon: "mdi:database", form: "rounded", label: "Log to Google Sheets1", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n11@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n14@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n15@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n12 --> n7
n12 --> n8
n14 --> n3
n4 --> n12
n10 --> n9
n1 --> n2
n2 --> n13
n3 --> n4
n13 --> n14
n7 --> n10
n8 --> n10
n11 --> n5
n0 --> n1
n6 --> n0
n9 --> n13
n5 --> n6
n15 --> n5
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 n11,n15 trigger
class n0,n12 decision
class n5,n9 database
class n3 api
class n1,n2,n7,n8 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3,n7,n8 customIcon
Varför det här spelar roll: HR-utskick kraschar när det görs manuellt
Manuella HR-utskick ser enkla ut tills du gör det i skala. Du kopierar namn från ett ark, klistrar in mejladresser i Gmail, bifogar rätt CV, justerar formuleringar och försöker sedan minnas om du redan skickade till ”Jordan på Acme” förra veckan. Små misstag blir snabbt stora. Ett dubbelt mejl kan förstöra en relation. En dag med för hög sändningsvolym kan knuffa leveransbarheten åt fel håll, vilket gör att nästa batch tyst hamnar i skräpposten. Och värst är uppföljningen: timmar senare letar du i ”Skickat” och försöker återskapa vad som hände.
Det eskalerar snabbt. Här är var det vanligtvis brister i riktiga team.
- Dubletter smyger sig in när listor kommer från flera källor, och du märker det inte förrän någon svarar: ”Du har redan skickat det här.”
- Hantering av bilagor är förvånansvärt skör, särskilt om CV:n ligger i olika mappar eller delade enheter.
- Daglig sändningsvolym är svår att hålla koll på i huvudet, så utskicken spikar och leveransbarheten blir oförutsägbar.
- Statusspårning blir ett jobb i sig eftersom Sheets, Gmail och uppföljningsanteckningar aldrig förblir synkade.
Det du bygger: personliga utskick som skickas säkert och loggar allt
Det här flödet börjar med din HR-kontaktlista i Google Sheets, där varje rad representerar en kontakt du vill mejla. n8n hämtar raderna enligt ett schema (eller när du kör det manuellt), tar bort dubbletter och kontrollerar att mejladresserna ser giltiga ut innan något skickas. Därefter tillämpar det en daglig sändningsgräns så att utskicken blir jämna i stället för spikiga. För varje godkänd rad skapar n8n ett personligt meddelande, hämtar CV-bilagan från din filplats och skickar mejlet via Gmail. Till sist skriver det tillbaka ett tydligt lyckades/misslyckades-resultat till ett loggark, så att du alltid vet vad som hände och varför.
Flödet startar i Google Sheets och går sedan vidare genom validering och hastighetsbegränsning. Gmail hanterar själva utskicket, och loggsteget knyter ihop det hela genom att uppdatera Sheets med sändningsstatus och detaljer. Du får kontrollerade utskick med en riktig granskningslogg.
Det du bygger
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntade resultat
Säg att du kontaktar 30 HR-kontakter per dag från ett ark. Manuellt ser en ”säker” process oftast ut så här: öppna raden (1 minut), skriva och personanpassa (3 minuter), hitta och bifoga CV:t (2 minuter), skicka och sedan logga tillbaka i arket (1 minut). Det är cirka 7 minuter per kontakt, eller runt 3,5 timmar per dag. Med det här flödet uppdaterar du arket och kör det; skickande och loggning sker automatiskt och din tid går ned till snabb listvård plus att punktkontrollera fel.
Innan du börjar
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för egen drift om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att lagra kontakter och loggrader.
- Gmail för att skicka utskick från ditt konto.
- Plats för CV-filer (Google Drive eller en nedladdnings-URL) för bilagor.
Nivå: Medel. Du kopplar Google-uppgifter och redigerar några inställningar för ”meddelande” och ”gränser” utan problem.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
En schemalagd eller manuell trigger startar körningen. Du kan låta det köra dagligen med schematriggern, eller starta det vid begäran när du precis har uppdaterat arket.
Kontakter hämtas från Google Sheets och rensas upp. n8n läser raderna i ditt HR-ark, tar bort dubletter och kontrollerar grundläggande mejlformat så att uppenbart felaktiga indata inte slösar utskick eller förstör din loggning.
Sändningsgränser tillämpas innan mejlinnehållet skapas. Ett steg för hastighetsbegränsning tillämpar din dagliga plan (inklusive att trappa upp över tid om du vill), och därefter skriver flödet ett personligt meddelande för varje godkänd kontakt.
Bilagor hämtas och mejlen skickas via Gmail. n8n laddar ned CV-filen, bifogar den, skickar meddelandet och utvärderar sedan om Gmail returnerade ett lyckat svar.
Allt loggas tillbaka till Sheets. Både lyckade och misslyckade skickningar mappas till en korrekt formaterad loggrad, vilket gör att du kan filtrera på status och bara försöka igen på det som misslyckades.
Du kan enkelt justera reglerna för dagliga gränser så att de matchar din policy för utskick baserat på roll, region eller kampanj. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera Schedule Trigger
Ställ in de tidsbaserade och manuella triggers som startar arbetsflödet och leder in i samma väg för datainhämtning.
- Välj Scheduled Start och bekräfta att schemaregeln använder
triggerAtHour: 9så att den körs dagligen kl. 09:00. - Låt Manual Run Trigger vara ansluten till Fetch HR Sheet Rows så att ni kan testa flödet vid behov.
- Verifiera att både Scheduled Start och Manual Run Trigger matar in i Fetch HR Sheet Rows enligt körflödet.
Steg 2: Anslut Google Sheets
Konfigurera HR-datakällan och loggningsdestinationen i Google Sheets.
- Öppna Fetch HR Sheet Rows och ställ in Document ID till
YOUR_RESOURCE_ID_HEREoch Sheet Name tillYOUR_RESOURCE_ID_HERE. - Inloggning krävs: Anslut era Google Sheets-inloggningsuppgifter i Fetch HR Sheet Rows.
- Öppna Append Log to Sheets och ställ in Operation till
appendmed Document IDYOUR_RESOURCE_ID_HEREoch Sheet NameYOUR_RESOURCE_ID_HERE. - Bekräfta att kolumnmappningarna i Append Log to Sheets använder uttryck som
{{ $json.Email }},{{ $json.emailStatus }}och{{ $now.format('MM-DD HH:mm:ss') }}. - Inloggning krävs: Anslut era Google Sheets-inloggningsuppgifter i Append Log to Sheets.
YOUR_RESOURCE_ID_HERE kommer Fetch HR Sheet Rows och Append Log to Sheets att misslyckas med att läsa eller skriva data.Steg 3: Ställ in validering och sändningsgränser
Filtrera giltiga e-postadresser, ta bort dubbletter och tillämpa dagliga sändningsgränser innan ni skapar utkast till meddelanden.
- I Eliminate Duplicate Records behåller ni standardinställningarna för att avdubbla inkommande HR-rader.
- I Validate Email Format bekräftar ni att regex-kontrollerna använder
{{ $json["Email"] }}och mönstren^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$och^(?:info|support|sales|admin|no[-.]?reply|noreply|contact|help|service|marketing|team|hello|hi)@. - I Apply Sending Limits uppdaterar ni ramp-inställningarna vid behov:
RAMP_START = new Date('2025-09-21')ochLIMIT_BY_WEEK = [150]. - Säkerställ att flödet fortsätter från Validate Email Format → Apply Sending Limits → Compose Email Draft.
Steg 4: Konfigurera utkast, batchning och fördröjningar
Skapa e-postinnehållet, bearbeta mottagare i batchar och upprätthåll fördröjningen mellan utskick.
- I Compose Email Draft ersätter ni platshållaren
YOUR_URL_HEREmed er faktiska utkastlogik eller ert API-anrop. - Använd Batch Iterator för att dela upp listan; behåll alternativen som de är om ni inte vill ange en batchstorlek.
- I Delay Interval ställer ni in Amount till
60för att pausa 60 sekunder mellan batchar. - Bekräfta sekvensen Compose Email Draft → Batch Iterator → Delay Interval → Retrieve Resume File.
60 till önskad fördröjning.Steg 5: Konfigurera e-postutskick och loggning
Bifoga CV-filen, skicka e-post via Gmail, utvärdera resultatet och logga tillbaka till Sheets.
- I Retrieve Resume File ställer ni in URL till
YOUR_GOOGLE_DRIVE_URL_HEREoch låter Response Format vara inställt på file. - Öppna Dispatch Gmail Message och ställ in Send To till
{{ $json.Email }}, Subject till{{ $json.emailSubject }}och Message till{{ $json.emailBody }}. - Inloggning krävs: Anslut era Gmail-inloggningsuppgifter i Dispatch Gmail Message.
- Använd Send Result Check för att routa lyckade utskick till Increment Send Counter och misslyckanden till Process Failure Case.
- I Map Log Fields bekräftar ni mappningar som
{{ $('Retrieve Resume File').item.json.Email }}och{{ $json.emailStatus }}för loggning. - Säkerställ att Map Log Fields skickar output till Append Log to Sheets så att varje sändningsförsök registreras.
Steg 6: Testa och aktivera ert arbetsflöde
Kör ett manuellt test för att validera flödet och aktivera sedan den schemalagda körningen för produktionsbruk.
- Klicka på Manual Run Trigger för att köra arbetsflödet och bearbeta ett litet urval av HR-rader.
- Verifiera att Dispatch Gmail Message returnerar ett icke-tomt
idoch att Send Result Check routar till Increment Send Counter vid lyckade utskick. - Bekräfta att Append Log to Sheets lägger till en rad med fält som
{{ $json.Email }}och{{ $json.emailSubject }}. - När testet lyckas växlar ni arbetsflödet till Active så att Scheduled Start körs dagligen kl. 09:00.
Felsökningstips
- Google Sheets-inloggningar kan löpa ut eller kräva specifika behörigheter. Om det slutar fungera, kontrollera menyn Credentials i n8n och bekräfta först att det anslutna Google-kontot fortfarande har åtkomst till både källarket och loggarket.
- Om du använder Wait-noder eller extern rendering varierar behandlingstiderna. Öka väntetiden om efterföljande noder fallerar på tomma svar.
- Gmail OAuth-behörigheter spelar större roll än många tror. Om ”Dispatch Gmail Message” misslyckas, kontrollera din Gmail-credential scope i n8n igen och bekräfta att avsändarkontot inte har nått dagliga sändningsgränser.
Snabba svar
Cirka 30 minuter om din åtkomst till Sheets och Gmail redan är klar.
Nej. Du kopplar främst konton och redigerar mejlmallen och gränserna. Flödet innehåller redan logiken för avduplicering, hastighetsbegränsning och loggning.
Ja. n8n har ett gratis alternativ för egen drift 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 med vanliga kostnader för att hosta dina CV-filer (ofta 0 kr om du använder Google Drive).
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller egen drift på en VPS. För egen drift är Hostinger VPS prisvärd och klarar n8n bra. Egen drift ger obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det bör du sannolikt. De flesta team anpassar steget ”Compose Email Draft” för ton, rolltyp och uppföljningsspråk och justerar sedan ”Apply Sending Limits” så att det matchar deras uppvärmningsplan. Du kan också byta källa för bilagan genom att ändra ”Retrieve Resume File” så att den hämtar från Google Drive i stället för en publik URL. Om du vill ha kampanjspecifik spårning kan du lägga till fler kolumner i ”Map Log Fields” så att loggen fångar sådant som rollnamn, region eller ansvarig rekryterare.
Oftast är det ett OAuth-behörighetsproblem eller en utgången Google-inloggning. Återanslut din Gmail-credential i n8n och bekräfta sedan att avsändarkontot kan skicka mejl som vanligt och inte har nått en daglig sändningstak. Om det bara misslyckas på vissa rader, kontrollera mejladresserna som gick igenom valideringen och se till att du inte skickar till tomma eller felaktigt formaterade värden som hämtats från Sheets.
Det beror på din plan och de gränser du sätter. På n8n Cloud Starter arbetar du inom din månatliga exekveringskvot, medan egen drift inte har någon exekveringstak (din server blir begränsningen). I praktiken är det här flödet byggt för taktad sändning, så det är vanligt att köra 20–200 mejl per dag med väntetider mellan batcher för att hålla Gmail nöjt.
Ofta, ja. Det här flödet bygger på förgreningslogik (hantering av lyckat vs. misslyckat), avduplicering och en konfigurerbar hastighetsbegränsare, vilket går att göra i Zapier/Make men tenderar att bli klumpigt eller dyrt när flödet växer. n8n ger dig också möjligheten till egen drift, vilket är en stor fördel när du kör utskick varje dag. Samtidigt: om du bara behöver ”läs en rad, skicka ett mejl” kan Zapier gå snabbare att komma igång med. Prata med en automationsexpert om du vill ha hjälp att välja.
När detta väl är på plats blir outreach ett kontrollerat system i stället för daglig brandsläckning. Ditt ark förblir korrekt, din sändningstakt håller sig rimlig och du får tid tillbaka till arbetet som faktiskt driver rekryteringen framåt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.