本日もメール配信サービス「ワイメール」の公式コラムをご覧いただきありがとうございます。
前回と前々回にご紹介した、新機能「シナリオ分岐」につきまして、リリース後、さまざまなご感想やさらなるご希望をいただきまして、誠にありがとうございます。
今回このシナリオ分岐機能の追加により、以前のように配信時期に関するフィルタリングを気にすることなく、ストーリーの分岐条件と分岐時期が直感的にわかりやすくなり、各シナリオの作成に注力しやすくなっています。
さらにこのシナリオ分岐は、APIと連動させることで、さらに細やかなトリガー設定が可能となります。
もし、ワイメールを利用して以下のようなことを達成したければ、ぜひ本コラムに目を通していただければ幸いです。
- 一定期間のうちに自社WEBサイトの特定のページへアクセスした読者に対して、専用のシナリオを配信したい
- 自社システムで提供するアンケートに答えてくれた人に対して、専用のシナリオを配信したい
目次
特定ページへのアクセス情報を基にシナリオを分岐
今回のコラムは多少専門的な内容となっておりますので、マーケティングご担当者様に置かれましては、どのような動作をさせたいかを明確にしたうえで、システム担当者様にも必要に応じて展開、共有していただければ幸いです。
ここでは例として、以下のような状況を想定します。
- 読者に対して3日程度、共通のシナリオを配信し、特定ページへ誘導
- 約1週間後、特定ページへのアクセスがあった場合、それを基にシナリオ分岐
- アクセスがなかった読者に対しては、引き続き共通のシナリオを配信
属性または自由項目の作成
まず、分岐の条件となる基の情報を作成します。
今回は固定項目の内容では分岐できないので、「属性設定」で「特定ページへアクセス有り」という属性を新規に作成し、この属性が付与されている読者を分岐対象とします。
この属性は、あくまで分岐対象かどうかを区別するものなので、属性ではなく、自由項目を使って作成していただいても構いません。
デフォルトシナリオの準備
3日程度配信する共通のシナリオを準備します。
特にシナリオを指定しないければ、「デフォルト」シナリオとして認識されますので、通常のステップメールを3日分準備すればOKです。
このステップメールの中で、誘導したい特定のページのURLの末尾に、「?id=’メルマガID’&email=%%EMAIL%%」と記述します。
なおクリック測定を有効にする場合、このURLは測定を除外してください。測定を有効にしてしまうと、システムの仕様でクリック測定用URLに自動変換され、読者個別のメールアドレス情報が取得できなくなってしまいます。
分岐を作成する
特定ページアクセス者用のシナリオへ分岐するための、分岐ポイントを作成します。
3日間共通のシナリオを配信した後、猶予期間として約1週間あけ、10日目に分岐を実行するものとします。
分岐条件は、作成しておいた属性「特定ページへアクセス有り」を指定します。
また必要に応じて、分岐条件に合致しなかった読者用のストーリーも準備します。
分岐の役割や各条件の詳細につきましては、マニュアルや以下の記事をご参照ください。
なお、当コラムを書いている時点で最新版のワイメール(Ver2.31)は、すでに分岐が存在する日に、ストーリーまたは他の分岐を設定できないよう制限されています。
これは、ストーリー配信と分岐のタイミングが近すぎることにより、分岐の条件が満たされにくなることを避けるためと、分岐直後に分岐先のストーリー配信が、分岐前のタイミングに来てしまうの防ぐためです。
ただし分岐のみであれば、同日に複数設定しても理論上差し支えないため、現在鋭意システムの改良を行っているところです。
恐れ入りますが、今後のバージョンアップをお待ちいただければと思います。
特定ページアクセス者用のストーリーを作成する
特定ページへアクセスした読者に対して配信するストーリーを作成します。
これでシナリオの準備ができました。
APIを利用してワイメールの読者情報を更新する
特定ページにアクセスがあった際に、アクセス時のパラメタ情報(メルマガIDとメールアドレス)を取得し、APIを利用してワイメールの読者情報に反映させます。
APIの利用方法は、マニュアル、リファレンス、以下の記事などをご参照ください。
ここでは、アクセスした読者に対して「特定ページへアクセス有り」という属性を追加するので、結果的にJavascriptを用いた場合のAPI実行コードは以下のようになります。
なお実行する場合は、必ず外部公開していないローカルマシン上か、サーバーサイドであればnode.js上などのJavascript実行環境に配置し、第三者がコードを認識できないように注意してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
// 定数定義 let url = new URL(window.location.href); let params = url.searchParams; // パラメタ取得 var data = { "apikeyid" : "1234567890abcdef", // クレデンシャルのAPI Key ID "secret_key" : "********", // クレデンシャル作成時に生成されたシークレットキー "api_fqdn" : 'my-ymail.com', // ワイメールで利用しているドメイン名 "id" : params.get('id'), // 目的のメルマガID "email" : params.get('email'), // 目的の読者のメールアドレス "attri" : "特定ページへアクセス有り", // 付与したい属性 }; // 読者情報の取得 const ymlget_result = await this.ymlGetUser(data); if(ymlget_result == 'ok'){ try { console.log('読者情報の取得が完了しました。'); // 読者情報の更新 const ymlupdate_result = await this.ymlUpdateUser(data); if(ymlupdate_result == 'ok'){ try { console.log('読者情報の更新が完了しました。'); } catch(err){ console.log('読者情報の更新時にエラーが発生しました。'); } } else{ console.log('読者情報の更新に失敗しました。'); } } catch(err){ console.log('読者情報の取得時にエラーが発生しました。'); } } else{ console.log('読者情報の取得に失敗しました。'); } async function ymlGetUser(data){ let result; const method = 'POST'; // エンドポイント let api_url = 'https://' + data.api_fqdn + '/api/rest/v1/get-user/'; // パラメタ作成 var array={ "apikeyid" : data.apikeyid, "id" : data.id, "email" : data.email, }; // 署名作成 let query_word = ''; for (let [key, value] of Object.entries(array)) { query_word += '&' + key + '=' + encodeURIComponent(value); } query_word = query_word.slice(1); let sign_word = method + "\n" + data.api_fqdn + "\n" + '/api/rest/v1/get-user/' + "\n" + query_word; const crypto = require('crypto'); let b64 = crypto.createHmac('sha256', data.secret_key).update(sign_word).digest('base64'); let e_b64 = encodeURIComponent(b64); // API呼び出し var params = new URLSearchParams(); for (key in array){ params.append(key, array[key]); } params.append('signature', e_b64); const axios = require("axios").default; try { let response = await axios.post(api_url, params.toString(),{ headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }); // 成功した場合 if(response.data && !response.data.errors){ // ユーザのハッシュを返却 const uid = Object.getOwnPropertyNames(response.data.data)[0]; result = uid; } // 失敗した場合 else{ result = 'ng'; } } catch (err) { result = 'ng'; }; # 結果返却 return result; } async function ymlUpdateUser(data){ let result; const method = 'POST'; let api_url = 'https://' + data.api_fqdn + '/api/rest/v1/update-user/'; var array = { "apikeyid" : data.apikey_id, "id" : data.id, "hash" : data.hash, "attri_1" : data.attri, }; // 署名作成 let query_word = ''; for (let [key, value] of Object.entries(array)) { query_word += '&' + key + '=' + encodeURIComponent(value); } query_word = query_word.slice(1); let sign_word = method + "\n" + data.api_fqdn + "\n" + '/api/rest/v1/update-user/' + "\n" + query_word; const crypto = require('crypto'); let b64 = crypto.createHmac('sha256', data.secret_key).update(sign_word).digest('base64'); let e_b64 = encodeURIComponent(b64); // API呼び出し var params = new URLSearchParams(); for (key in array){ params.append(key, array[key]); } params.append('signature', e_b64); const axios = require("axios").default; try { let response = await axios.post(api_url, params.toString(),{ headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' } }); // 成功した場合 if(response.data && !response.data.errors){ result = 'ok'; } // 失敗した場合 else{ result = 'ng'; } } catch (err) { result = 'ng'; }; return result; } |
※変数名はあくまで例です。お客様のシステムに合わせて適宜修正してください。
アンケート回答によるトリガー
2つ目の例で挙げた、「自社システムで提供するアンケートに答えてくれた人に対して、専用のシナリオを配信したい」場合も、以上とおおむね同様の手順で設定が可能です。
上記で紹介した手順において、
- 特定ページアクセス時にAPI実行 → アンケート回答完了時にAPI実行
- アクセスがあったことを区別する情報(属性)→ アンケート回答情報(読者に追加する情報、例えば性別など)
となるように設定を整えていただくことで、同様にシナリオ分岐が可能です。
自社システム内の開発はサポート対象外となりますが、現在はオープンソースでも使いやすいアンケートシステムが数多く提供されています。
本コラムでの紹介は割愛しますが、ぜひ使いやすいアンケートシステムを導入してみてください。
ただし、API連携をするため、利用者側でAPIを実行できる機構・条件(アクセス時のパラメタ・読者が回答したパラメタを操作できる、サンクスページへのアクセスでAPIプログラムを起動できる、など)を満たしていることが必要ですので、ご注意ください。
その他の方法
読者の追加情報を基に、配信するストーリーグループを区別する方法には、今回のシナリオ分岐を使った方法の他に、「読者自動移行」機能により区別する方法があります。
読者自動移行機能は、シナリオの最終ストーリーまで配信し終えた読者を、翌日以降に他のメルマガへ自動的に移行する機能です。
移行先のメルマガは、移行元のメルマガとは切り離された独立したメルマガで、読者も移行元の読者とは別読者として扱われます。
読者自動移行の詳細なルールや設定方法については、マニュアルをご参照ください。
読者自動移行機能を利用した場合、メルマガをもう一つ管理する手間が増えるというデメリットがありますが、役目を終えたステップメールから読者を全員退避させて、新しいコンテンツを提供した場合などには管理が直感的になるといったメリットがあります。
状況に応じて使い分けていただければと思います。
最後に
今回は、シナリオ分岐の応用として、APIを併用した例を紹介いたしました。
少しマニアックな話になってしまいましたが、今後もご利用者様の声を積極的に取り入れ、価値あるサービスとして改良を重ねてまいります。
今後もワイメールをよろしくお願いいたします。
免責事項
本コラムで紹介したコードの動作保証は行っておりません。
当コラムの内容は、コラム執筆時点での内容です。今後のバージョンアップ等により、仕様やインターフェイスが変更になる場合がございます。