年40万円のメール配信ツールを、
listmonkで年2万円弱に置き換えた方法

支援先の会社で、メルマガの配信ツールに年40万円かかっていました。営業管理の機能まで入った製品なのですが、使っていたのはメールの一斉配信だけです。
そこで、listmonk(リストモンク)という無料の配信ソフトと、AmazonのメールサービスであるSESを組み合わせた構成に乗り換えました。サーバー代を入れても年2万円弱で、配信の作業も以前より楽になっています。
この記事では、乗り換えの手順と費用、やってみてわかった注意点をまとめます。
listmonkとは
listmonkは、メールの一斉配信と購読者の管理をするためのソフトです。オープンソースなので利用料はかかりません。そのかわり、自分でサーバーを借りて設置する必要があります。
管理画面はブラウザで開きます。名簿の取り込み、配信の作成と予約、開封やクリックの確認といった操作は、一般的な配信ツールとほとんど変わりません。
ひとつ押さえておきたいのは、listmonk自体はメールを送る機能を持たないことです。実際の送信は外部のメールサービスに任せる作りになっていて、今回はAmazon SESを選びました。料金が安く、届かなかった宛先の情報も受け取れるためです。
なぜ年40万円かかっていたのか
まず、実際に月何通送っているのかを調べました。週3本を約8,000人に送っている前提で、月10万通近いと見積もっていたのですが、配信履歴を数えてみると月4万通ほどでした。配信のない週や、一部の人にしか送らない回があったためです。
年40万円を年間の48万通で割ると、1,000通あたり約830円。一方、SESの料金は1,000通あたり0.10ドル、1ドル150円で計算すると15円です。50倍以上の差がありました。
差が出た理由は、旧ツールの料金が使える機能の範囲と登録している連絡先の数で決まるためです。配信機能しか使っていなくても、製品全体の料金がかかります。
乗り換え先をどう選んだか
候補は次の3つでした。
- 国内のメール配信サービス(年5万〜11万円)。サポートがあり、運用の手間はいちばん少ない
- Sendy(買い切り69ドル)。いま契約しているレンタルサーバーに設置できる
- listmonk(無料)。共有のレンタルサーバーでは動かないので、別にサーバーを借りる必要がある
当初はSendyにするつもりでした。サーバー代が追加でかからないからです。ただ、購入前に動作確認できると思っていたところ、確認用のファイルは購入後でないと入手できませんでした。
listmonkに決めたのは、公式サイトのデモを触って、思っていたより使いやすかったからです。名簿の管理、配信の予約、開封やクリックの確認といった基本的な操作は、一般的な配信ツールと変わりません。これなら担当者が替わっても引き継げると判断しました。
メール送信の仕組みを一から自作する案も検討しましたが、配信停止の受付や届かなかったアドレスの除外まで自分で作って保守するのは負担が大きく、見送りました。
乗り換え後の費用
| 以前 | 乗り換え後 | |
|---|---|---|
| ツールの利用料 | 年40万円 | 0円 |
| サーバー | なし | 年12,600円 |
| メールの送信 | 利用料に含む | 年7,200円 |
| 合計 | 年40万円 | 年19,800円 |
| 1,000通あたり | 約830円 | 約41円 |
サーバーはAmazon Lightsailのメモリ1GBのプラン(月7ドル)。送信料は月4万通ぶん。どちらも1ドル150円で計算。1,000通あたりは、合計を年間の配信数(48万通)で割って1,000倍した金額。
サーバーはAmazon Lightsailを使いました。SESと同じAWSのアカウントで契約でき、請求もまとめられます。メモリ1GBのプランを選びましたが、listmonkのメモリ使用量は30MB程度で、性能には余裕があります。
サーバー代を含めても1,000通あたり約41円。以前は約830円だったので、およそ20分の1になりました。
なお、構築中に送ったテストメールは十数通で、SESの料金は0.2円ほどでした。
乗り換えの手順
1. SESに送信元のドメインを登録する
DKIM、SPF、DMARCの3つをDNSに設定します。GmailやYahoo!メールは、一斉配信の送信元にこの3つを求めています。作業自体はすぐ終わりますが、DNSの反映に時間がかかります。
また、SESは最初、登録済みの宛先にしか送れない状態になっています。解除には申請と審査が必要なので、早めに申請しておくとスムーズです。
注意:SMTPの認証情報を作成する画面には「Mail Manager」という似た名前の選択肢があります。こちらは別料金のサービスです。
2. サーバーにlistmonkをインストールする
必要なのは、データベースのPostgreSQLとlistmonk本体です。listmonkは実行ファイル1つで動くので、インストール自体は難しくありません。自動起動と管理画面のHTTPS化まで含めて、半日ほどで終わりました。
3. 旧ツールからデータを書き出す
旧ツールの解約日が先に決まっていて、作業開始時点で残り19日。解約後は管理画面にログインできなくなるため、データの書き出しを最優先で進めました。
書き出したのは次の4つです。
- 購読者の名簿
- 配信停止を希望した人の一覧
- エラーで届かなかったアドレスの一覧
- 配信ごとの開封・クリックの実績
なお、書き出したCSVは文字コードがShift_JISで、そのまま開くと文字化けしました。変換すれば済む話ですが、期限のある作業だったので少し焦りました。
4. 除外リストを先に登録する
listmonkに名簿を取り込むときは、配信停止の人とエラーになったアドレスを先に除外リストとして登録します。そのあとで購読者を取り込めば、重複している人は自動的に配信対象から外れます。
注意:順番を逆にすると、除外すべき人が配信対象に残ってしまいます。
5. 少ない件数から配信を始める
実績のない送信元から一度に8,000通を送ると、受信側のメールサービスに迷惑メールと判定されやすくなります。そのため、最初の週は反応のよい1,000件、次の週は3,000件というように、段階的に件数を増やしました。残りの宛先には、その間も旧ツールから配信しています。解約までの19日間は、この移行期間としてぎりぎりの長さでした。
名簿の整理がいちばん重要だった
書き出したデータを見て驚いたのが、配信エラーの多さです。約8,700件に送って、毎回800件前後がエラー。割合にすると9%を超えます。7月は791件、9月は828件と、件数も少しずつ増えていました。内訳はドコモ、au、ソフトバンクのキャリアメールが多く、機種変更などで使われなくなったアドレスだと思われます。
旧ツールでは、エラーになる宛先が含まれていても配信を続けられました。しかしSESでは、エラーの割合が5%を超えるとアカウントが審査の対象になり、10%を超えると送信を停止されます。名簿をそのまま移して全件に送っていたら、最初の配信で止められていたはずです。
配信停止を希望していた人も1,000人以上いました。この人たちに新しいツールから送ってしまうと、特定電子メール法に違反します。ツールを変えたことは、受信者には関係がありません。
これらを除外した結果、配信対象は約8,700件から約7,900件になりました。
送信テストで見つかった問題
テスト送信したメールは、Gmailの受信トレイに問題なく届きました。メールのヘッダーを確認すると、SPF、DKIM、DMARCもすべてpassになっていました。
送信元アドレスに返信が届いていなかった
このテストで別の問題が見つかりました。送信元のアドレスに返信したところ、エラーで戻ってきたのです。調べてみると、そのアドレスには受信用のメールボックスが作られていませんでした。旧ツールを使っていたころから、読者がメルマガに返信しても誰にも届いていなかったことになります。
返信先(Reply-To)に、実際に確認しているアドレスを設定して解決しました。
送信元のアドレスに自分で返信してみるだけで確認できます。乗り換えの予定がなくても、一度試してみることをおすすめします。
自動除外の設定が半分しか動いていなかった
エラーになったアドレスを自動で除外する設定も、実際に動くかどうかを確認しておいたほうがよいです。SESには、配信エラーや迷惑メール報告をわざと返してくれるテスト用の宛先が用意されています。
ここに送ってみたところ、配信エラーは正しく処理されたのですが、迷惑メール報告のほうは処理されていませんでした。通知の設定を修正し、再度テストして、除外されることを確認しました。
listmonkの使い方
管理画面は英語ですが、覚える場所は多くありません。ふだん触っているのは、名簿・絞り込み・配信の3か所だけです。実際にどう操作しているかを書いておきます。
名簿を入れる
まず Lists でリストを作ります。「メルマガ」「資料請求」のように、送り分けたい単位で分けておきます。そのうえで Subscribers → Import からCSVを取り込みます。
listmonkの特徴は、メールアドレスと名前のほかに好きな項目を持たせられることです。CSVにattributes列を作り、JSONで書いておくと、購読者ごとの情報として保存されます。
email,name,attributes
taro@example.com,山田 太郎,"{""source"":""資料請求"",""seminar"":""参加済み""}"
CSVの中にJSONを書くときは、引用符を2つ重ねて書きます。
配信先を絞り込む
Subscribers の検索欄に条件式を書くと、その場で絞り込めます。書き方はSQLのWHERE句と同じで、さきほどの項目は attribs->>'項目名' で取り出します。
# 説明会に参加した人
subscribers.attribs->>'seminar' = '参加済み'
# 資料請求から来て、まだ契約していない人
subscribers.attribs->>'source' = '資料請求'
AND subscribers.attribs->>'status' != '契約済み'
絞り込んだ結果は、そのまま配信対象にできます。名簿を作り直さずに送り先を変えられるので、思いついた切り口をその場で試せます。
メールを作って送る
Campaigns → Create new を開くと、指定するのは次の4つです。
- 件名
- 送信元のアドレス
- 送り先のリスト
- テンプレート
本文の形式は、リッチテキスト・HTML・Markdown・プレーンテキストから選べます。
私たちはHTMLを選んでいます。AIに書かせたHTMLをそのまま貼れるからです。送信前に自分のアドレスだけへテスト送信でき、日時を指定した予約配信もできます。
管理画面を開かずに送る
Settings でAPIユーザーとトークンを作っておくと、配信をコマンドから実行できます。キャンペーンを作るのと、送り始めるのの2回です。
# 1. キャンペーンを作る(この時点では下書き)
curl -u "api_user:トークン" https://配信サーバー/api/campaigns \
-X POST -H 'Content-Type: application/json' \
--data-raw '{"name":"9月号","subject":"件名","lists":[1],
"type":"regular","content_type":"html",
"body":"<html>…</html>"}'
# 2. 配信を始める(1で返ってきたidを使う)
curl -u "api_user:トークン" https://配信サーバー/api/campaigns/12/status \
-X PUT -H 'Content-Type: application/json' \
--data-raw '{"status":"running"}'
すぐ送らずに予約したいときは、キャンペーンに配信日時を入れたうえで running を scheduled に変えます。
1人に1通だけ送る
ステップ配信に使っているのがこれです。テンプレートを1つ用意しておき、宛先とテンプレートのIDを渡すと、その人にだけメールが飛びます。
curl -u "api_user:トークン" https://配信サーバー/api/tx \
-X POST -H 'Content-Type: application/json' \
--data-raw '{"subscriber_email":"taro@example.com","template_id":2,
"content_type":"html","data":{"name":"山田 太郎"}}'
data に渡した値は、テンプレート側で {{ .Tx.Data.name }} と書けば差し込めます。あとは「資料請求から何日たった人に、何通目を送るか」を判定する処理を1日1回動かせば、ステップ配信になります。
トークンは管理画面と同じ権限を持ちます。配信サーバーのURLとあわせて、社外に出ない場所に置いてください。
乗り換えてよかったこと
費用以外にも、乗り換えてよかった点が3つあります。
配信先を細かく絞り込める
listmonkでは、購読者ごとに任意の項目を持たせられます。名簿を取り込むときに「資料請求をした」「説明会に参加した」「契約済み」といった情報を付けておけば、「説明会に参加したが、まだ契約していない人」だけに送るといった配信が簡単にできます。旧ツールでは、こうした絞り込みのたびに名簿を作り直していました。
管理画面をほとんど使わなくなった
listmonkにはAPIが用意されていて、メールの本文をHTMLで渡せば配信の予約まで行えます。いまはAIにHTMLメールを作ってもらい、内容を確認してから、そのままAPI経由で配信しています。
以前は配信のたびに、管理画面のエディタに文章を貼り付け、画像をアップロードし、表示の崩れを直していました。この作業がなくなり、作業時間はかなり短くなりました。
ステップ配信を始められた
資料請求後のステップ配信も始めました。日数をあけて、順番に送るメールです。
- 請求の翌日に、お礼と資料の要点
- 3日後に、よくある質問
- 1週間後に、説明会の案内
listmonkにステップ配信の機能はありませんが、特定の相手に1通だけ送るAPIがあります。「請求から何日たった人にどのメールを送るか」を判定する簡単なプログラムを用意すれば実現できます。このプログラムもAIに書いてもらいました。
配信を増やしても、かかる費用は1,000通あたり15円の送信料だけです。件名や配信先を変えたテストも気軽にできるようになり、思いついた施策をすぐに試せるようになりました。
費用を下げる目的で始めた乗り換えでしたが、いまはこうした運用面のメリットのほうが大きいと感じています。
向いていないケース
- 配信数が月に数千通程度。国内の配信サービスの安いプランで十分です。年間数万円の差のために、構築と運用の手間をかける必要はありません
- 問い合わせできるサポート窓口が必要。オープンソースのlistmonkに窓口はありません
サーバーの管理については、以前ほど大きな壁ではなくなりました。インストールもトラブルの原因調査も、AIに聞きながら進められます。今回もコマンドや、ステップ配信のプログラムはAIに書いてもらいました。専門の担当者がいないから無理、という話ではありません。
ただし、止まったときに誰かが気づいて手を動かす必要はあります。知識の有無よりも、その役割を決められるかどうかのほうが問題になりやすいところです。
まとめ
メール配信にしか使っていないツールに年40万円かかっていましたが、listmonkとAmazon SESに乗り換えて年2万円弱になりました。
時間がかかったのは、ソフトのインストールよりも名簿の整理です。エラーになるアドレスと配信停止の人を除外し、少ない件数から配信を始める。ここを省くと、SESのアカウントが停止されてしまいます。
乗り換える前は、管理画面が整っている旧ツールのほうが運用は楽だろうと考えていました。しかし実際には、配信先の絞り込みやAIを使ったメール作成、ステップ配信など、できることが増えて作業も楽になりました。
同じようにツールの費用を見直したいと考えている方の参考になれば幸いです。
よくある質問
無料と書かれていますが、本当に費用はかからないのですか
listmonkそのものは無料ですが、置くためのサーバー代と、メールの送信料はかかります。今回の構成では合わせて年19,800円でした。配信数が増えれば送信料も増えますが、1,000通あたり15円なので、金額への影響は小さいです。
管理画面は日本語になりますか
いいえ、英語のままです。ただし操作する場所は名簿・絞り込み・配信の3か所で、項目名も一般的な配信ツールと同じ並びなので、英語が苦手でも詰まる場面はほとんどありませんでした。メールの本文はもちろん日本語で書けます。
いまの配信ツールから名簿はそのまま移せますか
CSVで移せます。ただしそのまま全件を取り込むのは危険です。配信停止を希望した人と、エラーで届かなかったアドレスを先に除外リストへ登録してください。これを省くと、法律に触れる配信をしてしまったり、送信側のアカウントを止められたりします。
乗り換えにはどれくらいかかりますか
今回は旧ツールの解約まで19日でした。ソフトのインストールは半日で終わっています。時間がかかるのは名簿の整理と、少ない件数から段階的に増やしていく移行期間のほうです。日数に余裕を持って始めたほうが安全です。
サーバーの管理ができる人がいません
インストールもトラブルの調査も、いまはAIに聞きながら進められます。今回もコマンドやプログラムはAIに書いてもらいました。問題になりやすいのは知識よりも、止まったときに誰が気づいて手を動かすかです。そこを決められないうちは、サポートのある国内サービスのほうが向いています。