ライブSalesforceデータを活用したインタラクティブメール

Salesforceは、パスワードや静かに期限切れになるリフレッシュトークンではなく、署名付きJWTでサーバー間の連携を認証します。MailInAppのAPIデータソースは、このフローをネイティブに話します: Connected Appの証明書と秘密鍵でサインインし、SOQLクエリを実行し、返された行をKPIスコアカードやチャートブロックに直接紐付けます — メールに貼り付けたスクリーンショットではなく、送信のたびに本物の最新の数値を持つパイプラインダイジェストです。

件名

Your pipeline this week

Salesforceは、パスワードではなく署名付きJWTでサーバー間連携を認証します — そしてMailInAppのAPIデータソースは、このフローをネイティブに話します。一度接続すれば、KPIスコアカードやチャートブロックが、ライブのOpportunity、Account、Contactの行に直接紐付きます。面倒を見るべきリフレッシュトークンも、送信のたびに再エクスポートするCSVも不要です。

ほとんどの「週次パイプライン」メールは、レポートのスクリーンショットであり、誰かがそれを貼り付けた瞬間に古くなります。チャートブロックをSalesforceに支えられたデータソースへ直接紐付けるということは、ブロック自身の数値が本物のSOQLクエリから来るということです — そして繰り返し送信は、送信のたびにそのクエリを新しく再実行するため、月曜日のダイジェストは実際に月曜日のパイプラインを反映します。

接続の仕組み

MailInApp

Connected Appの秘密鍵でJWTに署名します

Salesforceトークンエンドポイント

署名を検証し、アクセストークンを返します

Salesforce REST API

Bearerトークンで認証され、SOQLクエリを実行します

自分のメール

KPIスコアカード&チャートブロックが行にライブで紐付きます

すべてのステップは、送信のたびにサーバーサイドで行われます。パスワードが送信されることは一切なく、リフレッシュトークンもありません — 古くなったトークンは、新しいアサーションに署名することで置き換えられます。

これは、Salesforceが自身のサーバー間連携向けに文書化しているのと同じJWT Bearerフローであり、Salesforce専用に作られた独自の連携ではなく、MailInApp既存のAPIデータソース向けOAuth2認証モードに組み込まれています。

Connected Appを一度だけ設定する

Salesforce Setupで、Connected Appを作成し、OAuth設定を有効にし、Use digital signaturesの下で自己署名証明書をアップロードします — 証明書はSalesforceへ、対となるRSA秘密鍵はMailInAppへ渡します。Permitted UsersをAdmin approved users are pre-authorizedに設定してください。これによりやり取りが非対話的になります: スクリプトがクリックして通過するための同意画面は存在しません。Connected AppのConsumer Keyと、組織のMy Domain URLを控えておいてください — どちらもMailInApp側の接続設定に入力します。

SOQLクエリに向ける

データソースのEndpointはREST問い合わせURLで、クエリ文字列が実際に返ってくるデータそのものです:

SELECT Name, Amount, StageName, CloseDate FROM Opportunity WHERE IsClosed = false

Data pathをrecordsに設定します — Salesforceは問い合わせ結果をrecords配列に包んで返します。Owner.Emailのようなリレーションフィールドはネストして返り、MailInAppの行パーサーによって破棄されるため、クエリはフラットに保ってください。後でフィルタリングやマージのためにオーナーの識別子が必要な場合は、代わりにOwnerIdを選んでください。

マージタグではなく、ブロックを直接紐付ける

スタジオのデータパネルから、collectionロールでこの接続をプロジェクトに追加します — 繰り返しブロックが使うのと同じ紐付けです。そこから、KPIスコアカード、バー、ライン、円グラフブロックがそれぞれのインスペクターで直接紐付けられます:

  • Amountに設定しSum集計を使うKPIスコアカードは、ライブの「総オープンパイプライン」の数値になります。
  • StageNameでグループ化し、Amountをシリーズ(こちらもSum集計)とする棒グラフは、ステージ別のパイプライン内訳になります。

どちらのブロックも、手で入力するマージタグを1つも必要としません — 紐付けがその作業を代わりに行い、ディールがステージを移動したり成立したりしても、どちらも正しいままです。

スケジュールで送信する

週次の繰り返し送信は、発火するたびにSOQLクエリを再実行し、Salesforceの現在の行に対して両方のブロックを再レンダリングします — 同じダイジェスト構造で、毎週月曜日に新しい数値が、誰も手作業で再構築することなく反映されます。各Opportunity自身のSalesforce URLへ向けたボタンブロックは、ダイジェストを読む人に、注目を引いた数値の裏にあるレコードをワンクリックで開く方法を提供します。

