加工したデータをメールに挿入できる「メールスクリプトトークン」とは?
Adobe Marketo Engage コンサルタントの棟です。Adobe Marketo Engageには「トークン」と呼ばれる変数が用意されているのをご存知でしょうか?MAで作成したメールやランディングページに顧客データや任意に定義した値を出力させることができます。
通常、トークン(リード情報を出力できるリードトークンなど)ではデータベース内にある顧客データの値をそのまま出力することはできますが、その値を計算したり加工したりすることができません。例えば、契約更新日のデータを持っているとして、その更新日情報に基づき「あと◯日で更新期限です。」といったメッセージを掲載したい場合などです。
この例のような内容を実現するために、Adobe Marketo Engageにはデータを加工した値を挿入できる「メールスクリプトトークン」という機能があります。
今回はこの「メールスクリプトトークン」についてご説明します。
もくじ
- メールスクリプトトークンとは
- メールスクリプトトークンの作成方法
- スクリプトトークンのメールへの設置とテスト
- スクリプト仕様
- ユースケースとスクリプト例
- 最後に
はじめに、Adobe Marketo Engageのトークン機能について知りたい方は、こちらを参照ください。
トークンの出力イメージ
メールスクリプトトークンとは
メールスクリプトトークンを使うことで、以下のようなことが実現できます。
- 各種オブジェクトのデータを計算処理してメールに出力
- Adobe Marketo Engageカスタムオブジェクトや商談オブジェクトなど、リードオブジェクトや企業オブジェクト以外のデータをメールに出力(リードに対して1:Nで保持するデータも一覧出力可)
ただし、「メールスクリプト」という名前の通り、メールでのみ使用できるトークンです。(ランディングページやスマートキャンペーンなどでは使用不可)
記述する言語は、Apache Velocityというスクリプト言語がベースで、if/else、for、foreachなど、標準的なロジックが備わっています。
スクリプト例)正しい敬称で名前を出力
Genderフィールドが「男性」の場合に「Dear Mr.○○」、「女性」の場合に「Dear Ms.○○」、それ以外は「Dear ○○」と出力
#if(${lead.Gender} == "男性")
#set($greeting = "Dear Mr. ${lead.LastName},")
#elseif(${lead.Gender} == "女性")
#set($greeting = "Dear Ms. ${lead.LastName},")
##それ以外の場合
#else
#set($greeting = "Dear ${lead.FirstName},")
#end
##敬称付きの名前を出力
${greeting}
メールスクリプトトークンの作成方法
メールスクリプトトークンは「マイトークン」で設定します。
マイトークンは、「マーケティング活動」内のマーケティングフォルダまたはプログラムで設定することができます。
注意点として、マイトークンをメールやランディングページで使用するには、トークンを設定したプログラムやフォルダ配下に存在している必要があります。
※マイトークンについてはこちらを参照ください。
メールスクリプトトークンを作成するには、フォルダまたはプログラムに移動し、[マイトークン]タブを選択します。右側のメニューから、「メールスクリプト」オプションをトークンリストにドラッグします。
「クリックして編集」をクリックすると、エディタを開くことができます。
なお、トークン名は半角のみ指定可能です(以下の図ではfavorite_listがトークン名になります)。
エディタを開くと、右側に利用可能なオブジェクト項目が一覧されています。スクリプトで利用するには、右側のツリーにチェックがついている必要があります。
また、右側のツリーからスクリプトにドラッグすると、該当するトークンが挿入されます(自動的にチェックもつきます)。
スクリプトトークンのメールへの設置とテスト
マイトークンを定義したら、メールエディタを使ってトークンを設置します(以下の図ではmy.EventListが差し込まれたトークンです)。
スクリプトは、メールアセットの「サンプル送信」でテストできます。また、スクリプトを正しく処理するためには、「顧客」の値にデータベース内に存在するリードのメールアドレスを選択する必要があります(その方に送るわけではありません)。
また、メールプレビューを使ってスクリプトをテストすることもできます。そのためには、[表示形式]を選択する必要があります。[リード詳細]を選択し、利用可能な静的リストからリードを選択します。これには、スクリプトの実行中に発生した可能性のある例外が出力されるという利点もあります。
スクリプト仕様
詳しくはデベロッパーサイト(英語)を参考にしていただければと思いますが、今回はポイントだけ掻い摘んでお話します。
変数
変数には常に「$」という接頭辞が付き、「#set」で設定および更新します。
変数のあとに文字列を表示させたい場合は、変数を{ }で囲む必要があります。
変数指定例:変数「$greeting」に「おはよう」を設定
#set($greeting = "おはよう")
上記変数が設定されていた場合の、呼び出しと出力値の関係
呼び出し例①
$greeting
出力値は「おはよう」となります。
呼び出し例②
$greetingございます
出力値は「$greetingございます」となります。 ※スペースが区切られていないため、そのまま表示されてしまいます。
呼び出し例③
${variable}ございます
出力値は「おはようございます」となります。
※{ }をつけることで変数値と文字列が区別され、連結されて表示されます。
呼び出し例②のように、未定義の変数を指定すると変数名がそのまま出力されてしまうのを避けるには、$の後に「!」を記述します。
#set($foo = "bar")
$foo ##出力値→"bar"
$baz ##出力値→"$baz" ※setされていないので、変数名が表示される
$!baz ##なにも出力されない
その他の情報はApach User Guideをご参照ください。
Velocity Tools
その他、Velocity Toolsで定義されているメソッドを利用することもできます。
- AlternatorTool
- ComparisonDateTool
- ConversionTool
- DateTool
- DisplayTool
- MathTool
- NumberTool
- EscapeTool
- LoopTool
URLを設定する際の注意点
- メールスクリプトでURL設定する場合は、変数にはプロトコル (http:// または https://) を含めてはいけません。また、トークンとして出力する際はアンカー(<a>)タグを含めて出力する必要があります。また、リンクが for や foreach のループの中で出力された場合、リンクはトラッキングリンクには変換されません。
<!-- Correct -->
#set($url = "www.example.com/${object.id}")
<a href="<http://$>{url}">Link Text</a>
<!-- Correct -->
<a href="<http://www.example.com/${object.id}>">Link Text</a>
<!-- Incorrect -->
<a href="${url}">Link Text</a>
<!-- Incorrect -->
<a href="{{my.link}}">Link Text</a>
<!-- Incorrect -->
<a href="http://{{my.link}}">Link Text</a>
その他注意事項
- 1つのメールに含まれるメールスクリプトトークンの合計の長さは、100,000バイトが上限です。トークン文字列自体の長さの合計であり、出力された文字列の合計ではありません。
- 1つのメールに複数のメールスクリプトを含めると、上から下へと実行されます。最初に実行されたスクリプトで定義された変数のスコープは、後続のスクリプトでも利用できます。
ユースケースとスクリプト例
いくつかユースケースとスクリプトの例を挙げます。
例)お気に入りオブジェクト(カスタムオブジェクト)のデータから、各種データをループで出力
foreachで、該当リードのお気に入りオブジェクト(favorite_cList)のデータをリスト化。「favoriteID」の降順でソートし「favoriteDate」をyyyy-MM-ddの形式に変更もしています。
<table border="1">
<tr>
<th>お気に入りID</th><th>お気に入り商品名</th><th>お気に入り登録日</th>
</tr>
#foreach($favorite in $sorter.sort($favorite_cList, ["favoriteID:desc"]))
#set($favoriteDate = $convert.parseDate($favorite.favoriteDate,"yyyy-MM-dd"))
<tr>
<td>$favorite.$favoriteID</td>
<td>$favorite.$favoriteName</td>
<td>$favorite.$favoriteDate</td>
</tr>
#end
</table>
例)日時型を日本時間に修正
データとして格納している値はUS時間となっているので、まずUS時間を元にyyyy-MM-dd HH:mmの形式に直し、それを日本時間に変換をしています。
#set( $inTimeZone = $date.getTimeZone().getTimeZone('America/Chicago') )
#set( $outTimeZone = $date.getTimeZone().getTimeZone('Asia/Tokyo') )
#set( $locale = $date.getLocale() )
#set( $myDate = $convert.parseDate($lead.registrationDatetime,'yyyy-MM-dd HH:mm',$locale,$inTimeZone) )
${date.format('yyyy-MM-dd HH:mm',$myDate,$locale,$outTimeZone)}
例)年月日表記にする
前述同様に変換をして、年月日を分けて出力しています。
#set( $inTimeZone = $date.getTimeZone().getTimeZone('America/Chicago') )
#set( $outTimeZone = $date.getTimeZone().getTimeZone('Asia/Tokyo') )
#set( $locale = $date.getLocale() )
#set( $myDate = $convert.parseDate($lead.Acquisition_Date,'yyyy-MM-dd HH:mm',$locale,$inTimeZone) )
${date.format('yyyy',$myDate,$locale,$outTimeZone)}年${date.format('MM',$myDate,$locale,$outTimeZone)}月${date.format('dd',$myDate,$locale,$outTimeZone)}日
例)あと何日
LatestLessonTaughtDateの値をyyyy-MM-ddの形式に変換し、今日の日付との差分を出力します。
#set($lastLessonDate = $convert.parseDate(${lead.LatestLessonTaughtDate}, "yyyy-MM-dd"))
$date.whenIs($lastLessonDate, $date.getCalendar()).days
例)数値型でカンマ区切り
$number.integer($company.revenue)
その他の例はこちらにも載っていますので、参考にしてみてください。
最後に
少しテクニカルな話になってしまいましたが、最後までお読みいただくとなんとなくできることは理解いただけたのではないでしょうか。
今あるデータを活用し、より高度な1to1のメッセージを送ってみてはいかがでしょうか。
ぜひチャレンジしてみてください。
MA導入をご検討中の方は、お問合せよりお気軽にご連絡ください。
https://main--bacom-blog--adobecom.hlx.live/jp/blog/fragments/page-contact-us-consulting-services-dx
https://main--bacom-blog--adobecom.hlx.live/jp/blog/fragments/offer-003287-product-marketo-engage-jp