楽チーム — スポーツクラブ運営プラットフォーム
スポーツクラブの会員管理・請求・出欠を一本化するマルチテナントSaaS。Cloudflare Workers 上の GraphQL API と 3 つの SPA で構成しています。
- 担当範囲
- 企画・設計・開発・運用(フルスタック)
- 期間
- 開発・運用中
- 技術スタック
- Cloudflare Workers Cloudflare D1 (SQLite) Cloudflare Pages Hono GraphQL Yoga / Pothos React + Vite Relay Stripe Connect TypeScript
- マルチテナント設計。1つの基盤で複数クラブを運用
- 管理・会員・運営の3 SPA を単一 GraphQL スキーマから型安全に生成
- Stripe Connect(direct charges)とサブスクリプションによる会費回収
- ビジネスロジック層はテストカバレッジ 100% を維持
何を解決するプロダクトか
スポーツクラブの運営は、会員名簿・月会費の回収・出欠連絡・保護者への連絡といった仕事が、 紙とスプレッドシートと個人の LINE に分散しがちです。楽チームは、これらを 1 つの プラットフォームにまとめ、クラブの運営者が「集金と名簿の管理」ではなく「指導」に 時間を使えるようにするための Smart Clubhouse OS です。
アーキテクチャ
サーバは Cloudflare Workers 上の Hono + GraphQL Yoga + Pothos。データベースは
Cloudflare D1(SQLite)で、常に env.DB バインディング経由でアクセスします。
本番も、ローカルの wrangler dev も、テストランナー(vitest)も同じ経路を通るため、
「ローカルでは通るが本番で落ちる」種類の差分が原理的に発生しません。
フロントエンドは役割ごとに 3 つの SPA に分かれています。
| アプリ | 用途 | データ取得 |
|---|---|---|
web | クラブ管理者向け | Relay |
player | 会員・保護者向け | Relay |
ops | 自社運営向け(Cloudflare Access で保護) | graphql-codegen |
クラブ向けスキーマと運営向けスキーマはエンドポイントごと分離しており、運営専用の 操作がクラブ側のスキーマに漏れ出さない構造にしています。
認証と決済
認証は Google / LINE の id_token を検証したうえで、自前の HS256 セッション JWT を発行する
方式です。外部の認証 SaaS に月額を払わずに、保護者が普段使っているアカウントで
そのままログインできる状態を作っています。運営向けの ops のみ、アプリ層の手前で
Cloudflare Access が防ぎます。
会費の回収は Stripe Connect の direct charges + Subscriptions。売上はクラブごとの アカウントに直接入り、当社は決済フローの構築と運用だけを担います。
品質の作り方
services/ に置いたビジネスロジックはテストカバレッジ 100% を維持し、ユニット・
結合・E2E の各テストの結果を README のバッジとして常時可視化しています。仕様と
設計判断は docs/ にドキュメントとして残し、AI コーディングエージェント向けの
規約は CLAUDE.md に集約しています。人間にとっての設計書が、そのまま
エージェントへの指示書になる構成です。