**Show HN:**  
*Stripe‑no‑webhooks – Stripe のデータを Postgres DB に同期する方法*

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 ライブラリを追加する方法を説明しています。

  1. インストールとセットアップ

    npm install stripe-no-webhooks stripe
    を実行し、その後
    npx stripe-no-webhooks init
    .env
    billing.config.ts
    lib/billing.ts
    と、webhook ハンドラを
    app/api/stripe/[...all]/route.ts
    に作成します。

  2. データベースマイグレーション

    npx stripe-no-webhooks migrate
    を実行して、製品・クレジット・使用量データの同期に必要な Stripe‑schema テーブルを生成します。

  3. プランの定義

    billing.config.ts
    にサブスクリプションプラン(例: “Free”、 “Pro”)を価格間隔とともに宣言し、
    api_calls
    クレジットやウォレット割り当て、使用量ベース課金などのオプション機能を設定します。

  4. 製品・価格の同期

    npx stripe-no-webhooks sync
    を使って Stripe の製品/価格を作成し、ID を設定ファイルに更新します。プロダクション環境では「Set up for production」として再度同期し、ライブデータを同期させて webhook エンドポイントを生成します。

  5. Billing クライアントの構成

    lib/billing.ts
    billingConfig
    successUrl
    cancelUrl
    を提供し、
    resolveUser
    関数(例:Clerk 経由)を使用して billing インスタンスを作成します。

  6. テスト

    checkout({ planName: "Pro", interval: "month" })
    を呼び出す;開発時には
    stripe listen --forward-to localhost:3000/api/stripe/webhook
    で Stripe webhook を転送します。

  7. 使用機能 – ライブラリはクレジット(

    billing.credits.consume
    )、ウォレット残高(
    billing.wallet.consume
    )、および使用量(
    billing.usage.record
    )を自動で追跡します。
    onSubscriptionCreated
    onSubscriptionCancelled
    などのコールバックを通じてカスタムロジックを追加できます。

  8. 料金ページコンポーネント

    npx stripe-no-webhooks generate pricing-page
    で準備済み
    <PricingPage />
    コンポーネントを生成し、UI にインポートします。

  9. 本番デプロイ

    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 データベースを想定しています。
ローカルで試すため、まずテストモードで始めましょう。

  1. インストール

    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

    コマンドは

    .env
    を更新し、以下を作成します:

    billing.config.ts          # プラン定義
    lib/billing.ts             # 本体の課金クライアント
    app/api/stripe/[...all]/route.ts  # Webhook ハンドラ & API エンドポイント
    
  2. データベースをセットアップ

    npx stripe-no-webhooks migrate
    

    これで Stripe スキーマ(同期テーブル、クレジット、使用量など)が作成されます。

  3. プランを定義する

    billing.config.ts
    を編集します。テスト用例:

    const 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 のプリペイド残高
    }
    
  4. Stripe と同期

    npx stripe-no-webhooks sync
    

    プロダクト/価格が Stripe に作成され、ID が設定ファイルに反映されます。

  5. 課金クライアントを更新

    lib/billing.ts
    でユーザー ID を解決する方法を指定します(Clerk の例):

    import { 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;
      },
    });
    
  6. テスト

    • 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);
}

背景で起こること

  1. ユーザーがチェックアウト完了 → Stripe が Webhook を送信
  2. ライブラリがデータを DB に同期し、クレジット/ウォレットを更新(有効なら)
  3. billing.subscriptions.get
    は同期テーブルから読み込み
  4. クレジット・ウォレット・使用量は内部 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 />;
}

コンポーネントはプラン取得・現在のサブスクリプション検出・月額/年額切替・チェックアウトフロー・リダイレクト・エラー処理などをハンドルします。


