saas-free-tier-limit-lessons

Klaviyo無料プランの上限に当たった日 — 「無料でやる」の見えないコスト

Shopify で運営していたECサイトを BASE へ移行することになり、
既存顧客に案内メールを送ろうとした。配信ツールは Klaviyo。

Schedule を押すと、赤いエラーが出た。

Over account sending limit. Please review your billing plan.

無料プランのアクティブプロファイル上限は250。アカウントには354いた。
送信先が何人かは関係ない。アカウント全体の送信機能がロックされる。
実際に送りたかったのは32人だった。

対象を減らせば無料のまま送れるはずだった。実際、方法はあった。
半日かけて手順を組み、実行した。そして最後に、その方法では当日中に送れないと分かった。

作業自体は成功していた。ただ、Klaviyoの課金カウントの更新に
最大72時間かかる仕様だった。

有料プランへの切り替えは月$20程度。5分で終わる話だった。


教訓1:先に締め切りを聞く

これが全てだった。

「無料でできる方法はあるか」から考え始めてしまったが、
正しい最初の問いは**「いつまでに必要か」**だった。

無料枠の回避策には、ほぼ必ず反映遅延が伴う。
課金は即時反映されるが、削減は遅れる。当然といえば当然で、
事業者にとって課金が遅れる理由はないからだ。

Klaviyoの公式ドキュメントにはこう書かれている。

プロファイルをサプレッション、削除、一括削除した後、
アクティブプロファイル数が完全に更新されるまで最大72時間かかる場合があります

サプレッション自体は即座に反映される。 Suppressed profiles の件数はすぐ増える。
遅れるのは Billing の数字と、送信ロックの解除だけ。
だから「実行したのに何も変わらない」ように見えて、実は成功している。

判断のフロー

締め切りはいつか?
├── 今日〜明日  → 課金 or 別ツール(迷わない)
└── 3日以上ある → サプレッションで無料枠に収める

$20と半日の作業時間。
天秤にかけるまでもなかったのに、「最後だから課金するのもアレ」という気持ちが先に立った。

節約したつもりの金額より、費やした時間のほうが高くつくことがある。

参考:この規模ならShopify Emailで足りた

送信対象は32人。Shopify Email は無料枠が月10,000通ある。
Shopifyが稼働している間なら、そもそもKlaviyoを使う必要がなかった。

ツールの資産(テンプレート、フロー)に縛られて選択肢を狭めていた。


教訓2:フラグ名を信用しない

技術的に一番ハマったのがここ。

Klaviyoには can receive email marketing というステータスがある。
当然、配信に同意した人のことだと思った。

違った。

実際の定義は**「送信をブロックする要因がないか」**だった。
サプレッションされていない、配信停止していない。
それだけを満たせば、明示的にオプトインしていなくても can receive に入る。

公式ドキュメントにも、
アクティブプロファイルには2種類あると明記されている。

Shopify連携は、この両方をKlaviyoに追加する。
そして両方とも課金対象になる。

実際の内訳

区分 件数
Total profiles 424
Active(課金対象) 354
└ メルマガリスト所属(真に同意あり) 32
└ 未同意(注文・カート放棄経由) 322
Suppressed 70

つまり 354人中、明確な配信同意があるのは32人(9%)。
残り322人は「Klaviyo的には送れるが、特定電子メール法的には送るべきでない人」だった。

なぜ気づけたか

「未同意層は cannot receive で322件取れるはず」と先に件数を見積もっていたから。
実際に抽出したら70件(=既存のサプレッション分)しか出なかった。
この乖離で定義を疑い直せた。

仮説の数字を先に立てて、実測と照合する。ズレたら定義を疑う。

正しい抽出条件

未同意層を取るには、cannot receive ではなくリスト所属で切る。

Person can receive email marketing
AND
is not in → [メルマガリスト]

これで 354 − 32 = 322 が正しく取れた。

補足:ShopifyとKlaviyoで「同意」の数が合わない

Shopify側で「メール配信を明確にOKした顧客」を数えたら46名だった。
Klaviyoのメルマガリスト所属32名と一致しない。

同意という概念そのものが、ツールごとに違う粒度で実装されている。
移行やツール併用のときは、必ずここを突き合わせる。


教訓3:「いつ」ではなく「なぜ」を記録する

サプレッションには性質の異なる2種類があった。

前者は永久に戻さない。後者はいずれ戻すかもしれない。
まったく違うものが、同じ場所に混ざる。

