上原正吉(EarthLink Network Co., Ltd.)。Claude Codeを開発の主体に据え、20を超えるプロダクトを1人で同時に開発・運用しています。これは、その現場の実測記です。

ELN Billing です。Stripe(決済サービス)を包み、契約・クーポン・都度課金・紹介報酬・返金までを1つのAPI群で扱います。決済や解約が起きると、署名付きのWebhook(サーバー間の自動通知)で各サービスへ知らせます。前回は通知基盤の話をしました。今回は同じ並びの課金です。どのSaaSにも必ずある機能を、製品ごとに作らず基盤に寄せる話の2つ目です。

発端は実装量の確認でした。ある既存サイトの決済まわりを数えると、サブスクリプション関連だけでファイルが30を超えていました。Stripeとの連携、契約状態の管理、クーポン、返金の運用。これを新しいSaaSを立ち上げるたびに複製していくのは、書く量の問題だけではありません。返金や課金トラブルの対応が各サイトに分散し、利用者もサービスごとに別の管理画面を見せられます。
目指す形は、Appleの App Store と同じ考え方にしました。決済は1か所、機能は各アプリ。支払いと契約の管理は基盤が引き受け、その先の「何ができるか」は各サービスが決める、という分担です。
利用する側のSaaSから見ると、ELN Billingは次の形をしています。

作っている途中、あるサービスから「プランごとの機能上限(たとえば実行間隔の下限値)を基盤側で持って、強制してほしい」という依頼が来ました。課金の基盤なのだから、プランと機能の対応表もそこに置くのが自然に聞こえます。
私はこれを実装しませんでした。基盤がその値の意味を理解した瞬間、基盤はそのサービス固有の知識を背負います。次のサービスが別の上限の概念を持ち込めば、また基盤に定義が増える。課金基盤は「壊れたら全サービスの決済が止まる」位置にあるので、そこに各サービスの仕様が雪だるま式に溜まっていく未来は避けたいのです。
代わりに、プランには各サービスが自由な形式で値を書き込める欄を用意しました。監視系のサービスなら「監視対象は50個まで・最短実行間隔は60秒」、AIワークスペースなら「クレジット追加購入の単価と、作成数の上限なし」のように、各サービスが自分の言葉で書きます。機能の意味・値・強制は各サービスが所有し、基盤は中身を解釈せずに配るだけです。
この分担は、やってはいけないことの形でも文書にしています。「個別サイトに価格をハードコードしない」「基盤で権限・機能制限を定義しない」「プラン名の文字列一致でプランを識別しない(必ずプランIDで紐付ける)」。「契約しているか」までが基盤、「だから何ができるか」からは各サービス。この一線を引いたことで、課金を集約しても、基盤が全サービスの機能仕様を抱え込まずに済んでいます。

