AIメールシーケンス
Claude Codeの1コマンドで6シーケンス17本のライフサイクルメールを生成し、Inngestの行動トリガーを配線してデプロイ可能な分岐型メールファネルを構築します。
設定をやめて、構築を始めよう。
AIオーケストレーション付きSaaSビルダーテンプレート。
ほとんどのSaaSアプリが送るメールは3通です。ウェルカムメール、パスワードリセット、そして決済明細くらい。それはライフサイクル全体の約10%をカバーするだけです。
残りの90%は沈黙です。ユーザーがサインアップして、一日ちょっと触って、二度と戻ってこない。誰もフォローアップしない。プロダクトが何をするものなのか誰も説明しない。トライアルが切れそうなときに誰もナッジを送らない。ユーザーは、継続させてくれるはずのアプリの部分に到達する前に離脱してしまう。
ここにギャップがあります:自動化されたメールフローはメール総量の約2%にすぎませんが、メール収益の37%を生み出しています。多くの創業者がスキップするメールこそが、収益の大部分を生み出すものです。
この記事では、それらのメールを一度にすべて構築するシステムを説明します。1コマンド。6つのAIエージェントが並行して動作。出力:17のメールテンプレート、6つのバックグラウンドジョブ関数、配線されたトリガーイベント、そしてローカルで実行可能な型チェック済みのコード。
ほとんどのSaaSアプリが欠いている6つのシーケンス
ライフサイクルメールシステムは6つのステージをカバーします。それぞれがユーザージャーニーの異なる瞬間を対象にしています。
| # | シーケンス | トリガー | メール数 | 目的 |
|---|---|---|---|---|
| 1 | ウェルカム | ユーザーがサインアップ | 4 | ユーザーをプロダクトのコアアクションへ導く |
| 2 | アクティベーションナッジ | オンボーディング完了後48時間で主要アクションなし | 1 | 「サインアップしたけど使っていない」壁を突破 |
| 3 | フィーチャー教育 | アクティブユーザーが14日目に達する | 3 | まだ発見していない機能を教える |
| 4 | アップグレードプロンプト | 無料ユーザーがプラン制限に到達 | 3 | 既に使っているものを中心にした有料プランを提示 |
| 5 | チャーン防止 | ユーザーが7日以上非アクティブ | 3 | 離脱しつつあるユーザーを呼び戻す |
| 6 | ウィンバック | サブスクリプションがキャンセル | 3 | かつて支払った人を再エンゲージ |
ウェルカムは最も価値の高いシーケンスです。最初のウェルカムメールは平均55〜70%の開封率を誇ります。上位10%のSaaS企業は75%以上を達成します。これはユーザーから得られる最高の注目です。最初の7日間で4通のメール、それぞれがユーザーをプロダクトが「刺さる」瞬間へと近づけます。
アクティベーションナッジは最大のドロップオフを捕捉します。誰かがオンボーディングを終え、ダッシュボードを見て、去ります。48時間後に特定のアクションを試すよう促す1通のメールが、その一部を呼び戻します。
フィーチャー教育は別の種類のチャーンを防ぎます。ユーザーはアクティブだが1つの機能しか使っていない。2週間で3通のメール、それぞれがまだ触れていない機能をハイライトします。このようなセグメント化されたキャンペーンは一括送信の760%以上の収益をもたらすことがあります。
アップグレードプロンプトはタイマーではなく、ユーザーが実際の制限に到達したときに発火します。無料プランでは許可されないことをしようとしたのです。それが価値を理解する瞬間です。5日間で3通のメール:何が起きたか、有料プランに何が含まれるか、そしてオファー。
チャーン防止は毎日のバックグラウンドジョブで実行されます。毎朝9時に、7日以上ログインしていないユーザーをデータベースに問い合わせます。次の30日間に3通のメールを配信します。それぞれが異なる角度を使います:「あなたが見逃していること」、「あなたのデータはここにある」、そして「何が悪かったか教えてください」。
ウィンバックはStripeがキャンセルのウェブフックを送ったときに始まります。30日間で3通のメール。最初はキャンセルを認める。2番目は離れてから改善したことをハイライトする。3番目はオファーをする。ロスフレームのメッセージング(あなたが手放すもの)は、ポジティブなフレーミング(あなたが得るもの)より21〜32%高いコンバージョンを達成します。
38社のSaaS企業を対象とした調査では、全ライフサイクルステージをカバーしていたのはわずか2社でした。多くはウェルカムと請求で止まっています。このシステムが対応するのはそのギャップです。
なぜほとんどのメールツールでは不十分か
標準的なアプローチ:メールプラットフォームを開き、テンプレートを選び、コピーを書き、3日の遅延を設定して、繰り返す。
3つの問題があります。
タイマー、行動ではなく。 ほとんどのツールは固定の遅延でメールをスケジュールします。「メール1の3日後にメール2を送る」。これはユーザーが実際に何をしたかを無視します。1日目にアクティベートしたユーザーは、一度もログインしていないユーザーと同じナッジを受け取るべきではありません。トリガーメール(ユーザーの行動に基づいて送られる)は、タイマー送信より76%高い開封率と152%高いクリック率を達成します。
クリックを殺すHTMLテンプレート。 重いフォーマット、画像、レイアウトグリッドを持つリッチHTMLメールはプロフェッショナルに見えますが、パフォーマンスは低いです。プレーンテキストメールは42%多くのクリックを得ます。重要なメールクライアント(Gmail、Apple Mail)はプレーンテキストをうまく処理します。重いHTMLはスパムフィルターを発動させ、ユーザーが持つデバイスの半分でうまくレンダリングされません。
アプリとの接続がない。 外部のメールプラットフォームはデータベースを知りません。アクティベーションナッジを送る前にユーザーがすでにアクティベートしたかどうかを確認できません。昨日アップグレードした人へのアップグレードメールをスキップできません。メールシステムとプロダクトは別々の世界に存在します。
システム:1コマンド、2フェーズ
パイプラインは1つのClaude Codeスラッシュコマンドです:/emails。あなたのプロダクトを読み、シーケンスを設計して、すべてを構築します。
.claude/
commands/
emails.md # コマンド定義
skills/
email-sequence/ # シーケンス設計フレームワーク
react-email/ # テンプレート構築ルール
webapp/
emails/ # React Emailテンプレート(出力)
lib/inngest/functions/ # バックグラウンドジョブ関数(出力)
lib/emails/send.ts # 送信ユーティリティ(出力)フェーズ1(設計): 1つのエージェントがプロダクトドキュメント、ユーザージャーニー、ブランドボイス、価格設定を読みます。件名、タイミング、各メールの目標を含む6つのシーケンスすべてを設計します。そして止まり、プランを提示します。承認されるまで何も構築されません。
フェーズ2(構築): 6つのエージェントが並行して構築します。シーケンスタイプごとに1つ。各エージェントはReact Emailテンプレート(Reactコンポーネントで構築されたメールレイアウト)とInngest関数(タイミング、リトライ、状態チェックを処理するバックグラウンドジョブ)を書きます。1つのベースエージェントが先に実行され、共有レイアウトと送信ユーティリティを作成します。その後5つのエージェントが同時にシーケンスを構築します。
フェーズ1:プロダクトを読み、シーケンスを設計し、承認を待つ
設計エージェントは、テンプレートではなくあなたのプロダクトらしいメールを書くために必要なすべてを読みます。
読み込むプロダクトコンテキスト:
- プロダクト概要(アプリの機能、価格帯)
- ユーザージャーニー(誰がサインアップし、何を気にするか)
- ブランドガイドライン(ボイス、トーン、プロダクト名)
- フィーチャーマップ(教育メールでハイライトする内容)
- 認証フロー(サインアップの仕組み、ウェルカムシーケンスと一致させる)
- 請求設定(価格帯、アップグレードトリガー)
- ブランドカラー(メールテンプレートをアプリと一致させる)
そこから、メールブリーフを構築します:プロダクト名、「アハモーメント」(ユーザーにとってプロダクトが刺さる具体的なアクション)、価格モデル、教育対象のトップ機能、アップグレードトリガー。
そして17通すべてのメールを設計します。それぞれに:件名、目標、タイミング、コピーの角度。
件名はリサーチに基づいています。 短い件名(2〜4語)は550万通のメール調査で平均46%の開封率を達成します。システムはモバイルインボックスのカットオフに合わせてすべての件名を50文字以下に抑えます。
1つのテンプレートも書かれる前に、完全なプランがあなたに提示されます。シーケンスを削除したり、タイミングを変えたり、件名を書き直したり、メールを完全に削除したりできます。構築フェーズは承認されたプランを仕様として使用します。
フェーズ2:6つのエージェントが並行して構築
承認後、6つのサブエージェントが同時に起動します。それぞれがメールブリーフ、承認済みプラン、ブランドカラー、必要なスキルを受け取ります。
エージェント0:ベースレイアウトと送信ユーティリティ
最初に実行されます。他のすべてのエージェントが使用する2つの共有ファイルを作成します。
ベースレイアウトはReact Emailコンポーネント(Reactで構築された再利用可能なメールテンプレート)です。ブランドロゴ、コンテナ、購読解除リンク付きフッター、アプリのCSSから変換されたブランドカラーが含まれます。
送信ユーティリティはResend(メール配信サービス)をラップします。React Emailコンポーネントを受け取り、HTMLとプレーンテキストの両方に変換して送信します。すべてのシーケンスがこの同じ関数を使用します。
エージェント1〜5:シーケンスごとに1つ
各エージェントは2つのものを書きます:メールテンプレートとシーケンスを調整するバックグラウンドジョブ関数。
テンプレートはReactコンポーネントです。各メールは1つの.tsxファイルです。型付きpropsにより、件名、ユーザー名、動的データがすべてメール送信前に検証されます。
バックグラウンドジョブ関数はInngest(スケジューリング、リトライ、イベント駆動型ワークフローを処理するバックグラウンドジョブエンジン)を使用します。各関数はシーケンスの開始タイミング、メール間の待機時間、次のメールを送る前に実行するチェックを定義します。
6つのエージェントすべてが完了した後のファイル構造:
webapp/emails/
_components/
base-layout.tsx # 共有ブランドレイアウト
welcome/
welcome-1-getting-started.tsx # テンプレート4枚
welcome-2-activation-nudge.tsx
welcome-3-feature-education.tsx
welcome-4-check-in.tsx
activation/
activation-nudge.tsx # テンプレート1枚
education/
education-1-feature-a.tsx # テンプレート3枚
education-2-feature-b.tsx
education-3-feature-c.tsx
upgrade/
upgrade-1-limit-hit.tsx # テンプレート3枚
upgrade-2-value.tsx
upgrade-3-offer.tsx
churn/
churn-1-miss-you.tsx # テンプレート3枚
churn-2-data-waiting.tsx
churn-3-feedback.tsx
winback/
winback-1-sorry.tsx # テンプレート3枚
winback-2-improvements.tsx
winback-3-offer.tsx
webapp/lib/inngest/functions/emails/
welcome-sequence.ts
activation-nudge.ts
feature-education.ts
upgrade-prompt.ts
churn-prevention.ts
winback-sequence.ts17のテンプレート。6つの関数。1つの共有レイアウト。1つの送信ユーティリティ。
行動分岐:サインアップしたタイミングではなく、ユーザーの行動に反応する
これがシステムをタイマーベースのドリップと区別する部分です。
Inngestはstep.waitForEventと呼ばれる機能をサポートしています。平たく言えば、シーケンスを一時停止して、続行する前に特定のことが起こるのを待ちます。制限時間内にそのことが起こらない場合、シーケンスは別のパスを取ります。
実際にどのように見えるかを示します。
ユーザーがサインアップします。ウェルカムシーケンスが始まります。メール1がすぐに送信されます。そして関数はstep.waitForEventを呼び出し、user.activatedイベント(ユーザーがプロダクトのコアアクションを完了したことを意味する)を最大48時間待ちます。
イベントが届いた場合、シーケンスはアクティベーションナッジをスキップしてフィーチャー教育へジャンプします。ユーザーはすでに価値を見つけました。ナッジするのはノイズになります。
48時間以内にイベントが届かない場合、アクティベーションナッジが発火します。ユーザーがまだ取っていない特定のアクションに焦点を当てた1通のメール。
その分岐はすべてのシーケンスの中で起こります。アップグレードプロンプトはメール間にユーザーがアップグレードしたかを確認します。チャーン防止シーケンスはユーザーが再ログインしたかを確認します。ウィンバックシーケンスはユーザーが再サブスクライブしたかを確認します。
すべてのstep.sleep()呼び出し(メール間の一時停止)の間に、関数は新しいデータベース接続を作成してユーザーの現在の状態を確認します。 ユーザーがすでにコンバートしていた場合、シーケンスは停止します。アップグレードした翌日にアップグレードメールを受け取る人はいません。
これがコードで表現されたトリガーメールの姿です。ビジュアルフローのビルダーではなく、スリープし、状態を確認し、分岐し、送信する関数です。
トリガーの配線
シーケンスは自分では始まりません。アプリ内の何かがイベントを発火させる必要があります。
| イベント | 発火場所 | 開始するもの |
|---|---|---|
app/user.signed-up | サインアップコールバック / 認証確認ルート | ウェルカムシーケンス |
app/user.limit-hit | プラン制限チェック | アップグレードプロンプト |
app/subscription.cancelled | Stripeウェブフックハンドラー | ウィンバックシーケンス |
| 毎日のcron(午前9時) | Inngestスケジュール関数 | チャーン防止 |
システムはこれらの場所をコードベースで見つけてinngest.send()呼び出しを配線します。サインアップにはすでに認証コールバックがあります。Stripeにはすでにウェブフックルートがあります。制限チェックはユーザーが上限に達したときにすでにレスポンスを返します。各場所はユーザーのID、メール、関連データを含むイベントを発火させる1行を追加するだけです。
チャーン防止は異なります。 イベントではなく毎日のcronジョブで動作します。毎朝、Inngest関数が7日以上アクティブでないユーザーをデータベースに問い合わせて、それぞれのユーザーに個別のイベントを送信します。ユーザーごとのシーケンスが残りを処理します。
データが示すもの
このシステムを形成する数値は、理論からではなく、メールが実際にどのように機能するかから来ています。
7通のオンボーディングシーケンス(実際のSaaSプロダクトでテスト)は、トライアルから有料へのコンバージョンを12%から22%に、毎月のチャーンを8%から4.8%に下げました。これらは複利で積み上がる2つの指標です。10ポイントのコンバージョン向上と3ポイントのチャーン削減は、あなたが使うすべてのマーケティング費用の計算を変えます。
プレーンテキストがクリック率で勝つのは、プロモーションではなく人からのメッセージのように感じられるからです。システムはReact Emailのrender()関数を通じてすべてのメールのHTMLバージョンとプレーンテキストバージョンの両方をレンダリングします。プレーンテキストを好むメールクライアントの受信者は自動的にプレーンバージョンを受け取ります。
短い件名が機能するのは、モバイルのインボックスが切り捨てるからです。2〜4語の件名はすべてのデバイスで完全に表示されます。システムはすべての件名を50文字以下に抑えます。
行動トリガーが固定タイマーを上回るのは、関連性がタイミングより重要だからです。適切なアクションの後に適切なメールを送ることは、何が起こったかに関わらず3日目にメールを送ることより優れています。
品質ゲート
6つのエージェントすべてが完了した後、システムはプロジェクト全体にわたってTypeScriptの型チェッカーを実行します:
cd webapp && npx tsc --noEmit型エラーなし。すべてのテンプレートに型付きpropsがあります。すべてのInngest関数に型付きイベントペイロードがあります。すべてのinngest.send()呼び出しが期待されるイベント形状と一致しています。
次に、ローカルテストの手順が提供されます:
# ターミナル1:開発サーバーを起動
npm run dev
# ターミナル2:Inngest開発サーバーを起動
npm run dev:inngest
# http://localhost:8288 を開く
# テストイベントを送信:app/user.signed-up
# ウェルカムシーケンスがステップごとに実行されるのを見るInngest開発サーバーはすべての関数実行をリアルタイムで表示します。各ステップの実行、各スリープのカウントダウン、送信されるはずの各メールを確認できます。ローカル開発では実際のインボックスには何も届きません。
これを自分で構築するためのルール
このパターンは、どのメールプロバイダー、どのバックグラウンドジョブエンジン、どのフレームワークでも機能します。うまく機能させるためのポイントを示します。
メールを設計する前にプロダクトを読む。 最もよくある間違いは、メールを書いた人がプロダクトを十分に理解していなかったために一般的に聞こえるメールを書くことです。テンプレートに触れる前に、プロダクトドキュメント、ユーザージャーニー、ブランドボイスをシステムに与えてください。
どれかを構築する前に全シーケンスを設計する。 完全なプランを提示する。承認を得る。それから構築する。プランの件名を変更するのは無料です。構築されたテンプレートで変更するには再レンダリング、再テスト、再デプロイが必要です。
すべてのメールの間でユーザーの状態を確認する。 シーケンスが始まったときと同じ状態にユーザーがいると仮定しないでください。step.sleep("3d")(3日待つ)は3日間の潜在的な変化を意味します。送信前にデータベースに問い合わせてください。
メール1通につき1つのアクション。 2つのボタンではなく。3つのリンクでもなく。1つの明確な次のステップ。シングルコールトゥアクションのメールは、決断する必要がないのでクリック率が高くなります。
HTMLと並行してプレーンテキストを構築する。 プレーンテキストを後回しにしないでください。同じテンプレートから両方のバージョンをレンダリングする。プレーンテキストメールは直接比較テストで42%多くのクリックを得ます。
新しいイベントではなく既存のイベントにトリガーを配線する。 サインアップはすでに起こっています。キャンセルはすでに起こっています。制限ヒットはすでに起こっています。メールシステムはアプリがすでに発火させているイベントにフックします。新しいインフラはゼロです。
メールを超えて
並行エージェントのパターン(1つのベースエージェントが共有インフラを構築し、専門エージェントが同時にその上に構築する)はメール以外にも機能します。
通知システム。 同じ構造:すべての通知タイプを設計し、テンプレートを構築し、トリガーを配線する。プッシュ通知、アプリ内アラート、SMSはすべて同じライフサイクルステージに従います。
オンボーディングフロー。 1つのエージェントがプロダクトコンテキストを読んでフローを設計します。別々のエージェントが各ステップを構築します(ウェルカムモーダル、フィーチャーツアー、チェックリスト、空の状態)。行動分岐は、ユーザーがすでに行ったことに基づいてどのステップを表示するかを決定します。
ドキュメント。 1つのエージェントが構造と共有コンポーネントを構築します。専門エージェントが個々のセクションを並行して書きます。同じ形。同じ調整パターン。
毎回同じ基本的なアイデア。まずプロダクトコンテキストを読む。構築する前に設計する。共有インフラで並行して構築する。行動する前に状態を確認する。最後にすべてを型チェックする。
設定をやめて、構築を始めよう。
AIオーケストレーション付きSaaSビルダーテンプレート。