ooligo
n8n-flow

n8nによるインバウンド応募者トリアージ

Difficulty
中級
Setup time
60min
For
recruiter · sourcer · talent-acquisition
Recruiting & TA

Stack

新しいAshbyへの応募を待ち受け、候補者レコードと職種の必須ルーブリックを取得し、Claudeに職務経歴書の証拠を引用してルーブリックに照らして応募をスコアリングさせ、結果を3つのSlackチャンネルのうちの1つにルーティングするn8nフローです:#review-needed(大半)、#fast-track(集計スコアと最新性で上位10%)、または #surfaced-not-rejected(しきい値以下だが可視化を維持 — フローは自動却下しません)。採用担当者の毎日の受信ボックス整理の1時間を、12〜15分で処理できるランク付けされたSlackキューに置き換えます。

使う場面

  • ロールごとに週30件以上のインバウンド応募を受信し、採用担当者がほとんどフィットしない職務経歴書の読み取りに1時間以上/日を費やしている場合。
  • ロールに各ディメンション(スキルマッチ、レベル、場所/就労許可、応答可能性)に行動基準を持つ書面ルーブリックがある場合。ルーブリックテンプレートはバンドルの _README.md にあります。これがなければフローは感覚でスコアリングします。
  • Ashbyまたは応募ごとのWebhookを提供する別のATSを使用している場合。Greenhouse、Lever、Workableすべてが対応します;フローの受付ノードはクリーンに入れ替わります。ポーリングのみのATSプラットフォームは機能しますが、レイテンシーが最低5分になります。
  • 採用担当者が毎日少なくとも #review-needed キューを処理し、すべてのエントリーを対処する場合。フローはATSで候補者をステージに移動させません。

