Skip to main content

シンプル版

AI アシスタントに伝えるだけ:
これだけです。このページを AI 統合のエントリーポイントとして使い、正確な SKILL.md が必要なときに下の公式スキルファイルを開いてください。

完全版

エンドツーエンドテストを含む完全な統合の場合:

公式 Waffo Pancake スキル

AI インテグレーションページから公式スキルファイルを開くと、チームが使用している正確な SKILL.md を表示、コピー、ダウンロードできます。

@waffo/pancake-ts SDK は Waffo Pancake API の公式サーバーサイド TypeScript クライアントです。リクエスト署名、チェックアウトセッション作成、Webhook 検証、GraphQL クエリを処理します。

AI コーディングワークフロー

AI コーディングエージェントが最も役立つのは、ビジネスモデルをすでに理解していて、それをクリーンな Waffo カタログと実装プランに変換する手助けが欲しいときです。 典型的なタスク:
  • 料金ページを Waffo の商品と商品グループに変換する
  • どのオファーをサブスクリプション商品にし、どれを単発課金にするかを決める
  • priceSnapshot を使った動的価格設定フローを設計する
  • 商品定義、メタデータ、ロールアウトチェックリストを一括生成する
  • 既存カタログの命名、プラン構成、本番稼働の準備状況をレビューする

推奨ワークフロー

1

ビジネスモデルを説明する

何を販売しているか、顧客への課金方法、固定価格の部分と従量課金の部分を説明します。
2

カタログプランを依頼する

エージェントにオファーを単発商品、サブスクリプション商品、商品グループ、任意の動的価格設定フローへマッピングさせます。
3

出力をレビューする

命名、請求周期、税カテゴリ、アドオンを単発課金のままにすべきかどうかを確認します。
4

実装する

出力を使ってダッシュボードで商品を作成するか、SDK/API 統合コードを生成します。

プロンプトテンプレート

1. 料金ページを Waffo 商品に変換する

2. 動的価格設定を計画する

3. 既存カタログをレビューする

実践的なルール

サブスクリプション主導のビジネスがサブスクリプション商品と単発課金の両方を作成するのは普通のことです。課金モデルは会社のラベルではなく、ビジネスイベントに合わせるべきです。

避けるべきこと

  • 秘密鍵や本番シークレットをプロンプトに貼り付けない
  • レビューなしで AI エージェントに商品を本番公開させない
  • 最終金額が実行時に計算される場合、すべての価格バリエーションを別々の商品としてモデリングしない
  • 課金がイベントベースの場合、超過課金を無理にサブスクリプション商品に押し込まない

よくある落とし穴 — 最初にお読みください

統合を壊すミスをまとめています。コードを書く前に必ず目を通してください。

ユースケース

Waffo Pancake は merchant-of-record 決済プラットフォームです。SDK は以下を必要とするプロジェクトに適しています:
  • SaaS サブスクリプション課金 — 月額/年額プラン、アップグレード/ダウングレード(例:Free/Pro/Team ティア)
  • デジタル商品販売 — 電子書籍、テンプレート、コース、ライセンスの単発購入
  • 従量課金 — ダウンロード、API コール、レポート生成ごとに課金
  • ハイブリッドモデル — サブスクリプション+単発購入の組み合わせ

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

サーバーサイド専用。Node.js 18+。依存関係ゼロ。
必要な環境変数は2つだけです — サインアップ時に提供されます:
WAFFO_MERCHANT_ID はあなたのマーチャントIDを意味し、storeId でも URL 内のストア識別子でもありません。storeId はストアおよび商品管理フローにおいて現行 API モデルの一部として残っているため、両者を混同しないでください。 最初に動く統合を作るために必要な環境変数はこの2つだけです:WAFFO_MERCHANT_IDWAFFO_PRIVATE_KEY。Store ID と Product ID は実行時の値であり、コード、アプリ設定、または自前のデータベースに保持できます。

PEM 鍵の取り扱い

エスケープ改行(最もシンプル):
Base64(CI/CD 推奨):
ファイルパス(ローカル開発):

