会員サイトを月500円で運営|100名規模ならこの構成で十分
会員制のサービスを始めたい。けれど、月額いくらかかるのか分からない。それが怖くて一歩が踏み出せない、という相談をよく受ける。
調べてみると、会員サイト構築SaaS(月額制のウェブサービス)は月額1万円から、高いものだと月額3万円を超えるものもある。月100名の会員から月額500円もらっても売上は5万円。そこから運営コストに3万円持っていかれたら、手元に残るのは2万円だ。これでは事業として成立しない。
でも、実は月500円で動かす方法がある。100名規模までなら、この構成で十分回る。今日はその具体的な中身を、順を追って話していきたい。
この記事の前提
この記事は、これから有料の会員制サービスを立ち上げたい個人事業主に向けて書いている。想定しているのは、月額500円から2,000円ほどの少額課金で、会員数100名前後の小さなコミュニティだ。
大規模SaaS(数万人規模の月額サービス)を作る話ではない。ニッチな領域で、濃い関係性を作りたい人向けの内容だと思ってほしい。
技術者向けの内容に見えるかもしれないが、非エンジニアでも手順通りに進めれば組める構成にしている。分からない用語は都度言い換えるので、安心して読み進めてほしい。
そしてもう一つ前提がある。私はこの記事で、既存のノーコードツールを否定する気はない。月1万円払ってもペイするなら、それはそれで正しい選択だ。ただ、スタート時点で固定費を3万円積むのは、小さく始めたい人には重すぎる。その前提で話を進める。
なぜ月500円で動くのか

図: 会員サイトに必要な4つの機能
まず全体像から話そう。会員サイトに必要な機能を分解すると、大きく4つしかない。
・会員登録とログインの仕組み ・月額課金の決済と解約 ・会員だけが見られるコンテンツの出し分け ・会員情報の保管と管理
この4つを、月額制のオールインワンSaaSで揃えると1万円から3万円かかる。しかし、個別の無料枠の大きいサービスを組み合わせると、100名規模までは実質ほぼ0円で動く。実際にかかるのは、ドメイン代と決済手数料くらいだ。
具体的にはこの組み合わせになる。
・Vercel(ブイセル、ウェブサイトを公開する無料枠のあるサービス)でサイトを公開 ・Supabase(スーパーベース、データベースとログイン機能を提供する無料枠のあるサービス)で会員情報を管理 ・Stripe(ストライプ、月額課金を扱う決済サービス)で課金と解約を自動化 ・独自ドメインを年1,500円ほどで取得
Vercelの無料枠は個人利用なら余裕で足りる。Supabaseの無料枠は月5万リクエスト、データベース500MB、認証ユーザー5万人まで。100名規模なら指一本も触れない。Stripeは固定費0円で、決済が発生したときだけ手数料3.6%が引かれる。
つまり、月500円の正体は、ドメイン年1,500円を12ヶ月で割った125円と、決済手数料の変動費と、念のための予備費を合わせた金額だ。正確に言えば月額の固定費は125円で済む。タイトルで月500円と書いたのは、最初の1年分の余裕を見た数字である。
ここまで読んで、本当にそんな都合のいい話があるのかと疑う気持ちは分かる。だから、この後で1つずつ具体的に組み方を見ていく。
参考になる事例
事例1:趣味の収集家向けニッチコミュニティ
ある個人事業主が、かなり狭いジャンルの収集家向けに月額980円の会員サイトを運営している。会員は約80名。特別高価な情報を売っているわけではなく、週1回の勉強会と、会員限定の掲示板へのアクセス権がコンテンツだ。
月の売上は約7.8万円。運営コストは決済手数料を除くと数百円。残りはほぼ丸ごと手元に残る。その人は本業を別に持っていて、この会員サイトは副業として始めた。小さく始めたからこそ、会員1人1人と丁寧にやり取りができるのがこの規模のよさだと話していた。
重要なのは、会員80名のうち、過去2年で解約した人が10名以下だということ。小さいコミュニティはLTV(エルティーブイ、顧客が辞めずに払い続けてくれる累計額)が伸びやすい。
事例2:士業の勉強会コミュニティ
別のある士業の方は、同業者向けの月額1,500円の勉強会コミュニティを運営している。会員は約60名。月1回のオンライン勉強会と、過去の録画アーカイブ、質問掲示板がコンテンツだ。
こちらも技術的にはこの記事で紹介する構成に近い。本人はエンジニアではないが、技術に詳しい知人に初期設定を依頼し、運用は自分でやっている。月の売上は9万円。運営コストは年間で2万円ほど。
この事例で面白いのは、会員サイトそのものが収益源というより、同業者との繋がりを深める場として機能し、そこから本業の紹介案件が年間数百万円単位で生まれているという点だ。会員サイトはフロントエンドであって、バックエンドの本業に繋ぐための導線でもあるという発想は、覚えておいて損はない。
事例3:海外のインディーハッカー
海外のインディーハッカー(個人開発者)のコミュニティを見ていると、月額5ドルから10ドルの小さな会員サイトを運営している人が大量にいる。多くはStripeとSupabaseに相当する構成で組まれている。
印象的だったのは、会員50名で月額10ドルの会員サイトを運営している開発者の話だ。月の売上は500ドル。本人はこれで生活しているわけではなく、もっと大きな本業がある。ただ、この小さな会員サイトが、本業のユーザー調査の場としても機能しているらしい。会員と直接話せる距離が、事業のヒントを大量に生んでいるそうだ。
小さな会員サイトは、売上だけで見てはいけない。情報源としての価値も大きい。
具体的な手順

