2026年5月18日 改修完了レポート

嶋さんGAS 課金システム 改修内容

5/14ミーティングで決定した3つの仕様変更を実装・デプロイしました。本ドキュメントは嶋さん向けに非技術用語でまとめたものです。

新機能 バグ修正 仕様変更
1

今回の改修サマリ

3行で言うと…

課金サイクルが変わった

月初一斉リセットをやめて、契約日から1ヶ月ずつのサイクルに。

アップグレード時の通数繰り越し

残ってる通数を無駄にしない。ベース残50通+ラブ300通=350通使える。

解約フロー2段階化

うっかり解約を防ぐため、確認→最終確認の2ステップに。

2

課金サイクルの変更

月初リセット → 契約日から1ヶ月

仕様変更

これまで(不公平)

毎月1日に全ユーザーが一斉リセット

例: 4/25にベース契約
→ 5/1にリセット(たった5日で100通リセット
→ お客様「日割りないの?」となる

これから(公平)

契約日から1ヶ月ごとにリセット

例: 4/25にベース契約
→ 5/25まで100通使える
→ 5/25に次の課金webhook→自動リセット&30日延長

裏側の仕組み: Univapayのサブスクリプション継続課金が毎月自動で発火 → そのタイミングでGASが「月間利用回数(K列)」を0にリセットし、「有効期限(D列)」を1ヶ月延長します。

3

アップグレード時の通数繰り越し

残った通数を無駄にしない

新機能

具体例:ベース→ラブ

1

5/1にベースプラン(100通/月)を契約

5/1〜5/15で50通使用 → 残り50通
2

5/15にラブプラン(300通/月)にアップグレード

→ ベース残50通が新プランに繰り越し
→ 5/15〜6/15で 350通 使える!
3

6/15に次回課金

→ 繰越分はリセット、通常通り300通スタート
繰越期間は今期のみ。1ヶ月限りでリセットされます。
ダウングレードでは繰越なし。下位プランへの自動変更自体ができないため。
4

ダウングレードの扱い

自動切替なし、解約→再契約で対応

仕様変更

技術的な複雑さを避けるため、ラブ→ベースのような下位プラン変更は自動切替を実装しない方針です。お客様には「一度解約 → 期限終了後にご希望のプランで再契約」をご案内します。

1 お客様「解約」と送信
2 解約Flex内に「※ダウングレードしたい方も一度解約してください」と案内
3 有効期限まで通常利用可能
4 期限後、自動的にプラン選択画面表示 → 希望のプランで再契約
5

解約フロー(2段階確認)

うっかり解約を防ぐ親切設計

新機能
STEP 1

お客様が「解約」「退会」「キャンセル」等を送信

反応キーワード: 解約 / 退会 / キャンセル / 解約したい / 退会したい / プラン解約 / プラン退会
STEP 2

1段階目: 解約確認Flex送信

解約のご確認

以下のプランを解約しますか?

プラン: ベースプラン
月額: ¥3,300
次回更新: 2026/6/18

※解約しても有効期限まではご利用いただけます。下位プランへ変更したい方も一度解約→期限終了後に再契約してください。

STEP 3

2段階目: 最終確認Flex送信

最終確認

本当にベースプランを解約してよろしいですか?

【解約後の挙動】

2026/6/18までは引き続きご利用いただけます

有効期限後は自動的に利用停止となります

解約後の取り消しはできません

再開する場合は再契約が必要です

STEP 4

解約処理実行

  • Univapay APIで自動課金停止
  • スプレッドシートのステータスを「cancelled」に変更
  • お客様に解約完了メッセージ送信
6

解約後の利用

期限内はプラン通数枠で使える

新機能

解約済みでも有効期限までは普通に使えます

ただし「無制限」ではなく、プランの月間通数枠は守られます。たとえばベースプラン解約者は、解約後も月100通までは使えて、それを超えると「期限まで利用、期限後再契約してください」と案内されます。

状態 使えるか カウント 上限到達時
paid 使える K列+1 「月間上限到達、来月リセット」
cancelled + 期限内 使える K列+1(paidと共有) 「期限まで利用、期限後再契約案内」
cancelled + 期限切れ 使えない プラン選択Flex表示
expired 使えない プラン選択Flex表示
trial 残あれば使える C列-1 プラン選択Flex表示
7

プラン確認コマンド

繰越分も見えるようになった

表示改善

反応キーワード(完全一致)

プラン確認 契約確認 契約状況 マイプラン my plan プラン教えて プラン知りたい 今のプラン 契約内容 何プラン 利用状況

返信例(繰越あり時)

【ご契約情報】 プラン:ラブプラン ステータス:有効 月間利用回数:120 / 350回 (うち繰越分:50回 ※今期限り) 有効期限:2026/6/15 何でもお気軽にご相談くださいね。
8

修正したバグ

調査中に発見した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 行を削除する。

9

スプレッドシートの変更

課金管理シートに1列追加

構造変更
項目名 内容 変更
AユーザーIDLINEのuserId既存
Bステータスpaid / trial / cancelled / expired既存
Cトライアル残回数無料トライアルの残数既存
D有効期限次回更新日既存
Eユーザー名LINE表示名既存
F登録日時初回登録日既存
G備考ChargeID等既存
H最終利用日時最後にメッセージを送った時刻既存
Iユーザー区分normal / monitor / course既存
JプランIDplan_a / plan_b / plan_c既存
K月間利用回数今期の利用数既存
Lリセット年月未使用(後方互換のため残置)既存
Msubscription_idUnivapay側のサブスクID既存
N繰越通数アップグレード時の旧プラン残数新規
10

嶋さんへのお願い(運用面)

日常運用で気をつけること

定期チェック(月1回でOK)

  • テストSSの「決済ログ」シートで cancel_flex_reply_failed_failed 系イベントが急増していないか
  • 「課金管理」シートで cancelled 状態のユーザーが increasing trend ではないか

万が一の対応

何かおかしい時は、GASエディタから以下を実行してください:

  • setupAfterRefactor — ヘッダー/重複行/キャッシュ一括整理
  • cleanupDuplicateRows — 重複ユーザー行の整理のみ
  • testIncrementCountForAllPaidUsers — カウント関数の動作確認

本番反映の判断

今回の改修はテスト環境(嶋さんGAS)のみに反映済みです。本番環境(嶋さんGAS_シンプル版)への反映は、テストで安定動作確認後に別途相談しましょう。