ハコヅミを作る #77:退会・凍結のときに契約を止め、規約を書き直す(課金の「作る」の締めくくり)
#76 で休止を作りました。今回は、課金の「作る」の最後です。
- 退会したのに、引き落としが続く
- 退会では、顧客ごと消す
- Stripe で失敗したら、何も消さない
- 凍結では、止め方を分ける
- 凍結が失敗しても、凍結はする
- 規約とプライバシーポリシーに書く
- 手元で流さなかったテストが、落ちた
- 課金の「作る」を終えて
退会したのに、引き落としが続く
ハコヅミの退会は、データをすぐに全部消します。ところが、これまでの退会は、ハコヅミの中しか消していませんでした。
有料の人が退会すると、ハコヅミの側からは、その人がいなくなります。でも、Stripe の契約は残ったままです。翌月になると、Stripe は、いつもどおりカードから引き落とします。使えないサービスに、払い続けることになります。
凍結も同じです。凍結された人は、アカウントの画面を開けないので、自分で解約できません。
そこで、退会と凍結のときに、Stripe の側も止めるようにしました。
退会では、顧客ごと消す
Issue には、「退会すると、Stripe の契約をすぐに止める」と書いていました。作る前に、Claude Code が、もう一歩進めた案を出してきました。
契約だけを止めるのではなく、Stripe の顧客を消す
Stripe の「顧客」は、契約の持ち主です。顧客を消すと、その人の契約も、その場で止まります。それだけでなく、Stripe が預かっていたメールアドレスとカードも消えます。
ハコヅミは、「退会すると、すぐに消える」と約束しています。契約だけを止めると、Stripe の中には、その人のメールアドレスとカードが残ります。顧客ごと消せば、Stripe の側でも、その約束を守れます。
ただし、支払いの記録(いつ、いくら払ったか)は、Stripe に残ります。お金の記録なので、法律で残すことが決まっています。プライバシーポリシーにも、そう書きました。
退会の確認の画面には、有料の人にだけ、一文を足しました。

有料の人の退会の確認(架空のデータ)
Stripe で失敗したら、何も消さない
退会の処理は、もともと順番を決めてありました。招待の一覧 → 画像 → データベース。途中で失敗しても、やり直せる順番です。
Stripe を止める処理は、招待の一覧のあと、画像とデータベースの前に入れました。
理由は、Stripe の顧客の番号が、ハコヅミのデータベースにしかないからです。データベースを先に消すと、どの顧客を消せばよいか、分からなくなります。
そして、Stripe で失敗したら、退会はそこで止めます。データは何も消えていないので、もう一度やり直せます。もし逆に、データだけ消えて Stripe が残ったら、引き落としが続くのに、どの契約か分からない、という一番困る形になります。
凍結では、止め方を分ける
凍結のときは、Issue の案では「期間の終わりで解約」でした。払った分の期間は、そのまま残す形です。
Claude Code は、ここで、契約の状態によって分けたほうがよい、と言ってきました。
| 契約の状態 | 凍結したとき |
|---|---|
| 有効 | 期間の終わりで解約(払った分は残す) |
| 休止中 | すぐに止める |
| 支払いの払い直しのあいだ | すぐに止める |
休止中の契約には、「期間の終わり」がありません。解約の予定を入れても、休止したまま、ずっと残ってしまいます。
払い直しのあいだは、凍結したあとも、Stripe がカードからの引き落としを試し続けます。凍結された人から、お金を取ることになります。
管理画面で凍結するときの確認にも、そのことを書きました。

管理画面の凍結の確認(架空のデータ)
凍結が失敗しても、凍結はする
退会とは逆に、凍結では、Stripe で失敗しても、凍結そのものは止めないことにしました。
凍結は、規約に反することをした人を、すぐに止めるためのものです。Stripe に届かないからといって、凍結できないのは困ります。凍結はしたうえで、管理画面に「Stripe のダッシュボードで、契約を止めてください」と出し、わたしが手で止めます。
退会では「失敗したら、全部止める」、凍結では「失敗しても、止めることを優先する」。同じ「Stripe を止める」でも、何を守りたいかで、失敗したときの動きを変えました。
開発環境で、テストクロックの契約がある人を凍結すると、Stripe の契約に「でキャンセル」の印が付きました。

凍結すると、期間の終わりで解約になる
凍結を解いても、この印は残ります。自動では、もとに戻しません。また使うときは、申し込み直してもらう決まりにしました。
規約とプライバシーポリシーに書く
#74 から作ってきた決まりを、利用規約とプライバシーポリシーにまとめて書きました。
利用規約には、「料金」の条に、有料プランの決まりを足しました。
- 月額の契約で、料金の額は申し込みの画面に出す
- 支払いはカードで、カードの番号は運営者には届かない
- 毎月、自動で更新して払う
- 解約はいつでもでき、払った期間の終わりまで有料。日割りの返金はしない
- 休止、支払いができなかったとき、退会・凍結のときの扱い
- 料金や内容を変えるときは、前もって知らせる
料金の額そのものは、規約には書きませんでした。まだ仮の額で、変えるたびに規約を改定するのは大変だからです。
プライバシーポリシーには、預かる情報(契約の情報)と、支払いに使う Stripe のことを足しました。ハコヅミから Stripe に渡すのは、利用者を見分ける番号だけです。メールアドレスとカードは、利用者が Stripe の画面で入れ、Stripe が預かります。
本番では、有料プランはまだ申し込めません。でも、規約は先に出しました。お知らせにも「有料プランは、まだ申し込めません。始めるときは、あらためてお知らせします」と書きました。
手元で流さなかったテストが、落ちた
1つ、失敗がありました。
凍結の確認の文を変えたので、それを確かめているテストも直しました。ところが、同じ文を確かめているテストが、もう1つありました。確認の画面の見た目を確かめるテストです。
ハコヅミでは、手元では、変えたところに関係するテストだけを流し、全部のテストは PR の CI で流す、と決めています(GitHub Actions の時間を節約するため)。そのもう1つを、手元で流すテストに入れていませんでした。CI で落ちて、気づきました。
Claude Code が、同じ文を探して、残りの1つを直しました。文を変えるときは、その文で探してから、流すテストを決めるほうがよさそうです。
課金の「作る」を終えて
これで、課金の「作る」は、全部終わりました。
| 回 | 作ったもの |
|---|---|
| #73 | Stripe からの知らせを受け取る土台 |
| #74 | 申し込みと解約 |
| #75 | 支払いが失敗したとき |
| #76 | 休止 |
| #77(この回) | 退会・凍結のときと、規約 |
どれも、開発環境と、Stripe の練習用の環境だけで作りました。本番には、全部出してありますが、Stripe の鍵を入れていないので、課金の画面は見えません。
残りは「始める」です。本番の鍵と料金、特定商取引法の表記、テスタの方への約束(1年間の無料)を用意します。キャンプの季節が始まる前に、やる予定です。
おわりに
- 退会で消すなら、外のサービスに預けたものも消す。契約だけでなく、顧客ごと
- 外のサービスを止めるのは、自分のデータを消す前に。番号は、自分のところにしかない
- 同じ「止める」でも、失敗したときの動きは、何を守りたいかで変える
- 状態が増えたら、ほかの処理がその状態でどう動くかを、もう一度見る
- 規約は、作ったものにあわせて書く。額のように変わるものは、規約に書かない
- 文を変えたら、その文で探してから、流すテストを決める
テスタを募集しています。キャンプに行く方、よければ、触ってみてください。