楽チーム — スポーツクラブ運営プラットフォーム

スポーツクラブの会員管理・請求・出欠を一本化するマルチテナントSaaS。Cloudflare Workers 上の GraphQL API と 3 つの SPA で構成しています。

担当範囲
企画・設計・開発・運用(フルスタック)
期間
開発・運用中
技術スタック
Cloudflare Workers Cloudflare D1 (SQLite) Cloudflare Pages Hono GraphQL Yoga / Pothos React + Vite Relay Stripe Connect TypeScript

何を解決するプロダクトか

スポーツクラブの運営は、会員名簿・月会費の回収・出欠連絡・保護者への連絡といった仕事が、 紙とスプレッドシートと個人の 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 に集約しています。人間にとっての設計書が、そのまま エージェントへの指示書になる構成です。