<!-- https://unlockos.io/ja/manual/membership-plans -->

# メンバーシッププランと利用制限（クォータ）

## 概要

メンバーシッププランでは、施設への会員アクセス可否・請求方法・承認フロー・月間利用回数や時間の上限（クォータ）を設定できます。クォータを超えた場合は利用をブロックするか、Stripe Invoice Item として追加料金を請求するかを選べます。

会員は会員アプリのホーム画面でクォータバーを確認でき、現在の利用状況をリアルタイムで把握できます。

---

## 詳細機能

## 機能1: 申請フロー

プラン作成時に、入会申込から有効化までの流れを選択します。

| フロー | 内容 |
|--------|------|
| **先払い**（デフォルト） | 申し込み時に決済します。`auto_approve` が OFF の場合、スタッフがメンバーシップタブで手動承認するまでは `pending` 状態です。 |
| **申請先行** | 申込フォームの入力後、決済なしで申請が送信されます。スタッフが **承認待ち** タブで内容を確認し、承認または却下します。承認後、申請者にメールが届き、決済を完了することで有効化されます。 |

### 申請先行プランの設定

**申請先行** を選択すると：
- 決済なしで申請を送信できるようになります（決済は承認後）
- 申請内容は各承認待ちカードに表示され、スタッフが承認前に確認できます

