AI PLAY玩法更新持续收录
← 回到更新流

2026-09-29 · 原文发布日

n8n:ATS 新职位自动匹配候选人并排期外联

招聘场景工作流:接收 ATS 的“新职位”webhook,把职位规范化后,若技能字段不足就调 Anthropic API 抽取必备与加分技能;随后在 ATS 里搜索候选人,做去重、状态排除和电话格式化,算出带可读理由的匹配分;再查 Supabase 里的退订记录、近期触达和在投活动,过滤掉不合规人选;最后把职位、活动和候选人写入 Supabase,排好首次触达时间(只排期不发送),可选向 Slack 发上线摘要。内置演示模式可空跑。

原文要点

原工作流接收 ATS 的「新职位」webhook 或手动运行,用配置的 ATS_FIELDS 字段映射规范化职位;技能字段不足时调 Anthropic Messages API 抽取必备/加分技能;从 ATS 搜候选人(未接 ATS 时用内置示例池),做 E.164 电话格式化、状态排除、去重,算带可读理由的匹配分;再查 Supabase 的退订、近期触达、在投活动做合规过滤;最后 upsert 职位/活动/候选人并插入只排期不发送的 enrollment 行,可选 Slack 摘要。内置 DEMO_MODE、TEST_RUN 等开关。

这次做成什么

照做一条「演示模式空跑」练习:用本站合成职位 JSON 触发 webhook→Anthropic 抽技能→本站设计的打分 Code 节点给候选人池打分→演示模式跳过 Supabase→输出一份排期预览清单。先不连真实 ATS 与 Supabase,验证主链路后再逐项接真实系统。

准备什么

  • n8n 实例并能暴露 webhook 测试地址
  • Anthropic API key(用于技能抽取,可选,缺技能字段时才调用)
  • 正式接入时才需要:Supabase 项目 URL 与 service role key、含 engagement_history 函数的库表、ATS 凭证
  • Slack incoming webhook URL(仅要上线摘要时才需要)

具体怎么做

  1. 配置演示模式与字段映射

    导入模板后在 config 节点确认 DEMO_MODE=true、TEST_RUN=true,阈值如 MIN_MATCH_SCORE=60、ENROLL_TOP_N=5 按需要调整;ATS_FIELDS 按材料中的映射示例填职位标题、地点、技能字段名。演示模式会用内置候选人池,不碰真实 ATS。

  2. 用合成职位触发 webhook

    激活测试 webhook,用 curl 或 Postman POST 材料中的合成职位 JSON 到该地址。工作流先规范化职位,检测到 skills 数组过短,自动走 Anthropic 分支。

  3. 核对技能抽取结果

    Anthropic 节点使用材料中的抽取提示词,返回 requiredSkills 与 preferredSkills 并合并回 job spec。在节点输出面板检查 JSON 结构是否完整,缺字段时检查提示词中的输出格式约束。

  4. 打分与可读理由

    原模板打分逻辑未逐行公开,本练习在 Code 节点用材料中的评分示例:每命中一个必备技能+20、加分技能+10,生成 reasons 数组。确认低于 MIN_MATCH_SCORE 的候选人被 Filter 节点剔除。

  5. 排期预览与上线切换

    演示模式下 Supabase 分支返回空历史,不过滤任何人;最终输出 enrollment 预览(首触时间、候选人、分数)。确认无误后再关 DEMO_MODE,配好 Supabase 凭证与表,并先用 TEST_RUN/TEST_PHONE 试一条,确认只排期不发送。

可直接复制的材料

合成职位 webhook 测试数据

本站合成数据;skills 留空以触发 Anthropic 抽取分支。

{
  "event": "job_order.created",
  "job": {
    "id": "JO-DEMO-1042",
    "title": "高级后端工程师",
    "location": "上海",
    "workplace": "hybrid",
    "description": "负责支付中台服务,要求高并发经验,Go 为主,熟悉 Kubernetes 与 PostgreSQL,有 gRPC 经验者优先。",
    "skills": [],
    "hiringManager": "demo-hm-07"
  }
}

Anthropic 技能抽取提示词

