ooligo
n8n-flow

n8n で CSM に使用量低下をアラートする

Difficulty
中級
Setup time
45-90 min
For
cs-ops
Customer Success

Stack

CS チームが持つ最も信頼できる churn のシグナルは、プロダクト使用量が急落することです。そしてそのシグナルが見逃される最も一般的な理由は、誰も正しい週を見ていないことです。QBR が低下を浮かび上がらせる頃には、そのアカウントはすでに 2 か月間静かなままです。このワークフローは、可能な限り小さなメカニズムでそのギャップを埋めます。各アカウントのアクティブユーザー数を Amplitude から読み取り、先週とその前の週を比較し、低下が CS Ops リードがアカウント単位で制御する閾値を超えたときに、担当 CSM へ Slack のダイレクトメッセージを送る、週次の n8n flow です。やることは 1 つだけ —週次の使用量低下を、それがまだ今週の問題であるうちに浮かび上がらせること— で、それを誰も開かないダッシュボードなしで行います。

artifact バンドルは apps/web/public/artifacts/usage-drop-alert-n8n/ にあります。n8n のエクスポートは usage-drop-alert-n8n.json で、認証情報・schema・検証ガイドは _README.md です。バンドルにはプレースホルダーの認証情報と、初回実行前に存在している必要がある 2 つの Postgres テーブルが含まれているため、schedule を有効化する前に両方を必ず読んでください。

いつ使うか

これは、使用量ダッシュボードを目視で追うことを超えて成長したアカウント book を運用する CS Ops リードであるときに使ってください —CSM あたり 50 アカウントを超えるあたり、ポートフォリオ全体を頭の中に保持できない規模です。アカウント単位のアクティブユーザーシグナルを追跡する Amplitude(または HTTP ノードを再ポイントできるプロダクト分析ツール)、Slack ワークスペース、そしてアカウント単位の閾値を保存する場所が必要です。この flow は、CS 組織がすでにプロダクト使用量を先行指標として信頼しているが、次の QBR より前にそのシグナルを人間に push するメカニズムを持っていないときに、正しい選択です。

より重いヘルスモデルの下に置く、安価な最初のレイヤーとして特によく適合します。すでに n8n のコンポジット customer health score を運用している場合、この flow は速反応の補完です。コンポジットスコアは毎晩再計算してアカウントがどこに位置するかを伝え、このアラートは週次で発火して何が今動いたかを伝えます。多くのチームは、半日の作業で数日のうちに信頼を得られるため、まずアラートを立ち上げ、CSM がその ping に対して行動するようになってからコンポジットへ移行します。

いつ使わないか

CSM がポートフォリオ全体を手作業で読めるなら、これはスキップしてください。CSM あたりおよそ 30 アカウント未満では、月曜の朝に使用量ダッシュボードを人間がスキャンする方が、より多くのコンテキストで同じ低下を捉えますし、自動閾値の誤検知コストは見合いません。この flow はボリュームで価値を出すのであって、巧妙さで出すのではありません。

Amplitude のアカウント単位タギングが信頼できないなら、スキップしてください。flow 全体は gp:account_id(または同等のユーザープロパティ)が各イベントに一貫してセットされていることに依存します。アカウントが一貫性なくタグ付けされている場合 —一部のイベントはプロパティを持ち、一部は持たない— 週次アクティブ数は意味をなさず、アラートは行動の変化ではなくタギングのアーティファクトに対して発火します。先にタクソノミーを直してください。汚れたデータに対するアラートはアラートなしより悪いです。なぜなら数字としての権威を帯びるからです。

気にかけている低下がアカウント単位ではなくシート単位や機能単位なら、スキップしてください。この flow は 1 つのシグナル —アカウント単位の週次ユニークアクティブ— を見ており、総アクティブの 40% 低下は、休暇週に単に 1 人のパワーユーザーを失った健全なアカウントを隠す可能性があります。churn リスクが特定機能の放棄や、ある特定の champion が静かになることにあるなら、機能単位またはユーザー単位の cohort が必要で、それは別の(より重い)flow です。そしてチームが、低下アラートが発火したときに何をするかの playbook を持っていないなら、スキップしてください。次のアクションが定義されていない通知は、人々にそれを却下するよう訓練します。

