
ケーススタディ PassNow
イベントページから入場ゲートまで、スマホの中の一枚のチケット。
- クライアント
- PassNow
- 種類
- チケッティングプラットフォーム
- 役割
- プロダクト&フルスタック開発
- 年
- 2026
01概要
イベントチケットの販売・管理プラットフォーム。購入者向けの公開カタログとチェックアウト、主催者・プロモーター・管理者向けのパネル、そしてオフラインでも動き続けるチェックイン用スキャナー。ひとつのコードベースから Web、PWA、Android アプリとして提供します。
02課題
チケットは多くの人の手を経ます。支払う購入者、売上を確認したい主催者、手数料を得るプロモーター、入口に立つスタッフ。そのどこもが弱点になり得ますし、コピーできたり二度読み取れたりするチケットには価値がありません。
02アプローチ
ルールはすべてサーバーに置き、チケットを秘密情報として扱う。フロントエンドはデータベースに一切触れず、誰が閲覧・販売・出金・入場許可をできるかは API が判断します。入口に電波がなくても、チケットは一度しか使えません。
03開発内容
実際につくったもの
- 01
REST API とだけ通信する Next.js 16 のフロントエンドと、Prisma と PostgreSQL を使い、データベース URL を持つ唯一のプロセスである NestJS 11 のバックエンド。48 モデルのスキーマの上に 25 のモジュールを構成し、短命な JWT と、ローテーション・失効が可能なリフレッシュトークンを HTTP-only Cookie で扱います。
- 02
Canvi 経由で PIX、クレジットカード、デビットカードに対応した 4 ステップのチェックアウト。カード番号と CVV は決済事業者へ直接送られ、PassNow が保存するのはブランドと下 4 桁だけです。チケットトークンはペッパー付き SHA-256 ハッシュと、認可された表示用の AES-256-GCM 暗号化コピーとして保存され、アカウントのないゲスト購入者はアクセスキーでチケットを開きます。
- 03
同じチケットで二度入場させないチェックイン。最初の読み取りはトランザクション内の条件付き更新で行い、操作者はイベントの主催組織に属している必要があり、すべての入場が監査ログに記録されます。オフライン時は読み取りを IndexedDB にキューイングして後で同期し、衝突はコンフリクトとして記録されます。
- 04
組織内ロール(オーナー、管理者、財務、マーケティング、チェックイン、サポート)、プロモーターと出金、管理画面。Google ログインは購入者のみに限定。同じアプリを更新通知付きの PWA として、また Capacitor による Android APK として配布しています。
技術
- Next.js
- TypeScript
- React
- Tailwind CSS
- NestJS
- Prisma
- PostgreSQL
- Zod
- Capacitor
- Docker
04体験





05現在の状況
バージョン 1.0.0 は 2026 年 6 月にリリースされ、PWA と署名済みの Android APK を提供しています。スクリーンショットは、デモ用シードデータで動かしたローカルビルドのものです。
