テーマを切り替える

個人開発の決済基盤:Stripe・Paddle・Lemon Squeezy・WeChat Payの選び方

Easton editorial illustration: one dominant circular payment-routing switch with four selectable rails, one downstream stacked entitlement ledger/database receiving the verified flow

"Paddle:webhookでアクセス権を付与し、契約状態を同期する"

免責事項:この記事は税務、法務、会社設立、外国為替、事業者資格に関する助言ではありません。Merchant of Record、VAT/GST/sales tax、国内外の法人、入金経路については、各サービスの規約と専門家の助言を確認してください。

pricing.tsにはstarter_monthly、pro_yearly、lifetime_license、wechat_one_timeの4価格があるのに、データベースにはis_paidしかありません。checkout.session.completedのwebhookを受信し、利用者もsuccess_urlから戻ったのに、entitlementsは空のままです。問題は決済ボタンではありません。商品、注文、契約、アクセス権が決済システムの中でつながっていないのです。

個人開発者がサービスを選ぶ前に答えるべき問いは5つです。何を売るのか、どう課金するのか、誰に売るのか、取引と売上税の責任を誰が負うのか、支払い後に誰が権限を付与するのか。Stripe、Paddle、Lemon Squeezy、WeChat Payは、同じ層に並ぶ4つのボタンではありません。

決済サービスより先に販売モデルを決める

買い切りでは注文と納品、SaaSサブスクリプションではbilling lifecycle全体、従量課金では追跡できるusageデータが重要です。サービスを比べる前に、モデルをproducts、prices、ローカルテーブルへ落とし込みます。

販売モデル検討する出発点主な非同期イベントローカルの中核テーブル
買い切りデジタル商品Stripe / Paddle / Lemon Squeezycheckout.session.completed / transaction.completed / order_createdorders + entitlements
SaaSサブスクリプションStripe Billing / Paddle Billing / Lemon Squeezycustomer.subscription.* / subscription.*subscriptions + entitlements + 従量課金時のusage_events
サブスクリプションと買い切りの複合Stripe Billing / Paddle Billing複数イベントorders + subscriptions + entitlements
中国本土またはWeChat圏WeChat Pay(JSAPI/H5/Native)決済コールバックと注文照会結果orders + wechat_prepay

次の3点を押さえます。

  • 買い切り商品では、注文、納品、返金、再送が中心です。完全なサブスクリプションライフサイクルは不要です。
  • SaaSサブスクリプションでは、current_period_start/end、cancel_at、statusを持つsubscriptionsが必要です。従量課金には監査可能なusage_eventsも必要です。
  • WeChat Payは決済手段と商店システムであり、グローバルなMerchant of RecordやSaaS billingの代替ではありません。

Stripe Billing、Paddle Billing、WeChat Payの機能は変わり得ます。実装前にアカウント地域、商品モード、決済手段、APIバージョン、規約を確認してください。

Merchant of Recordでもすべての責任がなくなるわけではない

Merchant of Record、略してMoRは、取引上の記録商店となる事業者です。PaddleとLemon Squeezyは、対象となるデジタル商品のMerchant of Recordとして、取引範囲内の決済、売上税、返金、紛争対応を扱います。世界各地の売上税と請求運用は軽くなりますが、開発者や会社の所得税、法人、商品コンプライアンス、データ保護、会計上の責任まで消えるわけではありません。

Stripeを使う場合、通常は商店自身が記録商店です。Stripe Taxはsales tax、VAT、GSTの計算、基準値の監視、登録関連の作業を支援しますが、Stripeを自動的にMerchant of Recordへ変えるものではありません。登録、申告、法人上の責任は地域と取引ごとに確認します。

固定の売上高基準だけでMoRを選ばず、次の観点を比較します。

観点自前の決済・billing stackMerchant of Record
カスタマイズ性Checkout、Billing、Tax、請求書、社内フローを組み合わせられるプラットフォームの商品規約、checkout、契約、精算ルールに従う
税務・請求運用商店が登録、申告、請求書、返金、紛争処理を確認するMoRが対象取引の売上税、決済、一部のコンプライアンスを担う
コストの見方決済手数料に加え、税務ツール、開発、経理、サポートも含める料率だけでなく、精算、返金、追加費用、プラットフォーム制約も見る
適する状況強いカスタマイズ、既存の運用体制、特殊な契約フローが必要対象商品で世界各地の売上税と契約運用を軽くしたい

最終的な契約と税務の境界は、法人、地域、商品、顧客種別で変わります。マーケティングページは製品の立ち位置を説明するものであり、規約や専門家の助言には代わりません。