セットアップ

セットアップは apps/web/public/artifacts/usage-drop-alert-n8n/_README.md に端から端まで文書化されています。短縮版は次のとおりです。n8n の Settings → Import From File で JSON をインポートし、3 つのプレースホルダー認証情報(Postgres、Amplitude Basic auth、Slack bot token)を作成し、README の DDL から 2 つの Postgres テーブル(accounts_in_scopeusage_alert_history)を作成し、canary アカウントを 1 つ seed し、schedule を有効化する前に 8 ステップの検証シーケンスを実行します。クリーンな n8n インストールから、45 分から 90 分を見込んでください —その大部分は、Amplitude のセグメンテーションクエリがイベントタクソノミーと一致していること、そして Slack アプリがワークスペース内のユーザーへ DM を送れることの確認に費やされます。

accounts_in_scope テーブルはアカウント単位のポリシーが存在する場所であり、それを正しく設定することが、有用なアラートとミュートされた bot との違いです。各行は drop_threshold_pct(アラートを発火させる低下のパーセンテージ)と min_baseline_events(これを下回るとアカウントが判断するには小さすぎるアクティブユーザーの下限)を持ちます。enterprise アカウントはしばしばより厳しい閾値で運用します —200 シートのアカウントでの 25% 低下は一見の価値があります— 一方で self-serve アカウントはより多くのノイズを許容し 50% で運用します。これらをハードコードされた定数ではなくテーブルの列として保つことで、再調整は 1 回の UPDATE であり、再デプロイではありません。

flow が実際に行うこと

cron は月曜の America/New_York 09:00 に発火します(式は 0 13 * * 1 —13:00 UTC— なので、workflow の timezone がセットされていることを確認してください)。月曜の朝は意図的です。前の週が完全に締まっているため、毎週月曜を低下として読んでしまう部分週の比較がありません。Pull Accounts In Scope は、CSM の Slack id がセットされたアクティブアカウントを最大 500 件読み取ります。オーナーのないアカウントは通知する相手がいないため SQL でフィルタされます。Batch Accounts (20/group) はそれらをグループに分割し、並列の Amplitude 呼び出しが Dashboard REST API の同時実行上限を下回るようにし、batch 間に 1 秒の待機を入れます。

Amplitude — Weekly Actives (14d) は、14 日間のウィンドウにわたり i=7(週次バケット)で /api/2/events/segmentation エンドポイントを呼び出し、アカウントの gp:account_id プロパティでセグメント化します。これは 2 つの週次ポイント、先週とその前の週を返します。Compute WoW Drop は flow 内の唯一の実質的なロジックで、2 つの判断を行います。第 1 にノイズガードです。前の週のアクティブ数が min_baseline_events を下回る場合、アカウントは skipped_low_baseline とマークされ、決してアラートしません —4 アクティブから 2 への変化は 50% 低下で純粋なノイズです。第 2 に閾値です。(week_before - last_week) / week_before をパーセンテージとして計算し、それがアカウントの drop_threshold_pct に達するか超える場合にのみ、行を alert とマークし、「週次アクティブが 47% 低下(120 から 64 へ)前週比」のような読める理由を付けます。

Crosses Threshold? はアラート行を先へルーティングし、それ以外はすべて throttle へ直行します。次に Lookup Recent Alert が、このアカウントに対する過去 14 日間のアラートを usage_alert_history で確認し、存在すれば Outside Cooldown? が繰り返しを抑制します。これは疲労に対する 2 番目のガードです。持続的な低下は、そうでなければ使用量が回復するまで毎週月曜に CSM へ ping し、bot を無視するよう訓練してしまいます。cooldown があれば、実際の低下は一度 ping し、CSM はそこからフォローアップのオーナーになります。

生き残った行は Slack — DM Owning CSM に到達し、CSM の Slack user id へ、アカウント名・セグメント・前後のアクティブ数・低下のパーセンテージ・発火した閾値を含む Block Kit メッセージを直接ポストします。Persist Alert (idempotent per week) は、(account_id, date_trunc('week', alerted_at)) をキーとする ON CONFLICT 句でアラートを usage_alert_history に書き込むため、リトライされた実行は CSM へ 2 回 DM するのではなく既存の行を更新し、高速パスの cooldown 読み取りのためにアカウントに last_alerted_at をスタンプします。

