migrating-from-customer-io について
Customer.io の選択したオートメーションを、PostHog の下書きワークフローに移行する手順を示すスキルです。個人データを移さず、ワークフローを有効化せずに、安全な選択、プレビュー、インポート、確認を進めます。
主な機能
- 01Customer.io オートメーションの移行
- 02下書きワークフローのプレビューとインポート
- 03送信者とセグメントの対応付け
- 04テンプレート、スニペット、レイアウトの処理
- 05プライバシーを考慮したデータ境界
- 06インポート結果と再実行の案内
活用シーン
- 01稼働中のオートメーションを PostHog へ移行
- 02未対応ステップをインポート前に確認
- 03メッセージテンプレートの不足に対処
- 04元データ修正後に下書きを再インポート
MCP 対応
Customer.io MCP サーバーからの読み取りと、PostHog の MCP ツール経由のインポートを調整します。`cio` コマンドラインツールも利用できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ posthog/ ai-plugin --skill migrating-from-customer-ioインストール後、Claude Code で/migrating-from-customer-ioを入力して読み込まれたか確認します。
詳細
Customer.io からの移行
PostHog は Customer.io のオートメーションを下書きワークフローとしてインポートします。下書きからメッセージが送信されることはありません。担当者がそれぞれの下書きを確認し、インポートで引き継げなかった内容を修正してから有効にします。
2 つの MCP サーバー間でデータを受け渡します。Customer.io の MCP(または cio CLI)から読み取り、返された内容を変更せずに PostHog の workflows-import-customerio に渡します。変換は PostHog が行うため、workflows-create を使って自分でワークフローを再構築しないでください。
人のデータは移動しない
オートメーション、テンプレート、送信者 ID、セグメント名のみを渡してください。顧客プロフィール、セグメントメンバー、配信データ、イベントデータは取得も受け渡しもしないでください。対象者は通常すでに PostHog に存在しており、そのコピーはユーザーが求めていないプライバシー上のリスクとなります。
メッセージの内容をコンテキストに含めない
メールテンプレートは大容量で、それぞれ数十キロバイトの HTML を含むこともよくあります。PostHog のプロジェクトに Customer.io App API キーが保存されている場合(オプトアウトインポートを実行したチームには保存されています)、PostHog は Customer.io 自体からメッセージの内容を読み取ります。そのため、まずオートメーションのグラフを渡し、PostHog から求められた場合にのみテンプレートを読み取ってください。
手順
- PostHog のプロジェクトを確認します。 下書きは PostHog MCP のアクティブなプロジェクトに作成されます。
project-getでプロジェクトを読み取り、名前と ID をユーザーに伝え、下書きをそのプロジェクトに作成してよいか確認します。別のプロジェクトにする場合は、Customer.io から何か読み取る前にswitch-projectで切り替えます。 - 環境を確認します。 Customer.io のワークスペースが複数ある場合は、どのワークスペースを移行するか尋ねます。その ID が、以下のすべてのパスで
environment_idになります。 - オートメーションを一覧表示します。 Customer.io の読み取りツール(MCP では
cio_read_api、CLI ではcio api)でGET /v1/environments/{environment_id}/campaignsを呼び出します。結果はpage(0 始まり)でページごとに 20 件返されるため、20 件未満のページが返るまで各ページを読み取ります。各オートメーションの状態を添えて一覧をユーザーに提示し、どれを移行するか尋ねます。通常は実行中のオートメーションが対象です。依頼がない限り、アーカイブ済みのものは除外します。 - 各オートメーションを読み取ります。
GET /v1/environments/{environment_id}/campaigns/{campaign_id}を呼び出します。レスポンスのcampaignオブジェクトと、トップレベルのactions配列を保持します。campaign.actionsは存在しません。 - 送信者とセグメントを読み取ります。
sender_identities(id、email、name)を取得するにはGET /v1/environments/{environment_id}/identities?type=emailを呼び出し、segmentsはセグメント一覧から取得します(id、name、typeのみ)。PostHog は各メールアドレスを同じアドレスの PostHog 送信者に対応付け、セグメント名をメモに記載します。 - テンプレートなしでプレビューします。
source: "customerio"、dry_run: true、campaigns: [{campaign, actions}]、sender_identities、segmentsを指定してworkflows-import-customerioを呼び出します。1 回の呼び出しで最大 50 件のオートメーションを処理できます。 - 必要な場合にのみテンプレートを読み取ります。
content_fetchedだけで判断せず、各オートメーションのメモを確認します。trueは PostHog が一部のコンテンツを読み取ったことを示すだけで、1 つのオートメーション内のメッセージがすべて読み取られているとは限りません。メモにメッセージコンテンツがインポートに含まれていない、または PostHog がメッセージを読み取れなかったと記載されているオートメーションについては、template_idがあるすべてのアクションのテンプレートをGET /v1/environments/{environment_id}/templates/{template_id}で読み取り、templateオブジェクトを保持して、campaigns: [{campaign, actions, templates}]を指定して再度プレビューします。テンプレートは 1 つずつ読み取ります。ワークスペース内のテンプレートをすべて一覧表示すると、大規模なワークスペースではタイムアウトします。次回この手順を省略できるよう、Workflows のオプトアウトタブにある「Import from Customer.io」で App API キーが保存されることをユーザーに伝えます。 - スニペットとレイアウトを収集します。 メモに Customer.io のスニペット名が記載されている場合、または読み取ったテンプレート本文に
{{ snippets.name }}が含まれている場合は、ワークスペースのスニペットを読み取り、snippets({name: content})として渡します。PostHog がコンテンツ自体を読み取った場合、スニペットも読み取っています。見つからなかったスニペットがあれば、メモに記載されています。メモにレイアウト名が記載されている場合は、GET /v1/environments/{environment_id}/layouts/{layout_id}を読み取り、そのbodyをlayouts({layout_id: body})として渡します。 - プレビュー結果を報告します。 各オートメーションについて、ステータスとメモをレベル別(下記参照)にまとめて伝えます。ステータスが
failedのものをインポートする前に確認を求めます。validation_errorsに下書きが拒否される理由が記載されています。 - インポートします。
dry_run: falseと同じ引数を指定して再度呼び出します。各下書きのリンク(/workflows/{workflow_id})とneeds_inputのメモを改めて共有します。有効化する前に、チームでそれらに対応する必要があります。
エンドポイントのパラメーターが不明な場合は、そのエンドポイントのスキーマを確認します(resource.method を指定して cio_schema を使用)。リソース全体のスキーマを取得すると、数万トークンを消費します。
メモを読む
| レベル | 意味 | ユーザーに伝えること |
|---|---|---|
needs_input | 下書きに、チームだけが指定できる設定が必要です。メール送信者、トリガーコホート、分岐条件などが該当します | 有効化を妨げます。ワークフローごとに一覧にしてください。 |
approximated | PostHog ではステップの動作が異なります。たとえば、待機時間は最大 30 日です | 有効化する前に確認してください。 |
unsupported | PostHog に同等の設定がなく、含まれていません。たとえば、SMS ステップが該当します | 別の方法で再構築するかどうかを決めてください。 |
同じメモは、インポートしたワークフローの PostHog アプリ内にも表示されます。また、workflows-import-notes は 1 つのワークフローのメモを返します。
送信者とカテゴリー
メールには、Customer.io の送信者と同じアドレスを持つ PostHog のメール送信者が設定されます。そのアドレスの PostHog 送信者がない場合は、送信者として追加できるよう、needs_input メモにそのアドレスが記載されます。メールのサブスクリプションのトピックは、そのトピックからオプトアウトのインポートによって作成された PostHog のメッセージカテゴリーになります。トピックがインポートされていない場合は、その旨を示すメモが表示されます。
セグメントとコホート
Customer.io のセグメントはインポートされません。セグメントをトリガーとするオートメーションは、空のトリガーと needs_input メモを伴ってインポートされます。ユーザーがすでにそのセグメントに一致する PostHog コホートを持っている場合は、segment_cohorts: {"<segment id>": <cohort id>} を渡すと、そのセグメントのトリガーと条件にそのコホートが使われます。コホートをトリガーにするには、リアルタイムコホートが必要です。静的セグメントには専用のメモが表示されます。ワークフローでは静的コホートを確認できないため、ユーザーはそれを条件として再構築する必要があります。
プッシュ通知
プッシュのステップは unsupported メモとしてインポートされ、デバイストークンはインポートされません。ユーザーが Customer.io からプッシュ通知を送信している場合、アプリが PostHog SDK に登録したとき、またはエクスポートしたデバイストークンを PostHog のプッシュチャネルにインポートしたときにのみ、デバイスが PostHog に登録されることを伝えてください。トークンはユーザーデータであるため、そのインポートは別の手順としてユーザーが開始します。
再実行
オートメーションを再度インポートすると、その下書きが置き換えられるため、Customer.io で問題を修正した後に再実行できます。それ以降にチームが下書きに加えた編集は失われるため、再インポートする前に確認してください。すでに誰かが有効化したワークフロー、またはユーザーに編集権限がないワークフローは変更されず、結果は skipped になります。
インポート後
下書きは有効化しないでください。ユーザーに needs_input メモを確認してもらった後、テストと有効化のために building-workflows スキルに引き継いでください。有効化にはユーザーの明示的な承認が必要です。