Stripe、Paddle、Lemon Squeezy、WeChat Payの選び方

サブスクリプションとWeChat Payの両方が必要なら、まず問題を分けます。契約ライフサイクル、グローバル決済、中国本土向け決済を同じサービスで処理する必要はありません。ある決済手段が掲載されていても、すべてのアカウント地域、Checkoutモード、自動更新で使えるとは限りません。

サービス責任モデルサブスクリプションと買い切り中国向け決済標準ライセンス機能適した出発点
Stripe決済、Billing、Taxツール。通常はMoRではないCheckoutとBilling。自由度が高いAlipay/WeChat Payはアカウント地域、通貨、商品モードに依存汎用License Key商品はない決済、契約、税務ツール、社内フローを制御したいSaaS
PaddleMerchant of RecordPaddle BillingとCheckoutDashboardと最新文書でアカウント・地域条件を確認アプリが権限を管理世界各地の売上税と契約運用を軽くしたいソフトウェア事業
Lemon SqueezyMerchant of Record買い切りデジタル商品、比較的単純な契約、従量課金買い切りではAlipay/WeChat Payを表示可能。契約は制限が多いLicense Keysデジタル商品、ライセンス、初期のサブスクリプション
WeChat Pay決済手段と商店システムJSAPI/H5/Nativeなど。billing lifecycleは自前中国本土とWeChat圏なし人民元の買い切りとWeChat内決済

2026年7月18日時点の公式文書では、次を確認できます。

  • Stripe Checkoutにはホスト型ページ、埋め込みページ、組み合わせ可能なコンポーネントがあります。利用できる決済手段は地域、通貨、Checkoutモードで変わります。
  • Paddle webhookはat-least-once deliveryです。エンドポイントが5秒以内に200を返さない場合は再送されます。重複や順序逆転があるため、event_idで重複排除し、順序判断にはoccurred_atを使います。
  • Lemon Squeezyは現在、Cards、PayPal、Apple Pay、Google Pay、Alipay、WeChat Pay、Cash App Pay、bank debitsを記載しています。サブスクリプション商品で使えるのは現在Cards、Apple Pay、Google Pay、PayPalのみです。
  • WeChat PayのH5フローでは、サーバー側の注文作成、決済コールバック、能動的な注文照会が必要です。ブラウザの戻り先だけを正しい状態とはみなしません。

手数料、決済手段、精算周期、対応国、商品規約は変わります。最終予算では、記事に残った古い割合ではなく、その日の価格ページと契約を確認してください。

Webhookを権限同期の入口にする

よくある失敗は次の2つです。

  1. checkout.session.completedを受信し、success_urlにも戻ったのに、entitlementsが更新されず、支払い済み利用者が機能を使えない。
  2. 同じイベントがwebhook_eventsへ2回届き、処理側がライセンスを2枚発行する。

どちらも、1回のHTTPリクエストや成功ページを最終的な業務事実として扱うことが原因です。決済イベントは重複、順序逆転、遅延があり、一部の状態は注文照会や後続イベントで確認する必要があります。

Webhookエンドポイントの設計原則

原則StripePaddleLemon SqueezyWeChat Pay
HTTPS endpoint必須必須必須必須
署名検証Stripe-SignaturePaddle-SignatureX-SignatureWeChat Pay API v3署名
冪等キーevent IDまたは業務オブジェクトIDevent_idイベント種別 + オブジェクトID、または独自の一意キーout_trade_noとサービス側取引ID
応答方針検証・保存後すばやく応答し、非同期処理する5秒以内に200成功応答後に非同期処理する現行APIの応答仕様に従う
補償経路決済・契約状態を照会エンティティ照会とreconciliation注文・契約状態を照会注文照会、明細照合、手動復旧

運用原則は明確です。

  • webhookまたは決済コールバックを権限同期の入口にします。success_urlでは処理中と表示するだけで、権限を付与しません。
  • 最初に署名を検証し、元イベントまたは必要項目をwebhook_eventsへ保存します。複雑な処理は非同期ジョブへ渡します。
  • 一意制約で冪等性を保証し、event_id、source、occurred_at、processed_at、status、payload_hashを記録します。
  • 順序逆転はイベント発生時刻、オブジェクト更新時刻、状態バージョンで判断します。到着順だけで上書きしません。
  • 定期的にreconciliationを行い、注文または契約状態を照会し、手動復旧経路も残します。

注文・契約・権限・イベントのテーブル

