ステップメール配信ができるまで

このエントリーをはてなブックマークに追加
はじめまして。開発チームのmegumiです。
vim の投稿が続きましたが、今回は全然違う話にしようと思います。
ちなみに、私は1画面分くらいのスクリプトはvimで、製品コードはEclipse+Perlプラグインを使って書いています。


さて、今回はSHANON MARKETING PLATFORMのステップメール配信機能を作ったとき(1年ほど前)に何を考えていたか、たどってみました。
弊社の開発スタイルや、メンバーが仕様策定にどの程度関わっているか、といったことが伝わるといいなと思っています。

新機能を作るときに、カッチリと仕様が決まっていることは、まずありません。仕様を作るところからが仕事です。
お客様の要望や今後の製品計画などを元に、どういう機能が欲しいか、ということがざっくりと我々に伝えられます。

そこから、どのような画面にしたらいいか、どのような挙動になるべきなのか、現在ある機能をどう拡張するか、要望以外の機能で必要になるものは何か、といった具体的な内容は、開発チームとQAチームで考えながら進めていきます。そして要望からズレていないかを要所要所でチェックするのです。

■ 新しく実現すべき点はどこか?

ステップメール配信をしたい、という要望の中には、
  • 資料請求をした直後と1週間後と1ヶ月後にメールが自動的に送られるようにしたい
  • ある項目が編集されたら、その直後にメールが自動的に送られるようにしたい
  • ある項目に日付が入っていたら、その日付の1週間前にメールが自動的に送られるようにしたい
  • 休暇期間中など、自動的にメールを送ってほしくない期間があるので設定したい
といったことが例として挙げられていました。(逆に言うと、このような機能を持つものを弊社ではステップメール配信と呼ぶ、ということですね)

当時その時点の機能で、リードを検索して送信対象を絞り込むことは可能でした。
また、メールの配信日時を予約しておくことも可能でした。(以下、予約配信と書きます)

この機能を作る上で新しく必要になることは何か?というと、配信日時がリードによって異なるという点です。
その配信日時を自動的に計算することが、今までとの大きな違いなのです。

上に挙げた要望から、何らかの行動を起点とし、そこからの時間幅を計算することで、配信日時を決めることができるだろうとわかります。

□ 起点のパターン

「何らかの行動」にもいくつかパターンがあって、「資料請求をした」「ある項目が編集された」といった操作が完了した時点を表すものと、「ある項目に日付が入っていたら」というように起点を予め指定してあるものに分けられます。

さらに、「資料請求をした」と「ある項目が編集された」も粒度が違います。「ある項目が編集された」を起点として考えると、複数の項目を編集した場合は複数のメールにするべきなのか?一度編集してからすぐ編集しなおした場合はどうするべきか?など、まだまだ考えることがたくさんあります。

こうして起点のパターンを見ていくと、以下のように分けられました。
  • A. 明確な起点となり得るもの (「資料請求をした」)
  • B. ある程度のまとまりとして扱ったほうがいいかもしれないもの (「ある項目が編集された」)
  • C. 起点日時を予告するもの (「ある項目に日付が入っていたら」)

そしてどうやって実装するかを考えると、Aについては、その処理にフックして起点日時を得ることができます。
B についても、同様に処理にフックして起点日時を得ることはできますが、メールを送り過ぎないようにうまく処理する必要がありそうです。
C については、起点とする項目が指定された時点で、起点日時として設定されているデータを取りに行く必要があります。また、データの変更に追随していかなければなりません。そのため、定期的にデータを確認しにいく必要があります。
(現在リリースされているステップメール機能はAパターンの「申込」にのみ対応しています)

□ 時間幅の指定方法

起点日時が決まったとして、そこからの時間幅をどう設定すればいいのか?を考えます。
要望には「直後と1週間後と1ヶ月後に」「1週間前に」といったことが挙げられていました。

起点より前にメールを送りたいのか、起点より後にメールを送りたいのか、の前後の方向を指定してもらう必要があります。
そしてこれは、操作が完了した時点を起点とするもの(「資料請求をした」「ある項目が編集された」)については、起点より「後」だけ可能です。