コストの実際

この flow はほぼ無料で実行できます。LLM 呼び出しはありません —比較は Code ノード内の算術なので、唯一のコストは API クォータと n8n の実行時間です。アカウントあたり週あたり、flow は Amplitude のセグメンテーション読み取りを 1 回、最大 1 回の Slack 書き込み、2 ~ 3 回の Postgres クエリを行います。Amplitude の Dashboard REST API は有料プランでは呼び出しごとに課金しません。制約はその低い同時実行上限であり、それがまさに batch size が 20 で 1 秒の throttle がある理由です。500 アカウントの場合、実行全体は n8n Cloud の小さい executor でおよそ 3 ~ 6 分で完了し、シリアライズされた Amplitude 読み取りが支配的です。Slack の chat.postMessage はチャネルコンテキストあたりおよそ毎秒 1 メッセージに rate-limit されており、週次のアラートボリュームが必要とする量を余裕で下回ります。

実際のコストは人間のコストであり、それはあなたが削減しようとしているコストです。CS Ops リードはセグメントが変化するにつれて閾値を再調整するのに四半期あたりおそらく 1 時間を費やします。対する代替は、CSM がそれぞれ週あたり 20 ~ 30 分をダッシュボードの目視に費やすこと(あるいは、より頻繁には、それをやらず QBR で気づくこと)です。10 人の CSM チームでは、それはおよそ四半期あたり 40 ~ 50 時間の手作業スキャンが、1 時間の閾値メンテナンスに置き換わることになります —しかもそのスキャンはどのみち 1 か月遅れで低下を捉えていました。

成功とはどう見えるか

最初の四半期に 3 つの数字を見てください。第 1 に アラートに対するアクション率 —DM が 5 営業日以内に記録された CSM のタッチ(メール、予約された通話、メモ)につながった割合。これをアンケートまたは計測してください。最初の月の終わりまでに 60% 超を目指します。アクション率が 40% を下回る場合、閾値が緩すぎて bot が狼少年になっています —ノイズの多いセグメントの drop_threshold_pct を上げてください。第 2 に 介入までの lead time —後に churn または縮小したアカウントについて、使用量低下アラートが最初の CSM アウトリーチに何日先行したかを、「QBR で気づいた」という過去のベースラインと比べて測ります。要点は、その数字をおよそ 60 日から 14 日未満へ動かすことです。第 3 に 抑制率 —閾値を超えたが cooldown によって保留されたアカウントの割合。健全な数字は低く安定しています。抑制率の上昇は、ある cohort が持続的な低下にあり、週次アラートがもはや正しいツールではないことを意味します —それらのアカウントには、もう 1 つの ping ではなく、コンポジット customer health score と save play が必要です。

代替手段との比較

デフォルトの代替は Amplitude 自身のアラート です —その Anomaly モニターと Threshold モニターはチャートを監視し、Slack やメールへ発火できます。ちょうど 1 つのグローバルアラート(「総週次アクティブが低下した」)が必要なら、Amplitude のネイティブモニターを使ってください。n8n を立ち上げるより手間がかかりません。この flow が存在する理由はアカウント単位のルーティングです。Amplitude のモニターはチャートに対してアラートするのであって、アカウント対 CSM のマッピングに対してではないため、ポートフォリオレベルのモニターは担当 CSM に 彼らの アカウントが低下したと伝えられません。Amplitude 単独でアカウント単位・オーナー単位のルーティングを得るには、結局アカウントごとに 1 つのモニターを作ることになり、それは数件を超えるとスケールしません。この flow はアカウント対 CSM のマップとアカウント単位の閾値を、あなたが所有するテーブルに保持し、それに従ってルーティングします。

