ooligo
n8n-flow

Track enrichment credit burn across Clay, Apollo, and ZoomInfo before the allowance expires

Difficulty
上級
Setup time
2-3 hours
For
revops · gtm-engineer
RevOps

Stack

ClayApolloZoomInfo からクレジット消費を取得し、検証済みレコード1件あたりのコストに変換して、コストの大きい2つの事象——有効なレコード1件あたりの支出が上振れする、または残高が使われないまま失効日を迎える——のいずれかが起きた時点で Slack に通知する n8n ワークフローです。apps/web/public/artifacts/enrichment-credit-burn-monitor-n8n/ のバンドルには、完全な n8n エクスポートに加えて、インポート手順、認証情報の設定、環境変数の一覧表、ブランチごとの検証手順、そして監視自体にかかるコストをまとめた _README.md が含まれます。

使うべき場面

2社以上のデータベンダーにまたがるエンリッチメント支出が、誰かの頭の中で管理できる範囲を超えたときに使ってください。実務的には、年間コミット合計がおよそ 30,000 ドルを超え、少なくとも1社が超過しうるサイクルで課金している状態です。この規模になると、2つの失敗パターンは理論上の話ではなくなります。waterfall の列に有料プロバイダーが静かに1つ加わり、出力品質は何も変わらないまま検証済みレコード1件あたりのコストが 40% 上がる。あるいは Q4 の採用が後ろ倒しになってアウトバウンド量が落ち、消費ペースをカレンダーと突き合わせて見ている人がいないまま、9,000 の Clay Actions がサイクルの区切りで失効する。

エンリッチメントをすでに手作業ではなく自動化で回しているチーム——Clay を使ったエンリッチメントのパイプラインICP リストの構築——に適します。クレジットが消えていくのはそこであり、追加の配管なしに行単位のイベントを発火できるのもそこだからです。

要点は分母です。消費クレジットの合計は、ベンダーがすでに表示している数字です。検証を通過したレコード1件あたりの消費クレジットこそが、プロバイダーの変更で損をしたかどうかを教えてくれる数字であり、どのベンダーのダッシュボードもそれを計算しません。あなたのどの行が検証ステップを通ったかは、ベンダーには分からないからです。

使うべきでない場面

超過のない定額プランで単一ベンダーだけを使っているなら見送ってください。月に1回ダッシュボードを確認すれば、構築コストゼロで同じ問いに答えられます。

検証ステップがないなら見送ってください。検証済みレコード単価には、行ごとの検証フラグ——到達性チェック、キャッチオールのフィルタ、QA 列——が必要です。それがなければ、このワークフローが算出するのはエンリッチ済みレコード単価であり、それはベンダーがすでに報告しています。ドリフトのアラートも意味を失います。

量が多く、配賦の必要性が低いなら、Clay の行イベントのブランチだけは外してください。行イベント1件は 1 Clay Action を消費します。2026年3月の Clay の価格モデルでは HTTP リクエストが Actions を消費するためです。Growth プランの 40,000 Actions に対して月 20,000 行を処理する場合、全行を計測すると残り半分を測るために枠の半分を使うことになります。支出を配賦する必要がある2〜3個のテーブルだけを計測し、残りは CSV エクスポートに任せてください。

ベンダーごとに配線が違う理由

ここが、このワークフローが数字を報告するのか作り話を報告するのかを決める部分であり、各ベンダーが実際に何を公開しているかで決まります。

ZoomInfo は本物の使用量エンドポイントを持つ唯一のベンダーです。GET /gtm/data/v1/users/usagelimitTypetotalLimitcurrentUsageusageRemaining を持つ行を返し、limitTyperequest(スループット)と recorduniqueID(課金対象)を区別します。Parse ZoomInfo Usage はこの区別を保持し、課金対象の行だけに価格を付けます。レスポンスにリセット日は含まれないため、契約期間の終了日は設定値であって、取得できる値ではありません。

ApolloPOST /api/v1/usage_stats/api_usage_stats を公開しています。このエンドポイント自体は 0 クレジットで、日・時・分のウィンドウごとに limitconsumedleft_over をエンドポイント別に返します。これらが数えているのはリクエストであって、クレジットではありません。Apollo 自身のドキュメントが、この変換を双方向に不正確にしています。人物のエンリッチメントはデモグラフィックまたはメールで 1 クレジット、携帯電話番号が返れば追加で 8 クレジット、そして /people/bulk_match は1リクエストあたり最大10人を受け付けます。つまり1リクエストの価値は 0 から 90 クレジットの幅を持ちます。だからこそ Derive Apollo CreditsderivedCreditFloorderivedCreditCeiling を出力し、中央値には estimated: true を付けます。単一の自信ありげな誤った数字を出すことはしません。

Clay はクレジット残高のエンドポイントを一切公開していません。使用量は Settings → Usage にあり、workbook とテーブル別、インテグレーション別、シグナル別の内訳と CSV エクスポートが用意されています。このワークフローは、あなたが管理する URL からそのエクスポートを読み、Clay の HTTP API 列から送られる行単位の台帳を並行して保持します。verified フラグが存在する唯一の場所が、この台帳です。

このワークフローの数字のうち1つはベンダーの事実ではなくモデリング上の選択であり、このページはそれを取り繕いません。Clay のプラン料金は Data Credits と Actions をまとめて購入するものであり、Clay はそのどちらにも個別の価格を付けていません。CLAY_DATA_CREDIT_COST_SHARE がその料金を按分し、既定値は 70/30 です。Growth(月 495 ドルで 6,000 Data Credits と 40,000 Actions、2026-08-05 に確認した Clay の価格ページによる)では、Data Credit が 0.0578 ドル、Action が 0.0037 ドルになります。按分を変えれば、下流のドル換算はすべて一緒に動きます。