しかもKlaviyoのサプレッション理由ラベルでは区別できない。
手動サプレッションも、他社ESPからインポートした分も、
どちらも同じ User suppressed と表示される。

日付での区別は成立しない

最初に考えたのは日付だった。
「8/6以前が本物、8/7に入ったのが一時退避」。

これは今日しか成立しない。「今日より前」は未来から見て意味を持たない。
半年後にその画面を見た人には、どこが境界か分からない。

採用した方法

静的リストに切り出し、名前に性質を書いた。

サプレッションリスト(〜2026/08/06)        ← 本物
【一時退避】サプレッションリスト_20260807    ← 一時退避

「一時退避」という4文字が、将来の自分と後任への唯一の手がかりになる。
リストの description に経緯も書いておく。

動的セグメントは記録にならない

もう一つの落とし穴。

can receive を条件にしたセグメントを記録に使おうとしたが、これは機能しない。
サプレッションを実行した瞬間、全員が条件から外れてセグメントが空になる。

Klaviyoには救済策がある。
セグメント詳細ページの Manage segment → Create list of current members。
現時点のメンバーを静的リストに固定できる。
CSVエクスポート→再インポートの往復も、同意ステータス書き換えの事故リスクもない。

⚠️ 隣にある Convert to list は使わないこと。元のセグメントが消える。


教訓4:ローカルファイルは記録ではない

途中、CSVで手元に持つ案が出た。却下した。

PCは買い替える。フォルダ構成は変わる。数年後に探し出せる保証はない。

記録は、それが意味を持つシステムの中に置く。
Klaviyoを開いた人が、Klaviyoの中で見つけられる場所に。

外部にバックアップを持つのは良いが、それは正本ではなく写しだ。


教訓5:「戻せます」の期間制限を確認する

Klaviyoには90日ルールがある。

一度手動サプレッションしたプロファイルを解除すると、
90日間は再度手動サプレッションできない

つまり一度戻すと、90日間ずっと課金カウント対象に戻り続ける。
無料枠は即座に破綻し、送信ロックが再発する。しかも元に戻せない。

サプレッション実行時のモーダルにも明記されている。

You may unsuppress them anytime, but must wait 90 days from today to suppress them again.

「いつでも戻せます」と書いてあっても、
戻した後にもう一度やれるかは別の話だった。

無料枠運用では、これは実質的に不可逆な操作になる。


危うかった操作:CSVインポート時の同意上書き

記録用にリストを作る過程で、CSVインポートのダイアログが出た。

Did these contacts subscribe to email marketing messages?

ここで Yes を押すと、インポートした全員の同意ステータスが「購読中」に書き換わる。

対象は、配信停止した人やバウンスした人を含むサプレッションリストだった。
Yes を押していたら、意図的に止めた人を全員復活させるところだった。

「怖いね」と感じて手を止めたのが正解だった。
同意データを書き換える操作は、UIの選択肢1つで発生する。


おまけ:AIに作業を手伝ってもらうとき

今回、AIアシスタントと並走して作業した。
何度か誤った前提で進められ、そのたびに軌道修正が必要だった。

特に「322人はどうせ送れない人だから、サプレッションしても無害」という説明は
繰り返し出てきたが、これは間違いだった。
Klaviyoは322人全員を「送信可能」と判定していた。

修正が効いたのは、いずれも具体的な反論を返したときだった。

「日付ではなく、性質が違う」
「今日より前、は未来から見たら分からない」
「ローカルはどこに行くか分からない。PCも買い替える」

抽象的な違和感を言語化して返すと、設計が正しい方向に直る。

もう一つ効いたのは、根拠の提示を明示的に要求すること。
「公式ソースをあたって」と言った時点から、
推測ベースの回答が公式ドキュメント参照に切り替わった。

検証する役割は人間側にある。当たり前だが、
流れが速いときほど忘れやすい。


まとめ

学び
1 締め切りを最初に聞く。Klaviyoの課金カウント更新は最大72時間
2 can receive は同意ではなく「ブロック要因がない」の意。仮説と実測を照合する
3 記録は「いつ」ではなく「なぜ」を残す。動的セグメントは記録にならない
4 ローカルファイルは正本にならない
5 「戻せます」の期間制限(90日ルール)を確認する

無料で済ませることが目的化すると、判断を誤る。
コストは金額だけではない。


参考

※ 2026年2月よりプロファイル数ベース課金(送信数ベースではない)
※ 画面UIは変更される可能性あり