|
EN / PT
← Voltar aos projetos

CV Automation | Do LinkedIn ao Teamtailor com n8n

CV Automation

Do LinkedIn ao Teamtailor em Segundos: Automatizar a Importação de Candidatos com n8n

Fazer sourcing de candidatos no LinkedIn Recruiter é ótimo. Até teres de copiar manualmente os dados para o ATS. Fazer download do CV, abrir o Teamtailor, criar o candidato, preencher os campos, fazer upload do ficheiro. Repetir 20 vezes por semana. Por isso construí uma automação que faz tudo isto em segundo plano.

Larga um CV numa pasta do Google Drive e ele cria automaticamente o candidato no Teamtailor, faz upload do CV para o campo correto, e associa ao job certo. Sem tocar no ATS.


1. O Problema

A nossa equipa de recrutamento fazia sourcing no LinkedIn Recruiter e importava manualmente os candidatos para o Teamtailor. O processo era:

  1. Encontrar um candidato no LinkedIn
  2. Fazer download do CV (o LinkedIn permite até 25 de uma vez, 200/mês por seat)
  3. Abrir o Teamtailor
  4. Criar um novo candidato manualmente
  5. Fazer upload do CV
  6. Preencher nome, email, posição
  7. Repetir

A integração LinkedIn Recruiter System Connect (RSC) com o Teamtailor só funciona quando candidatos aplicam através de uma job posting. Não faz nada para candidatos sourced. O CV também nunca fica no campo correto para parsing automático.


2. A Stack

Camada Tecnologia
Automação de Workflows n8n (self-hosted)
Armazenamento de Ficheiros Google Drive
Upload de CV Teamtailor Transient Upload API
ATS Teamtailor
Trigger Google Drive polling (cada minuto)

3. O Pipeline de Automação

O workflow corre inteiramente em n8n e tem 6 passos:

CV largado na pasta do Google Drive
              │
              ▼
┌─────────────────────────┐
│   Watch CV Folder        │
│   Google Drive Trigger   │
│   (verifica cada minuto) │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│   Download CV            │
│   Busca o PDF binário    │
│   do Drive               │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│   Upload para Teamtailor │
│   POST /v1/files         │
│   Devolve URI transient  │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│   Criar Candidato        │
│   POST /v1/candidates    │
│   resume = URI transient │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│   Encontrar Job por      │
│   Título                 │
│   GET /v1/jobs           │
│   filtrado pelo filename │
└────────────┬────────────┘
             │
             ▼
┌─────────────────────────┐
│   Criar Job Application  │
│   POST /v1/job-apps      │
│   liga candidato + job   │
└─────────────────────────┘

4. Decisões Técnicas Principais

Teamtailor Transient Upload

A API pública do Teamtailor não suporta binary-data no endpoint de criação de candidatos. Isso só está disponível na Direct Apply API para parceiros de job boards. A abordagem correta para importar CVs externos é o endpoint de transient upload:

POST https://api.teamtailor.com/v1/files
Content-Type: multipart/form-data

file: [PDF binário]

Isto devolve uma URI transient: de uso único que se passa como valor de resume ao criar o candidato. O Teamtailor faz download, faz parse do CV e preenche automaticamente nome, telefone, LinkedIn URL e morada a partir do documento.

Match de Jobs por Convenção de Nome de Ficheiro

Em vez de hardcodar IDs de jobs ou construir uma tabela de mapeamento, o workflow usa uma convenção simples no nome do ficheiro:

EMEA Marketing Intern - Berta Carol Jutgla.pdf
SDR SP Intern - João Silva.pdf

O texto antes do - é extraído como job title e usado numa chamada à API em tempo real:

GET /v1/jobs?filter[title]=EMEA Marketing Intern

Isto significa que não é necessária configuração quando são criadas novas vagas no Teamtailor. O workflow encontra-as dinamicamente pelo nome.

Porquê Não Usar o Google Drive Desktop?

O cliente desktop do Google Drive introduz um delay de sincronização. Um ficheiro pode aparecer na pasta local antes de ter sido completamente enviado para os servidores da Google. Quando o n8n faz polling e deteta o ficheiro, pode tentar fazer download de um upload incompleto. Usar o upload direto pelo browser em drive.google.com garante que o ficheiro está completamente disponível no servidor antes do trigger disparar.


5. O Que é Preenchido Automaticamente

Quando o CV fica no campo resume do Teamtailor (não como attachment), o resume parser integrado extrai automaticamente:

  • ✅ Nome completo
  • ✅ Número de telefone
  • ✅ URL do LinkedIn
  • ✅ Morada / localização
  • ✅ Resumo do CV (via Co-pilot)

O email não é extraído automaticamente. O parser do Teamtailor omite-o por razões de privacidade. Um email placeholder é usado na criação e atualizado manualmente quando o recrutador faz contacto.


6. O Workflow em n8n

O workflow completo tem 8 nodes:

Node Tipo Ação
Watch CV Folder Google Drive Trigger Deteta novos ficheiros na pasta
Download CV Google Drive Faz download do PDF binário
Upload to Teamtailor HTTP Request POST para /v1/files, obtém URI transient
Create Candidate HTTP Request POST para /v1/candidates com URI como resume
Extract Candidate ID & Job Title Code Faz parse do ID do candidato + extrai job title do filename
Find Job by Title HTTP Request GET /v1/jobs filtrado por título
Prepare Job Application Code Extrai job ID, combina com candidate ID
Create Job Application HTTP Request POST para /v1/job-applications

Todos os nodes HTTP usam application/vnd.api+json como Content-Type (o Teamtailor segue a especificação JSON:API).


7. Lições Aprendidas

A API do Teamtailor é JSON:API. Todos os pedidos precisam de Content-Type: application/vnd.api+json, não application/json. Isto causou erros 500 silenciosos durante horas antes de ser identificado.

Dados binários em Code nodes do n8n. Aceder a dados binários de um node anterior requer items[0].binary.data.data, que já contém uma string base64. O helper getBinaryDataBuffer não funciona de forma fiável em todos os contextos.

O Google Drive Trigger processa múltiplos ficheiros. Quando vários CVs são largados ao mesmo tempo, o trigger devolve múltiplos items. Todos os Code nodes têm de estar no modo "Run Once for Each Item", caso contrário só o primeiro ficheiro é processado.

As URIs transient são de uso único. Têm de ser usadas em ~30 segundos após a geração. O workflow é suficientemente rápido para que isto não seja um problema na prática.


Conclusão

O que antes demorava 5 minutos por candidato agora demora 5 segundos. O recrutador faz download dos CVs do LinkedIn, renomeia-os com o prefixo do job title, larga-os na pasta do Drive, e o Teamtailor trata do resto.

A parte mais interessante desta build foi descobrir a API de transient upload do Teamtailor. Um endpoint não óbvio que não está documentado de forma proeminente, mas a forma correta de importar CVs programaticamente para o campo resume em vez de como attachments genéricos.


Construído por Nuno, Veesion Tech & IT