クイックスタート:パス A

Store ID と Product ID は後続の値です。アプリが実行時設定を保持する場所ならどこにでも保存できます。特に慣例として採用しない限り、環境変数にする必要はありません。 マーチャントが複数のストアを持っている場合は、商品を作成する前にどのストアに紐づけるかを確認してください。対象ストアを推測しないでください。

クイックスタート:パス B

ダッシュボードにすでに商品が存在する場合は、Product ID をコピーしてそのままチェックアウトへ進みます。このフローでも必要なのは上記の同じ2つの環境変数だけです:

API リファレンス

ストア

単発商品

taxCategory オプション: digital_goods | saas | software | ebook | online_course | consulting | professional_service

サブスクリプション商品

サブスクリプション商品グループ

グループは共有トライアルとサブスクリプション商品間のプラン切替を可能にします。

チェックアウトセッション

注文レベルパラメータと優先度

createSession に渡すパラメータで商品レベルの設定を上書きできます。AI 統合において優先度の階層の理解は不可欠です:
priceSnapshot は動的価格設定の鍵となるパラメータです。 priceSnapshot を指定すると、商品に設定された価格は完全に無視されます。ユースケースには、使用量ベースの階層価格設定、動的クーポン割引、異なる価格ポイントの A/B テストなどがあります。

Webhook 統合の要点

Webhook を統合する際に留意すべき重要なポイント: 典型的な Webhook ハンドラーパターン:

サブスクリプションのキャンセル

GraphQL クエリ

読み取り専用。ID 変数には String! を使用してください(ID! ではありません)。

Webhook 検証

SDK には両環境の公開鍵が埋め込まれています。検証は関数呼び出し一回で完了します。

Next.js App Router

Express

Hono

検証オプション

イベントタイプ

イベント構造

Webhook URL の設定

1 つのストアには複数の Webhook を登録でき、それぞれ異なるチャネル(httpfeishudiscordtelegramslack)に配信されます。チャネルと環境ごとに 1 件ずつ登録します:
Webhook 一覧の取得には GraphQL の Store.storeWebhooks フィールドを使用します — これが唯一のクエリエントリポイントです。

エラーハンドリング

エラーはコールスタックの深さ順に並びます:errors[0] が根本原因(最深層)、errors[n] が最も外側の呼び出し元です。

開発のヒント

  1. Webhook トンネリング — localtunnel ではなく cloudflared を使用してください(「よくある落とし穴」を参照)。
  1. 冪等性は自動 — SDK は merchantId + path + body から決定論的なキーを生成します。リトライは安全です。
  2. Test → Prod ワークフロー — 商品はデフォルトで test 環境に作成されます。.publish() で本番環境にプロモートします。Webhook イベントには mode: "test" | "prod" が含まれるため、ハンドラーで区別できます。

ダッシュボード UI 用語集

ダッシュボードは英語、中国語、日本語に対応しています。ドキュメントがダッシュボードの場所(例:「Integration に移動」)を参照するとき、ラベルは言語によって異なる場合があります。この表を使って正しいメニュー項目を見つけてください。

ナビゲーション

主要フィールド

モードと操作

商品と課金

ステータス

ID の確認場所


クイックスタートチェックリスト

  1. npm install @waffo/pancake-ts
  2. WAFFO_MERCHANT_IDWAFFO_PRIVATE_KEY 環境変数を設定(上記「ID の確認場所」を参照)
  3. new WaffoPancake({ merchantId, privateKey }) で初期化
  4. ストアを作成または参照
  5. マーチャントが複数のストアを持つ場合、どのストアに商品を紐づけるか確認
  6. 商品を作成または参照
  7. チェックアウトを作成:client.checkout.createSession(...)checkoutUrl にリダイレクト
  8. サンドボックスでテストカード 4576750000000110(成功)または 4576750000000220(拒否)でテスト
  9. Webhook を処理:verifyWebhook(rawBody, sig)必ず request.text() を使用
  10. Webhook URL を設定:client.webhooks.add({ storeId, channel: "http", url, events, testMode })