ooligo
n8n-flow

n8n と Claude を使った競合他社の言及と変更の自動追跡

Difficulty
中級
Setup time
60min
For
revops · sales-enablement
RevOps

Stack

B2B セールスチームにおける競合インテリジェンスは、多くの場合間違った方法で届きます。担当者がディールを失い、プロスペクトが競合他社の新しい料金プランに言及したと #lost-deals に投稿し、チームの残りが 3 週間後に知ります。遅い発見のコストは複合します — その間にクローズするすべてのディールが十分な準備なしに会話に入ります。このフローは安価で地味な修正です。日次 cron が実際に気にする競合他社のページリストをクロールし、デプロイノイズを除去するために HTML を正規化し、何が実質的に変わったかを Claude に要約させ(差分が化粧品の場合は NO_CHANGE を返す)、チャンネルが 1 ヶ月後でも担当者が開き続けるほどシグナルが密な状態を保つために単一の週次ダイジェストを Slack に投稿します。

apps/web/public/artifacts/competitive-intel-tracker-n8n/ のアーティファクトバンドルには、インポート可能な n8n ワークフロー(3 つのトリガーにわたる 20 ノードの competitive-intel-tracker-n8n.json)と、クレデンシャルセットアップ、作成が必要な 2 つの Postgres テーブル、マテリアリティスキップブランチとオンデマンドの Slack スラッシュコマンドの両方を実行する 6 ステップの初回実行検証が記載された _README.md が含まれています。

これを使用するタイミング

積極的にポジショニングする競合他社が 5〜15 社あり、重要な方法で変化する各競合他社の 3〜5 つの公開ページを名指しできる(価格設定、製品ポジショニング、戦略をほのめかす採用シグナル)、セールスチームが実際に開く Slack チャンネルが少なくとも 1 つある場合です。競合他社がサイトを再構築する際に追跡 URL のリストを維持する意志があります。Postgres データベース(または他のクエリを適応できるストア)とオンデマンドスラッシュコマンドを機能させたい場合はパブリックインターネットから到達可能な n8n インスタンスがあります。

以前「毎回の競合他社のブログ投稿に対する Slack アラート」RSS の仕組みを試してチームが 1 週間以内にミュートした場合、ここでのマテリアリティフィルターと週次ケイデンスはその失敗モードへの直接的な対応です。

これを使用しないタイミング

競合セットが G2、Capterra、TrustRadius などの JS 重視のレビュー集約サイトに支配されている場合は立ち上げないでください。それらの公開 HTML はシェルです — 実際のレビューコンテンツはクライアントサイドでレンダリングされるか認証の背後にあり、礼儀正しくクロールしてもほとんど何も返ってきません。それらを扱うベンダー(Crayon、Klue、Kompyte)に費用を払うか、それらのソースを完全にスキップしてください。

インテルをリアルタイムで必要とするチームには使用しないでください — 例えば、1 週間以内に回転するディールサイクルで昨日の競合他社の価格変更が発見コールのかなめとなる場合。ここでのケイデンスは日次フェッチ、週次ダイジェストです。1 時間未満のレイテンシが必要な場合は、別の製品(Klue アラート)を購入するか別のワークフロー(担当者の Slack DM にフィードするページ変更ウェブフック、ダイジェストではなく)を構築しています。

プライベートな競合他社の表面(ゲートされたトライアル、有料顧客ポータル、ログインの背後にあるもの)に対してはこれを使用しないでください。それらをクロールすることは公開マーケティングページのチェックとは倫理的および法的に異なるクラスにあり、このフローはそれに適した基盤ではありません。

競合他社が 3 社未満の場合はこれを使用しないでください。セットアップコスト(20〜30 行の追跡ページ、スキーマ、クレデンシャル、マテリアリティチューニング)は、1〜2 社を監視している場合には見合いません。Google アラートとカレンダーのリマインダーがその規模での正しい答えです。

セットアップ

