今回の改修サマリ
3行で言うと…
課金サイクルが変わった
月初一斉リセットをやめて、契約日から1ヶ月ずつのサイクルに。
アップグレード時の通数繰り越し
残ってる通数を無駄にしない。ベース残50通+ラブ300通=350通使える。
解約フロー2段階化
うっかり解約を防ぐため、確認→最終確認の2ステップに。
課金サイクルの変更
月初リセット → 契約日から1ヶ月
仕様変更これまで(不公平)
毎月1日に全ユーザーが一斉リセット
これから(公平)
契約日から1ヶ月ごとにリセット
裏側の仕組み: Univapayのサブスクリプション継続課金が毎月自動で発火 → そのタイミングでGASが「月間利用回数(K列)」を0にリセットし、「有効期限(D列)」を1ヶ月延長します。
アップグレード時の通数繰り越し
残った通数を無駄にしない
新機能具体例:ベース→ラブ
5/1にベースプラン(100通/月)を契約
5/15にラブプラン(300通/月)にアップグレード
6/15に次回課金
ダウングレードの扱い
自動切替なし、解約→再契約で対応
仕様変更技術的な複雑さを避けるため、ラブ→ベースのような下位プラン変更は自動切替を実装しない方針です。お客様には「一度解約 → 期限終了後にご希望のプランで再契約」をご案内します。
解約フロー(2段階確認)
うっかり解約を防ぐ親切設計
新機能お客様が「解約」「退会」「キャンセル」等を送信
解約 / 退会 / キャンセル / 解約したい / 退会したい / プラン解約 / プラン退会
1段階目: 解約確認Flex送信
以下のプランを解約しますか?
※解約しても有効期限まではご利用いただけます。下位プランへ変更したい方も一度解約→期限終了後に再契約してください。
2段階目: 最終確認Flex送信
本当にベースプランを解約してよろしいですか?
【解約後の挙動】
2026/6/18までは引き続きご利用いただけます
有効期限後は自動的に利用停止となります
解約後の取り消しはできません
再開する場合は再契約が必要です
解約処理実行
- Univapay APIで自動課金停止
- スプレッドシートのステータスを「cancelled」に変更
- お客様に解約完了メッセージ送信
解約後の利用
期限内はプラン通数枠で使える
新機能解約済みでも有効期限までは普通に使えます
ただし「無制限」ではなく、プランの月間通数枠は守られます。たとえばベースプラン解約者は、解約後も月100通までは使えて、それを超えると「期限まで利用、期限後再契約してください」と案内されます。
| 状態 | 使えるか | カウント | 上限到達時 |
|---|---|---|---|
| paid | 使える | K列+1 | 「月間上限到達、来月リセット」 |
| cancelled + 期限内 | 使える | K列+1(paidと共有) | 「期限まで利用、期限後再契約案内」 |
| cancelled + 期限切れ | 使えない | − | プラン選択Flex表示 |
| expired | 使えない | − | プラン選択Flex表示 |
| trial | 残あれば使える | C列-1 | プラン選択Flex表示 |
プラン確認コマンド
繰越分も見えるようになった
表示改善反応キーワード(完全一致)
プラン確認
契約確認
契約状況
マイプラン
my plan
プラン教えて
プラン知りたい
今のプラン
契約内容
何プラン
利用状況
返信例(繰越あり時)
修正したバグ
調査中に発見した4つの隠れ問題
バグ修正1. 利用回数がカウントされない問題
原因: カウント処理が Dify API呼び出しの「後」にあり、Difyでエラーが出るとカウントがスキップされていた。
修正: カウント処理を Dify呼び出しの「前」に移動(トライアル消費と同じパターン)。
2. 解約コマンドで返信が来ない問題
原因: 解約Flexで使ってた色コード #888 (3桁省略形)が LINE仕様違反で400エラー。コード側はエラーレスポンスを見ていなかったので「成功」と誤検知していた。
修正: 色コードを6桁形式 (#888888) に修正+LINE APIのレスポンスコードを確認し、失敗時はpush APIでフォールバック送信。
3. 解約後ユーザーが無制限に使えてしまう問題
原因: 解約後の状態(cancelled)では上限チェック・カウント増加が走らない実装になっていた。
修正: cancelled状態でも有効期限内はプラン通数枠でカウント管理。
4. 同じユーザーが2行存在する問題
原因: 5/3の事前登録バッチで、既存paidユーザーにも trial 行が追加されてしまった(戸野塚さんのケースで発覚)。
修正: cleanupDuplicateRows() 関数を追加。同userIdに paid 行と trial 行が並存する場合、trial 行を削除する。
スプレッドシートの変更
課金管理シートに1列追加
構造変更| 列 | 項目名 | 内容 | 変更 |
|---|---|---|---|
| A | ユーザーID | LINEのuserId | 既存 |
| B | ステータス | paid / trial / cancelled / expired | 既存 |
| C | トライアル残回数 | 無料トライアルの残数 | 既存 |
| D | 有効期限 | 次回更新日 | 既存 |
| E | ユーザー名 | LINE表示名 | 既存 |
| F | 登録日時 | 初回登録日 | 既存 |
| G | 備考 | ChargeID等 | 既存 |
| H | 最終利用日時 | 最後にメッセージを送った時刻 | 既存 |
| I | ユーザー区分 | normal / monitor / course | 既存 |
| J | プランID | plan_a / plan_b / plan_c | 既存 |
| K | 月間利用回数 | 今期の利用数 | 既存 |
| L | リセット年月 | 未使用(後方互換のため残置) | 既存 |
| M | subscription_id | Univapay側のサブスクID | 既存 |
| N | 繰越通数 | アップグレード時の旧プラン残数 | 新規 |
嶋さんへのお願い(運用面)
日常運用で気をつけること
定期チェック(月1回でOK)
- テストSSの「決済ログ」シートで
cancel_flex_reply_failedや_failed系イベントが急増していないか - 「課金管理」シートで cancelled 状態のユーザーが increasing trend ではないか
万が一の対応
何かおかしい時は、GASエディタから以下を実行してください:
setupAfterRefactor— ヘッダー/重複行/キャッシュ一括整理cleanupDuplicateRows— 重複ユーザー行の整理のみtestIncrementCountForAllPaidUsers— カウント関数の動作確認
本番反映の判断
今回の改修はテスト環境(嶋さんGAS)のみに反映済みです。本番環境(嶋さんGAS_シンプル版)への反映は、テストで安定動作確認後に別途相談しましょう。