
2026/02/11 2:14
**Show HN:** *Stripe‑no‑webhooks – Stripe のデータを Postgres DB に同期する方法*
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
(欠落点を補ったもの) **
本記事では、Stripe データを PostgreSQL に保存する Next.js プロジェクトに対して、オピニオン化された stripe‑no‑webhooks ライブラリを追加する方法を説明しています。
インストールとセットアップ –
を実行し、その後npm install stripe-no-webhooks stripeでnpx stripe-no-webhooks init、.env、billing.config.tsと、webhook ハンドラをlib/billing.tsに作成します。app/api/stripe/[...all]/route.tsデータベースマイグレーション –
を実行して、製品・クレジット・使用量データの同期に必要な Stripe‑schema テーブルを生成します。npx stripe-no-webhooks migrateプランの定義 –
にサブスクリプションプラン(例: “Free”、 “Pro”)を価格間隔とともに宣言し、billing.config.tsクレジットやウォレット割り当て、使用量ベース課金などのオプション機能を設定します。api_calls製品・価格の同期 –
を使って Stripe の製品/価格を作成し、ID を設定ファイルに更新します。プロダクション環境では「Set up for production」として再度同期し、ライブデータを同期させて webhook エンドポイントを生成します。npx stripe-no-webhooks syncBilling クライアントの構成 –
でlib/billing.ts、billingConfig、successUrlを提供し、cancelUrl関数(例:Clerk 経由)を使用して billing インスタンスを作成します。resolveUserテスト –
を呼び出す;開発時にはcheckout({ planName: "Pro", interval: "month" })で Stripe webhook を転送します。stripe listen --forward-to localhost:3000/api/stripe/webhook使用機能 – ライブラリはクレジット(
)、ウォレット残高(billing.credits.consume)、および使用量(billing.wallet.consume)を自動で追跡します。billing.usage.recordやonSubscriptionCreatedなどのコールバックを通じてカスタムロジックを追加できます。onSubscriptionCancelled料金ページコンポーネント –
で準備済みnpx stripe-no-webhooks generate pricing-pageコンポーネントを生成し、UI にインポートします。<PricingPage />本番デプロイ –
に本番プランを追加し、再度同期を行い、環境変数(billing.config.ts、STRIPE_WEBHOOK_SECRET、STRIPE_SECRET_KEY、DATABASE_URL)を設定します。税金徴収、トップアップ、チーム課金、支払い失敗処理などの高度な機能も有効にできます。NEXT_PUBLIC_APP_URLこの簡素化されたワークフローにより、Next.js 開発者はカスタム webhook ロジックを書かずに堅牢なサブスクリプション請求を実装でき、生産性が向上し、洗練された価格モデルの構築が可能になります。
本文
Stripe‑No‑Webhooks
このライブラリを選ぶ理由
- Stripe の決済処理を手軽に実装できるオピニオン付きヘルパー
- コード内でプランを定義 → Stripe アカウントと自動同期
- 手動で Webhook を設定する必要がない ― ライブラリ側が Webhook を受信し、ローカル DB と同期します
- サブスクリプション・クレジット・ウォレット残高・トップアップ・使用量課金のシンプル API
- シートベースの請求、税額計算、プランのアップ/ダウングレード(適切なクレジット処理付き)に対応
- カスタムロジック用に
などオプションコールバックを提供onSubscriptionCreated
クイックスタート
このガイドは Next.js アプリと PostgreSQL データベースを想定しています。
ローカルで試すため、まずテストモードで始めましょう。
-
インストール
npm install stripe-no-webhooks stripe npx stripe-no-webhooks initすると次の入力が求められます:
- Stripe テストキー(例:
) – ダッシュボードから取得sk_test_… - データベース URL – PostgreSQL 接続文字列 (
)postgresql://user:pass@localhost:5432/app_db - サイト URL – 例
http://localhost:3000
コマンドは
を更新し、以下を作成します:.envbilling.config.ts # プラン定義 lib/billing.ts # 本体の課金クライアント app/api/stripe/[...all]/route.ts # Webhook ハンドラ & API エンドポイント - Stripe テストキー(例:
-
データベースをセットアップ
npx stripe-no-webhooks migrateこれで Stripe スキーマ(同期テーブル、クレジット、使用量など)が作成されます。
-
プランを定義する
を編集します。テスト用例:billing.config.tsconst billingConfig: BillingConfig = { test: { plans: [ { name: "Free", price: [{ amount: 0, currency: "usd", interval: "month" }] }, { name: "Pro", price: [ { amount: 2000, currency: "usd", interval: "month" }, // $20/月 { amount: 20000, currency: "usd", interval: "year" } // $200/年 ], }, ], }, production: { plans: [], // 本番用に追加 }, };プランにはクレジット、ウォレット、使用量課金も含められます:
{ name: "Pro", price: [{ amount: 2000, currency: "usd", interval: "month" }], features: { api_calls: { credits: { allocation: 1000 }, // 月間 1 000 コールが含まれる pricePerCredit: 1, // 追加コールは $0.01/回 trackUsage: true, // 使用量課金を有効化 }, }, wallet: { allocation: 500 }, // $5 のプリペイド残高 } -
Stripe と同期
npx stripe-no-webhooks syncプロダクト/価格が Stripe に作成され、ID が設定ファイルに反映されます。
-
課金クライアントを更新
でユーザー ID を解決する方法を指定します(Clerk の例):lib/billing.tsimport { Billing } from "stripe-no-webhooks"; import { auth } from "@clerk/nextjs/server"; import billingConfig from "../billing.config"; export const billing = new Billing({ billingConfig, successUrl: process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000", cancelUrl: process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000", resolveUser: async () => { const { userId } = await auth(); return userId ? { id: userId } : null; }, }); -
テスト
-
Next.js アプリを起動
-
別ターミナルで Stripe Webhook を転送
stripe listen --forward-to localhost:3000/api/stripe/webhook
-
ライブラリの使い方
チェックアウトをトリガー
import { checkout } from "stripe-no-webhooks/client"; <button onClick={() => checkout({ planName: "Pro", interval: "month" })}> Upgrade to Pro </button>
テストカード:
4242 4242 4242 4242、有効期限は未来の任意の日付、CVC は任意。
サブスクリプション状態を確認
import { billing } from "@/lib/billing"; const subscription = await billing.subscriptions.get({ userId }); if (subscription?.status === "active") { console.log("Plan:", subscription.plan?.name); }
背景で起こること
- ユーザーがチェックアウト完了 → Stripe が Webhook を送信
- ライブラリがデータを DB に同期し、クレジット/ウォレットを更新(有効なら)
は同期テーブルから読み込みbilling.subscriptions.get- クレジット・ウォレット・使用量は内部 API で idempotent に追跡
stripe.subscriptions、stripe.credit_balances、stripe.credit_ledger を確認して検証できます。
クレジット/ウォレット/使用量課金を使う
// クレジット:含まれる単位を消費 if (await billing.credits.hasCredits({ userId, key: "api_calls", amount: 1 })) { await billing.credits.consume({ userId, key: "api_calls", amount: 1 }); } // ウォレット:プリペイド残高から差し引き(セント単位) await billing.wallet.consume({ userId, amount: 50, description: "AI generation", }); // 使用量:期間末の課金用に記録 await billing.usage.record({ userId, key: "api_calls", amount: 1 });
課金ポータルを開く
import { customerPortal } from "stripe-no-webhooks/client"; <button onClick={() => customerPortal()}> Manage Billing </button>
イベントに反応する
export const billing = new Billing({ billingConfig, callbacks: { onSubscriptionCreated: async (subscription) => { // ウェルカムメール送信など }, onSubscriptionCancelled: async (subscription) => { // リソースのクリーンアップ }, // docs/reference.md にすべてのコールバックを掲載 }, });
プライシングページを生成
npx stripe-no-webhooks generate pricing-page
components/PricingPage.tsx が作成され、ルートで使用可能です:
import { PricingPage } from "@/components/PricingPage"; export default function Pricing() { return <PricingPage />; }
コンポーネントはプラン取得・現在のサブスクリプション検出・月額/年額切替・チェックアウトフロー・リダイレクト・エラー処理などをハンドルします。
本番環境へ
-
に本番プランを追加billing.config.ts -
実行:
npx stripe-no-webhooks sync「Set up for production」を選択すると CLI が以下を実施:
- プランを Stripe ライブモードへ同期
- Stripe で Webhook エンドポイント作成
- Webhook URL とシークレットを表示
-
環境変数に秘密情報を設定(例:Vercel):
STRIPE_WEBHOOK_SECRET=whsec_… STRIPE_SECRET_KEY=sk_live_… # 重要: ライブキー DATABASE_URL=postgresql://user:pass@host:5432/dbname NEXT_PUBLIC_APP_URL=https://your-production-app.com
機能一覧
| 機能 | 利用シナリオ |
|---|---|
| クレジット | 「月間 1 000 API 呼び出しが含まれる」 – 消費可能単位 |
| ウォレット | 「AI 使用料に $5/月」 – プリペイド残高で支払う |
| トップアップ | 必要時にクレジットを追加購入 |
| 使用量課金 | 「API 呼び出しごとに $0.10」 – 後払いのメータ計測 |
| チーム請求 | 組織単位で請求、1 シートあたり価格設定 |
| 税額収集 | VAT/GST 自動算出と ID 取得 |
| 支払失敗処理 | カード拒否時の再試行ロジック |
CLI コマンド
| コマンド | 説明 |
|---|---|
| 設定ファイルと を作成 |
| データベーステーブルを作成 |
| プランを Stripe に同期 |
| プライシングコンポーネント生成 |
| 既存の Stripe データをインポート |
API リファレンス
完全な API は
docs/reference.md を参照してください。
LLM 固有の使い方も含めた詳細は以下で確認できます:
https://github.com/pretzelai/stripe-no-webhooks/blob/main/docs/llms.txt