# suisui 予約 — ダイナミックプライシング付きテーブル予約システム 仕様書

- 版: v0.1(提案用ドラフト)
- 作成日: 2026-07-12
- 対象: suisui 社への機能提案(既存ファストパスシステムのアップデート案)
- 成果物: 本仕様書 + 動作する画面モック(静的 HTML + JavaScript)

---

## 1. 背景と目的

suisui は「行列」という顧客のペインを、追加料金で行列を短縮できるファストパスとして販売することで付加価値に転換し、行列店の利益化に成功した。

一方、予約制の飲食店では「すぐに埋まる人気の予約枠」が早い者勝ちで消化されるだけで、その**希少性は誰の収益にもなっていない**。本サービスは同じ発想をテーブル予約に適用する:

> **予約残数が少なくなるほど予約料が段階的に上がるダイナミックプライシングを導入し、行列店以外の予約受付店でも「席の希少性」を利益化する。**

空席が十分にある間は従来どおり無料で予約できるため、既存の予約体験を損なわずに、需要が集中した分だけが収益に変わる。

## 2. サービス概要

| アクター | 利用画面 | 提供価値 |
|---|---|---|
| 飲食店利用者(お客様) | 利用者画面(スマホ) | 満席間際でも予約料を払えば確実に席を確保できる。空いていれば無料 |
| 飲食店(加盟店) | 店舗管理画面(タブレット) | 人気枠の希少性が予約料収入になる。No-show 対策・予約台帳・売上レポート |
| サービス提供側(suisui) | 運営管理画面(PC) | 予約料・キャンセル料の決済額に対する手数料収益。加盟店・決済の管理 |

TableCheck 等の一般的なテーブル予約システムを下敷きに、価格エンジン(ダイナミックプライシング)・予約時決済・No-show 自動判定を加えたものと位置づける。

## 3. ダイナミックプライシング仕様

### 3.1 在庫の単位

- 在庫は**テーブル(卓)単位**。店舗は複数の**テーブルタイプ**(例: 2名席×4、4名席×8)を登録する
- 営業時間は**時間制スロット**に区切る(例: 2時間制 × 3スロット = 17:00 / 19:00 / 21:00 入替)
- 予約は「日付 × スロット × テーブル1卓」を占有する。人数に対して**収容可能な最小のテーブルタイプ**から割り当てる

### 3.2 価格の決定

スロットの**残テーブル数(全タイプ合計)**を `remaining` として:

```
if スロット開始時刻を過ぎている            → 受付終了
if remaining == 0                         → 満席
if 開始まで freeReleaseHours 時間以内      → ¥0(直前無料開放)※空席が残っている場合のみ
tier = paidTiers のうち remaining <= maxRemaining を満たす最小の maxRemaining の段階
if tier が存在しない                       → ¥0(無料予約枠)
else                                       → tier.price
```

デモ店舗の設定例:

| 残テーブル数(計12卓) | 予約料 |
|---|---|
| 7 以上 | 無料 |
| 6 以下 | ¥500 |
| 3 以下 | ¥1,000 |
| 1 | ¥2,000 |

- 価格は予約が入るたびにリアルタイムに再計算される。予約確定の直前に再判定し、表示時から価格が変わっていた場合は利用者に再確認させる
- **利用者画面には残席数・予約状況は表示しない**(埋まっていない時間帯が「人気がない」と誤解されるのを防ぐため)。表示するのは「無料でご予約いただけます」か「残りわずかのため予約料が発生します(+金額)」のどちらかのみとし、有料の理由として希少性だけを伝える。残席数は店舗管理画面でのみ確認できる

### 3.3 直前無料開放(freeRelease)

「有料だから予約しない」という機会損失(買い控え)への対策として、スロット開始の N 時間前を切ったら有料枠を ¥0 に開放できる(N は店舗設定、0 = 開放しない)。

**利用者画面では開放中であることを明示せず、単に「無料」と表示する。**開放の仕組み自体を利用者に知らせないことで、「直前まで待てば無料になる」という買い控えの逆インセンティブを防ぐ。なお規約上、支払済みの予約料は開放が発生しても返金しない。

## 4. 店舗設定項目一覧

| 項目 | 型 / 例 | 説明 |
|---|---|---|
| テーブル構成 | 2名席×4、4名席×8 | タイプごとの収容人数と卓数 |
| 時間制(stayHours) | 2時間 | 1テーブルあたりの利用時間。スロット幅を兼ねる |
| スロット開始時刻・数 | 17:00 開始 × 3 | 1日の入替スロット |
| 段階価格(paidTiers) | 残6以下¥500 / 残3以下¥1,000 / 残1¥2,000 | 残数のしきい値と予約料の組。最大段より残数が多い間は無料予約枠 |
| 直前無料開放(freeReleaseHours) | 3時間前 | 0 で開放なし |
| キャンセルポリシー有効 | 有効 | 有効時は無料予約でもカード登録必須 |
| No-show キャンセル料 | ¥3,000 | 自動判定時に登録カードへ課金 |
| 無料キャンセル期限(freeCancelHours) | 24時間前 | これ以降のキャンセルは予約料を返金しない |