図: 月500円構成の構築ステップ
ここからは、実際に月500円構成を組むための手順を話していく。非エンジニアでも手を動かせるように、ステップごとに分けていく。
ステップ1:Supabaseでプロジェクトを作る
Supabaseは、データベースとログイン機能をセットで無料で使えるサービスだ。まずこれにアカウントを作り、新しいプロジェクトを立ち上げる。
プロジェクトを作ると、自動的にPostgreSQL(ポストグレスキューエル、業界標準のデータベース)が1つ用意される。会員情報を入れるテーブル(表のこと)を1つ作っておく。たとえばこんな構造だ。
・id(会員の識別番号) ・email(メールアドレス) ・stripe_customer_id(決済サービス側の顧客ID) ・subscription_status(有効か解約済みかの状態) ・created_at(登録日時)
これだけあれば、会員管理としては十分回る。最初から項目を増やしすぎないのがコツだ。後から追加する方が、設計を間違えたときのリカバリが楽になる。
ステップ2:認証とRLSの設計
認証というのは、ログインの仕組みのこと。Supabaseにはこれが最初から組み込まれているので、自分で一から作る必要はない。メールアドレスとパスワード、あるいはGoogleログインを数クリックで有効化できる。
ここで大事なのが、RLS(アールエルエス、行レベルセキュリティという機能)の設定だ。簡単に言えば、ログインした本人のデータしか読み書きできないようにするルールのこと。
なぜこれが必要か。RLSを設定しないと、Aさんがログインしたときに、技術に詳しい人ならBさんの情報まで見られてしまう状態になる。会員制サイトでこれが起きたら一発でアウトだ。
RLSの基本的なルールはこういう形になる。
・会員テーブルは、ログイン中のユーザーが自分のレコードのみ読み取れる ・コンテンツテーブルは、subscription_statusがactive(有効)の会員だけが読み取れる ・書き込みは管理者だけが可能
このルールを最初に1回設定しておけば、あとは自動で守られる。ここを手を抜くと、後から全部直すことになるので、必ず最初にやってほしい。
ステップ3:Stripeで月額課金を設定する
Stripeは決済サービスだ。アカウントを作り、ダッシュボードで商品(Product)を1つ作る。たとえば月額500円の会員プランという商品だ。
Stripeには Checkout という機能がある。これはStripeが用意してくれる決済ページで、自分でフォームを作らなくても、URLを1つ発行するだけでクレジットカード決済ができる。非エンジニアにはこの機能が神がかっている。
流れとしてはこうなる。
- 読者がサイトで会員登録をする
- Stripe Checkoutに飛ばし、カード情報を入れてもらう
- 決済が成立したら、StripeがWebhook(ウェブフック、イベント通知の仕組み)で自分のサイトに通知を送る
- その通知を受け取って、Supabaseの会員テーブルの subscription_status をactiveに更新する
この4ステップを組めば、月額課金が自動で回る仕組みは完成だ。
ステップ4:コンテンツゲーティング
コンテンツゲーティングというのは、会員だけに特定のページを見せる仕組みのことだ。ここで先ほどのRLSが効いてくる。
具体的にはこういう動きになる。会員限定ページを開くと、サイトはまず「この人はログインしているか」を確認する。ログインしていなければログインページに飛ばす。ログインしていたら「この人の subscription_status はactiveか」を確認する。activeであればコンテンツを表示し、そうでなければ課金ページに誘導する。
Next.jsで書くなら、こんなイメージのコードになる。
// app/members/page.tsx の抜粋
const { data: { user } } = await supabase.auth.getUser()
if (!user) redirect('/login')
const { data: member } = await supabase
.from('members')
.select('subscription_status')
.eq('id', user.id)
.single()
if (member?.subscription_status !== 'active') {
redirect('/subscribe')
}
return <MembersContent />
コードが苦手な人でも、やっていることは日本語で読める。ログインしているか確認し、有効な会員か確認し、そうでなければ別ページに飛ばす。それだけだ。
ステップ5:解約フローの自動化
解約フローは、意外と見落とされがちだ。ここを手作業にすると、会員が増えたときに破綻する。月100名規模でも、解約対応を手動でやると月に数時間持っていかれる。
Stripeには Billing Portal(ビリングポータル、請求管理ページ)という機能がある。これを使うと、会員が自分で解約・カード情報変更・請求書ダウンロードなどを全部できる画面を、Stripe側が勝手に用意してくれる。こちらはリンクを1本貼るだけでいい。
解約が発生すると、StripeからWebhookで通知が来る。先ほどの仕組みと同じで、その通知を受け取って、Supabaseの subscription_status を canceled に更新する。これで解約処理は完了だ。
大事なのは、解約したユーザーのデータをすぐに消さないこと。過去の会員だった記録として残しておくと、後で復帰してもらえたときにスムーズに戻せる。また、解約理由のアンケートをStripe Billing Portal上で収集するよう設定しておくと、改善のヒントが集まる。
月500円構成の内訳を細かく見る