2 番目の代替は CSP に組み込まれた使用量アラート です —Gainsight、Catalyst、ChurnZero、VitallyPlanhatTotango はすべて何らかの形の使用量低下トリガーを備えています。すでに CSP を運用しプロダクト使用量をそこへ流し込んでいるなら、ネイティブトリガーを使ってください —データはすでにそこにあり、CSM へのルーティングもすでに配線されています。この flow は、プロダクト分析を Amplitude に持つがまだ使用量を CSP に集約していないチーム、あるいは CSP の使用量データが Amplitude より sync サイクル分遅れているチームのためのものです。CSP のロールアップが追いつく前に先行指標を届けるブリッジです。

3 番目の代替は cron 上の DIY スクリプト です —Amplitude API と Slack API を叩く Python ジョブ。最初のバージョンは n8n flow を配線するより速く書けますが、認証情報のローテーション負担をコードで抱え、リトライのセマンティクスを out of the box では持たず、エンジニアでない CS Ops リードには見えません。n8n 版は生の柔軟性を、認証情報の UI、組み込みのリトライ、非エンジニアが読んで再調整できるビジュアル flow と引き換えにします。CS Ops が常駐エンジニアを持つなら DIY を選び、閾値を調整する人がアラートを読む人と同一なら n8n flow を選んでください。

注意点

  • タギングのアーティファクトが使用量の急落として読まれる。 プロダクト計装が変わると —イベントがリネームされる、ある面で account_id プロパティがセットされなくなる— その面のすべてのアカウントがゼロへの低下を示し、bot はすべての CSM へ一斉に DM します。ガード:有効化する前に、過去 2 週間で gp:account_id が非 null のアカウントの distinct カウントをクエリし、安定していることを確認してください。そして、多数のアカウントにわたる同一週のアラートボリュームの急増は、churn の波ではなく計装インシデントとして扱ってください —usage_alert_history テーブルがその急増を一目で可視化します。
  • 小さなアカウントは幻の低下を生む。 週次アクティブが 4 から 2 へ落ちるアカウントは 50% 低下ですが、何も意味しません。ガード:accounts_in_scopemin_baseline_events 下限が、前週の閾値を下回るアカウントを skipped_low_baseline とマークし、決してアラートしません。下限はセグメントごとに設定してください —self-serve は 5 の下限で運用でき、enterprise はめったに必要としません。
  • 持続的な低下が CSM をスパムする。 抑制がなければ、落ちて下がったままのアカウントは回復するまで毎週月曜に発火します。ガード:Lookup Recent AlertOutside Cooldown? の 14 日 cooldown が、低下イベントあたり 1 つのアラートを保証します。CSM は最初の ping の後にフォローアップのオーナーになり、まだ低下中のアカウントは繰り返しアラートではなくコンポジット customer health score に現れます。
  • リトライが DM を重複させる。 batch の途中でのノードの失敗が n8n のリトライを引き起こすと、Slack DM が 2 回送られる可能性があります。ガード:usage_alert_history(account_id, date_trunc('week', alerted_at)) に一意インデックスを持ち、Persist AlertON CONFLICT ... DO UPDATE を使うため、2 回目の試行は新しい行を挿入するのではなく既存の週次行を更新します —そして Slack 送信が persist に先行するため、リトライ時の cooldown 読み取りがそれを捉えます。
  • DM は届くが何も起こらない。 次のステップが定義されていないアラートは、タイムスタンプ付きのノイズです。ガード:これはコードのガードではなくプロセスのガードです —ロールアウトを 1 行の playbook(「使用量低下 DM → CSP でアカウントを確認 → 5 営業日以内にタッチを記録」)と組み合わせ、上記のアクション率を追跡してください。アクション率が低い場合、修正は playbook か閾値であって、より多くのアラートではありません。

スタック

  • n8n —オーケストレーション、週次 schedule、リトライ、認証情報管理、そして CS Ops リードがエンジニアなしで再調整できるビジュアル flow
  • Amplitude —プロダクト使用量のソース。Dashboard REST の events/segmentation エンドポイント経由でアカウント単位の週次ユニークアクティブ
  • Slack —配信チャネル。担当 CSM の user id への Block Kit DM(共有チャネルへ再ポイント可能)
  • Postgres —アカウント単位の閾値と CSM ルーティングのための accounts_in_scope、cooldown と idempotence キーのための usage_alert_history

Files in this artifact

Download all (.zip)