使わない場面

  • 自動却下をループに組み込む場合。 フローはランク付けとルーティングをします;却下は絶対にしません。スコアしきい値に却下アクションを配線すると、自動化された意思決定になります — これはNYC Local Law 144のバイアス監査義務(稼働から1年以内)とEU AI Act付録III高リスクシステム義務(EU居住候補者の場合)をトリガーします。フローの3番目のバケット(#surfaced-not-rejected)は採用担当者が却下されていたであろう人を見てオーバーライドできるように存在します。
  • スコアリング入力として人口統計データを使う場合。 フローは名前、写真、独立したシグナルとしての学校名、住所、卒業年から推測された年齢、性別代名詞、雇用ギャップのペナルティ、行動基準なしの「カルチャーフィット」でスコアリングすることを拒否します。バンドルの _README.md のフェアネスチェックリストはルーブリックの事前確認として実行されます。
  • 境界線上のケースでの採用担当者の判断の置き換え。 カットオフの15%以内の集計スコアはどちらの末端でもなく #review-needed にルーティングされます。これは意図的な裁量のバンドバッファです。
  • 週10件未満の応募を受け取るロール。 手動トリアージはルーブリックとSlackキューの調整よりも速いです。フローのセットアップコスト(60分プラスルーブリックの作成)は週30件の応募ラインで回収できます、週5件ではありません。
  • 機密/エグゼクティブロール。 異なる同意ポスチャー。異なる監査チェーン。異なるルーティング — これらは共有のSlackチャンネルではなく、指名された採用担当者に直接届きます。

セットアップ

  1. フローをインポートする。 apps/web/public/artifacts/inbound-applicant-triage-n8n/inbound-applicant-triage-n8n.json をn8nインスタンスにドロップします。すべてのノードに notesInFlow: true があるため、キャンバス内のノートが選択を説明します。
  2. 認証情報を接続する。 フローには3つが必要です:PLACEHOLDER_ASHBY_CRED_ID(Ashby APIキー、読み取りスコープのみ)、PLACEHOLDER_ANTHROPIC_CRED_ID(Claude APIキー)、PLACEHOLDER_SLACK_CRED_ID(3チャンネル向け chat:write を持つSlackボットトークン)。_README.md の各セクションが値の見つけ方を示しています。
  3. ルーブリックを作成する。 ロールごとに、4つのディメンション(スキル、レベル、場所、応答可能性)と各ディメンションの行動基準を含むJSONファイルを n8n/data/rubrics/<role-slug>.json 下に書きます。フローはAshbyの応募ペイロードから role_slug でルーブリックを検索します。ロールのルーブリックがない場合 → フローはデフォルトに照らしてスコアリングするのではなく、missing_rubric のログエントリで停止します。
  4. ルーティングしきい値を設定する。 Route by Aggregate IFノードで:aggregate >= 16#fast-track へ、12-15#review-needed へ、12未満は #surfaced-not-rejected へ。1週間のドライランの後に調整します。
  5. クローズされたロールでドライランする。 手動でソーシングしたロールの最後の1週間の応募を再生します。フローの #fast-track バケットと実際のスクリーンパスリストを比較します。ルーブリックアンカーを調整します — 通常は基準が間違っており、モデルではありません。
  6. トリガーを有効にする。 ドライランが正しく見えたら初めてAshby Webhookを disabled から enabled に切り替えます。本番環境のWebhookトラフィックは再生された履歴よりもデバッグが難しいです。

フローが行うこと

8ノード、順に実行。フローはフェアネス事前確認と決定論的フィルターをLLM呼び出しの前に保持します。汚染されたペイロードにモデルを解放すると、速くて自信があるが使えないスコアリングが生成されるからです。

  1. Ashby Webhookapplication.created イベントを受信します。Webhookシグネチャーは次のステップで確認されます;確認されていないペイロードは削除されます。
  2. シグネチャーを確認する — 設定されたWebhookシークレットに対するHMAC-SHA256。不一致のシグネチャー → ログ+停止。AshbyのWebhookはオープンインターネットから到達可能なため、シグネチャーチェックは任意ではありません。
  3. 応募+ルーブリックを取得する/candidate.info から完全な候補者+応募レコードを引き出し(AshbyはPOSTのみ、読み取りでも — バンドルの _README.md 参照)、ロールのルーブリックファイルをロードします。デフォルトにフォールバックするのではなく missing_rubric で停止します。
  4. フェアネス事前確認 — 保護クラスプロキシーのチェックリストを通じてルーブリックを実行します。学校ティアスコアリング、名前ベースのフィルタリング、雇用ギャップペナルティ、写真の存在、基準なしの「カルチャーフィット」 → 停止してルーブリック作成者に表面化します。LLM呼び出しの前に失敗する選択は意図的です:スコアリングAPIにロードされたバイアスのあるルーブリックは、GDPR第22条の下で自動処理としてカウントされるログエントリを残します。
  5. 決定論的プレフィルター — 作業許可をロールの場所要件に照らして確認し、最近却下されたリストからの応募を削除(6ヶ月のサイレント期間)し、応募に必要なドキュメント(職務経歴書、オプションのカバーレター)があることを確認します。これらのフィルターは監査可能で、LLMはそれらを再議論しません。
  6. Claudeスコアリング — ルーブリック+職務経歴書+応募フォームデータをClaudeに送信します。各ディメンションのスコア1〜5、1以上の各ディメンションの逐語的な証拠文字列、集計を含むJSONオブジェクトを返します。証拠文字列のないスコアはデフォルトで1になります。証拠の要件がモデルを名前や学校から推測するのではなく職務経歴書のテキストに根付かせるものです。
  7. 集計でルーティング — IFノード。セットアップステップ4で設定されたスコアバンドによる3つのブランチ。
  8. Slack通知+監査追記 — Ashbyの候補者ページへのリンク、ディメンションごとの証拠抜粋、view-rubric リンクを含む適切なSlackチャンネルに投稿します。application_idrole_slugrubric_sha256、ディメンションごとのスコア、集計、ルート、モデルを含む1行のJSONLを audit/<YYYY-MM>.jsonl に追記します。PII不含。監査ログはNYC LL 144またはEU AI Actの照会を生き延びるものです。

コストの実態

Claude Sonnet 4.5での100件の応募スコアリングごとのコスト:

  • Anthropic APIトークン — 応募ごとに通常8〜12k入力トークン(ルーブリック約1k+職務経歴書+フォームデータ)と400〜700出力トークン(スコアリングJSON+証拠)。Sonnet 4.5の定価で応募ごとに約0.05〜0.08ドル。週1,000件のインバウンド応募をスコアリングするチームは週に50〜80ドルのモデルコストで実行します。
  • n8nコスト — セルフホストのn8nはコンテナで無料。n8n CloudのStarterプランは月20ドルで約5,000件のワークフロー実行をカバーします;中〜高ボリュームチーム(週5,000件以上)はProまたはセルフホストが必要です。
  • Ashby APIクォータ — 読み取り呼び出しのみ。フローは応募ごとに1件の /candidate.info を行います;Ashbyのデフォルトの100件/分以内です。
  • 採用担当者の時間 — 本当の勝ち。100件の応募を手動で読むのは約8時間;証拠とリンクが事前に準備されたSlackの #review-needed キューを処理するのは約20〜30分。ファストトラックキューにはより丁寧なアウトリーチのために5〜10分追加かかります。
  • セットアップ時間 — フロー自体に60分、ロールごとのルーブリックに30〜60分追加。ルーブリックがバインドするコストです;ロールファミリー間での再利用によりコストが分散されます。

成功指標

ATSでロールごとに月3つの数値を追跡します:

  • #fast-track からの採用担当者スクリーンパス率 — キャリブレーションされたルーブリックで75%以上であるべきです。それ以下の場合、ルーブリックまたはしきい値が緩いです;しきい値を上げる前に基準を絞ります。
  • #review-needed からの採用担当者スクリーンパス率 — 25〜40%であるべきです。20%未満に落ちたら、裁量のバンドバッファが広すぎて多く読みすぎています。50%以上に上昇したら、ファストトラックのカットオフが高すぎて資格のある候補者を見逃しています。
  • 応募から最初の採用担当者タッチまでの時間 — 数日から4時間未満に落とすべきです。これが候補者体験の指標であり、TAリーダーに対するフローの守れる理由です。

代替手段との比較

  • Ashbyのネイティブスコアリング(またはGreenhouse Predictive Hire)対比 — ATSネイティブのスコアリングは二元的な「マッチ確率」の質問には問題ありませんが、スコアはブラックボックスでルーブリックは自分のものではありません。逐語的な証拠付きのディメンションごとのスコア(NYC LL 144の下で守れる)、バージョン管理するルーブリック、または交換可能なモデルが必要な場合はフローを選びます。チームがルーブリックをメンテナンスしない場合はATSネイティブを選びます。
  • Eightfold/Findemのインバウンドマッチング対比 — これらはより深いプロダクトです:過去の採用に対して再スコアリングし、アウトバウンドを処理し、候補者グラフを所有します。予算がプラットフォームプレイをサポートしており管理されたプロダクトが必要な場合はそれらを選びます。ルーブリックと監査ログをリポジトリに、残りのスタックはすでに接続されているものが必要な場合はフローを選びます。
  • Ashby APIをポーリングするDIY Pythonスクリプト対比 — プロンプトを慎重に構築すれば同じスコアリング品質ですが、Webhookシグネチャー確認、フェアネス事前確認、ルーブリックローダー、監査ログ、Slackルーティング、n8nデバッガーUXも自分で構築します。バンドルはそれらを提供します。
  • 現状(採用担当者がすべてを読む)対比 — ロールあたり週10件未満の応募では手動が正しい。ルーブリックはオーバーヘッドで採用担当者の頭はすでにキャリブレーションされています。フローはスケールするロールでセットアップコストを回収します。

注意点

  • バイアスの増幅。 ガード: ステップ4のフェアネス事前確認は、ルーブリックに保護クラスプロキシーが含まれている場合にフローを停止します。監査ログは応募ごとに rubric_sha256 をキャプチャするため、特定の日に使用されたルーブリックはEU AI ActまたはNYC Local Law 144のレビューの下で再現可能です。
  • Webhookの再生/重複スコアリング。 ガード: AshbyのWebhookシグネチャーには application.created.id が含まれます。フローの監査ログは application_id にキーイングされています;2回目の到着は再スコアリングせずに検出してスキップします。
  • ルーブリック編集時のモデル出力ドリフト。 ガード: 監査ログの rubric_sha256 は2つの実行の間のルーブリック変更を可視化します。再スコアリングされた応募で集計スコアが乖離する場合、差分はルーブリックハッシュにあり、モデルの非決定論ではありません。
  • 自動却下ルートへのドリフト。 ガード: フローには reject ブランチがありません。3番目のバケットは #surfaced-not-rejected であり、Slackメッセージには応募を #review-needed に再ルーティングする「レビューに昇格」ボタンが含まれています。採用担当者が唯一の却下権限者です。
  • SlackメッセージへのPII。 ガード: Slackメッセージには候補者のファーストネーム、現在のタイトル、ディメンションごとの証拠抜粋(各最大200文字)のみが含まれます。完全な職務経歴書の内容はATSに残ります。Slackチャンネルはより短い保持期間があります;フローはSlackを候補者データベースにしません。
  • EU候補者に対する未テストのリスク。 ガード: フローの Verify Signature ノードは応募の表明された場所も確認します。EU居住地コードを持つ応募はスコアに関わらず #review-needed にルーティングされ、Slackメッセージには EU candidate — confirm AI-screening notice was served とフラグが立てられます。通知なしのEU居住者のAIスクリーニングはEU AI Act高リスクシステム違反です。

スタック

アーティファクトバンドルは apps/web/public/artifacts/inbound-applicant-triage-n8n/ にあり、以下を含みます:

  • inbound-applicant-triage-n8n.json — n8nフローエクスポート(すべてのノードが設定済み、スタブパラメーターなし)
  • _README.md — 認証情報セットアップ、ルーブリックフォーマット、フェアネスチェックリスト、ドライラン手順

ワークフローが使用を前提とするツール:Ashby(ATS — GreenhouseまたはLeverに切り替えるには受付ノードを置き換える)、Claude(スコアリングモデル)、n8n(オーケストレーション)、Slack(採用担当者のキューサーフェス)。並行したソーシングフローについては候補者ソーシングClaude スキルを参照;ループごとのインタビュービルドアウトについてはインタビューループビルダーを参照。

関連コンセプト:AIスクリーニングバイアス候補者体験採用ファネルメトリクス構造化インタビュー

Files in this artifact

Download all (.zip)