ooligo
claude-skill

Run governed CRM hygiene through the HubSpot Agent CLI

Difficulty
上級
Setup time
60-90 min
For
revops · gtm-engineer
RevOps

Stack

HubSpot Agent CLI を駆動して CRM の一括クリーンアップ、すなわち重複排除、プロパティの補完、停滞した deal のクローズを、明文化されたポリシーのもとで実行する Claude Skill です。不可逆な書き込みの前に、レビュー可能な変更台帳と変更前スナップショットを必ず生成します。バンドルは apps/web/public/artifacts/hubspot-agent-cli-crm-cleanup-skill/ にあり、SKILL.md と、初回実行前に記入する 3 つのリファレンスファイルを含みます。

多くのページが埋もれさせる点から始めます。ここでの機械的な作業は、HubSpot が既に無償の skill として提供しています。npx skills add hubspot/agent-cli-skills で 15 個の skill が入ります。その中には bulk-operations(JSONL パイプ、バッチ読み取り、ページネーション、dry-run と確認のパターン、hubspot history によるリカバリ)、crm-data-quality(不完全なレコードの検出、値の正規化、objects merge による重複排除)、deal-management(停滞した deal の検出とクローズ)が含まれます。まずそちらを入れてください。この Skill はそれらを置き換えるものでも、作り直すものでもありません。

ベンダーのバンドルが提供していないのはポリシーです。レコードをマージするための語彙は与えますが、どの重複がフィールド単位で勝つのか、補完された値がどこから来たのか、静かな deal が単に遅いのか死んでいるのか、実行後に何の証跡が残るのかは決めません。この欠落こそがこの Skill の存在理由であり、自分が管理していないポータルに対してクリーンアップジョブがヘッドレスかつスケジュール実行される瞬間に効いてきます。

使うべき場面

HubSpot のクリーンアップジョブが次の 4 条件のうち少なくとも 1 つを満たす必要があるときに使います。誰も個々の変更を見ていない状態でスケジュール実行される。操作者以外の誰かが変更内容をレビューする。触れるプロパティがルーティング、スコアリング、レポート、報酬に流れ込むため、誤った書き込みが下流でコストになる。あるいは対象件数がおよそ 200 件を超え、1 組ずつのレビューが現実的でなくなる。

HubSpot の Agent CLI は 2026-06-23 にパブリックベータへ入りました。開発用 CLI の hs とは別のバイナリです。POSIX では curl -fsSL https://api.hubapi.com/hub/cli/backend/hub-cli/latest/install.sh | sh、Windows では PowerShell 版でインストールし、hubspot auth login で認証します。コマンドは hubspot <noun> <verb> の形を取り、既定で JSONL を出力し、変更を適用せずにプレビューするグローバルな --dry-run を受け付けます。

使うべきでない場面

  • 自分が管理するポータルでの一度きりの清掃。 ベンダーの crm-data-quality skill のほうが、はるかに少ない準備で済みます。操作者とレビュー担当が同一で実行が一度きりなら、ポリシーファイルは負担にしかなりません。
  • スナップショットをディスクに書けない。 マージは取り消せません。変更前の状態がなければ復元経路は存在せず、この Skill は続行せずに停止します。
  • サバイバーシップのルールが決まっていない。 この Skill は与えられたルールを適用するだけで、勝手に作りません。未記入の references/1-survivorship-policy.md は既定値ではなく停止条件です。
  • 50 件未満。 その規模では、HubSpot 内蔵の重複管理と手作業のレビューのほうが、準備コストに見合います。
  • 1 回の実行で 3 つの仕事を片付けたい。 重複排除、補完、停滞 deal の処理は、それぞれ別のポリシーファイルに対する別の実行が必要です。まとめると、誰も読めない台帳ができあがります。

セットアップ

