山頂でしか使えないクーポンシステムをDjangoで作った話

はじめに

「ハイキングコースの山頂に電子看板を置いて、来た人だけにクーポンを配りたいんですが」

自治体担当者からそんな相談が来たとき、正直すぐにワクワクした。面白い課題だと思った。

ただ、ひとつ大きな問題がある。

QRコードは共有できる。

山頂まで行かなくても、友人からURLを教えてもらえばクーポンが手に入る。それでは「山頂まで来た人だけが得をする」という体験価値が崩れてしまう。

要件を整理する

やりたいことはシンプルだった。

  1. 決まった時間に電子看板にQRコードを表示する
  2. QRコードを読んだ人に、当日限り有効なクーポンを発行する
  3. URLを他人と共有されても使えないようにする

3番をどう実現するか、がこの案件の肝だった。

解決策:IP判別

山頂にはWi-Fiが設置されていた。

つまり、山頂のWi-Fiに接続した状態でアクセスしたリクエストと、それ以外を区別できる。山頂のIPアドレス以外からのアクセスは無効にする、これで解決できた。

同一Wi-Fi内の複数人が使えるのは仕様として問題なし。グループで山頂まで来てくれたなら、全員にクーポンを渡したい、という意図もあった。

Djangoでの実装

技術スタックはDjangoを選んだ。理由はシンプルで、IPの取得・判定・セッション管理・有効期限の処理が素直に書けるから。

処理の流れはこうなる。

QRコード読み込み

アクセス元IPを取得

山頂Wi-FiのIPと照合

一致 → 当日限りのクーポンを発行
不一致 → 「現地でお使いください」ページを表示

取得日の24:00に自動失効

有効期限は取得した日付の 23:59:59 をDBに保存しておき、アクセスのたびに現在時刻と比較する。期限切れなら「このクーポンは失効しました」を返す。これで運用側が何もしなくても自動で無効化される。

デジタルサイネージは外部アプリを選定

看板に表示するQRコードのスケジューリングは、既存のデジタルサイネージアプリを選定して使った。自前で作るより確実だし、コストも抑えられる。

「全部作る」ではなく「作るべきところだけ作る」判断は、このケースでは正解だったと思う。

やってみて思ったこと

技術的には難しいことは何もない。でも、こういう案件は好きだ。

「山頂まで来た人だけが得をする」という体験設計を、システムで担保するという仕事。コードを書いているというより、体験をデザインしている感覚がある。

観光振興や地域活性化の文脈でも、デジタルとリアルをつなぐ仕掛けはまだまだ面白いことができると思っている。

何か変わった仕掛けを作りたい方、ぜひ気軽に相談を。