> 申込時に追加の入力項目（氏名・連絡先など）を求めたい場合は、**申請先行に限らずどちらの入会フローでも**設定できます。プラン保存後に表示される「申込フォーム」セクションで設定します（[機能1.5: 申込フォームの設定](#機能15-申込フォームの設定)を参照）。

### 申請の承認・却下（承認待ちタブ）

1. 管理画面の **メンバーシップ** タブを開く
2. **承認待ち** サブタブをクリック
3. 各申請カードには、申請者のメールアドレス・申請プラン・申請日・フォームの回答が表示されます
4. **承認** をタップすると申請者にメールが送信され、決済に進めるようになります
5. **却下** をタップすると却下理由の入力ダイアログが表示されます（任意）

> 承認後、サブスクリプションは会員が決済を完了するまで `pending_payment` 状態のままです。決済が確認されると `active` になります。

## 機能1.5: 申込フォームの設定

会員プランを一度保存すると、編集画面に **「申込フォーム」** セクションが表示されます。ここで「フォーム」ページで作成済みのフォームを1つ選んで入会申込に紐付けられます。チェックイン設定にフォームを紐付けるのと全く同じ仕組み（Form 機能）なので、同一のフォーム定義をチェックインと入会申込の両方で使い回せます。

| 項目 | 内容 |
|------|------|
| 対応フロー | 先払い・申請先行のどちらでも設定可能（申請先行専用ではありません） |
| 使える項目タイプ | テキスト・メールアドレス・電話番号・数値・選択式・日付・複数行テキスト・画像アップロード |
| 回答の保存先 | フォーム回答（フォーム管理の回答一覧）に保存されます。他のフォーム回答と同じ個人情報保護の対象になります |
| 1プランあたり | 1フォームまで（複数フォームの同時添付はできません） |

### 設定手順

1. あらかじめ「フォーム」ページで申込フォームを作成しておきます（対象スコープは「本人情報」または「予約」のフォームが選択候補に表示されます）
2. メンバーシッププランを新規作成し、一度保存します
3. 保存後に表示される編集画面の **「申込フォーム」** セクションで、作成したフォームを選択します
4. 選択すると即座に反映されます

> **新規作成の直後には設定できません。** フォームは保存済みのプランIDに紐付くため、プランを保存 → 編集画面を開き直す、という2ステップになります。

### 既存の申込フォームからの移行について

以前は「申請先行」プランでのみ、独自の項目ビルダー（テキスト・メール・電話番号の3種類限定）で申込項目を設定できました。この項目ビルダーは廃止されました。**既に項目を設定していたプランは、リリース時に自動的にフォーム機能へ変換されており、施設側での再設定は不要です。** 変換後のフォームは「申込フォーム」セクションに表示され、これまでどおり機能します。

必須項目の入力チェック（未入力・メール形式エラー）は従来どおりサーバー側で行われます。

## 機能2: クォータの設定（管理者）

管理画面の **メンバーシップ** タブから、プランを作成・編集する際にクォータを設定します。

### 設定できる上限項目

| 項目 | 説明 | リセット周期 |
|------|------|------------|
| **月間訪問数** | 1ヶ月に入場できる回数の上限 | 月次 |
| **日次利用時間** | 1日に利用できる時間（時間単位）の上限 | 日次 |
| **月間予約数** | 1ヶ月に行える時間枠予約の上限（回数制限または時間制限） | 月次 |

#### 月間予約数の制限方式

月間予約数は「**無制限 (unlimited)** / **回数 (By count)** / **時間 (By hours)**」の3択から選択します。

| 選択肢 | 動作 |
|--------|------|
| **無制限** | 月間予約回数・時間の上限を設けない。会員アプリのクォータバーに予約枠の進捗は表示されない。 |
| **回数制限** | 1ヶ月に予約できる件数（回）の上限を設定する。 |
| **時間制限** | 1ヶ月に予約できる合計時間（時間）の上限を設定する。 |

月間訪問数と日次利用時間は値を空欄にすると「無制限」として扱われます。

### プラン作成手順

1. 管理画面 → **メンバーシップ** タブを開く
2. **新規プラン作成** ボタンをクリック（プランの詳細入力ページに移動します）
3. プラン名・料金・請求間隔・申請フローなどの基本情報を入力
   - **料金** と **請求間隔** のラベル横には「(作成後は変更不可)」と表示されます。これらの項目は Stripe 連携の都合上、保存後に変更できません
4. **利用制限** セクションで上限値を入力

## 機能2.5: プランカードの加入者数表示

プラン管理タブの各プランカードに、現在の加入者数が「**{加入者数} / {上限}** 名」の形式で表示されます。上限が未設定の場合は「**{加入者数} 名**」（∞ 表示）となります。

集計対象のステータスは `active`・`past_due`・`pending_approval`・`pending_payment` の4種です。退会済み（`canceled`）は含まれません。

## 機能3: 超過時のポリシー設定

クォータを超えた際の挙動を「ブロック」または「追加課金」から選択します。

| ポリシー | 動作 |
|---------|------|
| **ブロック** | 上限に達すると入場・予約を拒否する。追加料金は発生しない。 |
| **追加課金** | 上限を超えても利用可能。超過分は Stripe Invoice Item で自動請求される。 |

### 超過料金（追加課金ポリシー選択時のみ）

追加課金ポリシーを選択すると、超過料金の入力フィールドが表示されます。

| 項目 | 説明 | 例 |
|------|------|----|
| 超過1回あたり料金 | 月間訪問数を超えた入場1回ごとの料金 | ¥500 |
| 超過1時間あたり料金 | 日次利用時間を超えた1時間ごとの料金 | ¥200 |
| 超過1予約あたり料金 | 月間予約数を超えた予約1件ごとの料金 | ¥300 |

超過料金はプランの通貨（JPY/USD）に従います。空欄のままにすると対象クォータの超過課金は行われません。

## 機能4: メンバーシップ専用プランの予約リストからの除外

`selected_plan_type='membership'` として作成されたプランは、予約ページ（Booking アプリ）のプランリストには表示されません。会員アプリのホーム画面から「予約プランを開く」ボタン経由でのみアクセスできます。これにより、会員専用の予約枠が一般の予約プラン一覧に混在するのを防ぎます。

## 機能5: クォータバーの確認（会員アプリ）

会員アプリのホーム画面には、有効なクォータが設定されているプランの場合にクォータバーが表示されます。

### 表示される情報

- **ラベル**: 月間訪問回数 / 本日の利用時間 / 月間予約回数
- **数値**: 使用済み数 / 上限（例: `2 / 5 回`）
- **プログレスバー**: 使用割合を視覚的に表示
  - 青緑（通常）: 使用率 80% 未満
  - 黄（注意）: 使用率 80%〜99%
  - 赤（上限）: 使用率 100%

### 追加課金メモ

超過時のポリシーが「追加課金」に設定されている場合、クォータバーの下に以下の注意文が表示されます：

> 上限超過時は追加料金が発生します

## 機能6: 対象予約プラン（無料枠の適用範囲）

会員プランの編集フォームでは、**予約制限（スロット予約）** セクション内に **対象予約プラン** というマルチセレクトがあります。ここで選んだ通常の予約プランが、このメンバーシッププランの無料枠（クォータ）の対象になります。

> **この設定は予約サービスだけでなく、ウォークイン（フロントデスク／その場のチェックイン）にも共通で効きます。** 以前はウォークインの無料枠を「チェックイン設定」単位で管理していましたが、現在は本セクションのプラン単位の設定に統一されています。

| 選択状態 | 予約サービスでの動作 | ウォークインでの動作 |
|---------|------------------|------------------|
| 未選択（デフォルト） | すべての予約プランが対象。会員はどのプランを予約しても無料枠が適用されます（従来の挙動） | プラン単位では判定せず、下記「チェックイン設定ID（レガシー）」の設定に従います |
| 1つ以上選択 | 選択したプランのみ対象。対象外のプランは会員でも通常課金されます | 選択したプラン（対象プラン・会員無料）がそのチェックイン設定に含まれていれば無料。含まれていなければ有料 |

> **非会員が締め出されることはありません。** 対象予約プランを設定しても、非会員は引き続きすべてのプランを通常料金で予約できます。この設定は「予約できるかどうか」ではなく「無料になるかどうか」だけを制御します。

### 設定手順

管理画面 → **メンバーシップ** タブでプランを新規作成または編集し、**予約制限（スロット予約）** セクション内の下記 2 つのマルチセレクトを使い分けます（複数選択可、検索ボックスで絞り込み可能）。

1. **対象予約プラン（会員無料）** — ここで選んだプランは **会員特典で ¥0** になります（無料枠 quota の対象）。予約とウォークインの両方に効きます
2. **対象予約プラン（会員向け・通常課金）** — ここで選んだプランは **会員アプリの「予約プラン」カードに表示**されますが、**料金は通常通り課金** されます（時間外割引プラン等の会員導線用）。この欄はウォークインの無料判定には使われません

両方とも未選択の場合は、後方互換で予約側は **すべての予約プランが会員無料** の対象になります（ウォークイン側は次項のレガシースコープに従います）。

保存すると、それぞれのセクションで選択したプランがタグとして表示されます。同じプランを両方の欄で選ぶことはできません（一方に追加すると自動的に反対側から外れます）。

### 対象プランの制約

- 選択候補には **この施設の有効な予約プラン** のみ表示されます。他施設のプランや無効化されたプランは新規の選択候補には出ません
- 既にリンク済みのプランが後から無効化された場合、タグとしてプラン名は表示され続けますが、新規選択の候補には出ません
- 保存時に他施設のプランIDや存在しないプランIDが含まれていた場合は自動的に除外され、画面上部に「一部の対象予約プランはこの施設に存在しないためリンクされませんでした」という警告が表示されます（保存自体は成功しています）

### チェックイン設定ID（レガシー）— ウォークイン専用の旧スコープ

「対象予約プラン（会員無料）」を **1つも選んでいない会員プラン** に限り、折りたたみ式の **「チェックイン設定ID（レガシー）」** 欄がウォークインの無料枠判定に使われます。この欄はウォークイン（直接チェックイン）専用で、予約サービスには影響しません。すでにこの欄を設定済みの会員プランでは、編集画面を開くと自動的に展開されます。

- 「対象予約プラン（会員無料）」を1つでも選ぶと、そのプランについてはチェックイン設定IDの設定は**無視され**、プラン単位の判定に切り替わります
- これまで複数のチェックイン設定に分けて会員ランクごとの入口を作っていた施設は、「対象予約プラン（会員無料）」に移行すると、複数のチェックイン設定を **1つの入口に統合** できます。統合すると、その入口の最大収容人数の設定を施設の実際の同時収容人数に近づけられます（会員ランクの数だけ入口を分ける必要がなくなるため）。加えて、無料プランがその日1件に確定する場合は、会員のチェックイン画面でプラン選択のステップが自動的にスキップされます

### 無料枠の適用ルール

会員が対象予約プランを予約する場合:
- 上記の **月間予約数**（回数制限・時間制限）が設定されていれば、その上限の範囲内で無料
- 月間予約数が「無制限」であれば、常に無料
- 上限を超えた場合の挙動は **機能3: 超過時のポリシー設定** に従います（ブロックまたは追加課金）

会員が対象外の予約プランを予約する場合は、通常のゲスト料金がそのまま適用されます（無料枠は消費されません）。ゲスト側の予約確認画面での表示については [会員・サブスク予約の特典](guest-member-booking.md) を参照してください。

---

## 設定例

### 例1: コワーキング スタンダードプラン

月20回入場 + 日8時間まで利用可能、超過は拒否する場合：

- 月間訪問数: `20`
- 日次利用時間: `8`
- 月間予約数: （空欄）
- 超過時の対応: **ブロック**

### 例2: フレックス メンバーシップ

月10回入場、超過は1回 ¥500 で追加課金する場合：

- 月間訪問数: `10`
- 日次利用時間: （空欄）
- 月間予約数: （空欄）
- 超過時の対応: **追加課金**
- 超過1回あたり料金: `500`

### 例3: スタジオ クラス会員

月4回の時間枠予約のみ制限する場合：

- 月間訪問数: （空欄）
- 日次利用時間: （空欄）
- 月間予約数: **回数制限** → `4` 回
- 超過時の対応: **ブロック**

---

## よくある質問

### Q: クォータはいつリセットされますか？

月間クォータは毎月1日の 00:00（施設タイムゾーン）に自動でリセットされます。日次クォータは毎日 00:00 にリセットされます。手動でのリセットは不要です。

### Q: 複数の上限を設定した場合、どの条件で制限されますか？

いずれか1つでも上限に達した場合に制限が適用されます。例えば、月間訪問数と日次利用時間の両方を設定している場合、どちらかが上限に達すると以降の利用がブロック（または課金）されます。

### Q: 超過料金はいつ請求されますか？

超過課金は Stripe Invoice Item として都度記録され、次回の定期請求サイクル（月次・年次）の請求書に合算されます。

### Q: 会員がクォータを確認できない場合は？

クォータバーはクォータが1件以上設定されているプランでのみ表示されます。月間予約数が「無制限」、かつ月間訪問数・日次利用時間がすべて空欄のプランの場合、クォータバーは表示されません。

### Q: 既存の会員に対してクォータを変更した場合、すぐに反映されますか？

プランのクォータを変更した場合、次回リセット後から新しい上限が適用されます。現在の使用済み回数は引き継がれます。

### Q: 対象予約プランを追加・変更すると、既存の会員にすぐ反映されますか？

はい。対象予約プランのリンクは保存した瞬間に反映されます。バックフィル作業は不要で、既に有効なサブスクリプションを持つ会員は次回の予約から新しい設定が適用されます。

### Q: 対象予約プランを1つも選択しなかった場合はどうなりますか？

すべての予約プランが対象になります（後方互換の挙動）。特定のプランだけを無料枠の対象にしたい場合のみ、対象予約プランを絞り込んでください。

### Q: ウォークイン（直接チェックイン）の無料枠も対象予約プランで決まりますか？

はい。「対象予約プラン（会員無料）」を1つ以上選ぶと、その設定が予約とウォークインの両方に適用されます。1つも選んでいない会員プランのウォークインは、従来どおり「チェックイン設定ID（レガシー）」の設定で判定されます。

### Q: 申込フォームは申請先行プランでしか使えませんか？

いいえ。プラン保存後に表示される「申込フォーム」セクションは、先払い・申請先行のどちらの入会フローでも設定できます。以前は申請先行プラン専用の項目ビルダーでしたが、現在はチェックイン設定と共通のフォーム機能に統合されています（[機能1.5](#機能15-申込フォームの設定)参照）。

---

## トラブルシューティング

### 上限に達していないのに利用をブロックされる

以下を確認してください：

1. 会員アプリのホーム画面でクォータバーの現在の数値を確認する
2. 日次クォータ（本日の利用時間）も上限に達していないか確認する
3. メンバーシップの有効期限が切れていないか確認する
4. それでも解決しない場合は、施設の管理者にお問い合わせください

### クォータバーが表示されない

- 月間予約数が「無制限」で、月間訪問数・日次利用時間もすべて空欄（無制限）の場合は表示されません
- 管理画面でプランの利用制限設定を確認してください

### 会員なのに特定のプランで通常課金されてしまう

1. 管理画面でそのメンバーシッププランの **対象予約プラン** を確認し、該当プランが選択されているか確認してください
2. 対象予約プランが1つ以上選択されている場合、リストに含まれないプランは意図的に通常課金の対象です（無料枠の適用範囲を絞り込む機能のため）
3. すべてのプランを無料枠の対象にしたい場合は、対象予約プランの選択をすべて解除してください（未選択＝全プランが対象）
4. プランを保存した直後は反映されているはずです。反映されない場合はページを再読み込みしてください

### 会員なのにウォークイン（直接チェックイン）で通常課金されてしまう

1. その会員プランの **対象予約プラン（会員無料）** に、利用しているチェックイン設定のプランが含まれているか確認してください
2. **対象予約プラン（会員無料）を1つでも選んでいる場合**、ウォークインの判定は完全にそちらへ移行します。「チェックイン設定ID（レガシー）」欄を設定していても無視されます
3. 対象予約プランを1つも選んでいない場合は、「チェックイン設定ID（レガシー）」欄にそのチェックイン設定が含まれているか確認してください

---

## Stripe カスタマーポータルの設定（施設オーナー必須）

会員がカードの変更や領収書のダウンロードを行うには、Stripe Dashboard で **Customer Portal** を有効にする必要があります。

### 設定手順

1. [Stripe Dashboard](https://dashboard.stripe.com/) にログイン
2. **Settings** → **Billing** → **Customer portal** を開く
3. 以下を設定:

| 項目 | 設定 | 理由 |
|------|------|------|
| **Payment methods** | ✅ 有効 | 会員がカードを追加・変更・削除できるようにする |
| **Invoice history** | ✅ 有効 | 会員が領収書・請求書の PDF をダウンロードできるようにする |
| **Subscriptions > Cancel subscriptions** | ❌ 無効 | 退会は UnlockOS の専用フローで処理するため |
| **Subscriptions > Switch plans** | ❌ 無効 | プラン変更は UnlockOS で管理するため |

4. **Save** をクリック

### 注意事項

- この設定は **Stripe アカウント全体** に適用されます（施設単位ではありません）
- テストモードと本番モードで別々に設定が必要です
- 設定が完了すると、会員アプリの **お支払い履歴** ページに「カード・請求書を管理」ボタンが表示されます
- ボタンをクリックすると Stripe のポータル画面が開き、操作完了後に会員アプリに戻ります

### Customer Portal が未設定の場合

設定が完了していない状態で会員がボタンをクリックすると、Stripe からエラーが返されます。必ず上記の設定を完了してからメンバーシップを公開してください。

---

## 関連ページ

- [会員サインアップ](member-signup.md)
- [メンバー管理](members.md)
- [会員・サブスク予約の特典](guest-member-booking.md)
- [時間枠予約（会員向け）](timeslot-booking-member.md)
- [時間枠予約プランの設定（管理者向け）](timeslot-booking-admin.md)
- [予約管理ダッシュボード](booking.md)
- [ブラックリスト管理](blacklist.md)
- [回数券](ticket-books.md)

---

最終更新: 2026-08-21 - 申込フォームの Form primitive 統合（ADR-0061）と、対象予約プランの予約/ウォークイン共通化（#2750）を追記
