スマホのカメラロールを開かなくていい。電話しなくていい。DM を待たなくていい。
LINEを開いて、写真を見て、ボタンを押すだけで予約が入る。
そういう体験を、架空のネイルサロン「Lien Nail Studio」向けに実装した。
ネイルサロンの予約は、今もDMや電話が多い。 LINEで連絡はできても、空き確認→日程調整→確定という往復が発生する。 お客さんは待たされ、サロン側は都度返信しなければならない。
これは自動化できる。LINEのBot機能を使えば、カルーセルでメニューを見せて、カレンダーで空きを選んで、名前を入れたら予約完了まで全部LINEの中で完結する。
「Lien Nail Studio」という架空のネイルサロン向けLINE予約Botをゼロから実装した。デモとして実際に動いている。
— LINE のリッチメニュー。写真背景に8機能を配置した。
ワンカラー・ニュアンスデザイン・アート込みコースなど7メニューを写真付きで表示。価格と所要時間も一目でわかる。
前回来店時の担当を自動で提案。初回なら全スタッフの紹介カードを表示して選べる。
定休日・スタッフの休憩・すでに埋まっている枠を除外して、本当に予約できる時間だけをボタンで表示する。同じ枠に2人が同時に予約しようとしても、1件しか入らない仕組みになっている。
予約は即確定せず「仮受付」として管理画面に届く。サロン側が確認して確定ボタンを押すと、お客様のLINEに通知が届く。
予約前日の夜20時に、タイマーが自動でリマインドメッセージを送る。サロン側が何もしなくていい。
仕組みをざっくり説明すると、LINEでメッセージを送るたびに「サーバー」が瞬時に反応して返事を作っている。この「サーバー」は世界中に分散していて、月間コストはほぼゼロ円。特別な機材も契約も不要だ。
一番考えたのは「会話の途中を覚えておく」仕組みだ。LINEのBotは、メッセージが来るたびに「初対面」として起動する。前のメッセージを覚えていない。だから「今この人はメニュー選択が終わって日付を選んでいる最中」という状態をどこかに記録しておく必要があった。
解決策は、メモ帳のようなストレージに「この人の現在地」を書いておくことだ。予約が完了したら消す。30分間放置されたら自動で消える。シンプルだが、これだけで会話が途切れずに成立する。
// 「この人は今ここにいる」と記録(30分で自動消去)
await kv.put(`state:${userId}`, JSON.stringify(state), { expirationTtl: 1800 });
// 次のメッセージが来たとき、記録を読み出す
const raw = await kv.get(`state:${userId}`);
const state = raw ? JSON.parse(raw) : null;
もう一つは二重予約の防止だ。同じ時間帯を2人が同時に選ぼうとした場合、どちらか片方しか入れないようにしなければならない。「データベースのルール」として「同じ日時・同じスタッフには1件しか入らない」と設定することで、アプリ側で複雑な処理をしなくても自動的に弾かれる仕組みにした。
CREATE UNIQUE INDEX IF NOT EXISTS uniq_slot
ON reservations(date, start_time, staff_id)
WHERE status IN ('confirmed', 'pending');
「30秒ルール」の壁が最初の難関だった。LINEのBotはメッセージを受け取ってから30秒以内に返事をしなければならない。重い処理を順番にやっていると、あっという間に超える。
対策は「まず『受け取りました』とだけ返してから、重い作業を並行で走らせる」設計に変えることだった。完成したものから順番にLINEへ送る。レストランで「ご注文承りました」と言ってから調理する感覚に近い。
もう一つは言葉の誤解の問題だ。「ニュアンスデザイン」というメニューを選んだとき、Botが「デザイン」という言葉に反応して「作品ギャラリーはこちらです」と的外れな返事をしてしまっていた。予約の最中はこういったキーワード検索を完全にオフにすることで解決した。
— 管理画面で確定ボタンを押すと、お客様の LINE に即座に通知が届く。
動くデモとして公開している。実際にLINEで友だち追加して予約操作が体験できる。スタッフは架空だが、Botの動きは本物だ。
LINEを開く。リッチメニューの「予約」を押す。
写真付きのメニュー一覧が流れてくる。
ワンカラーを選ぶ。スタッフを選ぶ。日付を選ぶ。名前を入れる。
確認画面が出て、「確定」を押す。
それだけで予約が入る。
お客さんは待たなくていい。サロン側は手が空いたときに確認すればいい。
— Bot から「ギャラリー」と送ると、作品写真のカルーセルが流れてくる。
次回は管理画面と、受信ボックス(お客様からのフリーメッセージに返信できる機能)について書く。