もう1つ「持たない」と決めたのが認証です。課金基盤は誰がどのサービスを契約しているかを扱うので、ログインの仕組みを自前で作りたくなります。ここは、先に紹介した社内の認証基盤(ELN ID)へ委譲しました。利用者のIDは全サービスで統一され、課金基盤は認証の結果だけを受け取ります。
委譲すれば楽になる、とだけ書くのは正確ではないので付け加えます。認証を外に出した代わりに、検証環境を1つ増やすたびに、その環境の戻り先URLを認証基盤側にも登録する、という運用作業が残りました。委譲は実装を消しますが、外部との結び付きは増えます。
Stripe側の構成も、選択肢を比べて決めています。サービスごとにStripeアカウントを分ける案は、集約の意味がなくなるので却下。Stripeのマルチアカウント連携機能(Connect)は、手数料構造が変わり運用も複雑になるので却下。採ったのは、1つのStripeアカウントに全サービスの決済を流し、決済ごとの付帯情報(メタデータ)にサービスID・プランID・利用者IDを焼き込んで識別する方式です。Stripeの管理画面1つで全サービスの売上が見え、どの決済がどのサービスのものかは付帯情報で機械的に振り分けられます。
Stripeから届くイベントの二重処理も基盤側で防ぎます。イベントIDを7日間の期限付きでデータベースに記録し、同じイベントが再送されてきても安全に読み飛ばします。決済イベントは「たまに同じものが2回届く」前提で作るのが正解です。
各サービスへの通知は、事故が起きやすい境界なので仕様を細かく固めています。
この基盤で一番学びが多かったのは、2026年4月の「通知が届かない」5連戦です。時系列で書きます。
1戦目(署名形式の不一致)。 送信側は本文だけに署名し、受信側は「送信時刻+本文」への署名を期待していて、全件が改ざん扱いで拒否されていました。根因は仕様書に署名の式が書かれておらず、両側が独自に解釈していたこと。このとき署名式を仕様書に明記し、送受で一致することを契約テストにしました。
2戦目(3層の連鎖設定不備)。 署名を直しても届きません。誤った仮説を3回経た後にたどり着いた真因は、設定の3連鎖でした。Stripeに通知先が1件も登録されていない。配信環境に検証用の秘密値が設定されていない。データベース上の通知先URLが http://localhost:3000 のまま。どれか1つでも欠けると全体が沈黙します。対策として、localhost系URLをAPIで拒否し、3層を1コマンドで検証するスクリプトを作り、本番設定のチェックリストを整備しました。
3戦目(投げ捨てた非同期処理)。 まだ届かないケースが残ります。今度は送信処理が「投げっぱなし」(結果を待たずに処理を終える書き方)になっていて、サーバーレス実行環境が処理終了と同時に実行中の送信を凍結・中断していました。送信を全箇所で待つ形に直し、「処理が終わる時点で送信が完了済みである」ことを検査する回帰テストを追加しました。サーバーレスでは投げっぱなしは壊れます。
4戦目(受信側の設定と壊れたビルド)。 それでも届かない最後の1件は、受信側サービスの秘密値が未設定で、しかもその受信側はビルドパイプラインが2日間壊れていて設定を追加しても反映されない状態でした。このとき決めたのが「受信側の応答本文を最初に見る」「実機の通し検証は、すべての仮説に優先する」です。以後、通知の配送を実際に流して確かめるスクリプトをデプロイの必須ゲートにしています。
推測で直しては外す、を4回繰り返して学んだことは1つです。境界をまたぐ機能は、両端の実物を見るまで直ったと言わない。
新しいSaaSがこの基盤に乗るときの手順は、型が決まっています。
クーポンの運用も基盤側でまとまっています。割引率か固定額、有効期間、全体の利用回数、1人あたりの回数、対象プラン、対象サービスを設定でき、管理画面で作るとStripe側のクーポンにも自動で同期されます。割引が100%になる場合はカード入力そのものを省略できます。無料キャンペーンでカード番号を求めて離脱される、という定番の取りこぼしへの対応です。
クレジット(前払いの利用枠)には、購入分と特典分の区別があります。特典分には有効期限があり、残高を読むときに期限切れを清算する方式にしました。期限切れを消すためだけの定期実行を持たない、という運用コストの判断です。
課金基盤には「だいたい合っている」がありません。2026年9月には、決済に関わる経路を集中的に洗い直し、16件の不具合を修正して、7つの決済経路すべてを実機で通し検証しました。代表的な直しを2つ挙げます。
このリポジトリの最初のコミットは2026年3月1日です。その初日のうちに、認証連携・データベース・Stripe連携・決済ページ・Webhook処理・契約管理・管理画面・売上分析・署名付き通知・配信設定までの土台を19コミットで一気に組みました。AIとの開発では、最初の1日で「動く全体」を作り切って、以後は実際の利用で見つかる問題を潰していく進め方が合っています。
以後6か月でコミット172件。実装はTypeScript 233ファイル・約32,000行。仕様書17本、テスト258件(うち実データベースを使う統合テスト9ファイル)、ブラウザ経由の通し検証4本。決済という性質上、テストの厚みは他の製品より意図的に厚くしています。
置き場所は独立リポジトリです。コーポレートサイトに同居させる案も共通リポジトリに入れる案もありましたが、「課金は壊れたら全SaaSが止まる。ほかの変更に巻き込まれる場所に置かない」を優先しました。通知基盤notifyが共通リポジトリ入りを選んだのと逆の判断で、同じ「基盤」でも壊れたときの影響範囲で置き場所は変わります。
2026年9月にpre-GA版(v0.9)を本番リリースし、最初のSaaSが実際の課金をこの基盤経由で回しています。2つ目のサービスの接続が進行中で、登録予定は計6サービス。正式版(v1.0)のスコープも8機能で確定済みです。利用者向け画面と運営の管理画面は、別ドメイン・別配信に分離して稼働しています。
この共通基盤(認証・通知・課金など)についての記事は、開発の経緯・どんな機能があるか・どう実装したかを、順次シリーズとして公開していきます。 興味のある方は、ぜひ「いいね」と記事の購読をお願いいたします。
ここで紹介した基盤の上で動く自社プロダクトは https://www.eln.ne.jp/products にまとめています。
上原正吉。EarthLink Network Co., Ltd. でAI開発をしています。2025年からClaude Codeを開発の主体に据え、今は20を超えるプロダクトを1人で同時に開発・運用しています。この連載では、その現場で実際に起きたこと(うまくいったことも、失敗も)を、数字と一緒に書いていきます。
また、AIで業務や開発を組み替えたい会社・チーム向けに、AI活用のコンサルティングも受け付けています。ご相談は www.eln.ne.jp からどうぞ。
EarthLink Network は、会社の全業務を AI で回すために、必要になったものを自社で作っています。いま作っているプロダクトの一覧と概要は、こちらにまとめています。
→ EarthLink Network が自社でつくっている18のプロダクト
会社と各プロダクトの詳細は、公式サイト www.eln.ne.jp をご覧ください。