60-90 分を見込んでください。その大半はインストールではなくポリシーファイルの記入に費やされます。サバイバーシップの議論、つまりどのレコードが勝ち、敗者のどのフィールドが生き残るかの決定はさらに時間がかかり、セットアップより前に行います。

  1. CLI とベンダーの skill を入れる。 インストールスクリプトを実行し、hubspot auth login、続いて hubspot whoami でポータルを確認します。さらに npx skills add hubspot/agent-cli-skills を追加します。Team または Enterprise アカウントの Claude Cowork 利用者は、事前に管理者が api.hubapi.com を許可リストに入れる必要があります。
  2. この Skill を入れる。 SKILL.mdreferences/ フォルダを .claude/skills/hubspot-crm-hygiene/ にコピーします。frontmatter の namedescription が、関連するプロンプトでの起動トリガーです。
  3. 来歴用の 2 つのプロパティを作る。 補完対象の各オブジェクトタイプに、1 行テキストの hygiene_sourcehygiene_run_id を作成します。定義は references/2-backfill-provenance.md にあります。存在しない場合、この Skill は停止します。
  4. references/1-survivorship-policy.md を記入する。 パート A にマッチルール、パート B に主レコードの選定、パート C にフィールド単位の勝者テーブル、パート D に不可触リストを書きます。アトリビューションと同意のフィールドはパート D に入れてください。清掃中にファーストタッチのアトリビューションを書き換えることは、マーケティングの履歴を目に見えない形で改変することです。
  5. references/3-stale-deal-disposition.md をパイプライン責任者と同席して記入する。 各ステージのしきい値は、自社の closed-won 履歴におけるそのステージの中央値の約 2 倍に設定します。
  6. workflow の登録トリガーを監査する。 対象プロパティを参照しているアクティブな workflow を洗い出します。この手順は任意ではありません。4 つ目の障害モードを参照してください。
  7. 200 件の範囲で dry-run する。 ledger/digest.md を最後まで読み、あいまい判定のリストが、誤較正されたマッチルールの産物ではなく本当の判断待ちに見えることを確認します。

この skill が実際に行うこと

6 つのフェーズを固定順で実行し、先送りや飛ばしは行いません。

フェーズ 1 は環境を固定します。hubspot --version と認証済みの識別情報を ledger/run-meta.json に記録します。HubSpot はベータのコマンド、フラグ、挙動が予告なく変わりうると明示しているため、台帳を生成したバージョンは台帳の一部です。探索は service key ではなく OAuth で実行します。OAuth は操作者自身の権限に限定されるので、スコープの誤りが安全側に倒れて失敗するからです。

フェーズ 2 はスナップショットを取ります。 対象範囲の全レコードを、他の何よりも先に pre-image/<object_type>.jsonl へ書き出します。理由は具体的です。--dry-run はまだ実行していない書き込みをプレビューするものであり、hubspot history は今も存在するレコードのプロパティ値を復元するものです。マージの後ではどちらも役に立ちません。HubSpot は取り消し手段を文書化しておらず、敗者側のレコードは存在しなくなるからです。スナップショットが欠けている、または行数が対象件数と一致しない場合、フェーズ 5 は実行を拒否します。

フェーズ 3 は候補を決定論的に生成します。 正規化とマッチルールはコードとして動き、モデルの判断は入りません。同じ重複集合を 2 回グルーピングさせても、モデルは同じ結果を返しません。それでは実行間の差分がレビュー不能になり、レビュー担当の承認が意味を失います。モデルの判断はあいまい帯という 1 か所にのみ現れ、その出力は助言的で、自動適用されることはありません。

フェーズ 4 はポリシーに従い、レコード単位ではなくフィールド単位で解決します。 このフェーズは HubSpot の具体的な挙動のために存在します。objects merge は、両方のレコードに値がある場合は主レコードの値を残します。したがって主レコードを選ぶという行為は、副レコード側の良質なデータ、つまり新しい電話番号、修正済みの役職、入力済みのライフサイクルステージを捨てることになります。そこでこの Skill は順序を逆にします。まず objects update で勝者のフィールド値を主レコードへ先行書き込みし、その後にマージします。これによりマージは関連付けと活動履歴を畳み込むだけになります。ポリシーで解決できないグループは ambiguous.jsonl に送られ、適用対象から外れます。