インポートする前に apps/web/public/artifacts/competitive-intel-tracker-n8n/_README.md を最初から最後まで読んでください。短いバージョン:n8n の Import from Filecompetitive-intel-tracker-n8n.json をインポートし、README の DDL で 2 つの Postgres テーブル(competitor_tracked_pagescompetitor_change_log)を作成し、4 つのクレデンシャル(PLACEHOLDER_POSTGRES_CRED_IDPLACEHOLDER_ANTHROPIC_CRED_IDPLACEHOLDER_SLACK_CRED_ID、プラスオプションの Slack スラッシュコマンドウェブフック URL)を設定し、Settings でワークフロータイムゾーンを明示的に設定し、20〜30 行で追跡ページテーブルにシードし、アクティベートする前に 6 ステップの初回実行検証を実行します。検証は意図的に、以前のスナップショットなしのパス、安価な変更なしのパス、強制差分パス、マテリアリティスキップパス、ダイジェストパス、オンデマンドウェブフックの 6 つのブランチと 6 つの小さな入力を実行します。

フローの実際の動作

クローラーは単一のページ障害が実行を中断しないよう batchSize: 1splitInBatches ループです。各イテレーションは HTTP フェッチの前に 4 秒スリープします — これにより 30 ページが約 2 分にわたって分散され、どんな合理的なホストごとのレート制限もよく下回り、サーバーログには礼儀正しいボットとして見えます。httpRequest ノードは neverError: true を設定します。アンチボット防御からの 403 は記録してスキップするべきであり、ワークフローをクラッシュさせてはならないからです。

正規化は <script><style><noscript>、HTML コメントを一括でストリップし、4 つのクラスの揮発性コンテンツをマスクする Code ノードで行われます:ISO タイムスタンプ、US フォーマットの日付、4 桁の年、32 文字を超えるすべての 16 進数文字列(ビルド ID、アセットハッシュ)。このステップがなければ、「© 2026」フッターや更新された og:updated_time を再レンダリングする Astro/Next/Hugo のすべてのデプロイが変更として登録され、週次ダイジェストが 20 件の無意味なエントリで発火し、チャンネルが死にます。

マテリアリティゲートは 4 条件の AND です:フェッチが成功した、ハッシュが以前のスナップショットと異なる、以前のスナップショットが存在する、長さのデルタが 0.5% を超える。長さデルタの項は、Claude コールを節約する安価な事前フィルターです — 単一文字や空白のみの編集はモデルに到達しません。「以前のスナップショットがあった」という項は、初回実行を安価にするものです:新しく追跡されたページはベースラインハッシュをキャプチャして差分を完全にスキップします。

Claude コールは両方のスナップショットを各 6000 文字(各約 1500 トークン、プラスシステムプロンプトとオーバーヘッド、マテリアルなページあたり約 3500 入力トークン)に切り詰めて送信します。システムプロンプトは二値選択を強制します:差分が化粧品のみ、ナビゲーションのみ、フッターのみ、または特定できない場合は NO_CHANGE を返す。または、何が変わったかとセールスパーソンが気にすべき理由を正確に 2 文で返す。Parse ノードは NO_CHANGE をセンチネルとして扱い、is_material = false に切り替えます。行は監査のために依然としてログに記録されますが、ダイジェストには届きません。

月曜日の 14:30 ダイジェスト集計器は、競合他社ごとに過去 7 日間のマテリアルな変更をグループ化する 1 つの SQL クエリを実行し、競合他社ごとに 1 つの Slack Block Kit メッセージをレンダリングします — 1 つのメガ投稿ではなく。セールス担当者は長い中断のないダイジェストをミュートします。競合他社ごとのメッセージはスキャン可能でスレッド化可能です。サイレントな週(どこにもマテリアルな変更がない)は何も投稿しません。オンデマンドウェブフックは第 3 のトリガーで完全に独立しています:Slack スラッシュコマンドの POST を消費し、過去 90 日間の変更ログに対して LIKE 照合クエリを実行し、要求ユーザーに対してエフェメラルに最大 10 件のフォーマットされたブロックで応答します。

コストの実態

