金曜の夜、天文館。目当てのお店に着いたら満席で、スマホを片手に次のお店を探して歩く——そんな経験は、誰にでもあると思います。
一方で、お店の側から見ると、まったく逆のことが起きています。席は空いているのに、お客さんはそれを知りようがない。目の前の通りを、お店を探している人が歩いているのに、です。
お客さんは「いま入れるお店」を探している。お店は「いま空いている」ことを知らせたい。両方が同じ情報を求めているのに、その情報を載せる場所がどこにもない。このギャップに気づいたのが、今あきの始まりです。
グルメサイトに載っていない、たったひとつの情報
営業時間、メニュー、写真、レビュー。お店の情報はネットにあふれています。でも「いまこの瞬間、席が空いているか」だけは、どこにも載っていません。知る方法は、電話をかけるか、行ってみるか。
今あきは、この一点だけを扱う道具です。お店の一覧を開くと、「空きあり・残りわずか・満席」のバッジが並ぶ。現在地から近い順に見れば、「いま入れる近くのお店」がひと目で分かる。それだけの、シンプルなサービスです。
ひとつ決めていることがあります。お客さんの現在地は、サーバーに送っていません。お店の一覧はまとめて配っていて、そこからの距離を計算するのはブラウザの中です。「近い順」を出すのに、誰がどこにいるかを預かる必要はありません。
いちばんこだわったのは「ワンタップ」
設計でいちばんこだわったのは、お店側の発信がワンタップで終わることです。
お店がいちばん忙しいのは、まさに営業中です。空席状況をこまめに入力してください、という仕組みは、どんなに立派でも続きません。続かない仕組みは、存在しないのと同じです。だから今あきは、「空きあり・残りわずか・満席」のボタンをひとつ押すだけにしました。レジの合間の3秒で終わります。
もうひとつが、情報の鮮度です。空席状況は生ものなので、古い「空きあり」は嘘になります。今あきでは、報告から60分たった情報は自動的に「情報なし」に戻します。少し不親切に見えるかもしれませんが、当てにならない情報を見せ続けるより誠実だと考えています。
そして、そもそも押さなくても正しくなるところは、押さなくて済むようにしました。
営業時間を登録しておけば、時間外は自動的に「営業時間外」になります。夜18時から翌2時まで、のように日をまたぐ営業にも、昼と夜で分かれる2部制にも対応しています。「本日は営業終了」のボタンは、18時間たつと自動で解除されます。押しっぱなしのまま翌日ずっと閉店表示、を防ぐためです。
「その日」の区切りも、0時ではなく朝5時にしてあります。深夜まで営業しているお店にとって、日付が変わった瞬間に「昨日」になってしまうのは実感に合いません。
お店の言い分と、お客さんの言い分が食い違ったら
今あきでは、お店だけでなく来店したお客さんも空き状況を報告できます。お店が忙しくて更新できないときでも、情報が途切れないようにするためです。
ところが、これを入れた瞬間に厄介な問題が生まれます。両者が違うことを言ったら、どちらを表示するのか。
最初は「お店の報告を60分まるごと優先する」つもりでした。お店が言っているのだから、それがいちばん正しいはずだ、と。
でも、考え直しました。今あきは「更新は任意です」と案内しているサービスです。忙しければ押さなくていい、と自分で言っている。ということは、お店が状態を戻し忘れるのは、想定外ではなく想定内です。
満席になったのに「空きあり」のままになっている。それを60分間、お店の言い分として守り続けたら、その間ずっと満席の店へお客さんを送ることになります。押し忘れを責めるのではなく、押し忘れる前提で作るべきでした。
そこで、お店の報告が単独で通るのは最初の20分だけにしました。それを過ぎたら、より新しい来店者の報告に譲ります。
逆の心配もあります。来店者の報告1件で、お店の言い分をひっくり返していいのか。見間違いもあれば、悪意もありえます。だから、20分以内にお店の表示を上書きするには、来店者の報告が2件そろって、同じことを言っている必要があります。1件では覆りません。
画面の上でも、その情報が「お店から」なのか「来店者から」なのかは区別して見せています。同じ「空きあり」でも、どちらが言っているかで受け取り方は変わるはずなので。
空いたら知らせる。ただし、一度だけ
満席のお店には、「空いたら通知する」を付けられます。行きたいお店が埋まっているとき、何度も開いて確かめるのは面倒です。
この通知には、決めごとが一つあります。一度送ったら、それで終わりです。空席に変わった瞬間に1通だけ送って、購読はその場で自動的に消えます。次に満席になっても、また空いても、もう送りません。
繰り返し送ると、あっという間に「無視される通知」になるからです。通知は、鳴った回数ではなく、鳴ったときに見てもらえるかどうかで価値が決まります。
通知の仕組み自体は、灰なうと同じく自前で書きました。ブラウザへ届ける通知は暗号化が必要なのですが、仕様書に公式のテストデータが載っているので、自分の実装の出力と1バイトずつ突き合わせて正しさを確かめています。
もうひとつ、地味な守りを入れてあります。通知の送り先として登録できるのは、既知のプッシュサービスだけにしました。どんなURLでも登録できるようにしてしまうと、「サーバーに、指定した場所を代わりに叩かせる」道具として使われてしまうからです。
お店専用のURLと、見えない鍵
お店側の管理には、会員登録の代わりに専用の管理URLを発行する方式にしました。ただ、URLを知っている人なら誰でも空席状況を書き換えられてしまうのは避けたかったので、発行するトークンはサーバー側でハッシュ化して保存し、平文のままは残さないようにしています。また同じ場所から短時間に何件も登録されることを防ぐため、登録には簡単な回数制限も設けました。会員登録なしの手軽さと、いたずら操作への備えを両立させる部分は、地味ですが作りながら一番気を配ったところです。
その回数制限で、全店舗を待たせていた
その「回数制限」で、笑えない間違いをしました。
お店の状態更新には、連打を防ぐために「30秒に1回まで」の制限を入れてあります。回数を数えるには、誰の分を数えているのかを表す鍵が要ります。ここに、お店ごとの識別子ではなく固定の文字列を入れていました。
つまり、全店舗が同じ1個のカウンタを共有していたのです。どこか1店が更新したら、その30秒間は他のすべてのお店が更新できない。
掲載店舗が2〜3店のうちは、まず気づけません。同時に更新すること自体が起きないからです。店が増えてきて初めて「たまに更新できない」という形で表に出て、しかも再現しにくい。いちばん厄介な種類の不具合でした。
掲載店舗がまだ無いうちに見つかったのは、単純に運が良かったと思っています。
通報が来ても、自動では消さない
誰でも登録できる仕組みである以上、実在しないお店や、内容のおかしい登録が入る可能性があります。だから、おかしいと思ったら通報できるようにしてあります。
ただし、通報が一定数を超えたら自動で非表示、という作りにはしていません。
自動で消せるということは、示し合わせて通報すれば、誰でも気に入らない店を消せるということだからです。掲載を止めるのは、お店にとってかなり重い結果です。通報は運営に届くだけにして、実際に外すかどうかは必ず手で判断しています。
手間はかかりますが、この規模なら人が見たほうが確実です。通報そのものにも、同じ人が同じ店に繰り返し押せないよう1日1回の制限をかけています。
消すまでの時間を、分けた
登録されたお店の情報を、いつまで載せておくか。これも迷いました。
ずっと載せ続けると、閉店したお店がいつまでも一覧に並びます。かといって早々に消すと、しばらく更新しなかっただけのお店まで消えてしまう。登録し直してもらうのは、お店にとってかなりの手間です。
そこで、「隠す」と「消す」を分けました。
60日間まったく動きがないお店は、一覧や地図から外れます。閉店している可能性があるので、お客さんの導線には出しません。ただし情報は残っていて、消えるのは1年たってからです。そして、管理画面を開くだけで期限は延びます。何かボタンを押す必要もありません。
古い情報を見せない、というお客さん側の都合と、勝手に消さない、というお店側の都合。両方を立てるには、1本の線ではなく2本要りました。
まだ語れないことは、語らない
お店の詳細ページには、時間帯ごとの混み具合の傾向を出す欄があります。過去30日ぶんの報告を、時間帯別に集計したものです。「このお店は19時台が混みやすい」が分かれば、行く時間を選べます。
ただし、報告が20件に満たないお店や、3つの時間帯にしかデータが無いお店では、このグラフを出しません。
3件の報告から「19時台が混む」と言うのは、傾向ではなくただの偶然だからです。厄介なのは、データが3件でもグラフは描けてしまうことです。棒が並んでいれば、読む人はそこに意味を見ます。描けることと、言っていいことは違います。
これは新しく登録したお店ほど当てはまる話なので、しばらくのあいだは誰の詳細ページにもグラフが出ません。少し寂しい画面になりますが、当てにならない傾向を見せるよりはいいと思っています。
お店を募集しています
正直に書くと、今あきはまだ生まれたばかりのサービスで、掲載店舗はこれからです。
ここまで書いてきた仕組みは、どれもまだ本番で試されていません。お店の言い分と来店者の言い分が食い違う場面も、まだ一度も起きていない。この記事は、使われる前の設計の記録です。
だからこそ、この仕組みに共感してくれる最初のお店を探しています。登録は無料で、最短1分。専用のURLからワンタップで空席を発信できます。「満席だと思われて素通りされる」機会損失を減らしたい飲食店・カフェ・サロンの方は、ぜひ試してみてください。
「いま、空いてる?」に答えられる街は、お店にとってもお客さんにとっても、少し優しい街だと思うのです。