CV-granskning faller ihop i samma stund som den ”enkla delen” blir datainmatning. Du öppnar en PDF, kopierar ett namn, klistrar in det i Airtable och upprepar sedan för antal års erfarenhet, senaste roll, plats, LinkedIn och allt annat teamet spårar. Missar du en rad är din pipeline plötsligt full av halvt felaktiga poster.
Det här är den sortens röra som rekryterare känner av varje dag, men HR ops och byråteam som jobbar med kandidatinhämtning råkar också ut för det. Med automatiserad CV-tolkning slutar du skriva in samma fakta om och om igen och kan börja granska kandidater tidigare. Mer strukturerade fält. Färre ”vänta, är det där deras nuvarande titel?”-ögonblick.
Den här guiden går igenom vad arbetsflödet gör, varför det fungerar så bra för röriga CV:n och hur du sätter upp det i n8n utan att leva i kalkylblad.
Så fungerar automatiseringen
Här är det kompletta arbetsflödet du kommer att sätta upp:
n8n Workflow Template: Airtable + OpenAI: cv tolkade till strukturerade fält
flowchart LR
subgraph sg0["Derive Field Value Flow"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Event Category Router", 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/>Extract Prompt Fields"]
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/>Fetch File Content"]
n3@{ icon: "mdi:cog", form: "rounded", label: "Parse File Content", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assemble Row Output", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Record Batch", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Row Snapshot", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "Derive Field Value", pos: "b", h: 48 }
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/>Identify Missing Fields"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Row Updates", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Row Pointer", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve File Content"]
n12@{ icon: "mdi:cog", form: "rounded", label: "Parse File Content B", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Compile Field Output", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "Derive Single Field", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Rows With Files", pos: "b", h: 48 }
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Described Fields", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Event Context", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Event Context B", pos: "b", h: 48 }
n19@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Engine", pos: "b", h: 48 }
n20@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Engine B", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Retrieve Webhook Payload"]
n22["<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/>Interpret Event Data"]
n23["<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/airtable.svg' width='40' height='40' /></div><br/>Fetch Table Schema"]
n24["<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/airtable.svg' width='40' height='40' /></div><br/>Retrieve Table Records"]
n25["<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/airtable.svg' width='40' height='40' /></div><br/>Modify Row Record"]
n26["<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/airtable.svg' width='40' height='40' /></div><br/>Fetch Single Row"]
n27@{ icon: "mdi:swap-vertical", form: "rounded", label: "Append Row ID", pos: "b", h: 48 }
n28["<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/airtable.svg' width='40' height='40' /></div><br/>Modify Record Fields"]
n29["<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/>Airtable Incoming Webhook"]
n26 --> n15
n10 --> n11
n17 --> n16
n18 --> n26
n0 --> n18
n0 --> n17
n4 --> n25
n25 --> n5
n13 --> n27
n22 --> n0
n24 --> n5
n2 --> n3
n6 --> n2
n28 --> n9
n11 --> n12
n5 --> n6
n29 --> n23
n8 --> n14
n23 --> n1
n9 --> n10
n3 --> n7
n15 --> n9
n1 --> n21
n19 -.-> n14
n12 --> n8
n20 -.-> n7
n16 --> n24
n21 --> n22
n7 --> n4
n27 --> n28
n14 --> n13
end
subgraph sg1["Manual Run Flow"]
direction LR
n30@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Run Trigger", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define Airtable Settings", pos: "b", h: 48 }
n32["<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/airtable.svg' width='40' height='40' /></div><br/>Fetch Schema Setup"]
n33@{ icon: "mdi:swap-vertical", form: "rounded", label: "Locate Input Field", pos: "b", h: 48 }
n34["<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/>Create Records Webhook"]
n35["<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/>Create Fields Webhook"]
n33 --> n34
n32 --> n33
n31 --> n32
n31 --> n35
n30 --> n31
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 n30 trigger
class n7,n14 ai
class n19,n20 aiModel
class n0,n15,n16 decision
class n23,n24,n25,n26,n28,n32 database
class n2,n11,n21,n29,n34,n35 api
class n1,n8,n22 code
classDef customIcon fill:none,stroke:none
class n1,n2,n8,n11,n21,n22,n23,n24,n25,n26,n28,n29,n32,n34,n35 customIcon
Varför detta spelar roll: datainmatning av CV:n är en flaskhals
De flesta rekryteringsteam har egentligen inte problem med att få in CV:n. De har problem med att omvandla dem till konsekvent, sökbar data. PDF:er kommer i olika layouter, med otydliga rubriker, duplicerade avsnitt och ”kreativ” formatering som ser bra ut för människor och är usel för system. Så någon plockar manuellt ut samma detaljer varje gång och rättar sedan stavfel när en kollega inte kan filtrera på plats eller sortera på antal års erfarenhet. Det är inte bara långsamt. Det är mentalt dränerande, och det försenar i det tysta kontakt med riktigt bra kandidater.
Friktionen växer. Särskilt när dina Airtable-fält utvecklas över tid.
- Copy-paste från PDF:er är felkänsligt, och små misstag gör att filtrering och rapportering skapar fel.
- Olika teammedlemmar tolkar samma CV olika, så ”nuvarande titel” blir snabbt inkonsekvent.
- När du lägger till ett nytt fält (som ”arbetstillstånd”) måste någon fylla i äldre poster manuellt.
- Rekryterande chefer slutar med att läsa råa PDF:er eftersom databasfälten inte går att lita på.
Vad du bygger: Airtable-styrd CV-extraktion med flexibla prompts
Det här arbetsflödet gör om en CV-PDF till strukturerade Airtable-fält med OpenAI, men den stora vinsten är hur lätt det är att underhålla. I stället för att hårdkoda vad som ska extraheras i n8n läser arbetsflödet dina kolumnbeskrivningar i Airtable som ”dynamiska prompts”. Du bifogar en CV-PDF (eller uppdaterar inmatningsfältet) i Airtable, Airtable triggar n8n via webhook och n8n hämtar filinnehållet. Sedan tolkar den PDF-texten, ber OpenAI extrahera exakt det som respektive fältbeskrivning efterfrågar och skriver tillbaka de felfria värdena till samma post. Lägger du till en ny kolumn senare uppdaterar du fältbeskrivningen, och extraktionen anpassar sig utan att du behöver bygga om arbetsflödet.
Arbetsflödet startar med ändelsehändelser i Airtable (ny post, uppdaterat fält eller uppdaterad fil). Därefter bearbetar det CV-innehållet och tar fram värden per fält med OpenAI. Till sist uppdaterar det Airtable så att tabellen blir din källa till sanning i stället för en lagringsplats för PDF:er.
Det här bygger du
| Vad som automatiseras | Vad du uppnår |
|---|---|
|
|
Förväntat resultat
Säg att du hanterar 20 CV:n i veckan och extraherar cirka 10 fält per CV (namn, e-post, plats, senaste roll, antal år och några egna). Manuellt kan du lägga runt 10 minuter per CV på att kopiera, kontrollera och fixa formatering, vilket blir cirka 3 timmar i veckan. Med det här arbetsflödet blir ”jobbet” att ladda upp/bifoga PDF:en och snabbt skumma de extraherade fälten efter uppenbara missar, oftast ett par minuter per CV. Det är ungefär 2 timmar tillbaka de flesta veckor, och tabellen håller sig mer strukturerad när volymen ökar.
Innan du börjar
- n8n-instans (prova n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Airtable för din CV-tabell och fältbeskrivningar.
- OpenAI för att extrahera strukturerad data från CV-text.
- OpenAI API-nyckel (hämta den från sidan för OpenAI API-inställningar)
Svårighetsgrad: Medel. Du är bekväm med att koppla konton, klistra in ID:n för Airtable-webhooks och testa med ett par riktiga poster.
Vill du att någon bygger detta åt dig? Prata med en automationsexpert (gratis 15-minuters konsultation).
Steg för steg
Airtable triggar arbetsflödet. När en CV-post skapas eller uppdateras skickar Airtable en ändelsehändelse till n8n via en inkommande webhook.
Arbetsflödet läser dina ”instruktioner” i tabellen. n8n hämtar Airtable-schemat och plockar sedan fältbeskrivningarna från de kolumner du bryr dig om. De beskrivningarna fungerar som mini-prompts (till exempel: ”Kandidatens nuvarande jobbtitel och företag”).
CV-filen hämtas och tolkas. Om posten har en bifogad PDF laddar n8n ner den, extraherar texten och förbereder kontext för AI-steget. Om det inte finns någon fil hoppar den över posten.
OpenAI extraherar värden och uppdaterar Airtable. Arbetsflödet kör en AI-extraktion för hela raden eller bara för saknade fält, slår ihop resultaten och skriver tillbaka felfria värden till Airtable-posten. Ett webhook-svar bekräftar körningen.
Du kan enkelt ändra vilka fält du extraherar så att de matchar din rekryteringsscorecard. Se den fullständiga implementationsguiden nedan för alternativ för anpassning.
Steg-för-steg-implementeringsguide
Steg 1: konfigurera webhook-triggern
Det här arbetsflödet startar från webhook-händelser i Airtable och använder dem för att driva efterföljande parsning och uppdateringar.
- Lägg till noden Airtable Incoming Webhook och ställ in HTTP Method på
POST. - Ställ in Path på
a82f0ae7-678e-49d9-8219-7281e8a2a1b2så att den matchar den inkommande Airtable-webhooken. - Anslut webhook-utdata till Fetch Table Schema för att starta schemaidentifiering för fältbeskrivningar.
Steg 2: definiera Airtable-inställningar och skapa webhooks
Använd grenen för manuell konfiguration för att registrera Airtable-webhooks och lösa indatafilfältet som används för PDF-extraktion.
- Lägg till noden Manual Run Trigger för att möjliggöra engångskonfiguration.
- I Define Airtable Settings ställer ni in appId, tableId och notificationUrl till era Airtable-värden, och sätter inputField till
File. - Define Airtable Settings skickar utdata parallellt till både Fetch Schema Setup och Create Fields Webhook.
- I Fetch Schema Setup bekräftar ni att Resource är
baseoch att Operation ärgetSchema. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter. - I Locate Input Field behåller ni uttrycket för JSON Output som det är för att hitta filfältet:
{{$input.all().map(item => item.json).find(item => item.id === $('Define Airtable Settings').first().json.tableId).fields.find(field => field.name === $('Define Airtable Settings').first().json.inputField)}}. - Konfigurera Create Records Webhook med Method
POSToch det angivna JSON-body-uttrycket. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter. - Konfigurera Create Fields Webhook med Method
POSToch det angivna JSON-body-uttrycket. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter.
Steg 3: ladda schema och tolka händelser
Den här vägen läser Airtable-schemat, hämtar webhook-payloads och routar händelser baserat på ändringstyp.
- I Fetch Table Schema behåller ni Resource inställt på
baseoch Operation inställt pågetSchema. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter. - Lämna Extract Prompt Fields som den är för att filtrera fält med beskrivningar och mappa dem till en struktur som är redo för prompten.
- I Retrieve Webhook Payload ställer ni in URL på
=https://api.airtable.com/v0/bases/{{ $('Airtable Incoming Webhook').first().json.body.base.id }}/webhooks/{{ $('Airtable Incoming Webhook').first().json.body.webhook.id }}/payloadsoch aktiverar Airtable-autentisering. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter. - Behåll koden i Interpret Event Data för att härleda
event_type,fieldochrowIdför routning. - I Event Category Router säkerställer ni att de tre rutterna matchar
row.updated,field.createdochfield.updatedmed{{ $json.event_type }}.
Steg 4: konfigurera flöde för raduppdatering (PDF-extraktion)
När en rad uppdateras hämtar arbetsflödet PDF-filen, extraherar text och skriver härledda värden tillbaka till Airtable.
- Från Event Context B ansluter ni till Fetch Single Row med ID satt till
{{$json.rowId}}. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter. - Använd Filter Rows With Files för att behålla poster där
{{$json.File[0].url}}inte är tom. - Skicka poster genom Iterate Row Updates och Row Pointer, och sätt sedan Retrieve File Content URL till
{{ $('Row Pointer').item.json.File[0].url }}. - Ställ in Parse File Content B till Operation
pdf, och kör sedan Identify Missing Fields för att avgöra vilka beskrivna fält som fortfarande är tomma. - I Derive Single Field behåller ni Text-prompten med
{{ $('Parse File Content B').first().json.text }}och{{$json.description}}för riktad extraktion. OpenAI Chat Engine är ansluten som språkmodell för Derive Single Field – säkerställ att inloggningsuppgifter läggs till i OpenAI Chat Engine. Credential Required: Anslut era openAiApi-inloggningsuppgifter. - I Compile Field Output behåller ni det dynamiska uttrycket för fältnamn
{{ $('Identify Missing Fields').item.json.name }}och matar ut{{ $json.text.trim() }}. - I Append Row ID behåller ni det råa JSON-uttrycket för att slå ihop extraherade fält och post-id, och uppdaterar sedan Airtable med Modify Record Fields. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter.
Steg 5: konfigurera flöde för fältbeskrivningar (dynamisk extraktion)
När ett beskrivet fält skapas eller uppdateras skannar arbetsflödet alla poster med filer och fyller i värden för just det specifika fältet.
- Från Event Context passerar ni genom Filter Described Fields för att säkerställa att
{{ $json.field.description }}finns. - I Retrieve Table Records behåller ni Operation
searchoch Filter By Formula inställt påNOT({File} = ""). Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter. - Iterera med Iterate Record Batch och skicka aktuellt objekt till Row Snapshot.
- Ställ in Fetch File Content URL till
{{$json.File[0].url}}och extrahera sedan med Parse File Content medpdf. - I Derive Field Value behåller ni prompttexten och fälten för utdataformat:
{{ $json.text }},{{ $('Event Context').first().json.field.description }}och{{ $('Event Context').first().json.field.type }}. OpenAI Chat Engine B är ansluten som språkmodell för Derive Field Value – säkerställ att inloggningsuppgifter läggs till i OpenAI Chat Engine B. Credential Required: Anslut era openAiApi-inloggningsuppgifter. - I Assemble Row Output sätter ni id till
{{ $('Row Snapshot').item.json.id }}och behåller det dynamiska fältnamnet{{ $('Event Context').first().json.field.name }}. - Skriv uppdateringar med Modify Row Record och behåll Operation som
update. Credential Required: Anslut era airtableTokenApi-inloggningsuppgifter.
Steg 6: verifiera stödjande noder och grupperade integrationer
Det här arbetsflödet använder flera Airtable-, HTTP- och Set-noder – verifiera nyckelkonfigurationer på den kritiska vägen och gruppera liknande noder för snabbare granskning.
- Bekräfta att alla Airtable-noder (Fetch Table Schema, Retrieve Table Records, Fetch Single Row, Modify Row Record, Modify Record Fields, Fetch Schema Setup) delar samma airtableTokenApi-inloggningsuppgifter.
- Granska HTTP-noder som används för Airtable-webhooks och filhämtningar (Retrieve Webhook Payload, Create Records Webhook, Create Fields Webhook, Fetch File Content, Retrieve File Content) för att säkerställa att URL:er använder de angivna uttrycken.
- Bekräfta att Set-noderna (Define Airtable Settings, Assemble Row Output, Compile Field Output, Append Row ID, Locate Input Field) behåller sina dynamiska uttryck intakta.
Steg 7: testa och aktivera ert arbetsflöde
Kör setup, trigga en testhändelse och aktivera sedan webhooken för produktion.
- Klicka på Execute Workflow på Manual Run Trigger för att skapa Airtable-webhooks och verifiera att anropen till Create Records Webhook och Create Fields Webhook lyckas.
- Skicka en test-webhook från Airtable (uppdatera en post eller ett fält) och bekräfta att körningen passerar genom Interpret Event Data och Event Category Router.
- För en raduppdatering kontrollerar ni att Retrieve File Content och Parse File Content B slutförs och att Modify Record Fields uppdaterar Airtable-posten med extraherade värden.
- För en fältuppdatering verifierar ni att Retrieve Table Records → Parse File Content → Modify Row Record uppdaterar varje rad med det härledda fältvärdet.
- När allt är verifierat ställer ni arbetsflödet till Active för att bearbeta Airtable-webhook-händelser i produktion.
Felsökningstips
- Airtable-autentisering kan gå ut eller kräva specifika behörigheter. Om saker slutar fungera, kontrollera först scopes för Airtables personal access token och åtkomsten till basen.
- Om du använder Wait-noder eller extern rendering varierar bearbetningstiderna. Öka väntetiden om noder längre fram fallerar på tomma svar.
- Standardprompts i AI-noder är generiska. Lägg in din tonalitet tidigt, annars kommer du att redigera utdata för alltid.
Snabba svar
Cirka en timme om din Airtable-bas redan är uppsatt.
Nej. Du kopplar ihop Airtable och OpenAI och klistrar sedan in några Airtable-ID:n för webhook-uppsättningen.
Ja. n8n har ett gratisalternativ för self-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 kostnader för OpenAI API, vilket vanligtvis är några cent per CV beroende på längd.
Två alternativ: n8n Cloud (hanterat, 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 dig obegränsade körningar men kräver grundläggande serverhantering.
Ja, och det är hela poängen med mönstret för dynamiska prompts. Du uppdaterar fältbeskrivningarna i Airtable (logiken ”Extract Prompt Fields” läser dem), och sedan följer OpenAI-extraktionsstegen (”Derive Field Value” / ”Derive Single Field”) de instruktionerna automatiskt. Vanliga anpassningar är att extrahera portföljlänkar, lägga till en uppskattning av ”senioritet” eller byta indata från en PDF-fil till ren text som klistras in i posten.
Oftast handlar det om behörigheter. Säkerställ att din Airtable-token har åtkomst till basen och inkluderar rätt scopes (schema och records), och bekräfta sedan att base-/table-ID:n matchar det arbetsflödet förväntar sig. Om webhooken skapades under ett annat konto kan du behöva återskapa Airtable-webhooks så att händelser faktiskt triggas. Kontrollera också Airtables rate limits om du uppdaterar många poster samtidigt.
Med n8n Cloud Starter brukar du kunna hantera några tusen körningar per månad, och med self-hosting försvinner körningsbegränsningar (din server blir begränsningen). I praktiken bearbetar det här arbetsflödet CV:n en post i taget och begränsas främst av PDF-tolkning och OpenAI:s svarstid, så det är bäst att köra det kontinuerligt i stället för att batcha hundratals på en gång. Om du väntar dig hög volym, lägg till throttling och en kö så att Airtable-uppdateringar inte staplas på hög.
Ofta, ja. Upplägget med dynamiska prompts bygger på att läsa Airtable-schemat och köra rikare logik (som ”fyll bara saknade fält”), och n8n hanterar vanligtvis den typen av förgrening mer naturligt. Du får också möjligheten att self-hosta, vilket spelar roll när varje CV triggar flera steg och kostnader lätt smyger upp. Zapier eller Make kan fortfarande fungera om du vill ha ett väldigt enkelt ”PDF in, fält ut”-flöde och inte planerar att vidareutveckla ditt schema. Om du är osäker, prata med en automationsexpert och mappa det mot din volym.
När detta väl rullar slutar CV:n vara en hög med PDF:er och blir tillförlitlig Airtable-data. Sätt upp det en gång, finjustera dina fältbeskrivningar löpande och kom tillbaka till faktiska rekryteringsbeslut.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.