ooligo
n8n-flow

Candidate rediscovery for silver medalists with n8n

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

Stack

Greenhouse を監視して新しくオープンした求人を検知し、関連求人で面接の終盤ステージまで進んだものの不適格に当たらない理由で見送られた過去の候補者、つまり「シルバーメダリスト」を見つけ出し、それぞれを新しい求人のルーブリックに対して Claude で再スコアリングし、ランク付けされたショートリストを 1 つの Slack チャンネルに投稿する n8n フローです。このフローは誰にも連絡せず、候補者をパイプラインに追加せず、ATS 上で候補者を移動させることもありません。すべてのアウトリーチはリクルーターが判断します。「去年の春は別の人を採用したけれど、次点だったのは誰だっけ?」を、40 分の発掘作業から、求人がオープンしたその時間に届く Slack メッセージへと変えてくれます。

使うべきとき

  • Greenhouse(または読み取り API を備えた別の ATS — その場合インテークノードを差し替えます)を使っていて、昨年のファイナリストが今年のショートリストになるような、繰り返し発生するジョブファミリーで十分な数の求人をオープンしている。
  • 構造化された見送り理由をつけて実際にファイナリストを見送っている。このフローの安全性モデル全体は、「別の人を採用した」と「バックグラウンドチェックに通らなかった」を区別することに依存しています。チームが全員を単一の汎用的な理由で見送っているなら、まずそれを直してください。フローにはゲートをかける対象がありません。
  • 紐付けるフィーダー求人がある。このフローはどの過去の求人が「関連」しているかを推測しません — ジョブファミリーごとに過去の Greenhouse のジョブ ID を設定ファイルに列挙します。これにより、マッチングが類似度のブラックボックスではなく、監査可能なものになります。
  • リクルーターがダイジェストに目を通してアウトリーチを判断する。フローは候補を表に出してランク付けし、人間が再スクリーニングして連絡します。

使うべきでないとき

  • アウトリーチ送信をループに組み込む。 フローはランク付けして Slack に投稿するだけで、メールを送らず、シーケンスに追加せず、ステージを移動させません。ダイジェストにアウトリーチ送信を配線すると、再コンタクトの提案が候補者データの自動処理に変わってしまいます。そして候補者に開示した保持期間を過ぎてから再コンタクトすることは、グロースハックではなく GDPR 違反です。候補者ごとのダイジェストの Confirm first: の行は、まさにメッセージを送る前にリクルーターが同意と鮮度を確認するために存在します。
  • 直近性のウィンドウがない。 GDPR は、候補者に伝えた保持期間 — 不採用の応募者では一般に 12〜24 か月 — を超えて候補者データを保持・再処理しないことを求めています。フローの recency_months ゲートは、ウィンドウを過ぎた人を除外します。これを表明した保持期間より長く設定して母集団を広げることは、このフローを負債に変える唯一の編集です。
  • 信頼できない見送り理由。 「Position filled」が「懸念があった」の意味でこっそり使われているなら、deny リストはあなたを守れません。フローの安全性は、その背後にある見送り理由の規律の程度に等しいだけです。
  • 小規模または単発の採用。 年に互いに無関係な 3 件の求人をオープンするチームは、ルーブリックとフィーダー求人リストを作るより、自分の記憶を読み返したほうが速いです。セットアップは、ジョブファミリーが繰り返されるときに元が取れます。
  • 機密または役員レベルのサーチ。 同意の姿勢が異なり、監査チェーンも異なります。これらは共有の Slack チャンネルには属しません。