フェーズ 5 は台帳を作ります。 計画されたすべての変更を --dry-run --format json で発行し、ledger/changes.jsonl に畳み込みます。1 レコード 1 行で、変更前後の値と、その変更を許可したルールを持ちます。あわせて人間が読める ledger/digest.md を出力します。いずれかの変更種別が max_mutations(既定 250)を超えた場合、実行はここで中止し、何も書き込みません。上限で打ち切ることはしません。半分だけ適用されたクリーンアップは、実行前と実行後のどちらよりも悪い状態をポータルに残すからです。

フェーズ 6 はゲート付きで適用します。 変更は再計算した計画ではなく台帳から再生されるため、実行されるのはレビュー済みの成果物そのものです。失敗は failed.jsonl に隔離され、盲目的な再試行は行いません。適用後、触れたすべてのレコードを読み直して ledger/verified.jsonl に書きます。

コストとスループットの実際

効いてくる制約はトークンではなく、HubSpot の API 制限です。

探索は CRM Search API を使います。これはアカウントあたり毎秒 5 リクエストが上限で、1 ページ最大 200 オブジェクトを返し、1 クエリあたり 10,000 件という上限があります。それを超えてページングすると 400 が返ります。したがって 12,000 件の対象は createdate で最低 2 クエリに分割する必要があります。1 ページ 200 件、毎秒 5 リクエストなら探索は毎秒およそ 1,000 件を読むので、50,000 件の範囲でおよそ 1 分です。

書き込みはバースト上限に縛られます。Professional と Enterprise のプライベートアプリは 10 秒あたり 190 リクエスト、Free と Starter は 100、API Limit Increase アドオン付きで 250 です。日次上限は Professional が 625,000 コール、Enterprise が 1,000,000 コールです。600 グループの重複排除は、対象レコードごとのサバイバーシップ先行書き込みとグループごとのマージで、書き込みコールがおよそ 1,850 回になります。Professional では純粋な API 時間で 100 秒ほど、日次枠の約 0.3% を消費します。

トークンコストは設計上小さく抑えられています。マッチングが決定論的だからです。モデルに届くのはあいまい帯だけで、10,000 レコードあたり 30-60 グループ、1 グループあたり入力 800 トークン程度なら、フル実行でも Claude のトークン費用は 1 ドルを大きく下回ります。実際のコストは 60-90 分のポリシー策定であり、これは一度きりで、以後のすべての実行に按分されます。

成功指標

追うべきは重複の発生率であり、削除した重複の数ではありません。削除数はポータルがどれだけ汚れていたかを測るだけです。発生率は、重複を作っている入口が直ったかどうかを測ります。重複排除ジョブを毎月回し、新規作成 1,000 レコードあたりの新しい重複グループ数をプロットしてください。横ばいか上昇なら、フォームの重複排除設定、リストインポート、あるいは何らかの連携が今も衝突を生んでおり、清掃の量でそれを追い越すことはできません。

副次的な指標はあいまい帯の大きさです。マッチルールを調整するにつれて縮むはずです。候補グループの 10% を超えたままなら、パート A のどれかのルールが誤較正です。

停滞 deal については、通知の保留期間中の再オープン率が較正シグナルです。15% を超えるならしきい値が厳しすぎます。個別の deal を議論するのではなく、しきい値を上げてください。