本站编写;接入原模板时按其 Anthropic 节点实际参数结构粘贴到 system/user 对应位置。

你是招聘需求分析器。从下面职位描述中抽取技能要求,只输出 JSON,不要输出任何其他文字。
格式:{"requiredSkills":[...],"preferredSkills":[...]}
规则:必备技能最多 6 个,是职位运转不可缺的;加分技能最多 4 个,是「优先/熟悉更好」类表述;技能名用行业通用英文或中文短词,不要整句。
职位描述:{{$json.job.description}}

候选人打分 Code 示例(本站设计)

本站演示打分逻辑,非原模板算法;状态排除名单与权重可按需改。

// 输入:{ candidate: {skills:[...], phone, status}, job: {requiredSkills:[], preferredSkills:[]} }
const c = $json.candidate, j = $json.job;
if (['placed','do_not_contact','inactive'].includes(c.status)) return [];
let score = 0; const reasons = [];
for (const s of j.requiredSkills) if (c.skills.includes(s)) { score += 20; reasons.push('必备命中:' + s); }
for (const s of j.preferredSkills) if (c.skills.includes(s)) { score += 10; reasons.push('加分命中:' + s); }
let phone = (c.phone || '').replace(/[^0-9+]/g, '');
if (phone && !phone.startsWith('+')) phone = '+86' + phone.replace(/^0+/, '');
return [{ json: { name: c.name, phone, score, reasons: reasons.join('; ') || '无技能命中' } }];

config 关键字段示例

键名以原模板 config 节点实际为准,本站未逐键核对;上线前填真实 Supabase 与 Slack 值。

{
  "DEMO_MODE": true,
  "TEST_RUN": true,
  "TEST_PHONE": "+8613800000000",
  "MIN_MATCH_SCORE": 60,
  "ENROLL_TOP_N": 5,
  "ATS_VENDOR": "your-ats-vendor",
  "ATS_FIELDS": { "title": "title", "location": "location", "skills": "skills", "description": "description" },
  "SLACK_WEBHOOK_URL": "",
  "SUPABASE_URL": "",
  "SUPABASE_SERVICE_ROLE_KEY": ""
}

输入与输出示例

本站虚构演示,未运行原模板;分数与候选人来自本站示例池。

输入

POST 上面的合成职位 JO-DEMO-1042(高级后端工程师,skills 为空)到测试 webhook。

对应输出

Anthropic 抽出 requiredSkills=["Go","Kubernetes","PostgreSQL","高并发"]、preferredSkills=["gRPC","支付系统"];演示候选人池中「张伟」命中 Go/Kubernetes/PostgreSQL 得 60 分,理由「必备命中:Go; 必备命中:Kubernetes; 必备命中:PostgreSQL」;低于 60 分的两人被过滤;最终预览显示 1 条 enrollment,首触时间排在次日 10:00,状态 scheduled_not_sent。

做完检查这些

  • DEMO_MODE=true 时整条链路跑完且 Supabase/Slack 节点不报错不写入
  • skills 为空的职位能触发 Anthropic 分支并回填合法 JSON
  • 打分输出含 score 与可读的 reasons 字段,低于阈值者被剔除
  • 电话号码统一成 E.164 格式(+ 开头)
  • 关闭演示模式前 TEST_RUN=true,enrollment 只排期未发送

容易卡住的地方

  • 原模板要求 Supabase 存在特定表与 engagement_history 函数及合适 RLS 策略,缺一个就会在该分支报错
  • 字段映射 ATS_FIELDS 必须与真实 ATS 的字段名一致,否则规范化后技能为空、全部走 AI 抽取,增加 API 消耗
  • Anthropic 与 Supabase、Slack 均为外部付费/限流服务,模板本身免费不代表调用免费
  • webhook 需要在 ATS 后台订阅「job order created」事件,仅导入工作流不会收到数据
  • 原模板的具体打分权重未公开,本站示例权重仅用于练习

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Score ATS candidates and launch outreach campaigns with Supabase and Claude
原作者
muhd dahlan
原始发布日期
2026-09-29T03:26:17.066Z
来源
https://n8n.io/workflows/20111