図: オールインワンSaaS vs 月500円構成
ここまでで仕組みは分かったと思う。ではコストを、もう一段細かく見ていこう。
確実にかかる固定費
・独自ドメイン:年1,500円(月125円)
これは必須だ。無料のサブドメイン(他社ドメインの末尾に自分の名前が付く形式)でも動くが、有料サービスを無料ドメインで提供するのは信用の問題で避けた方がいい。
無料枠で収まるもの
・Vercelのホスティング:個人利用無料枠で月100GBの転送量まで無料 ・Supabaseのデータベースと認証:月5万リクエスト、500MBストレージ、5万認証ユーザーまで無料 ・Stripeの月額利用料:0円(決済のときだけ手数料がかかる)
100名規模なら、どれも一桁以上の余裕がある。
変動費
・Stripeの決済手数料:決済額の3.6% ・月額500円で100名の会員なら月1,800円、月額1,500円で100名なら月5,400円
この変動費は売上から自動的に引かれる形になる。固定費としては計算しなくていい。
合計
月の固定費は125円。年間で1,500円。これを月額換算するときに余裕を見て月500円と呼んだ、というのがタイトルの真相だ。
もう少しリッチにするなら、決済手数料を加味しても、売上に対して5%以下で運営できる。SaaSのオールインワン会員サイトを使うと売上の30%から60%が運営費になる現実と比べて、圧倒的に軽い。
よくある失敗と落とし穴
順調そうに聞こえる話でも、実際に組んでみると落とし穴はある。私が見てきた中でも多い失敗を共有しておきたい。
失敗1:RLSを後回しにする
最初に動くものを作ろうとして、RLSを後回しにする人がいる。これは本当にやめてほしい。先ほども書いた通り、設定せずに公開すると、他人のデータが見える状態で運用が始まってしまう。
会員が増えてから慌ててRLSを入れると、テストケースが増えて検証が地獄になる。最初の1人目を登録する前に、必ずRLSを有効化してほしい。
失敗2:Webhookの署名検証を省く
StripeからのWebhook通知には、本物かどうかを確認する署名(サイン、本物証明のこと)が付いている。これを検証せずに受け取ると、悪意のある第三者が偽の通知を投げて、勝手に会員権を有効化できてしまう。
チュートリアルには必ず署名検証のコードが書いてあるので、それを省かずに入れる。ここを省くと、有料会員のサイトにタダ乗りされる脆弱性(ぜいじゃくせい、セキュリティの穴)が生まれる。
失敗3:テスト環境と本番環境を分けない
Stripeにはテストモードと本番モードがある。同じく、Supabaseも開発用と本番用でプロジェクトを分けられる。この2つを最初から分けずに運用を始めると、テストのつもりで実行した処理が本番の会員情報を書き換えてしまう事故が起きる。
面倒でも最初から分ける。分けていないプロジェクトは、100名を超える前に必ず事故る。
失敗4:解約を手動で処理する
先ほども触れたが、解約をメール対応にしている人は本当に多い。会員数が少ないうちは成立するが、50名を超えると月に数回は解約申請が来るようになる。その都度手動で対応していると、疲弊して事業が嫌になる。
Stripe Billing Portalのリンクを会員ページに貼っておくだけで、この作業は消える。最初から自動化しておけば、精神的な負担が全然違う。
失敗5:会員規約と特定商取引法の表記を忘れる
技術の話ばかりしてきたが、有料会員を扱う以上、法律面の整備は必須だ。日本で有料サービスを提供する場合、特定商取引法に基づく表記が義務付けられている。これを書いていないサイトは、決済代行会社の審査で落ちることもある。
会員規約、プライバシーポリシー、特定商取引法に基づく表記。この3つは必ず用意してからローンチしてほしい。雛形は行政書士事務所のサイトや、業界団体の公開ページにある。
失敗6:初期会員に期待しすぎる
これは技術の話ではなく運用の話だが、立ち上げ初月で100名集まると思ってはいけない。実際は最初の3ヶ月で10名から30名あたりに着地することが多い。100名は、半年から1年かけて到達する目標と思ってほしい。
月500円構成の強みは、会員が少ない時期でも赤字にならないこと。焦って広告を打たなくて済む。ゆっくり育てる時間を、この構成は買ってくれる。
明日からやる3つのこと
長くなった。最後に、この記事を閉じた後にすぐ動ける3つのアクションを渡したい。
- Supabaseで無料アカウントを作り、プロジェクトを1つ立ち上げる
まず触ってみることから始めてほしい。Supabaseのダッシュボードは日本語表示には対応していないが、英語表記でも操作はクリックだけで済む。会員テーブルを作り、認証を有効化するところまでなら、30分で終わる。動くものに触れるのが一番速い。
- Stripeでテストモードの商品を1つ作り、Checkoutのリンクを発行する
Stripeもアカウント作成は無料だ。商品(Product)を作り、月額500円のプランを設定し、Checkoutのテスト用リンクを発行する。自分で自分のテスト決済を実行してみる。ここまでやると、月額課金というものが遠い技術ではなく手元で動く仕組みだと体感できる。
- 会員サイトで提供するコンテンツを紙に書き出す
技術構成が分かったら、中身を考える番だ。週1回の記事なのか、月1回の勉強会なのか、掲示板でのQ&Aなのか。100名規模のサイトで大事なのは、規模より距離感だ。何を提供するかを紙に書き、3ヶ月続けられそうかを自分に問う。
続けられそうだと思えたら、その瞬間にあなたの会員サイトは半分完成している。残りの半分は、この記事で紹介した手順を1つずつ進めるだけだ。
月500円で動く会員サイトは、派手な事業にはならない。ただ、ひとりで小さく始めて、会員1人1人と丁寧に向き合う時間を作る器としては、これ以上ない構成だと思う。ぜひ試してみてほしい。