障害モード

  • マージは不可逆であり、--dry-run はそれを変えません。 プレビューは意図した結果を示すだけで、復元ポイントは作りません。HubSpot はマージの取り消しを提供していません。ガード: フェーズ 2 の変更前スナップショットは必須で、これが無ければフェーズ 5 は強制失敗します。run_dir は少なくとも 1 更新サイクル保持してください。存在しなくなったレコードに戻れる唯一の経路です。
  • マージは通算 250 回の上限で失敗します。 2 つのレコードが合計 250 回以上のマージに関与している場合、HubSpot はマージを拒否します。また、結果が設定済みの関連付け上限を超える場合もマージは失敗します。長年清掃を重ねたポータルでは、この失敗が実行の途中に集中します。ガード: 失敗は API エラーを添えて failed.jsonl に隔離し、そのグループだけを止めます。盲目的な再試行はしません。同じ呼び出しは同じように失敗しますし、部分適用されたマージに対する再試行は、清掃をインシデントに変える典型的な経路です。
  • プロパティの書き込みは workflow の登録トリガーを発火させます。 4,000 件の連絡先へのライフサイクルステージ補完は、その 4,000 件すべてをナーチャリングのシーケンスに登録し、既存顧客へ 4,000 通のメールを送りかねません。これはこのページで最も影響範囲が広く、しかも発生源は CLI の外側です。ガード: 対象プロパティを参照する登録トリガーを持つアクティブな workflow を洗い出し、実行中は一時停止するか対象範囲を除外します。この Skill はフェーズ 4 で対象プロパティ一覧を表示し、この監査を実施したことの明示的な確認を求めます。
  • 補完された値は、人が入力した値と見分けがつきません。 数か月後には、どのレコードにジョブが触れたのか誰にも分からず、取り消すことも分析から除外することもできません。ガード: 補完の書き込みは、同じ objects update の呼び出しで hygiene_sourcehygiene_run_id を設定します。2 回目のパスで付けてはいけません。クラッシュ時に、印は付いたが書かれていないレコードが残る窓ができるからです。references/2-backfill-provenance.md のロールバック手順は実行 ID を鍵にし、台帳が名指ししたプロパティだけを復元するので、その後に人が加えた編集は保持されます。
  • admin モードは自分の権限を超えて届きます。 HubSpot はスキーマ操作と大半の削除に HUBSPOT_ACCESS_TOKEN の service key を要求し、このキーはアカウント単位です。長寿命のシェルにエクスポートすると、以降のすべてのコマンドで有効なままになります。ガード: 探索と dry-run は OAuth で実行し、service key はそれを必要とする 1 コマンドに限定したサブシェル内でエクスポートします。
  • ベータの変化は固定した実行を静かに壊します。 CLI は既定で自動更新され、HubSpot はフラグが予告なく変わりうると警告しています。スケジュール実行の合間にフラグが消えれば、統制された実行が統制のない実行に変わります。ガード: スケジュール実行では HUBSPOT_NO_AUTO_UPGRADE=1 を設定し、run-meta.json にバージョンを固定し、バージョンの差分をレビューの起点として扱ってください。

代替案との比較

HubSpot 公式の skill 単体との比較。 無償で、ベンダーが保守し、CLI の変化に追随します。これはこのバンドルには無い実質的な利点です。CRM の管理者が一度きりの清掃を行い、結果を自分で確認するなら、公式だけで十分です。この層を足すのは、実行が繰り返されるとき、レビュー担当が操作者と別人のとき、あるいは半年後に誰かが「どのジョブがこの値を書いたのか」と尋ねるときです。正直な線引きはこうです。ベンダーが動詞を与え、こちらがポリシーと証跡を与えます。

Insycle 系の重複排除 SaaS との比較。 専用ツールにはここで本物の強みがあります。技術者でない ops 担当者がテンプレート方式の一括マージを画面から動かせますし、Insycle は HubSpot 自身が提供していないマージ取り消しの手順を文書化しています。清掃を回す人がターミナルに不慣れで、予算があるなら、そちらを買ってください。この Skill が勝つのは、清掃がエージェントの中でヘッドレスかつスケジュール実行される場合、そしてポリシーを他の ops 設定と並べてバージョン管理下に置き、サバイバーシップのルールを誰が変えたかを差分で見たい場合です。

HubSpot 内蔵の重複管理との比較。 無償で準備も不要、候補の重複を 1 組ずつレビューに出してくれます。50 件未満ならこれが正解です。フィールド単位のサバイバーシップ制御は無いため、両方のレコードに値があれば常に主レコードの値が勝ちますし、後からレビュー担当が読める成果物も残りません。

REST API を直接スクリプトする場合との比較。 ページネーション、リトライ、バックオフ、10,000 件上限の分割ロジックを自分で書くことになります。CLI が既に持っているものに 1 週間かける計算です。Agent CLI がまだ対応していないオブジェクトやエンドポイントが必要なときは直接書いてください。それ以外では、ベータの CLI にポリシー層を載せるほうが近道です。

関連: Claude から HubSpot を読み取り中心で扱う mcp-server-hubspot-cs、および停滞 deal の処理が供給する先のレポート業務 weekly-pipeline-report-skill

Files in this artifact

Download all (.zip)