30 の追跡ページと典型的な 3〜5 件のマテリアルな変更を持つクロール実行あたり:claude-sonnet-4-6 に対して約 11,000 入力トークンと 1,000 出力トークン、実行あたり約 0.05 USD。30 日間、日次:月約 1.50 USD の Claude 支出。n8n セルフホスト:0 USD 増分;n8n Cloud Starter:他のフローで既に実行している場合は 20 USD/月のスタンドアロンまたは 0 USD。Postgres:変更ログを無期限に保持する場合は数メガバイトのストレージ(last_content_text 列が重いもの — 30 行 × ~50KB ≈ 合計 1.5MB、ゆっくり増加)。

実行あたりのウォールクロック:約 2.5 分(30 ページ × 4 秒スロットル + マテリアルなものへの Claude レイテンシ)。Slack ダイジェスト:5 秒未満。オンデマンドウェブフック:応答まで 2 秒未満。

オペレーターの時間:競合他社がサイトを再構築する際に追跡ページリストを更新するために四半期に一度 30〜60 分、プラス誰かが誤陽性を報告した最初の時(「ダイジェストが価格が変わったと言ったが変わっていなかった」)にマテリアリティ閾値を調整するか noise-mask パターンを追加するために約 5 分。

成功の姿

最初の 8 週間で注目すべき具体的な指標:Slack でのダイジェスト開封率または既読確認の同等物(リアクション数または担当者を手動で確認することで代理できます)。チャンネルの 30% 未満がダイジェストを読む場合、シグナル対ノイズ比が低すぎます — マテリアリティ閾値を引き締め(長さデルタゲートを 0.5% から 1% に引き上げ)、最低シグナルページタイプを削除し(毎週変動する恒久的な採用ページを持つ競合他社の採用ページは通常ノイズです)、または低頻度の競合他社を「ロングテール」ダイジェストセクションにマージします。一貫して 60% 以上が読む場合、正しいものを構築しており、次のステップはディスカバリーコールのユースケースのためのオンデマンドパスを追加することです(すでに接続済み — スラッシュコマンドを公開するだけです)。

2 番目の指標:四半期に 1 件の担当者が #won-deals または #lost-deals スレッドでダイジェストを引用した回数。20 人チームから四半期に 5 件の引用は良いシグナルです。2 ヶ月後に引用がゼロの場合は、ダイジェストが読まれていないか内容が行動不可能なことを意味します。

代替案との比較

Klue または Crayon(SMB ティアで最後に確認した 2026 年 Q1 の年間 3〜8 万 USD)は、自分でクロールできない JS 重視のレビュー集約ソースを扱い、セールスチーム向けの洗練されたコンシューマーエクスペリエンス(バトルカード、ウィン/ロスのテーマ、インテルハブ)を提供し、Claude が見逃すニュアンスをキャッチする人間キュレーションレイヤーを含みます。競合インテリジェンスがディールサイクルの中心で専任の CI 担当者がいる場合は Klue または Crayon を購入してください。このフローは、専任の CI 採用なしに 20 人の担当者を持つ組織を運営し、自社のロストディールスレッドから競合他社の価格変更を発見することを止める必要がある場合の正解です — コストの 1% で価値の 70% を得られます。

Visualping または Distill.io(月 10 USD 未満)はページ変更検出レイヤーをうまく行いますが、「このページが変わった」で止まり、差分をインボックスに送信します。興味深い作業 — 差分を「セールスチームが違うことを言う必要があること」に変換すること — はまさに Claude がここで行うことです。礼儀正しいクローラーの懸念をアウトソースしたい場合は Visualping を n8n に接続してこのフローのクローラー/ハッシャーの半分をバイパスできます。マテリアリティフィルターと Claude 差分ステージが実際に重要な部分です。

単一の Google アラートフィードは、ほとんどのチームがデフォルトとして使用し、ほとんどのチームが静かに 1 ヶ月後に読むのをやめるものです。Google アラートはページ変更ではなくプレスの言及に発火します。価格ページの編集を完全に見逃します(ページは新しいニュースインデックスエントリを取得しません)。ボリュームはシンジケートされたプレスリリースノイズに支配されます。プレスシグナルのためのこのフローの補完として、代替品ではなくアラートを使用してください。