セットアップ

  1. バンドルをインポートします。 n8n の Workflows → Import from File から apps/web/public/artifacts/enrichment-credit-burn-monitor-n8n/enrichment-credit-burn-monitor-n8n.json を読み込みます。入口は3つあります。API で照会できる2社向けの毎時スケジュール、Clay のエクスポートと2つの予測を回す 07:00 の日次リコンサイル、そして行イベント用の /webhook/clay-credit-event の webhook です。

  2. ワークフローのタイムゾーンを設定します。 Settings → Timezone(エクスポートは America/New_York で出荷)、Execution Orderv1 にします。2つの cron 式はこのゾーンで解釈され、07:00 の発火がサイクルの区切りをどの暦日に置くかを決めます。

  3. サイクルの日付を入れます。 CLAY_CYCLE_ENDAPOLLO_CYCLE_ENDZOOMINFO_CONTRACT_END を、それぞれ YYYY-MM-DD 形式で設定します。ここで扱うどのベンダーも自分のリセット日を返しません。未設定にすると、そのベンダーの失効予測は無効になり、その旨がアイテムに記録されます。ワークフローが暦月を勝手に仮定することはありません。

  4. 手元にある単価を設定します。 APOLLO_CREDIT_USDZOOMINFO_RECORD_USD は契約から取ります。どちらのベンダーも単位あたりの定価を公開していません。未設定でも、単位消費と失効のブランチは動き続け、静かになるのはドリフトのブランチだけです。

  5. 認証情報を2つ接続します。 ZoomInfo の OAuth2 認証情報(PLACEHOLDER_ZOOMINFO_OAUTH2_CRED_ID)と、chat:write を持つ Slack アプリの認証情報(PLACEHOLDER_SLACK_CRED_ID)です。Apollo のマスターキーは APOLLO_MASTER_API_KEY に置きます。usage-stats のエンドポイントはマスター以外のキーを拒否します。

  6. どちらのスケジュールを有効化する前にも、_README.md の5ステップの検証を実行してください。 最も重要なのはステップ1です。ZoomInfo の認証情報をわざと壊し、パーサーが used: 0 ではなく ok: false, reason: 'auth_401' を出すことを確認します。

失敗パターンとガード

期限切れの認証情報は、支出ゼロとして読まれます。 401 が使用量 0 のレコードとしてパースされる状態は、停止よりたちが悪いです。下流のしきい値がすべて「支出が止まった」と解釈して沈黙するからです。ガード:HTTP ノードは neverErrorfullResponse で動かし、ステータスコードをデータとしてパーサーに届けます。Parse ZoomInfo Usage は 401、403、429 でヘルスレコードを出し、使用量レコードは一切出しません。

古い Clay エクスポートは、支出の停止と見分けがつきません。 どちらも日次の数字が平坦になります。ガード:Parse Clay Usage CSV はエクスポートの経過時間を記録し、CLAY_EXPORT_STALE_HOURS(既定 36)を超えたものを stale として印を付けます。それは 28 日ベースラインに流れ込む代わりに、poll のヘルスメッセージとして warning チャンネルへ送られます。

エクスポートの列名変更は、Clay のブランチを静かにゼロにします。 ベンダーは予告なく CSV のヘッダー名を変えます。ガード:パーサーは必要な列を検査し、欠けている列を 0 と見なす代わりに、実際に読み取ったヘッダー行を添えてエラーを投げます。

分母が小さいと、検証済みレコード単価は爆発します。 静かな日曜日の検証済み 12 行は、算術的には正しく運用上は無意味な数字を生みます。ガード:CPVR_MIN_VERIFIED(既定 250)を 7 日ウィンドウと 28 日ウィンドウの両方で満たすまでドリフトは発火せず、それ未満ではノードが status: 'insufficient_data' を返します。

毎時ポーリングは、1つの問題を 24 件のアラートに変えます。 ガード:Alert Gate + Dedup は、ワークフローの static data に置いた 12 時間バケット内で (kind, vendor, unit, status) をキーにします。static data は本番実行でのみ保持されるため、このガードの検証には手動実行ボタンではなく有効化したスケジュールを使います。

Clay は失敗した HTTP 列を再試行し、行を二重に数えます。 ガード:Clay Ledger Appendtable::rowId で重複を排除し、2回目の配信には duplicate: true を返します。

何を置き換えるのか

現状は、3つのダッシュボードを、思い出した人が3つの異なる頻度で確認している状態です。それでも超過はいずれ見つかりますが、失効はほぼ捕まりません。ベンダーのダッシュボードには、あなたの消費ペースを基準にサイクルの区切りまでを逆算する仕組みが何もないからです。

SaaS 支出管理ツール(Vertice、Zylo、Cledara)は、ここでは劣った道具というより、そもそも用途の違う道具です。追跡するのは請求書——契約金額、更新日、シート数です。Data Credits と Actions の対比も、waterfall の中のどのプロバイダーが高くなったかも見えず、検証済みレコードという分母も持ちません。答えるのは「Clay にいくら払ったか」で、このワークフローが答えるのは「使えるレコード1件にいくらかかったか、そして残高が無駄になるか」です。

同じものをウェアハウス上のスケジュール実行 SQL として作るのは正当な代替案で、エンリッチメントのイベントがパイプライン経由ですでにウェアハウスへ届いているなら、そちらが良い選択です。届いていない場合に n8n 版が勝ちます。行イベントの webhook と CSV の取り込みが、先にインジェストを立ち上げることなく、イベントのストリームと突き合わせ用のソースを与えてくれるからです。

Files in this artifact

Download all (.zip)