本番環境へ

  1. billing.config.ts
    に本番プランを追加

  2. 実行:

    npx stripe-no-webhooks sync
    

    「Set up for production」を選択すると CLI が以下を実施:

    • プランを Stripe ライブモードへ同期
    • Stripe で Webhook エンドポイント作成
    • Webhook URL とシークレットを表示
  3. 環境変数に秘密情報を設定(例: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 コマンド

コマンド説明
init
設定ファイルと
.env
を作成
migrate
データベーステーブルを作成
sync
プランを Stripe に同期
generate pricing-page
プライシングコンポーネント生成
backfill
既存の Stripe データをインポート

API リファレンス

完全な API は

docs/reference.md
を参照してください。

LLM 固有の使い方も含めた詳細は以下で確認できます:

https://github.com/pretzelai/stripe-no-webhooks/blob/main/docs/llms.txt

同じ日のほかのニュース

一覧に戻る →

2026/02/11 7:20

テルネットが消えたその日

## Japanese Translation: > GreyNoiseは、**2026年1月14日〜21:00 UTC(日本時間で10時頃)**に世界のtelnetトラフィックが急激かつ持続的に減少したことを観測しました。セッション数は1時間以内に65%(約74,000から22,000へ)、翌時間にはさらに83%減少し、2月10日まで平均で59%の削減となりました。この減少はステップ関数的であり、**事前に5万以上のセッションを持つ18のASN**(Vultr AS20473、Cox Communications AS22773、Charter/Spectrum AS20115、BT/British Telecom AS2856など)がゼロになり、ズンビア、ウクライナ、カナダ、ポーランド、エジプトの5か国がGreyNoiseデータセットから消えました。 > このパターンはユーザー行動の変化ではなく、**北米Tier‑1トランジットプロバイダーが米国内メンテナンスウィンドウ(約16:00 EST / 21:00 UTC)に合わせてポート23フィルタリングを実装したこと**によるルーティングインフラの変更を示しています。主要クラウドプロバイダーはほぼ影響を受けず、むしろトラフィックが増加しました(AWS +78%、Contabo +90%、DigitalOcean +3%)。一方で住宅/企業向けISPは大きな損失を被り、Verizon/UUNET AS701はセッションの79%を失いました。 > タイミングは**CVE‑2026‑24061**(GNU Inetutils telnetdにおけるUSER環境変数注入による認証バイパス、CVSS 9.8)の公開と一致しています。この脆弱性は2015年に発見されましたが、約11年間知られていませんでした。悪用は1月21日に初めて確認され、1月22日には報告され、2月上旬までに約2,600セッション/日でピークを迎えました。 > 減少後のトラフィックではサワーソース型のスパイクが観測され、これは不定期なフィルタリングまたはルーティングフラップを示唆しています。週平均はベースライン119%から2月上旬には約35%に低下しました。連邦機関向けCISAの修正期限は**2026年2月16日**です。 > telnetをまだ使用している組織は、GNU Inetutilsを**v2.7‑2+**にアップグレードするか、サービスを完全に無効化すべきです。この事件は、脆弱性の遅延公開が重要インフラを曝露するリスクと、迅速なパッチ適用および協調的ネットワークフィルタリング対応の必要性を浮き彫りにしています。

2026/02/11 2:04

シンギュラリティは火曜日に起きます。

## Japanese Translation: --- ## 要約 著者は、人間の注意力と制度的対応が急速なAI進歩に追いつけなくなる「社会的シンギュラリティ」(人間の注目と機関の反応がAIの進展に遅れを取る点)が差し迫っていると主張しています。 これを定量化するため、5つのAI進歩指標(ドルあたりトークン数を対数変換した値・リリース間隔の逆数)を \([0,1]\) に正規化します。各系列は独立に双曲線モデル \[ x(t)=\frac{k}{t_s-t}+c \] でフィットさせ、共通のシンギュラリティ時間 \(t_s\) を共有させます。アーカイブ(arXiv)の「emergent」ペーパー指標だけが明確な有限時間ピークを示し、それを除外するとフィットは検索境界に崩れ、予測されるシンギュラリティ日付は実質的にこの単一指標から導かれていることを示しています。 著者は \(t_s\) を超知能の到来ではなく、機関がAIによる驚きを吸収できない社会的出来事として解釈します。支持証拠には以下が含まれます: - **労働市場ショック** – 2025年に110万件のレイオフが発表され、そのうち55,000件以上がAI関連と報告。 - **規制遅延** – EU AI法は2027年へ延期。米国では行政命令が取り消されたり改訂されたり、州レベルで連邦政策を上回るルールが導入されている。 - **資本集中** – 2025年時点でS&P 500のトップ10銘柄(主にAI関連)が指数ウェイトの40.7%を占め、ChatGPT開始以降AI株はリターン・利益成長・資本支出の75–90%を捉えている。 - **信頼低下** – 世界的なAIへの信頼は56%。米国労働者の自信は18%低下し、使用率は13%増加。60%が創造よりも雇用削減を恐れる。 - **再現性ギャップ** – AI研究の再現可能性は3分の1未満で、コード共有は5%未満。企業ラボは公開が少ない。 - **政治的再編** – ポピュリストの反発、中間選挙への影響予測、MAGIのAI影響に関する分裂、左派–右派軸がAI政策問題で揺らぐ。 著者はシンギュラリティ日付が単一指標に基づいており、定常性を仮定し、追加の双曲線系列を含めると変動する可能性があると警告します。制限事項としては MMLU の飽和とトークン/ドルあたりの非単調挙動があります。 **予測される結果:** - AI企業に対する規制強化と市場集中度の増大。 - AI政策を巡る政治的分極化の激化。 - 労働者の雇用不安定化、投資家へのリターン変動、公共信頼の低下が有益なAI技術採用の遅延を招く可能性。

2026/02/11 4:25

Windows 95は実際に「Weezerの*Buddy Holly*ビデオをOS自体に『入れた』わけではありません。 この映像は、Microsoftが第三者コンテンツプロバイダーからライセンスした「Video Player」サンプルセットの一部として、Windows 95 CD‑ROM に同梱されていました。 1994年に宣伝用に制作されたビデオは、既にWeezerとレコードレーベル(Geffen Records)からCD‑ROM メディアで配布する許可を得ており、その上でMicrosoftは別途ライセンスを取得して Windows 95 バンドルに含めました。 こうすることで、すべての著作権保有者が適切に報酬を受け取り、コンテンツが米国の著作権法に準拠していることが保証されます。

## Japanese Translation: MicrosoftのWindows 95 CDは、システムの機能を示すためにマルチメディアエクストラを同梱していました。そのうちの一つがウィーザー(Weezer)の「Buddy Holly」のミュージックビデオで、Microsoftはバンドの出版元Geffen Recordsから権利を取得しましたが、メンバーへの相談は行わずに済ませました。初めはバンド側も動揺していましたが、後には大きなチャンスとして受け止められました。 ビデオでは「ハッピーデイズ」(Happy Days)のセットを再現し、登場人物のクリップを編集して使用しました。このため、弁護士は*Happy Days* の全出演者―ヘンリー・ウィンクラー(Henry Winkler)を含む―に連絡したり代理人と交渉したりして許可を取得する必要がありました。 レイモンドは30年以上の経験を持つベテランWindows開発者で、2003年から人気サイト「The Old New Thing」を運営しています。同氏はAddison Wesleyより2017年に同名の書籍 *The Old New Thing*(2007)を執筆し、時折 Windows Dev Docs のTwitterアカウントにも投稿しています。 このプロモーション戦略はWindows 95 のグラフィカルおよびオーディオ機能を披露するとともに、テクノロジー市場での将来のクロスインダストリーコラボレーションへの先駆けとなりました

**Show HN:** *Stripe‑no‑webhooks – Stripe のデータを Postgres DB に同期する方法* | そっか~ニュース