はじめに

JWT Bearerフロー用の証明書を持つSalesforce Connected Appを作成し、Consumer Key、インテグレーションユーザー名、秘密鍵を使ってMailInAppのデータソースタブでそれを接続し、recordsをデータパスとするSOQLクエリにエンドポイントを向け、その後スタジオのデータパネルからKPIスコアカードと棒グラフをそれに紐付けます。フィールドごとの完全な設定手順はSalesforce連携ガイドを参照してください。

典型的な作成・送信の流れ

  1. 1

    サーバー間アクセス用のSalesforce Connected Appを作成する

    OAuth設定を有効にし、自己署名のデジタル証明書をアップロードし、JWT Bearer Flowをオンにして、Permitted Usersを「Admin approved users are pre-authorized」に設定します。これにより、人間が同意画面をクリックする必要がなくなります。

  2. 2

    SalesforceをAPIデータソースとして接続する

    MailInAppのデータソースタブでOAuth2 JWT Bearerを選び、トークンURL、Connected AppのConsumer KeyをIssuerとして、インテグレーションユーザーのユーザー名をSubjectとして、ログインホストをAudienceとして、そして対応する秘密鍵を貼り付けます。

  3. 3

    エンドポイントをSOQLクエリに向ける

    エンドポイントは組織のREST問い合わせURLで、データパスは「records」です — SELECT Name, Amount, StageName, CloseDate FROM Opportunity WHERE IsClosed = falseのようなクエリは、フェッチのたびにライブのパイプライン行を返します。

  4. 4

    KPIとチャートブロックを直接紐付ける

    スタジオのデータパネルからそのソースにCollectionロールの紐付けを追加し、KPIスコアカードのValueフィールド(AmountのSum)と棒グラフのGroup by(StageName)をそれに紐付けます — 手で入力するマージタグは一切不要です。

  5. 5

    繰り返しスケジュールで送信する

    週次の繰り返し送信は、発火するたびにクエリを再実行し、Salesforceの現在の行に対して両方のブロックを再レンダリングします — 同じダイジェスト構造で、毎週月曜日に新しい数値が、誰も手作業で再構築することなく反映されます。

よくある質問

アクセストークンを手動で更新する必要はありますか?

いいえ — キャッシュされたトークンの期限が近づくと、MailInAppは自動的に新しいJWTアサーションに署名し、新しいアクセストークンと交換します。また、呼び出しが未認証で返ってきた場合も同様です。このフローには面倒を見るべきリフレッシュトークンは存在しません — 古くなったトークンは、新しいものを発行することで単純に置き換えられます。

自分のSalesforceのパスワードがMailInAppに届くことはありますか?

いいえ — JWT Bearerフローは、証明書に対して検証される署名付きアサーションで認証を行い、ユーザー名/パスワードのやり取りは一切行いません。MailInAppが保存する唯一の秘密情報は、その証明書ペアの秘密鍵の側であり、保存後はすべてのレスポンスでマスクされます。

各営業担当者は自分自身のOpportunityだけを見ることができますか?

SOQLクエリがフィルタリング用のフラットなフィールドを返す場合のみ可能です — Owner.Emailのようなリレーションフィールドはネストしたオブジェクトとして返り、MailInAppの行パーサーはネストした値をフラット化しないため破棄されます。代わりにOwnerIdのようなフラットな識別子を選び、紐付けたチャートブロックを、オーディエンス自身の連絡先の行にある一致するフィールドに対してフィルタリングしてください(チャートのBind to dataフィルターは受信者のマージタグを参照できます)。これにより、同じ共有クエリを受信者ごとに分割できます。

どのSalesforceエディションが必要ですか?

REST APIアクセスが有効になっているエディションであれば何でも構いません — Enterprise、Unlimited、Performance、Developer Editionには標準で含まれています。ProfessionalとEssentialsはAPIアドオンが必要です。インテグレーションユーザー自身のプロフィールでもAPI Enabledがオンになっている必要があります。

本番環境の代わりにサンドボックスに対しても動作しますか?

はい — トークンURLのホストとAudienceの値の両方にhttps://test.salesforce.comを使い、エンドポイントは本番環境ではなくサンドボックス自身のMy Domain URLに向けてください。

スタジオでこれを作ってみましょう

無料プランから始められます — すべてのインタラクティブブロックと完全なフォールバックエンジンが、どのプランにも含まれています。