もくじ
はじめに
以前の記事で、Salesforce Marketing Cloudを使ったパーソナライズ配信の紹介をしました。
前回は、パーソナライズ配信に、外部システムからの購買データや商品マスタを配信に利用しました。
実際に運用しようとなると、これらのデータがMarketing cloud内に自動で格納されるような設計が求められることがほとんどだと思いますが、今回はそういった設計をせずともある程度のパーソナライズ配信を行う方法について紹介します。
Marketing cloudで開封履歴のデータを取得するには?
Marketing Cloudでは、[ データビュー ] と呼ばれるMarketing cloudの購読者やジャーニー情報に関するシステム側で管理しているデータの一覧があります。
このデータビューですが、Marketing Cloud内でSQLを実行して、内容を確認するだけではなく、データを抽出しData Extensionとして格納することもできます。
データビューの一覧はこちらから確認できます。中には、購読者の配信結果に関するログも確認できます(バウンス、開封、クリック)。
今回はこの中から、開封に関するデータを扱っていきます。
アカウントのメール開封はデータビュー[ _Open ]という名称で格納されています。データ内の各項目と内容は以下のようになっています。
説明 | データ型 | データエクステンションのデータ型 | NULL可能 | |
---|---|---|---|---|
AccountID | アカウント ID 番号 | int | Number | 〇 |
OYBAccountID | 関連する代理人アカウントのアカウント ID 番号 | int | Number | X |
JobID | メール送信のジョブ ID 番号 | int | Number | 〇 |
ListID | 送信で使用されたリストのリスト ID 番号 | int | Number | 〇 |
BatchID | 送信で使用されたバッチのバッチ ID 番号 | int | Number | 〇 |
SubscriberID | 影響を受ける購読者の購読者 ID | int | Number | 〇 |
SubscriberKey | 影響を受ける購読者の購読者キー | nvarchar(254) | Text | 〇 |
EventDate | 開封が発生した日付 | datetime | Date | 〇 |
Domain | 開封が発生したドメイン | varchar(128) | Text | 〇 |
IsUnique | イベントが一意か、繰り返しか | bool | Boolean | X |
TriggererSendDefinitionObjectID | トリガーによる送信定義のオブジェクト ID | varchar(36) | Text | X |
TriggeredSendCustomerKey | トリガーによる送信のカスタマーキー | varchar(36) | Text | X |
多くの項目が確認できるかと思いますが、今回はこの項目の中から主に、SubscriberID、EventDateの値、すなわち「どのユーザーがいつ開封したのか」に関するログを使用したデータの作成について紹介します。
開封履歴を使ったパーソナライズ配信
a.最後にメール開封してからの経過期間を使う
このケースでは、定期的にメルマガを送って、顧客とコミュニケーションを取っている場合を考えてみます。
一定数のユーザ数にメールを定期的に配信しているため、Marketing cloud内に配信結果に関するログも定期的に収集されていくことになります。
一番シンプルな配信方法としてはメルマガを希望したユーザ全員に同じタイミングで同じコンテンツを一斉配信する方法になります。
しかし、同じコンテンツを送り続けてもそれに対するユーザの感想は画一的ではありません。
あるユーザにおいては、メルマガのコンテンツが有益な情報となっており、毎回楽しみにしてくれていてメールを開いてくれる場合もあれば、別のユーザでは登録はしたものの、時間とともに、送られてくる内容にあまり興味を持たなくなってしまっており、メールが届いても開封することなく放置している場合もあります。
こうした場合、現状ほとんど開封しなくなっているユーザに関しては、今まで通りに同じコンテンツを送り続けるよりも、コンテンツの内容を変えてみるなど別のアプローチをしてみるほうが望ましいでしょう。
例えば、マーケティング活動の一環として「毎週全会員にメルマガを一斉配信している」とします。
このとき対象の配信での各ユーザごとの開封履歴は以下のように出力します。
SELECT
SubscriberKey,
EventDate
FROM
_Open
WHERE
JobID = [対象の送信のジョブID]
SQLの実行結果の確認ですが、Marketing cloudのAppExchangeのQueri Studioを使用すると簡単に確認できて便利です。インストールに関しても簡単にできます。
上のSQLを少し修正して、ユーザ毎の最後に開封した時間を、以下のように出力します。
SELECT
SubscriberKey,
MAX(EventDate) AS LastOpenDate
FROM
_Open
WHERE
JobID = [対象の送信のジョブID]
GROUP BY
SubscriberKey
最後に開封してからの経過日数は、ユーザ毎に上の計算結果と、SQL実行時点での時刻との差分を計算すると出すことができます。以下のように出力します。
SELECT
SubscriberKey,
DATEDIFF(d,LastOpenDate,GETDATE()) AS LastOpenDate
FROM
(
SELECT
SubscriberKey,
MAX(EventDate) AS LastOpenDate
FROM
_Open
WHERE
JobID = [対象の送信のジョブID]
GROUP BY
SubscriberKey
) AS a
気をつけなければいけないこととして、データビューの開封ログには「1回も開封していない」ユーザはそもそもログが存在していません。
そのため、例えば今回作成したData Extensionを「30日以上開封していないユーザ」のリストの抽出に使用したいときなどは、このData Extensionには「メルマガを配信してから一回もメールを開いていないユーザ」はリストに存在していないため、条件から漏れてしまいます。
「メルマガを配信してから一回もメールを開いていないユーザ」も含めて抽出したい場合は、例えば以下のように元のメルマガ会員のData Extensionに上記の出力結果を結合させます。
この場合の最後に開封してからの経過日数は、例えば今回はメルマガ会員に登録した日付を設定してます(ここは他に適切な日付があればそちらを採用してもいいでしょう。データや運用などで判断してください)
最終的なSQLは以下になります。
SELECT
[メルマガ会員Data Extension].会員ID,
ISNULL( b.TimeLastOpen, [メルマガ会員Data Extension].登録日) AS TimeLastOpen
FROM
[メルマガ会員Data Extension]
LEFT JOIN
(
SELECT
SubscriberKey,
DATEDIFF(d,LastOpenDate,GETDATE()) AS TimeLastOpen
FROM
(
SELECT
SubscriberKey,
MAX(EventDate) AS LastOpenDate
FROM
_Open
WHERE
JobID = [対象の送信のジョブID]
GROUP BY
SubscriberKey
) AS a
) AS b
ON
[メルマガ会員Data Extension].会員ID = b.SubscriberKey
出来上がったData Extensionは以下のようになります。
会員ID | TimeLastOpen |
---|---|
c001 | 14 |
c002 | 7 |
c003 | 84 |
次に、作成したData Extensionを使って「TimeLastOpen」の値別にパーソナライズ配信をする方法について説明します。
パーソナライズ配信をする方法については前回の記事で紹介したように、Journey Builderを使用する方法もありますが、今回は、Automation Studio+Journey Builderを使用した方法について紹介しようと思います。
Automation Studioは、Marketing Cloud内で、複数ステップのマーケティングやデータ管理に関するアクティビティを即時、トリガー、またはスケジュール等のタイミングによって実行させることのできる、ワークフローアプリケーションです。
実装の流れとしては、例えば以下のような物が考えられます。
Automation StudioのSQLアクティビティで上記のSQLを実行、メルマガ会員リストにTimeLastOpenが付与されたData Extensionを作成(このアクティビティはメルマガ送信のタイミングでスケジューリングします)。
Journey Builderでは↑のData Extensionをエントリーソースにし、以下の条件で判断分岐させます。
例えば1の層に関しては今まで通りのコンテンツで配信し、2に関しては約1ヶ月以上開封をしてくれていない層になるので、興味を引くために内容を変えたものを送ってみるようにします。
一連の流れの概略図としては以下のようになります。