セットアップ

  1. フローをインポートする。 apps/web/public/artifacts/candidate-rediscovery-n8n/candidate-rediscovery-n8n.json を n8n インスタンスにドロップします。すべてのノードに notesInFlow: true が付いているので、キャンバス内のノートが各選択を説明します。
  2. 認証情報を配線する。 3 つあります。PLACEHOLDER_GREENHOUSE_CRED_ID(Harvest API キー、読み取りスコープのみ — Jobs、Applications、Scorecards)、PLACEHOLDER_ANTHROPIC_CRED_ID(Claude API キー)、PLACEHOLDER_SLACK_CRED_ID(#talent-rediscovery への chat:write を持つ Slack ボットトークン)。各値がどこにあるかはバンドルの _README.md に示されています。
  3. ジョブファミリーごとに 1 つの設定ファイルを作成する(${CONFIG_DIR}/<family>.json)。match_job_ids(フィーダー求人)、min_stage_reached(終盤ステージのゲート)、見送り理由の allow リストと deny リスト、recency_monthsfit_thresholdtop_n、そしてルーブリックを保持します。完全なフォーマットは _README.md にあります。あるファミリーの設定がない場合、フローはデフォルトに対してスコアリングするのではなく missing_config で停止します。
  4. ルックバックを設定する。 POLL_LOOKBACK_HOURS はスケジュール間隔(デフォルト 6h)以上でなければならず、そうでないとポーリングの合間にオープンした求人が漏れます。この 2 つはセットで調整します。
  5. 直近で採用したファミリーでドライランする。 覚えている次点者がダイジェストの上位近くに来るはずです。新しいファミリーで信頼する前に、自分の記憶に照らして min_stage_reached とルーブリックのアンカーを調整してください。
  6. トリガーを有効化する。 実際に行動する価値のあるダイジェストが出てから初めて active: true に切り替えます。

フローの動作

12 のノードを順番に。決定論的な同意とフェアネスのゲートはモデル呼び出しの前に実行されます。なぜなら、LLM を見送りアーカイブ全体に解き放つことは、二度と連絡しないでほしいと頼んだ人に再コンタクトするやり方そのものだからです。

  1. Every 6 Hours — スケジュールトリガー。Greenhouse には信頼できるジョブ作成 webhook がないため、フローはポーリングします。
  2. Fetch New Open Reqs — Greenhouse Harvest に対する GET /v1/jobs?status=open&created_after=…。JSON 配列は新しい求人ごとに 1 アイテムへ分割されます。
  3. Load Match Config — 求人のジョブファミリーを解決し、その設定を読み込み、監査ログ用にハッシュ化します。missing_config で停止します。
  4. Config Loaded? — IF ゲート。設定のない求人はここで止まります。
  5. Fetch Rejected PoolGET /v1/applications?status=rejected&last_activity_after=…、ページネーションあり。見送られた応募ごとに 1 アイテム。
  6. Eligibility Filter — 5 つのゲートからなる下限です。フィーダー求人のマッチ、終盤ステージ到達、見送り理由の allow/deny(deny が勝つ)、直近性ウィンドウ、連絡禁止のサプレッション。それ以外はすべて、どのモデルが見る前にも除外されます。
  7. Fetch Scorecards — 候補者の過去の面接スコアカード、つまり再マッチングのための根拠テキストを取得します。
  8. Claude Re-Match — 過去の候補者を 新しい 求人のルーブリックに対して Sonnet 4.6 でスコアリングします。古い見送り判断を引き継がないこと、保護対象クラスの代理指標でスコアリングしないことが明示的に指示されています。証拠必須で、スコアカードの逐語引用がなければ fit は 1 です。
  9. Parse + Keep — 証拠ルールを強制し、fit が設定のしきい値以上のとき keep フラグを立てます。
  10. Audit Append — スコアリングされた候補者ごとに、仮名化された JSONL を 1 行(候補者 ID + リンク、氏名なし、スコアカードテキストなし)。
  11. Build Digest — 求人ごとにグループ化し、2 つのフィーダー求人経由でマッチした候補者を重複排除し(高い fit が勝つ)、ランク付けして top_n まで切り詰めます。
  12. Slack Digest — 求人ごとにランク付けされたショートリスト 1 つを #talent-rediscovery に投稿します。各候補者には再浮上させる理由を 1 行と Confirm first: のノートを添えます。

コストの実態

  • Anthropic API トークン — 候補者ごとにスコアカードテキスト + ルーブリック(入力で約 4〜5k トークン)を送り、約 300 出力トークンを返します。Sonnet 4.6 のリスト価格では候補者 1 人のスコアリングあたり約 $0.015〜0.03 になるので、適格なシルバーメダリストを 200 人引き出すファミリーは、オープンした求人 1 件あたりおよそ $3〜6 のコストになります(あなたのデータで測定したものではなく、トークン数から算出)。
  • Greenhouse Harvest 呼び出し — 読み取り専用です。1 回のジョブポーリング、1 回のページネーション付き応募取得、適格な候補者ごとに 1 回のスコアカード取得。これは現実的なファミリーサイズであれば Harvest が文書化しているキーごとのレート制限の範囲内に収まります。
  • n8n コスト — セルフホストはコンテナで無料です。n8n Cloud の Starter プランはこのポーリングボリュームをカバーします。Pro が必要なのは非常に高い求人スループットの場合だけです。
  • リクルーターの時間 — ここが勝ち。 過去の求人をまたいでシルバーメダリストのリストを手で再構築すると、求人 1 件あたり 1 時間近くかかります。ダイジェストはランク付け済みで、同意フラグと再スクリーニングのプロンプトを事前にセットした状態で、求人がオープンしてから数分のうちに届きます。
  • 勝ちの背後にある経済性。 公開されている採用ベンチマークでは、採用 1 件あたりのコストは $4,500 超、再発見による採用 1 件の節約はおよそ $2,000〜3,000 とされ、再発見採用の time-to-fill は 20〜30 日短縮します。チームは通常 5〜15% の再発見率から始め、1 年以内に 35〜50% を目標とします。シルバーメダリストの採用率ベンチマークはおよそ 8〜15% です。このフローは、これらの数字を達成することを四半期プロジェクトではなくデフォルトにするために存在します。

成功指標

ジョブファミリーごと、四半期ごとに 3 つの数字を追跡します。

  • ショートリスト→スクリーン率 — リクルーターが再スクリーニングまで進めるダイジェスト候補者の割合。約 20% を下回るなら、ルーブリックまたは min_stage_reached が緩すぎます。母集団を広げる前にアンカーを締めてください。
  • 再発見採用率 — そのファミリーの採用のうちダイジェスト発の割合。8〜15% のベンチマークが目標です。2 四半期後に 5% を下回るなら、フィーダー求人リストまたは直近性ウィンドウが狭すぎます。
  • 求人オープンから最初の適格なスレートまでの時間 — 候補者体験と採用マネージャーの指標です。ダイジェストはこれを数日からその日のうちへと動かすはずです。

代替手段との比較

  • GemhireEZ の再発見と比較 — これらは独自の再エンゲージメントキャンペーンと候補者グラフを備えたマネージド型のタレント CRM 製品です。プラットフォームが欲しく予算が許すなら、これらを選んでください。マッチングルール、deny リスト、監査ログを自分のリポジトリでバージョン管理し、自分で選んだフィーダー求人にスコープを絞り、ダイジェストを自分のスタックに届けたいなら、フローを選んでください。
  • Greenhouse 自身の「prospect pool」検索と比較 — ネイティブ検索はキーワードとステージで候補者を見つけますが、引用された証拠とともに新しい求人のルーブリックに対して再スコアリングはせず、関連度ランキングはブラックボックスです。候補者ごとの reason_to_resurfaceConfirm first: の行こそがリクルーターを動かすものであるとき、フローを選んでください。
  • リクルーターが手作業で ATS を掘り起こすのと比較 — 調子の良い日には同等の品質ですが、リクルーターは直近性ウィンドウを忘れ、締め切りのプレッシャーで deny リストを飛ばし、そして覚えている求人についてしかやりません。フローはそれを、繰り返し発生するすべての求人について、毎回、同意ゲートを必須にして実行します。

注意点

  • 保持期間を超えた再コンタクト。 ガード: recency_months ゲートが、スコアリングの前に開示された保持ウィンドウを過ぎた人を除外し、監査ログが使用したウィンドウを記録します。これは表明した保持期間か、それより短く設定してください — 母集団を増やすために長くは決してしないでください。
  • 不適格な候補者の再浮上。 ガード: 見送り理由の deny リストはモデルの前に実行され、deny が allow に勝ちます。バックグラウンド/リファレンスチェックの不通過、行為上の懸念、就労資格なし、明示的な連絡禁止の理由は、ダイジェストに決して届きません。この規律は上流の正直な見送り理由に依存します。
  • 過去の判断からのバイアスの引き継ぎ。 ガード: モデルは過去の見送り判断を引き継がないよう指示されます — 別の人が選ばれたために見送られた候補者が新しい求人では 5 になり得ます — また、氏名、単独のシグナルとしての出身校、年齢、性別、就業の空白でスコアリングしないよう指示されます。監査ログの config_sha により、任意の日付で使われたマッチングルールが AI スクリーニングのバイアス レビューのもとで再現可能になります。
  • 古くなった候補者の状態。 ガード: 候補者ごとのダイジェストの Confirm first: の行が、アウトリーチの前にその人がまだ地域内にいるか、まだ興味があるか、まだフィットするかをリクルーターに確認させます。フローはマッチを主張するのであって、現在の事実を主張するのではありません。他社で活動中の候補者は、リクルーターが Greenhouse で確認する対象であり、バンドルの既知の制限に記載されています。
  • 薄いスコアカードが低スコアになる。 ガード: スコアカードテキストが唯一の根拠なので、実質的な面接の前に見送られた候補者は設計上低スコアになります。モデルが見られない履歴書を与えるのではなく、min_stage_reached を上げてください。

スタック

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

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

このワークフローが前提とするツール: Greenhouse(ATS — インテークノードを差し替えれば AshbyLever に切り替え可能)、Claude(再マッチングのスコアラー)、n8n(オーケストレーション)、Slack(リクルーターの判断面)。新しいインバウンドをルーブリックに対してトリアージするには インバウンド応募者トリアージフロー を、このフローが表に出した候補者をウォーミングするには 候補者エンゲージメントシーケンス候補者ソーシング Claude スキル を参照してください。

関連する概念: 採用ファネル指標候補者体験AI スクリーニングのバイアス構造化面接

Files in this artifact

Download all (.zip)