できること
- クーポンを作成:パーセンテージまたは固定額の割引に、対象商品、合計使用回数、有効期限を設定。購入者がチェックアウトで入力するコードを持ちます
- 同じクーポンにプロモーションコードを追加発行し、コードごとに独自の購入者制限を設定(対象メールアドレス、購入者ごとの回数、最低金額)—— インフルエンサーやキャンペーンチャネルごとのコード、使い切りコードの一括発行など
- 購入者がチェックアウトページでコードを入力する、コード適用済みの商品リンクを共有する、またはチェックアウトセッション作成時にサーバーからクーポンを適用したりプロモーションコードを事前入力したりする
クーポンとプロモーションコード
クーポンは割引の内容を定義し、購入者が入力できる自身のコードを持ちます(作成時に指定するか、Pancake に生成させます)。クーポンの制限は有効期限と合計使用回数のみなので、クーポン自身のコードはその範囲内でどの購入者も使用できます。プロモーションコードは同じクーポンの別のコードで、購入者の制限を持ちます。1 つのクーポンに複数のプロモーションコードを持たせられ、購入者はプロモーションコードの制限に加えて、クーポンの有効期限と合計使用回数も満たす必要があります。プロモーションコードはクーポンと同じリクエストで一緒に作成することも、後から追加することもできます。サーバーからcouponId で適用するクーポンにはコードは不要です。
クーポンとそのコードは 1 つのストア、1 つの環境に属します。テストモードで作成したコードはライブモードでは使えません。コードは大文字・小文字を区別しません ——
spring-20 と入力しても SPRING-20 として扱われます。
クーポンの作成
Dashboard 経由
Dashboard → クーポンで、クーポンの作成、プロモーションコードの追加、コードの一括生成、各コードの使用回数の確認ができます。Dashboard ガイドのクーポンを参照してください。API または SDK 経由
サーバーからクーポンとプロモーションコードのエンドポイントで作成します:よくあるキャンペーン
マーチャントがよく行うプロモーションごとの設定方法です。どれも 1 つのクーポンで、購入者ごとにルールを変えたい場合はプロモーションコードを追加します。Dashboard でも SDK でも設定できます。新商品発売:期間限定の公開コード
新商品発売:期間限定の公開コード
誰でも使える 20% オフのコードを 2 週間、上限付きで配布します。
- 設定:クーポンを 1 つ。パーセント 20、有効期限は 2 週間後、利用上限(たとえば 500)、対象は全商品または発売商品のみ。クーポン自身のコード(例:
LAUNCH-20)が公開コードになります。 - 購入者の使い方:チェックアウトページでコードを入力します。クーポンを作成した時点で商品リンクにコード入力欄が表示されます。広告やメールではコードをリンクに組み込めば入力不要です:
…/product/{productId}?discount_code=LAUNCH-20 - 注意:有効期限は入力時と注文時の両方で確認されるため、期限前にページを開いて期限後に支払うと通常価格になります。クーポンの期限切れは、適用済みのサブスクリプションの割引も終了させます。
インフルエンサーとチャネル:パートナーごとに 1 コード
インフルエンサーとチャネル:パートナーごとに 1 コード
割引は同じでも、どのパートナー経由の注文かを把握し、それぞれ別々に上限を設けたい場合です。
- 設定:割引を定義するクーポンを 1 つ作り、その上にパートナーごとのプロモーションコードを追加します:
KOL-ALICE、KOL-BOB、PODCAST-10。それぞれに総利用回数を設定し、必要なら最低注文金額も設定します。クーポン自身のコードは公開しなくて構いません。 - 購入者の使い方:パートナーがコード、または
?discount_code=KOL-ALICE付きの商品リンクを共有します。 - 確認:クーポンの詳細でコードごとの利用回数を確認でき、CSV でエクスポートしてパートナーへの報告に使えます。契約終了時はそのパートナーのコードだけを無効化すれば、他のコードはそのまま使えます。
ニュースレターやプレゼント:1 人に 1 つの使い切りコード
ニュースレターやプレゼント:1 人に 1 つの使い切りコード
受信者ごとに 1 回だけ使えるコードを配り、コードの共有を防ぎます。
- 設定:クーポンを 1 つ作り、その上で一括生成します。必要な数(1 回の生成で最大 500)、
NEWS-などのプレフィックス、「各コードは最大 1 回まで」。CSV をダウンロードしてメールツールに差し込みます。 - 購入者の使い方:各メールに 1 つのコードが入り、購入者がチェックアウトで入力します。
- 注意:コードは支払い済みの注文で使い切られます。未払いの注文は 72 時間使用を保持し、その後コードは再び使えるようになります。一括生成のコードはランダムなので、誰がどのコードを使ったかは CSV と注文のメールアドレスを突き合わせるしかありません。
復帰促進や VIP リスト:特定の購入者だけ
復帰促進や VIP リスト:特定の購入者だけ
コードが漏れても、リストにある購入者しか使えない割引です。
- 設定:プロモーションコードに「特定の購入者のみ利用可能」を設定してメールアドレスを貼り付け、「各購入者は最大 1 回まで」を設定します。
- 購入者の使い方:チェックアウトでコードを入力します。コードはチェックアウトページに入力されたメールアドレスと照合されるため、メールアドレス入力前に適用すると、ページが先にメールアドレスを求めます。リストにない購入者には、特定の購入者向けのコードであることが表示されます。
- 注意:メールアドレスの完全一致(大文字小文字は区別しません)で照合します。別のメールアドレスで決済する購入者は拒否されるので、どのアドレスに送ったかを伝えてください。
会員ランクやパートナー価格:自分で決め、コードは見せない
会員ランクやパートナー価格:自分で決め、コードは見せない
誰が割引を受けるかは自社システムが判断し(会員ランク、リセラー、合意した見積もり)、購入者にコードを見せたり共有させたりしたくない場合です。
- 設定:ランクごとにクーポンを 1 つ(
Gold 15%、Partner 25%)。コードを公開する必要はありません。 - 購入者の使い方:サーバーが
couponIdを指定してチェックアウトセッションを作成し、そのcheckoutUrlに購入者を送ります。チェックアウトページには割引と割引後の合計が表示され、コードもコード入力欄も表示されず、購入者は割引を外せません。 - 注意:
couponIdには API Key が必要なので、対象かどうかはサーバーコードで判断し、ブラウザから送られた値は使わないでください。Next.js SDK のcreateCheckoutActionはcouponIdを取り除くため、サーバーコードから@waffo/pancake-tsを呼びます。購入者が自分のコードを重ねられるようにするには、代わりにプロモーションコードをpromotionCodeとallowPromotionCodes: trueで渡します。クーポンはコード入力と併用できません。
サブスクリプション:最初の数か月を割引、または年額への移行促進
サブスクリプション:最初の数か月を割引、または年額への移行促進
月額プランで「3 か月間 25% オフ」、または年額プランでのみ使えるコードで購入者を年額へ誘導します。
- 設定:最初の数か月の割引には、期間「複数の請求サイクル」= 3 のクーポン。年額への誘導には年額商品限定のクーポンを使うと、月額プランではコードが
PRODUCT_NOT_ELIGIBLEで拒否されます。 - 購入者の使い方:新規購入者はチェックアウトでコードを入力します。既存の月額購入者はカスタマーポータルからプランを変更します。年額プランで使えるコードがあればプラン変更ページにコード入力欄が表示されます。または
promotionCodeを指定したプラン変更セッションを自分で作成し、そのリンクを送ることもできます。 - 注意:無料トライアルは割引を消費せず、最初の有料期間から割引が始まります。有料トライアルは割引を消費し、最初の期間として数えられます。プラン変更時、新しいコードは現在の割引を置き換えます。コードがなければ現在の割引が使用済みの期間を引き継いで継続します。サブスクリプションとプラン変更を参照してください。
まずテスト、それから本番へ
まずテスト、それから本番へ
クーポンは 1 つの環境にのみ属するため、テストモードで作成したクーポンは本番モードでは見えません。
- 設定:テストモードでクーポンとコードを作成し、テストカードでチェックアウトを試します。
- 本番へ:クーポンを開いて本番環境へコピーを選びます(商品を先に本番へ公開しておく必要があります)。コピーは利用回数 0 から始まり、オプションを選べば有効かつ期限内のプロモーションコードも一緒にコピーされます。API の場合は本番の API Key でクーポンを再作成します。
- 注意:本番ですでに使われているコードがあるとコピーは中止されます。先に本番でそのコードを無効化するか、コードなしでコピーしてください。
チェックアウトでの割引の適用
割引は次の 4 つの方法のいずれかでチェックアウトページに届きます。購入者は支払い前に、割引後の税込合計を必ず確認できます。コード入力欄
商品リンクとストアページでは、ストアにその商品で使えるコードがある場合にコード入力欄が表示されます。商品が対象で、期限切れでなく、合計使用回数の上限に達していないactive なクーポンがあり、そのクーポン自身のコードまたはプロモーションコードが active で、期限切れでなく、自身の使用回数の上限に達していないことが条件です。対象購入者や最低金額など購入者に依存するルールは、コード入力時にのみ検証されます。期限切れや上限到達の直後のコードでは、最大 5 分間コード入力欄が表示されたままになることがあります。API Key で作成したチェックアウトセッションでは、allowPromotionCodes: true を渡した場合にのみ表示されます:
よくあるシナリオ
よくある状況でチェックアウトページがどう判断し、何を渡せばよいか:コード付き商品リンク
商品リンクにdiscount_code を付けます。ページを開いた時点でコードが適用され、コード入力欄は表示されません:
サーバーで指定したクーポン
チェックアウトセッション作成時にcouponId(クーポンの CPN_ ID)を渡します。購入者には割引の内容(名前、金額、期間)が表示されますが、クーポンに自身のコードがあってもコードは表示されません。コードを表示したい場合は、代わりに promotionCode で事前入力します。クーポンはその場で検証され、別のストアや環境のクーポン、無効化済み・期限切れのクーポン、商品が対象外のクーポン、セッション通貨の金額がない固定額クーポンは 409 で拒否されます —— チェックアウトセッションの作成を参照してください。
couponId は allowPromotionCodes や promotionCode と同時に指定できません。両方を送ると 400 が返ります。couponId はマーチャントの認証情報(API Key または JWT)でのみ受け付けます。Store Slug のリクエストや customer のセッショントークンは 403 になり、Next.js SDK の server action も couponId を取り除くため、購入者が自分でクーポンを選ぶことはできません。
サーバーで事前入力したプロモーションコード
promotionCode —— クーポンコードまたはプロモーションコードの文字列。大文字小文字を区別しません —— を渡すと、チェックアウトページを開いた時点でそのコードが適用されます。couponId と同じルールでその場で検証され、使えないコードは 409 で拒否されます。購入者が変更できるかは allowPromotionCodes で決まります:
couponId と同じく、promotionCode はマーチャントの認証情報(API Key または JWT)でのみ受け付けます —— Store Slug のリクエストや customer のセッショントークンは 403 になり、Next.js SDK の server action も取り除きます。
コードが使えない場合
Pancake は購入者がコードを入力したときに確認し、最終的には注文確定時の判定に従います。入力時の確認は事前チェックのため、次のルールは注文時に判定されます:- ゲストのチェックアウトでは、入力時の合計使用回数には支払い済みの注文だけを数え、支払い済みの回数が上限に達したときにだけ拒否します。未払いの注文と購入者ごとの回数は注文時に判定します。残りの枠を他の購入者の未払い注文が使っている場合は、注文時に拒否されます。
- ログイン済みの購入者が同じコードで作成した自分の未払い注文は、使用回数に数えません。ただし、まだ使用枠を確保している未払いのプラン変更は除きます —— 確定済みで切り替え日を待っている変更、または現在の割引が引き継がれる先の変更です。
- 購入者が支払いページを離れて未払いのまま戻ってきても、同じコードをもう一度入力できます。新しい注文を確定すると、未払い注文が使っていた枠を新しい注文が引き継ぎます。
注文確定の時点で初めてルールを満たさなくなった場合(直前に別の購入者が最後の 1 回を使ったなど)、注文は作成されず、請求も発生せず、チェックアウトセッションは引き続き使用できます。購入者が次にできることはコードの適用方法によって異なります:
コードを使って注文した購入者がまだ支払っていない場合、同じコードで新しい注文を作成できます。新しい注文が以前の注文の使用枠を引き継ぎます。以前の注文も支払い可能なままですが、それも支払われた場合は要確認となり、もう 1 回の使用としては数えません。
未払いの注文が使用枠を確保するのは 72 時間までです。それを過ぎると、同じクーポンを使う次の注文 —— そのクーポンのどのプロモーションコードでも、どの購入者の注文でも —— がその枠を取り戻します。未払いの注文はキャンセルされず状態もそのままで、後から支払われた場合は要確認となり、もう 1 回の使用としては数えません。
サブスクリプション
新規サブスクリプションでも、単発商品と同じ方法・同じルールで割引を付けられます。購入者は支払い前に、初回の請求額と以降の各期間の金額を、割引前と割引後の両方で確認できます。割引される期間の数
割引前の金額が 0 より大きい期間だけが割引を消費します。100% オフの期間は請求額が 0 でも、通常どおり 1 期間を消費します。
トライアル
プロモーションコードの最低金額は、初回の請求の割引前・税抜金額で判定します:有料トライアルではトライアル価格、それ以外は通常価格です。更新時には再判定しません。
例えば月額 $10、20% オフ、`repeating` 3 期間の場合、第 1〜3 期は $8、第 4 期以降は $10 を請求します。7 日間の無料トライアルと `once` のクーポンの場合、トライアルは $0、最初の有料月が割引され、以降は通常価格です。
使用回数が加算されるとき
- 割引される最初の請求が成功したときに 1 回加算されます:最初の有料の請求、有料トライアルではトライアルの請求です。以降の更新では加算されません。
- それまではサブスクリプションが使用枠を確保しています。その請求の前にサブスクリプションが終了した場合 —— 無料トライアル中のキャンセル、または初回の支払いが成功しなかった場合 —— 使用枠は戻り、購入者は再びコードを使えます。72 時間を超えて未払いのサブスクリプション注文はキャンセルされませんが、使用枠は確保しなくなります:同じクーポンを使う次の注文(そのクーポンのどのプロモーションコードでも)がその枠を取り戻します。
- その請求の前にクーポンの有効期限が過ぎ、通常価格で請求された場合も、使用枠は戻ります。
- 同じ購入者が同じコードで新しい注文を作成したときに引き継がれるのは、一度も支払われていない以前の注文の使用枠だけです。無料トライアル中の有効なサブスクリプションは使用枠を確保したままです:新しい注文には引き継がれず、確保中の枠はコードの回数制限に数えられます。
割引が終わるとき
- 適用期間が終わると、更新は通常価格で請求されます。
- クーポンの有効期限は、サブスクリプションに適用済みの割引も終了させます:期限後の更新は
foreverでも通常価格で請求されます。プロモーションコード自体の有効期限は、新しい使用を止めるだけです。 - クーポンを無効化しても、サブスクリプションに適用済みの割引は次回のプラン変更まで終了しません —— プラン変更を参照してください。
- サブスクリプションをキャンセルすると割引は完全に失効します。期間終了前にキャンセルを取り消した場合、割引はそのまま続きます。
- プラン変更では、割引が新しいプランに引き継がれない限り割引は終了します —— プラン変更を参照してください。
プラン変更
プラン変更は、サブスクリプションを新しいプランの新しいサブスクリプションに置き換えます。プラン変更セッションが許可していれば、プラン変更ページにコード入力欄が表示されます。また、新規購入と同じようにプラン変更セッションにcouponId や promotionCode を設定できます —— チェックアウトセッションの作成を参照してください。商品リンクの discount_code はプラン変更には使えません。プラン変更ページではメールアドレスを入力しないため、プロモーションコードの対象購入者リストは元のサブスクリプションの購入者メールアドレスで照合します —— コード入力時もプラン変更の送信時も同じです。
つまり、クーポンを無効化すると、サブスクリプションに適用済みの割引は次回のプラン変更で終了します。
- 第 1 期。 即時に適用される変更では、新しいサブスクリプションの第 1 期の金額は、新しいプランの価格から当期の未使用分のクレジットを引いた額 —— または
changeAmount/changeCreditAmountで指定した金額 —— です。これが 0 より大きければ割引が適用され、1 期間を消費します。割引は新しいプランの全額で計算し、そのあとで元のプランの残りのクレジットを差し引きます:パーセント割引は新しいプランの価格に対する割合、定額割引は同じ金額で、割引額は第 1 期の金額が上限です。購入者の支払いは第 1 期の金額から割引を引いた額で、0 を下回りません。割引が第 1 期の金額全体をカバーする場合も 1 期間を消費します。0 の場合 —— 多くはクレジットが新しいプランの価格以上になるダウングレード —— 割引は適用されず期間も消費せず、割引は第 2 期から始まります。次の期間から適用される変更は通常価格の期間から始まり、トライアルを付与する変更は上記のトライアルのルールに従います。 - クレジットは購入者が支払う金額に基づきます。 当期の未使用分のクレジットは、その期間に購入者が支払う金額から計算されます:その期間が割引されていれば割引後の金額、そうでなければ表示価格です。
- プロモーションコードの最低金額は、新しいプランの通常価格(割引前・税抜)で判定します。クレジットは差し引きません。
- 使用回数が加算されるとき。 新しいコードは、新しいサブスクリプションで割引される最初の請求が成功したときに加算されます —— 第 1 期、または第 1 期が 0 の場合は第 2 期です。変更が完了しなかった場合 —— 購入者が完了しなかった、決済チャネルが失敗を報告した、次の期間から適用される変更がキャンセルされた —— 使用枠は戻ります。開始されたまま完了しない変更は、72 時間後に使用枠を確保しなくなり、同じクーポンを使う次の注文(そのクーポンのどのプロモーションコードでも)がその枠を取り戻します —— すでに終了したサブスクリプションからその変更へ引き継がれる途中の枠も同様です。現在のサブスクリプション自身のコードが割引される最初の請求をまだ待っている場合、引き継がれる割引はその確保中の枠を新しいサブスクリプションに移します。新しいコードまたはコードなしの場合、その枠は戻ります。
repeating 3 期間で 1 期間使用済みのとき、購入者が期間の半ばにコードなしで月額 $10 にアップグレードしたとします。クレジットは $2(支払った $4 の半分)なので、第 1 期は割引前 $8・支払額 $7、次の期間は $9、それ以降は $10 です。代わりに新しい 20% オフ `once` のコードを入力した場合、割引は $2(月額 $10 の新しいプランの 20%)なので、第 1 期は割引前 $8・支払額 $6、それ以降は $10 で、元の割引の残り 1 期間は無効になります。
サブスクリプションの支払い金額
- サブスクリプションの注文には表示価格が記録されます。各支払いには、その期間について Pancake が想定する金額 —— 元の価格、割引額、支払額 —— が記録されます。
subscription.payment_succeededwebhook はlistPriceにこれらの金額(listTotal、discountAmount、total)を含めます。 - 請求額が想定した割引と一致しない場合 —— 割引が早く終了した、または多く・少なく請求された場合 —— Pancake が内部で照合します。支払いには想定金額が記録されたままで、実際の請求額は webhook の
chargedAmountにあります。 - 初回の領収書 —— 有料トライアルではトライアルの請求、トライアルなしでは最初の請求 —— には、その請求が割引される場合、元の価格、割引、小計、税額、支払額が表示されます。無料トライアルの初回の領収書は $0 で、内訳は表示されません。
- 各更新の領収書にも、その期間が割引される場合は同じ内訳が表示されます。トライアル終了後の最初の請求では更新の領収書は送られません —— 無料トライアルでは、これがまさに割引される期間です。購入者は請求予定の通知でその想定金額を確認できます。
- メールに表示される次回の請求額は、次の期間も割引される場合にのみ割引が反映されます。
- プラン変更後、新しいサブスクリプションの最初の支払いは第 1 期の金額を想定として記録します(プラン変更を参照)が、この支払いの領収書は送信されません。第 1 期が 0 の場合、この支払いは $0 の支払いです。以降の支払いは通常期間の金額を想定として記録します。顧客には代わりに「プラン変更」のメールが届き、新しいプランの割引前の通常価格、次回請求日、次回請求額(その期間に割引が適用される場合は割引後の金額)が表示されます。第 1 期の金額や割引の内訳は表示されません。支払い記録には第 1 期の各金額が残ります。以降の更新では上記のとおり領収書が送信されます。
金額、領収書、使用回数
- 割引は税込価格に適用されます。 パーセンテージ割引は通貨の最小単位に切り捨てます。固定額で合計がゼロを下回ることはなく、100% オフでは 0 円の注文になります。
- 注文、支払い記録、領収書、Dashboard には 3 つの金額が表示されます:元の価格、割引額、購入者の支払額。返金の上限は支払額です。
- 注文の価格スナップショットには表示価格が記録されます。 単発注文でもサブスクリプション注文でも、スナップショットの
totalは割引前の税込価格です。各請求の割引後の金額は支払い記録(snapshotAmountDetails.total)にあります。 - 割引のある領収書には、元の価格、割引、小計(割引後・税抜)、税額、支払額の順に表示されます。小計と税額の行は課税される場合のみ表示されます。
- 使用回数は支払い成功時に加算されます —— サブスクリプションでは割引される最初の請求です(サブスクリプションを参照)。注文がキャンセルまたは期限切れになると回数が戻り、購入者は再びコードを使えます。返金しても使用回数は戻りません。
次のステップ
クーポンエンドポイント
クーポンの作成、名前の変更、無効化
チェックアウトセッションの作成
クーポンの適用、またはコード入力欄の表示