次に、「直後」「1週間」「1ヵ月」といった幅の指定方法について考えます。
既存の予約配信では日付と時刻を別々に指定するため、この方法が利用者にとって理解しやすいだろうと思われます。
しかし予約配信とは違って日付と時刻の他に前後の方向があるため、「1日間後の9時(明日の9時)」「1日と9時間後(33時間後)」と二通りの解釈があり得るのです。こちらについては、感覚的にわかりやすい「1日間後の9時(明日の9時)」を採用することになりました。
また「直後」については日付と時刻での指定はできないので、別途「即時」という選択肢を用意しました。

※ 現在リリースされているものでは、起点としてAパターンの「申込」にのみ対応しているため、ユーザーインタフェースでは「○日後の○時」というように日時のみ指定するようになっています。前後の指定はありません。

■ 送信判定

ここまでで、配信日時を決めることができるようになりました。
既存の予約配信の機能に、配信日時を決める機能を足す、というのが大まかな方針です。

さて、メールを実際に送信するときの流れについて考えます。
配信日時が決まるのは起点が定まったときなので、そこから実際にメールが配信されるまでには時間があります。

その間に、起点となった行動が取り消されるかもしれません。例えば、セミナーへ申し込んだ人が、後でキャンセルすることもあります。このとき、それでもメールを送りたいのか、キャンセルした人には送りたくないのか、それはメールの内容によるでしょう。
そのため、一律に、起点を取り消すアクションがあったときは配信予定から取り消す、といった処理を入れることはできません。

予約配信の機能と同様に、検索条件を指定して送信対象を絞ることはできます。そのため、メールを送りたい人の条件をきちんと設定してもらい、配信日時になったら検索条件による最終チェックを行い、実際に送信するかどうかを判断するのです。
こうすることで、最新の状態で送信するかどうかを判断することができますし、配信予定から取り消すといった処理が不要になるため流れはシンプルです。

□ 送信を一時停止したい

まだ「自動的にメールを送ってほしくない期間」という要望について触れていませんでした。
これについても、送信判定のときにステータスが「配信停止中」であれば、メールを送らないようにしました。理由は同じく、いつ設定が「配信停止中」に変更されるかわからないので、実際に送信するタイミングで判断すべきだからです。

この「配信停止中」の設定の仕方についても、いくつか方法が考えられました。
  • カレンダーの祝日・営業日で判断する
  • 日付の範囲を指定する
  • 手動で切り替える
まず、カレンダーを利用する方法は、利用者によって営業日が異なるので却下です。次に日付範囲を指定する方法ですが、配信を停止するときの理由としては、年末年始の一斉休暇や、メール文面の変更など様々なことが考えられます。計画的に期間を決められるとも限らないので、柔軟な方法ということで手動で切り替えられるようにしています。
複数の方法があるほうが良いのかもしれませんが、同時にシンプルに設定できなければならないので、難しいところです。

□ 送信を再開したら?

さらに、「配信停止中」に配信日時を迎えたメールについては、配信を再開したときに自動的に送信するべきか?ということも考えなければならないポイントでした。再開したのだから溜まっていた分も送りたいという場合と、もう時期を逸したから送りたくないという場合があるでしょう。メール文面を変えてから送りたいという場合もあるかもしれません。

やはり利用者によって様々なパターンがあることが考えられたので、一律の対応は難しく、誰に送らなかったのかを記録に残すようにし、担当の方がその一覧を見ることで対応することができるようにしておこう、ということになりました。

■ 同時進行での開発

(いろいろ省略はしていますが) このように実現のために複数の方法があることは多々あります。様々なお客様がいらっしゃるので、一律に動作を決めることも難しく、かといって、設定すべき項目が増えてしまうのもミスを増やしてしまいます。
QAチームには、他の機能との整合性といった点での意見を多くもらいます。その中でどの手段を取るかが決まっていくことも多々あります。

仕様を考えながら、実装の複雑さや実現可能性を見ながら、技術部以外の利用者目線での意見を聞きながら、というようなスタイルで開発を進めています。
上にはなるべく整理して書きましたが、考える順番は上からではありませんし、1ヶ月単位のスクラムなので月が変わって要望の優先順位が変わったりします。開発したもの全てがリリースまでたどり着くわけでもありません。

ただ、決められたものを作るよりは、試行錯誤して考えながら作るほうが楽しいので、そういうスタイルを紹介してみました。

# 絵がなくてスミマセン



次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...