テーブル中核フィールドStripe対応Paddle対応Lemon Squeezy対応
ordersprovider_order_id, customer_id, amount, currency, status, created_atCheckout Session / PaymentIntenttransactionorder
subscriptionsprovider_subscription_id, customer_id, status, current_period_end, cancel_atsubscriptionsubscriptionsubscription
entitlementsuser_id, product_id, feature_key, source, status, expires_atorderまたはsubscriptionから導出transactionまたはsubscriptionから導出order、subscription、licenseから導出
webhook_eventsprovider, event_id, occurred_at, processed_at, status, payload_hash冪等性と監査冪等性と順序判断冪等性と監査

特定サービスのAPIオブジェクトをすべてローカルテーブルへコピーしないでください。アクセス判定に必要な安定項目を先に決め、照会とreconciliation用にサービス側オブジェクトIDを保存します。

権限同期の戦略

戦略適する場面実装の要点
Lean cache多くのSaaSサブスクリプションアクセス判定に必要なcustomer、subscription、status、price、productだけを保存し、イベントで更新する
State mirrorオフラインの請求表示や複雑な運用画面より完全な契約データを複製し、更新時刻を記録してreconciliationで状態ずれを防ぐ
License key買い切りデジタル商品やデスクトップソフト有効化後にinstance IDを保存し、store、product、variant、customerの対応を検証する。license keyを完全なユーザーシステムとして扱わない

Paddleの公式provisioning文書では、多くのアプリにlean cacheを推奨しています。より詳しいローカル照会が本当に必要な場合だけstate mirrorへ進みます。Lemon Squeezyのlicense keyも、アプリ側で商品と顧客を検証し、instanceを自分のアカウントや端末モデルへ対応付ける必要があります。

サービス別の実装要点

ここでは最初の実装境界を示します。各サービスの完全な統合文書を置き換えるものではありません。

Stripeの実装要点

初期のSaaSなら、自作のカードフォームを保守する前に、ホスト型CheckoutとCustomer Portalから始められます。Stripe Billingはサブスクリプション、請求書、従量課金、収益回復などのライフサイクルを扱います。Stripe Taxは税計算と運用のツールであり、Merchant of Recordではありません。

商品と価格はローカル権限へ対応付けます。product_idは商品または権限パッケージ、price_idは月額、年額、seat、usageのモデルです。usersにis_paidだけを残してはいけません。

実装例はNext.jsのカートとStripe決済チュートリアルで確認できます。Checkout Session、webhook endpoint、注文処理を扱っています。

Paddleの実装要点

最初に、参照するチュートリアルがPaddle ClassicではなくPaddle Billing向けか確認します。API、webhook、Paddle.js、Product/Priceモデルが異なります。

Paddle Checkoutは決済画面を提供しますが、provisioningはアプリの責任です。多くのアプリでは、アクセス判定に使うcustomer、subscription、status、price、product、scheduled changeだけで足ります。運用画面が完全な請求データを必要とする場合だけstate mirrorを作ります。

どちらのキャッシュ方式でも、webhookで更新しreconciliationを実行します。Merchant of Recordを使っても、誰がどの機能を使えるかをアプリが自動で理解するわけではありません。

Lemon Squeezyの実装要点

Lemon Squeezyは、初期のデジタル商品、ライセンス、比較的単純なサブスクリプションの出発点になります。Merchant of Record、checkout、契約、usage-based billing、webhook、License Keysを提供しますが、実際の費用と対応範囲は現在のstore planと文書で確認します。

License keyを有効化したらinstance IDを保存し、store_id、product_id、variant_id、customerを検証します。別商品のkeyや転売されたkeyを直接Pro権限へ結び付けてはいけません。

WeChat Payのサブスクリプションが要件なら、契約商品の決済手段を別に確認します。現在の文書にはWeChat PayとAlipayがありますが、契約商品で使えるのはCards、Apple Pay、Google Pay、PayPalのみです。

WeChat Payの境界

WeChat Payは中国本土やWeChat圏の決済に向きますが、グローバルなMerchant of Recordでも完全なSaaS billing lifecycleでもありません。商店は注文状態、コールバックの署名検証、注文照会、返金、reconciliation、請求書、権限同期を用意します。

H5、JSAPI、Mini Program、Nativeは決済シナリオであり、別々のサブスクリプションシステムではありません。H5では、バックエンドが注文を作成してh5_urlをフロントエンドへ渡します。ブラウザが戻っても、バックエンドは注文を照会し、out_trade_noで識別した同じ注文へ決済コールバックを反映します。

商品権限、商店の主体、ドメイン、手数料、APIパラメータは、現在のWeChat Pay商店文書で確認してください。

次の作業:決済ボタンを検証可能な状態機械にする