b.メールをよく開く時間帯を使う
次に紹介するのは、メールを開封した時間帯についてデータを集計し、配信に利用する方法です。
ユーザによって、メールを開くタイミングは様々です。基本的に最も多いと言われているのが、メールを配信して1時間以内に開封する層ですが、それ以外では各々のメールを確認するタイミングでメールを開封しやすいです。
もし、データビューに十分な開封履歴が蓄積されていれば、ユーザが最も多くメールを開封している時間帯がある程度、配信に活かすことが十分に信頼された状態で特定することができます。
今回はその方法と、作成したデータを使用した配信例について紹介します。
ユーザ毎の開封している時間帯ですが、今回は簡略化するために以下の時間帯で定義しました。(ここは、状況に応じて適切に調整してください)
定義 | 時間帯/th> |
---|---|
朝 | 6時~9時 |
午前 | 9時~12時 |
午後 | 12時~15時 |
夕方 | 15時~18時 |
夜 | 18時~21時 |
深夜 | 21時~24時 |
まずは、各時間帯の開封数をユーザ毎に算出します。
SELECT
SubscriberKey,
OpenTimes,
COUNT(*) AS OpenNum
FROM
(
SELECT
SubscriberKey,
CASE
WHEN DATEPART(hour,EventDate) >5 and DATEPART(hour,EventDate) <9 THEN '朝'
WHEN DATEPART(hour,EventDate) >8 and DATEPART(hour,EventDate) <12 THEN '午前'
WHEN DATEPART(hour,EventDate) >11 and DATEPART(hour,EventDate) <15 THEN '午後'
WHEN DATEPART(hour,EventDate) >14 and DATEPART(hour,EventDate) <18 THEN '夕方'
WHEN DATEPART(hour,EventDate) >17 and DATEPART(hour,EventDate) <21 THEN '夜'
WHEN DATEPART(hour,EventDate) >20 and DATEPART(hour,EventDate) <24 THEN '深夜'
ELSE 'その他'
END AS OpenTimes
FROM
_Open
WHERE
JobID = [対象の送信のジョブID]
) AS a
GROUP BY
SubscriberKey,
OpenTimes
上記のSQLでの出力結果は以下のようになります。
SubscriberKey | OpenTimes | OpenNum |
---|---|---|
c001 | 朝 | 8 |
c001 | 午前中 | 13 |
c001 | 夕方 | 4 |
ここから、更にユーザ毎に最も開封されている時間帯を算出します。最終的なSQLは以下になります。
(順位付けのために重複を除外してSQLを簡略化するためにROW_NUMBER()関数を使用しています。同率1位が複数出てきた場合の処理をもう少し複雑にしたい場合は、適時修正してください)
SELECT
SubscriberKey,
OpenTimes AS MostOpenTimes
FROM
(
SELECT
SubscriberKey,
OpenTimes,
OpenNum,
ROW_NUMBER() OVER (PARTITION BY SubscriberKey ORDER BY OpenNum DESC) AS Rank
FROM
(
SELECT
SubscriberKey,
OpenTimes,
COUNT(*) AS OpenNum
FROM
(
SELECT
SubscriberKey,
CASE
WHEN DATEPART(hour,EventDate) >5 and DATEPART(hour,EventDate) <9 THEN '朝'
WHEN DATEPART(hour,EventDate) >8 and DATEPART(hour,EventDate) <12 THEN '午前'
WHEN DATEPART(hour,EventDate) >11 and DATEPART(hour,EventDate) <15 THEN '午後'
WHEN DATEPART(hour,EventDate) >14 and DATEPART(hour,EventDate) <18 THEN '夕方'
WHEN DATEPART(hour,EventDate) >17 and DATEPART(hour,EventDate) <21 THEN '夜'
WHEN DATEPART(hour,EventDate) >20 and DATEPART(hour,EventDate) <24 THEN '深夜'
ELSE 'その他'
END AS OpenTimes
FROM
_Open
WHERE
JobID = [対象の送信のジョブID]
) AS a
GROUP BY
SubscriberKey,
OpenTimes
) AS b
) AS c
WHERE
Rank = 1
上記のSQLでの出力結果は以下のようになります。
SubscriberKey | MostOpenTimes |
---|---|
c001 | 朝 |
c002 | 夕方 |
c003 | 夜 |
次に、作成したData Extensionを使って「MostOpenTimes」の値別にパーソナライズ配信をする方法について説明します。
a)最後に開封してからの期間と同様に、Automation Studio+Journey Builderを使用した方法について紹介しようと思います。
実装の流れとしては、例えば以下のような物が考えられます。
Automation StudioのSQLアクティビティで上記のSQLを実行、MostOpenTimesが付与されたData Extensionを作成
Journey Builderでは↑のData Extensionをエントリーソースにし、以下の条件で判断分岐させます。
判断分岐後には、それぞれの属性の時間帯に配信されるように待機アクティビティを設定します。
例えばエントリー時点でのスケジュールを8時に設定した場合は各待機時間に3時間毎に増やした待機アクティビティを設定します。
一連の流れの概略図としては以下のようになります。

