CV-granskning låter enkelt tills du har 25 PDF:er, en kravprofil och en rekryterande chef som ber om ”topp 5 till imorgon”. Då blir det copy-paste-kaos, inkonsekventa magkänslebeslut och anteckningar som inte stämmer med det du sa i förra rekryteringsrundan.
Det här är automatiserad CV-granskning byggd för rekryterare som behöver öka tempot, grundare som rekryterar vid sidan av och HR-chefer som behöver beslut de kan motivera. Du får en rankad shortlist med matchningspoäng, styrkor, svagheter och en tydlig rekommendation, utan att läsa samma CV två gånger.
Nedan ser du hur flödet körs i n8n, vad det levererar och vad du behöver för att sätta upp det så att granskningen förblir konsekvent även när volymen sticker iväg.
Så fungerar den här automationen
Hela n8n-flödet, från trigger till slutligt resultat:
n8n Workflow Template: OpenAI + Google Sheets: rankade CV-urval snabbt
flowchart LR
subgraph sg0["AI Recruiter Agent Flow"]
direction LR
n0["<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/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
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/webhook.dark.svg' width='40' height='40' /></div><br/>Respond to Webhook"]
n2@{ icon: "mdi:robot", form: "rounded", label: "AI Recruiter Agent", pos: "b", h: 48 }
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/>Parse Recruiter Output"]
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/code.svg' width='40' height='40' /></div><br/>List_File"]
n5["<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/>Detect PDF Type"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n7@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n8@{ icon: "mdi:cog", form: "rounded", label: "Extract from File", pos: "b", h: 48 }
n9["<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/>Convert Base64 to Binary"]
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Replace Me", pos: "b", h: 48 }
n12["<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/>Reattach_Metadata_After_Extr.."]
n13["<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/>Combine_Candidates_For_AI"]
n14["<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/>Preprocess_CV_Names"]
n6 --> n9
n0 --> n4
n4 --> n5
n11 --> n10
n5 --> n6
n10 --> n8
n10 --> n11
n8 --> n12
n7 -.-> n2
n2 --> n3
n14 --> n2
n3 --> n1
n9 --> n10
n13 --> n14
n12 --> n13
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 ai
class n7 aiModel
class n6 decision
class n0,n1 api
class n3,n4,n5,n9,n12,n13,n14 code
classDef customIcon fill:none,stroke:none
class n0,n1,n3,n4,n5,n9,n12,n13,n14 customIcon
Problemet: CV-granskning blir snabbt rörig
Manuell granskning faller ihop så fort kandidater kommer in i blandade format. Vissa CV:n är korrekt formaterad text. Andra är PDF:er med märkliga layouter, saknade rubriker eller namn som inte matchar filnamnet. Du slutar med att öppna varje fil, leta efter erfarenhet och sedan försöka jämföra kandidater i huvudet medan dina anteckningar ligger på tre olika ställen. Värst är konsekvensen. Två personer kan läsa samma CV och ge helt olika poäng, vilket leder till fler möten och mer velande.
Det går snabbt utför. Här är var det brukar spåra ur.
- Att läsa och läsa om CV:n tar flera timmar per roll, och det är innan du ens börjar shortlist:a.
- PDF-extraktion är opålitlig, så ”snabb poängsättning” blir till manuell efterstädning.
- Rekryteringsfeedback blir subjektiv eftersom det saknas en gemensam rubric kopplad till kravprofilen.
- Din shortlist är inte revisionsvänlig, vilket gör godkännanden och samsyn med intressenter långsammare än det behöver vara.
Lösningen: OpenAI-poängsättning + ranking i Google Sheets
Det här flödet förvandlar en hög med CV:n och en kravprofil till en strukturerad shortlist du faktiskt kan använda. Det startar när du laddar upp en kravprofil och flera CV-filer via en webhook (PDF eller text). Flödet avgör vilken fil som är kravprofilen respektive kandidaternas dokument och extraherar sedan text från PDF:er så att allt blir jämförbart. Därefter utvärderar en AI-rekryteraragent varje kandidat mot kravprofilen med en konsekvent rubric och genererar en matchningspoäng plus styrkor, svagheter och en rekommendation. Slutligen returneras resultaten i ett strukturerat svar och kan loggas till Google Sheets så att din shortlist blir en levande dashboard i stället för ett engångsmeddelande i Slack.
Flödet börjar med en webhook-uppladdning av kravprofilen och CV:n. Sedan normaliserar det filnamn, extraherar text (inklusive från PDF:er) och batchar kandidater för poängsättning. OpenAI producerar strukturerad utvärderingsdata och flödet ger ett rankat resultatpaket som är redo för rapportering och granskning i Sheets.
Vad du får: automation vs. resultat
| Vad det här flödet automatiserar | Resultat du får |
|---|---|
|
|
Exempel: så här kan det se ut
Säg att du rekryterar till en roll och får in 20 CV-PDF:er. Manuellt blir även en snabb första genomgång på cirka 8 minuter per CV ungefär 3 timmar, och sedan behöver du fortfarande skriva anteckningar och ranka kandidater efteråt. Med det här flödet laddar du upp kravprofilen plus de 20 CV:n en gång (några minuter), och väntar sedan medan extraktion och poängsättning kör (ofta runt 15–20 minuter beroende på PDF:er och modellens hastighet). Du får en rankad lista med konsekvent motivering och kan lägga in den i Google Sheets direkt.
Det här behöver du
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- OpenAI för poängsättning och rekryterar-lik analys
- Google Sheets för att logga resultat och ranka kandidater
- OpenAI API-nyckel eller n8n AI Agent-behörighet (hämta den i din OpenAI-dashboard eller i n8n-credentials)
Kunskapsnivå: Medel. Du kopplar behörigheter, testar webhook-uppladdningen och justerar utvärderingsprompten så den matchar kraven för rollen.
Vill du inte sätta upp det här själv? Prata med en automationsexpert (gratis 15-minuters konsultation).
Så fungerar det
En webhook-uppladdning startar allt. Du skickar in en kravprofil och en batch med kandidaters CV-filer (PDF eller text). Flödet bekräftar direkt att begäran är mottagen så att du inte sitter och väntar i en webbläsarflik som bara snurrar.
Flödet identifierar vad som är vad. Det samlar filposter, identifierar format och separerar kravprofilen från CV:n. Om ett CV är en PDF konverterar det base64-payloaden till en binär fil så att den kan extraheras pålitligt.
Kandidattext extraheras och normaliseras. PDF:er går igenom textextraktion, sedan återkopplar flödet metadata (som ursprungligt filnamn) och normaliserar kandidatnamn så att resultaten inte kommer tillbaka som ”document (3).pdf”. Liten detalj. Stor förbättring i vardagen.
OpenAI utvärderar varje kandidat i batchar. AI-rekryteraragenten jämför varje CV mot kravprofilen och returnerar strukturerade fält som matchningspoäng, styrkor, svagheter och en rekommendation. Ett kodsteg analyserar sedan rekryterarresultaten så att slutsvaret blir konsekvent och lätt att lagra.
Du kan enkelt ändra poängkriterierna så att de matchar din rekryteringsrubric utifrån dina behov. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementering
Steg 1: Konfigurera webhook-triggern
Sätt upp den inkommande webhooken som tar emot JD-text och CV-filer från ert formulär eller er klientapp.
- Lägg till noden Incoming Webhook Trigger och ställ in HTTP Method på
POST. - Ställ in Path på
chat-new. - Ställ in Response Mode på
responseNodeså att arbetsflödet svarar via Return Webhook Response. - Koppla Incoming Webhook Trigger till Collect File Entries.
body.message (JD-text) och body.files[] (base64-filer) för att validera parsning i Collect File Entries.
Steg 2: Koppla in CV-filintag och PDF-detektering
Parsa inkommande filer, detektera PDF-typ och routa endast textbaserade PDF:er till extraktionspipen.
- I Collect File Entries behåller ni befintlig kod som mappar
body.filestill items som innehållerjd,filenameochbase64. - I Identify PDF Format behåller ni Mode satt till
runOnceForEachItemför att klassificera varje fil somtextellerscan. - Konfigurera Branch on PDF Text med Loose Type Validation satt till
=={{ $json["pdf_type"] === "text" }}. - Koppla Branch on PDF Text till Decode Base64 to Binary.
base64 saknas returnerar Identify PDF Format pdf_type = unknown, så filen kommer inte att bearbetas. Validera er klient-payload innan ni testar.
Steg 3: Sätt upp PDF-extraktion och sammanställning av kandidater
Konvertera base64-filer till binära PDF:er, extrahera text och bygg om metadata till en kandidatlista för utvärdering.
- I Decode Base64 to Binary behåller ni Mode satt till
runOnceForEachItemoch behåller den binära mappningen tillapplication/pdf. - Koppla Decode Base64 to Binary till Iterate Records Batch, och koppla sedan Iterate Records Batch till Extract PDF Text.
- I Extract PDF Text ställer ni in Operation på
pdf. - Koppla Extract PDF Text till Rejoin Metadata After Extract, sedan till Assemble Candidates Payload och därefter till Normalize CV Names.
- Låt Placeholder Step vara fortsatt kopplad från Iterate Records Batch för felsökning och framtida utbyggnad.
Steg 4: Konfigurera AI-utvärderingslagret
Sätt upp AI-utvärderaren för att jämföra JD och CV:n och ta fram strukturerade poängresultat.
- Öppna Recruitment AI Evaluator och behåll prompten i Text som den är för att säkerställa strukturerad poängsättning och strikt hantering av namn. Prompten använder
{{ $json.jd }}och{{ JSON.stringify($json.candidates) }}för att skicka in JD och kandidater. - Säkerställ att OpenAI Chat Engine är kopplad som språkmodell för Recruitment AI Evaluator.
- Behörighet krävs: Koppla era openAiApi-uppgifter i OpenAI Chat Engine.
- Koppla Normalize CV Names till Recruitment AI Evaluator, och sedan till Analyze Recruiter Results.
Steg 5: Konfigurera utdatarespons
Returnera poängresultaten till anroparen som webhook-svar.
- I Analyze Recruiter Results behåller ni JSON-parsningen och logiken för kandidatrankning intakt för att skapa
summary_textoch kandidatmetrik. - I Return Webhook Response ställer ni in Respond With på
allIncomingItems. - Bekräfta att Analyze Recruiter Results är kopplad till Return Webhook Response.
Steg 6: Testa och aktivera ert arbetsflöde
Verifiera end-to-end-bearbetning innan ni aktiverar arbetsflödet i produktion.
- Klicka på Execute Workflow och skicka en POST-request till Incoming Webhook Trigger-URL:en med ett exempel på JD i
body.messageoch base64-PDF:er ibody.files[]. - Bekräfta lyckade körningar: Extract PDF Text outputar
text, Recruitment AI Evaluator returnerar poängsatta kandidater och Return Webhook Response svarar med en JSON-payload som inkluderarsummary_text. - När testet fungerar växlar ni arbetsflödet till Active för att börja bearbeta inkommande inskick i realtid.
Vanliga fallgropar
- OpenAI-behörigheter kan löpa ut eller blockeras av saknad fakturering/behörigheter. Om det skapar fel, kontrollera först status för din OpenAI API-nyckel och dina användningsgränser i OpenAI-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 redigera output för alltid.
Vanliga frågor
Cirka 30 minuter om du redan har access till OpenAI och Google Sheets.
Nej. Du kopplar främst konton och klistrar in dina poängkriterier. Om du vill ha anpassade poängformler är lite JavaScript hjälpsamt, men det är valfritt.
Ja. n8n har ett gratis self-hosted-alternativ 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 OpenAI API-kostnader, som vanligtvis är några cent per kandidat beroende på CV-längd och modell.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärt och hanterar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är ett av de bättre användningsfallen för den här setupen. Du kan justera prompten som AI-rekryteraragenten använder för att styra vilket språk den ska svara på, eller för att returnera tvåspråkiga fält för styrkor och svagheter. Om du vill ha olika rubrics per språk kan du lägga till en enkel gren för ”språk upptäckt” före AI-steget och routa kandidater till separata promptmallar. Många team lägger också till en extra output-kolumn i Google Sheets för ”språksäkerhet” så att granskare vet när de bör dubbelkolla.
Oftast beror det på en ogiltig eller utgången API-nyckel, eller att fakturering inte är aktiverad på OpenAI-kontot. Uppdatera behörigheten i n8n och kör igen med en kandidat först för att bekräfta att det fungerar. Om du skickar många långa PDF:er samtidigt kan rate limits också orsaka intermittenta fel, så batchning (Split in Batches) och lite långsammare körningar hjälper.
Dussintals per körning är normalt, och större batchar fungerar om du processar dem i mindre delar.
Ofta, ja, eftersom det här flödet behöver branching, batchning och filhantering (PDF-extraktion plus strukturerad AI-output) som blir klumpigt och dyrt i enklare verktyg. n8n ger dig också mer kontroll över hur kandidatdata slås ihop, namnges och returneras, vilket spelar roll när du presenterar resultat för intressenter. Zapier eller Make kan fortfarande fungera bra om du bara poängsätter ett CV i taget och inte bryr dig om korrekt formaterad, repeterbar rankningslogik. Om din process inkluderar ”ladda upp många filer, poängsätt alla, ranka och logga”, är n8n oftast det lugnare alternativet. Prata med en automationsexpert om du vill ha en snabb rekommendation baserat på din volym.
När detta väl rullar slutar granskningen att vara flaskhalsen. Du får bättre shortlists, tydligare beslut och ett flöde du kan upprepa för varje roll utan att uppfinna processen på nytt.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.