クローズドコミュニティ向けのイベント出欠管理・集金ツール。 出欠確認から集金まで、リンク1本でまとめて管理。
みんなの集金 (EventPay) は、イベントの出欠確認と集金を一体化し、幹事・会計担当の運用負担を減らすことを目的としたWebアプリケーションです。 Next.js App Router を中心に、Supabase と Stripe(Connect含む)を組み合わせ、Cloudflare Workers 上にデプロイする構成です。
従来の課題:
- 出欠確認はLINE、集金は現金手渡し→二重管理・抜け漏れ
- 会計担当が現金を立て替え→精神的・金銭的負担大
- 誰が払ったか分からず、催促の手間がかかる
本システムの解決策:
- Stripeでキャッシュレス集金
- 出欠・決済を1つのシステムで統合管理
- リマインダー自動送信で催促業務も自動化
想定ユースケース:
- 大学サークル / 社会人サークル
- PTA / 町内会
- スポーツチーム
- 小〜中規模クローズドコミュニティのイベント運営全般
- コミュニティ作成・切り替え(現在選択中コミュニティを軸にしたワークスペース型UI)。
- コミュニティ設定の確認・編集・削除。
- コミュニティ公開ページ、問い合わせフォーム、特商法ページの提供。
- 現在選択中コミュニティ配下でのイベント作成・管理。
- 支払い設定(無料 / 現金のみ / オンライン決済 / 両方)。
- 出欠回答期限・支払い期限・猶予期間などの期限管理。
- 参加者・決済状況に応じた編集制限(変更検知)。
- トークンベース招待(参加者はアカウント不要でゲスト参加)。
- 定員管理と出欠状況の可視化。
- 現金集金のステータス追跡(手動管理)。
- Stripe Checkout によるオンライン決済。
- Stripe Connect(Express)による主催者口座への振込導線。
- コミュニティに紐づく payout profile を基準にした受取先管理。
- 冪等性を意識した決済リトライ設計。
- 期限前の自動リマインダー。
- メール通知(Resend)、管理者通知(Slack連携)。
- CSVエクスポート、メンテナンスモードなどの運用機能。
主要技術:
- Next.js 15(App Router / Server Actions)
- React 19 / TypeScript 5
- Supabase(PostgreSQL / Auth / RLS)
- Stripe(Checkout / Connect Express)
- Cloudflare Workers(OpenNext 経由)+ R2(インクリメンタルキャッシュ用途)
周辺:
- Tailwind CSS / shadcn/ui
- React Hook Form / Zod
- Upstash Redis(レート制限)
- QStash(非同期処理)
- Resend(メール)
- Jest / Playwright / ESLint / Prettier
このリポジトリは、app/(UI・ルーティング)→ features/(ドメイン/ユースケース)→ core/(横断ユーティリティ)というレイヤを意識した構成です。
依存関係の逆流を防ぐため、ルールをESLint等で強制する前提の設計です。
設計の詳細や意思決定の背景については、以下のドキュメントを参照してください。
- アーキテクチャ詳細 - システム構成、シーケンス図、レイヤ設計
- 主要業務フロー - イベント作成、出欠回答、決済などのプロセス詳細
- データモデル - ER図、テーブル定義、状態遷移
- セキュリティモデル - 認証・認可 (RLS)、Webhook検証、レート制限
- ADR (Architecture Decision Records) - 技術的な意思決定の記録
- ビジネスルール - ドメイン知識、計算ロジック、制限事項
event-pay/
├── app/ # Next.js App Router ページ / ルーティング
│ ├── (app)/ # ログイン後アプリ(ダッシュボード / イベント / 設定)
│ ├── (auth)/ # 認証関連ページ
│ ├── (focus)/ # コミュニティ作成などの集中導線
│ ├── (marketing)/ # ランディング
│ ├── (public)/ # コミュニティ公開ページ / 法務ページ
│ └── api/ # API Routes & Webhooks
├── features/ # 機能モジュール(ドメイン)
├── core/ # 共有ユーティリティ(auth/logging/security等)
├── components/ # UIコンポーネント
├── supabase/ # migrations
└── wrangler.jsonc # Cloudflare Workers 設定
前提:
- Node.js 20+
- pnpm 10.11.1(Corepack経由)
- Supabase CLI(ローカルDB)
- Stripe CLI(Webhook転送が必要な場合)
手順:
git clone https://github.com/rytkhs/event-pay.git
cd event-pay
corepack enable
pnpm install --frozen-lockfile
cp .env.example .env.local
# .env.local を編集(最低限 Supabase / Stripe / App URL)
supabase start
pnpm run db:reset
pnpm run db:migrate
pnpm run dev
# http://localhost:3000
# 開発サーバー
pnpm run dev
# Lint / Format / Typecheck
pnpm run lint
pnpm run lint:fix
pnpm run typecheck
pnpm run format
pnpm run format:check
pnpm run check:all
Stripe Webhook(必要時):
pnpm run stripe:listen
このプロジェクトは Cloudflare Workers 上に OpenNext を用いてデプロイする構成です。
本番環境は minnano-shukin.com ドメインで動作します。
前提:
- Cloudflare R2 バケット
cacheを作成 wranglerでログイン- 本番用の環境変数を Cloudflare 側に設定
コマンド:
# プレビューデプロイ
pnpm run preview
# 本番デプロイ
pnpm run deploy
# アセットのみアップロード
pnpm run upload
# Cloudflare型生成
pnpm run cf-typegen
必須:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=
STRIPE_CONNECT_WEBHOOK_SECRET=
NEXT_PUBLIC_APP_URL=http://localhost:3000