さいごに
今回は、Salesforce Marketing Cloud で開封ログを使用したパーソナライズ配信について紹介しました。
今回のようなパーソナライズ配信は、データビューにある程度開封ログが蓄積されていれば、始めることができるのでパーソナライズ配信の取っ掛かりとして行ってみても良いのではないでしょうか。
※iOS15では、iOS標準のメールアプリを使用している読者の開封情報が分からなくなる仕様をとっています。
なので、今回の手法は一部のユーザにとっては参考値になる可能性があるので、考慮した上で参考にしてもらえればと思います。
トライコーンでは、グループ企業である株式会社セプテーニ(※)と共に、Salesforce Marketing Cloudの 導入支援・活用支援サービスを提供しております。 デジタル広告代理店として、ウェブマーケティングや運用型広告で20年以上の実績をもつセプテーニと、25年以上にわたるCRM・Webマーケティング支援活動で培ったトライコーンのノウハウを基に、顧客獲得から優良顧客への育成・維持まで、広範囲にわたりお客様のビジネスの成功を支援いたします。
※株式会社セプテーニは株式会社セールスフォース・ジャパンの Salesforce Marketing Cloud コンサルティングパートナーの認定企業です。 ※「Salesforce」「Salesforce Marketing Cloud」「Marketing Cloud Engagement」「Marketing Cloud Account Engagement」「Marketing Cloud Personalization」「Marketing Cloud Customer Data Platform」「Marketing Cloud Intelligence」は、Salesforce.com Inc.の登録商標です。