データウェアハウスの cron ジョブ上のカスタム Python クローラーは、すべてのスタッフエンジニアが構築したいものです。1 スプリントでクローラーが動作し、その後のスプリントで差分レイヤーが動作し、その後のスプリントで Slack フォーマットが動作し、その後、エンジニアがチームを変わると誰もそれを所有しなくなります。ここで n8n を使用する理由は、ワークフローを可視化し(グラフがドキュメントです)、エンジニア以外が編集可能にし(マーケティング Ops の人が PR なしで追跡ページを追加できます)、それを構築した人が去っても続くほど退屈にするためです。

注意事項

  • アンチボットブロックが 403/503 を返し、ハッシュが静かに古くなります。 ガード:Fetch Page HTML ノードは neverError: true を設定し、マテリアリティゲートの fetch_ok 条件(ステータス 200〜399 かつ本文長 > 200 バイト)が失敗したフェッチを false ブランチにルーティングします — それらはログに記録されますが、Claude やダイジェストには到達しません。last_seen_at が 7 日より古いページについて competitor_change_log に対する週次クエリを追加し、それを「古い追跡ページ」レポートとして扱ってください。
  • 正規化された差分がごちゃごちゃしている場合(例:CSS クラスの名前変更がすべての <div> に触れてストリップされたテキストが完全に回復しなかった)、Claude が変更を幻覚します。 ガード:システムプロンプトのエスケープハッチはリテラル文字列 NO_CHANGE であり、パーサーは ^NO_CHANGE\b(大文字小文字を区別しない)に一致するものを非マテリアルとして扱います。明らかに間違ったダイジェストエントリが見えたとき、修正は Normalize + Hash Code ノードにノイズマスクパターンを追加することであり、モデルの温度を下げることではありません。
  • Slack チャンネルが稼働後 4 週間以内にミュートされます。ダイジェストエントリの 20% でも非マテリアルな場合。ガード:日次ではなく週次ケイデンス(バンドルされているダイジェスト cron は月曜日 14:30 の 30 14 * * 1 のみ)、0.5% のマテリアリティ長さデルタフロア、NO_CHANGE Claude センチネル、競合他社にマテリアルな変更がない場合にダイジェストを完全に抑制するサイレント週が黙っているままの IF ゲート。それでもミュートする場合は、次に調整すべきダイヤルは追跡ページリストから最低シグナルの page_type 値を削除することです — 通常は採用ページ。
  • 長い競合他社名や大量の変更が Slack の 50 ブロックのメッセージ制限を超えます。 ガード:競合他社ごとに 1 つのメッセージ(1 つのメガ投稿ではなく)。上限は週ではなく競合他社ごとです。単一の競合他社が 1 週間に実際に 15 件以上のマテリアルな変更を持つ場合、それはその特定の競合他社のマテリアリティ閾値を引き上げる必要があるシグナルです。
  • オンデマンドスラッシュコマンドが Slack ワークスペース内の誰にでも競合インテリジェンスを漏洩させます。Slack スラッシュコマンドはチャンネルメンバーシップを強制しないためです。ガード:respondToWebhookresponse_type: "ephemeral" を返すため、要求ユーザーのみが結果を見ます。クエリは変更ログにスコープされています(生のページテキストは返されません)。より厳格なアクセス制御が必要な場合は、SQL クエリを実行する前に Parse Slash Command Code ノードで Slack ユーザーグループ ID にスラッシュコマンドをゲートします。

スタック

  • n8n — 3 つのトリガー(日次フェッチ cron、週次ダイジェスト cron、オンデマンドウェブフック)、HTTP フェッチャー、正規化器、マテリアリティゲート、永続化
  • Postgrescompetitor_tracked_pages(信頼できる最新情報リスト、20〜30 行)と competitor_change_log(マテリアルかどうかを問わず検出されたすべての変更の監査証跡)
  • Claude Sonnet 4.6NO_CHANGE センチネルをエスケープハッチとして持つ差分と要約ステージ
  • Slack — ダイジェスト配信チャンネルとオンデマンドスラッシュコマンドサーフェス

Files in this artifact

Download all (.zip)