tenmane / user_memberships

term_to 仕様整理

2026-03-31 — 解約取消対応の調査に伴う整理
term_to は有効期限を表すカラムだが、会員の有効性判定には使われていない。日常的な判定は status カラムのみで行われる。
term_to の3つの役割
1

課金成功時の更新基準

PayJPの charge.succeeded webhookを受けたとき、term_to を翌月末に更新する。定期課金が走るたびに1ヶ月ずつ延びる仕組み。

extendUserMembership() — user-memberships.persistence.ts
2

BI / LTV分析での期間判定

「ある時点にこの会員は有効だったか」を term_from <= 基準日 < term_to で判定する。

ltv.service.ts, member.service.ts, activity.service.ts, users.service.ts
3

長期プランの更新期間表示

1年/2年プランの更新通知に使用。満了月の前々月21日〜満了月10日を「更新期間」として計算。

membership.ts — isInRenewalPeriod()
会員が「有効」かどうかの判定
status 会員有効性の判定に使用
term_to 会員判定には不使用(BI分析・課金更新のみ)
status 判定 説明
ACTIVE 有効 通常の有効会員
SCHEDULED_CANCEL 有効 解約予定だがまだ有効
SCHEDULED_CHANGE 有効 プラン変更予定だがまだ有効
SCHEDULED_CONTINUE 有効 継続申請済み
PENDING 無効 保留中
INACTIVE 無効 無効化済み
PAUSED 無効 一時停止中
CANCELED 無効 解約済み
USED 無効 使用済み(単発)
FAILED 無効 課金失敗
判定箇所: getAvailableUserMembershipPlan()(persistence層)、getValidMemberships()(フロントエンド)
入館制御・予約での判定
🔓
入館(RemoteLock)
term_to 不使用。予約の start_at / end_at ベースでQR発行。
📅
予約作成
status・同時予約制限・営業時間でバリデーション。term_to 不使用。
term_to 経過後の自動処理
term_to が過ぎたことをトリガーにして status を CANCELED にするバッチ処理は存在しない

CANCELED への自動変更トリガーは以下の2つで、どちらも term_to は基準にしていない。

change_at 基準 updateMembershipMonthly

change_at が過ぎた SCHEDULED_CANCEL レコードを CANCELED に変更。

created_at + limit_month 基準 continueLimitedMembership

created_at + limit_month が過ぎた長期プランを CANCELED にし、新レコードを作成。

term_to の更新タイミング(全パターン)
dayjs().add(1, 'month').endOf('month') → 現在日の翌月末
(1) 初回作成時

createRecurringMembership

サブスク新規登録時。term_to = 現在日の翌月末。

(2) 定期課金成功 webhook

extendUserMembership

charge.succeeded を受けて term_to = 現在日の翌月末に更新。最も頻繁に発火するパターン。

(3) 定期課金失敗 webhook

stopUserMembershipAtThisMonth

charge.failed 時。term_to は翌月末に設定されるが、status は SCHEDULED_CANCEL に変わる。

(4) プラン変更バッチ

updateMembershipMonthly

新レコード作成時に change_at の翌月末を設定。

(5) 長期プラン自動継続

continueLimitedMembership

新レコード作成時に翌月末を設定。

今回のケースへの影響

⚠ 齋藤 美香 様 — 仙台南店(解約取消対応)

DB term_to 2026-03-31(本日で切れる)
PayJP トライアル終了 2026-04-20(この日に初回課金)
DB status ACTIVE
3/31〜4/20の間、term_to は過去日付のままになる。
会員有効性判定・予約・入館には影響なし(status = ACTIVE で判定されるため)。
BI / LTV分析の集計値には影響が出る可能性あり(この期間が「無効」扱いになる)。