将来的には曜日・時間帯別の需要係数、予約時のメニュー事前決定(コース前受け)を追加予定(§10)。

## 5. 予約・決済フロー

1. 利用者が日付・人数・スロットを選択(価格と残数をリアルタイム表示)
2. 氏名・電話番号を入力。**予約料が発生する場合、またはキャンセルポリシーが有効な場合はカード情報を登録**
3. ダイナミック予約料は**予約時点で即時決済**(飲食代とは別の席確保料)
4. 予約確定。予約番号を発行し、マイページから確認・キャンセルできる

### 返金規定

| ケース | 返金 |
|---|---|
| 開始 freeCancelHours 前までの利用者キャンセル | 予約料を全額返金 |
| それ以降のキャンセル | 返金なし |
| 直前無料開放が発生した場合の支払済み予約料 | 返金なし(規約に明記) |
| No-show 誤判定の取消 | キャンセル料を全額返金 |

## 6. 消し込みと No-show 判定

- 来店時、店舗スタッフがタブレットの「来店」ボタンで予約を**消し込む**(status: 予約済み → 来店済み)
- **No-show 自動判定**: 予約日の**翌日 AM5:00** 時点で消し込まれていない予約は自動的に No-show となり、キャンセルポリシー有効かつカード登録済みなら登録カードからキャンセル料を課金する
- 誤課金の防止:
  - 利用時間が終了しても未消込の予約がある場合、店舗管理画面に**未消込アラート**を表示(判定前のリマインド)
  - 判定後も店舗・運営の双方から**誤判定取消**が可能(予約を来店済みに戻し、課金済みキャンセル料を全額返金)

## 7. 収益モデル

- 課金対象 GMV = ダイナミック予約料 + No-show キャンセル料 −返金
- サービス側(suisui)は GMV に対して**手数料率 20%(デモ値)**を徴収し、残り 80% が加盟店の受け取り
- 返金時は手数料も同率で戻す
- 無料予約には課金が発生しないため、加盟店は「需要が集中したときだけ支払う」成果報酬型になる

## 8. 画面一覧(モック対応表)

| 画面 | パス | 主な機能 |
|---|---|---|
| 提案トップ | `index.html` | サービス概要・価格のしくみ・デモ手順 |
| 利用者: 予約トップ | `customer/index.html` | 日付/人数選択、スロット別に「無料」または「予約料+残りわずかの理由」を表示(残席数は非表示) |
| 利用者: 予約確認 | `customer/reserve.html` | 料金内訳、カード入力(モック)、ポリシー同意、確定直前の価格再判定 |
| 利用者: 完了 | `customer/complete.html` | 予約番号の発行 |
| 利用者: マイページ | `customer/mypage.html` | 予約確認・キャンセル(返金可否を表示) |
| 店舗: 本日の予約 | `store-admin/index.html` | スロット別台帳、来店消し込み、未消込アラート、現在価格 |
| 店舗: 予約管理 | `store-admin/reservations.html` | 全期間の予約、店舗側キャンセル、No-show 誤判定取消 |
| 店舗: 設定 | `store-admin/settings.html` | §4 の全設定項目 |
| 店舗: 売上レポート | `store-admin/revenue.html` | 決済総額・店舗取り分・手数料、決済履歴 |
| 運営: ダッシュボード | `service-admin/index.html` | 全店 GMV・手数料収益・加盟店数 |
| 運営: 加盟店管理 | `service-admin/stores.html` | 加盟店一覧と設定の確認(設定監査) |
| 運営: 決済管理 | `service-admin/payments.html` | 決済一覧、No-show チャージの返金対応 |

## 9. データモデル(概念)

```
Store 1 ─── * TableType(label, capacity, count)
Store 1 ─── * Slot(date × time)         ※実体は設定から導出
Slot  1 ─── * Reservation(partySize, tableType, fee, cardRegistered,
                          status: confirmed | seated | cancelled | noshow)
Reservation 1 ─── * Payment(type: reservation_fee | noshow_fee | refund, amount, at)
```

- モックでは全状態を `localStorage("dpft_state")` に保持し、3画面が同一状態を共有する
- モックには**仮想現在時刻**があり、デモパネルから進めることで直前開放・No-show 判定を再現できる

## 10. 将来拡張

1. **曜日・時間帯別の需要係数**: 金曜夜など恒常的な人気帯に基礎係数を掛ける
2. **予約時メニュー事前決定**: コース前受け・事前決済により客単価とオペレーション効率を向上
3. **需要予測に基づく価格自動提案**: 過去の埋まり方から段階価格・しきい値を運営側が提案
4. **複数店舗・ブランド管理**、POS/既存ファストパスとの統合、多言語対応

---

## 補足: 本モックの技術構成

- 静的 HTML + Vanilla JS のみ(ビルド・サーバ不要、`index.html` をブラウザで開くだけで動作)
- `shared/store.js`: 状態管理・シードデータ・予約/消込/No-show 判定などのアクション
- `shared/pricing.js`: 価格エンジン(純関数)
- `shared/demo.js`: 全画面共通のデモ操作パネル(仮想時刻・リセット)
- 実際の決済は発生しない(カード入力はモック)