サービスを選んだら、統合作業を検証可能な項目へ分けます。

  1. orders、subscriptions、entitlements、webhook_eventsを作成し、従量課金ならusage_eventsを追加します。
  2. 各webhookまたは決済コールバックに、署名検証、冪等処理、順序逆転の処理、すばやい応答、失敗復旧を実装します。
  3. 成功ページからis_paid=trueを書き込まず、ローカル注文状態を照会するようにします。
  4. 注文照会、reconciliation、返金、更新失敗、手動復旧のテストを追加します。
  5. sandboxでイベントを再送し、状態更新を逆順で配信しても、権限が二重付与されたり誤って巻き戻ったりしないことを確認します。

バックエンドの配置とデータベース選定は、Supabase Edge Functions実践ガイドと本シリーズのバックエンド・データベース記事へ続きます。決済ページが正常に戻るだけでは完了ではありません。重複、遅延、順序逆転、返金があっても、注文、契約、権限が正しい状態へ収束することが完成条件です。

個人開発の決済基盤を選定して実装する手順

販売モデル、責任分界、対象市場からサービスを選び、監査できる権限同期経路を作ります。

⏱️ 目安時間: 45 分

  1. 1

    ステップ 1: 販売モデルを決める

    買い切り、SaaSサブスクリプション、従量課金、複合モデルのどれかを明確にし、返金、更新、アップグレード、ダウングレード、利用終了日の規則を記述します。
  2. 2

    ステップ 2: 税務と運用の責任を分ける

    決済、billing、Taxの各ツールを自分で組み合わせるか、Merchant of Recordを使うか決めます。法人や税務上の責任は、サービス規約と専門家の助言で確認します。
  3. 3

    ステップ 3: 市場ごとに決済手段を選ぶ

    グローバルなカード決済とサブスクリプションにはStripe、Paddle、Lemon Squeezyを、中国本土やWeChat圏の買い切りにはWeChat Payを検討し、アカウント地域、商品区分、決済手段の対象条件を確認します。
  4. 4

    ステップ 4: ローカル状態モデルを作る

    orders、subscriptions、entitlements、webhook_eventsを作成し、サービス側のイベントIDまたは注文IDに一意制約を設けて、冪等性と監査性を確保します。
  5. 5

    ステップ 5: 非同期の権限同期を検証する

    署名検証、重複、順序逆転、タイムアウト、返金、更新失敗、手動復旧をテストします。成功ページは処理状況を表示するだけで、権限を付与しません。

FAQ

Stripe、Paddle、Lemon Squeezyの大きな違いは何ですか?
Stripeは決済、Billing、Taxのツールを提供し、販売、税務、運用の責任は通常商店側に残ります。PaddleとLemon Squeezyは対象取引のMerchant of Recordとして、決済、売上税、一部のコンプライアンス業務を担います。ただしアプリ内の権限同期は自分で実装します。
個人開発の初期はMerchant of RecordとStripeのどちらを選ぶべきですか?
単一の売上高基準では決められません。対象市場、商品の取扱可否、税務と請求運用の体制、精算と返金、カスタマイズ性、総コストを比べます。法人や税務は専門家に確認してください。
PaddleやLemon SqueezyはSaaSの権限を自動で付与しますか?
しません。決済、請求、Merchant of Record業務は処理できますが、アプリはwebhookを受信し、注文や契約をローカルのentitlementsへ対応付け、欠落イベントをreconciliationで修復する必要があります。
Lemon SqueezyがWeChat Payに対応していれば、WeChat Payでサブスクリプションを提供できますか?
そのようには判断できません。現在の文書にはWeChat PayとAlipayが記載されていますが、サブスクリプション商品で使えるのは現在Cards、Apple Pay、Google Pay、PayPalのみです。公開前に最新の決済手段文書を再確認してください。
WeChat PayはグローバルSaaSのStripeを置き換えられますか?
直接は置き換えられません。WeChat Payは中国本土とWeChat圏向けの決済手段および商店システムです。グローバルな契約、売上税、請求ライフサイクル、多通貨運用は別途設計が必要です。
webhookの重複、順序逆転、欠落にはどう対処しますか?
署名を検証して元イベントを保存し、イベントIDまたはサービス側注文IDに一意制約を設けます。イベント時刻や状態バージョンで順序を判断し、すばやく応答して非同期処理し、照会、reconciliation、手動復旧で欠落を補います。
個人開発の最小決済システムにはどのテーブルが必要ですか?
最低限orders、entitlements、webhook_eventsが必要です。継続課金にはsubscriptions、従量課金には追跡可能なusage_eventsを追加します。

8分で読めます · 公開日: 2026年10月21日

コメント

GitHubアカウントでログインしてコメントできます

Easton BlogEaston Blog