E コマースでは、カゴ落ちとは、顧客が購入の完了前に決済フローを離れる場合のことです。顧客を Checkout に戻すには、リカバリーフローを作成して、購入を完了するようメールで顧客に連絡をします。
カゴ落ちのメールは、広義では顧客に新製品について知らせたり、クーポンや割引を提供したりするための「プロモーションメール」カテゴリーに分類されます。顧客にメールを送信するには、顧客がプロモーションメールの受信に同意している必要があります。Checkout は以下に役立ちます。
- プロモーションメールを送信できるように顧客からの同意を収集します。
- 顧客が Checkout を破棄したときに通知を受け取り、カートの破棄に関するメールを送信できるようにします。
プロモーション用コンテンツへの同意を収集するように Checkout を設定します。顧客のメールアドレスを収集して、Checkout にリダイレクトされる前にプロモーション用コンテンツへの同意をリクエストする場合、consent_collection[promotions]
をスキップできます。
curl https://api.stripe.com/v1/checkout/sessions \
-u "sk_test_BQokikJOvBiI2HlWgH4olfQ2
:" \
-d "line_items[0][price]"= \
-d "line_items[0][quantity]"=1 \
-d customer= \
-d mode=payment \
--data-urlencode success_url="https://example.com/success" \
-d "consent_collection[promotions]"=auto
Checkout セッションは、その expires_at タイムスタンプに達すると、顧客が購入していなくても破棄されます。この場合、セッションにアクセスできなくなり、Stripe が checkout.session.expired
Webhook を起動します。この Webhook をリッスンすることで、顧客を新しい Checkout セッションに戻して購入を完了してもらう機会を作ることができます。この機能を使用するには、セッションの作成時に after_expiration.recovery
を有効にします。
curl https://api.stripe.com/v1/checkout/sessions \
-u "sk_test_BQokikJOvBiI2HlWgH4olfQ2
:" \
-d "line_items[0][price]"= \
-d "line_items[0][quantity]"=1 \
-d mode=payment \
--data-urlencode success_url="https://example.com/success" \
-d customer= \
-d "consent_collection[promotions]"=auto \
-d "after_expiration[recovery][enabled]"=true \
-d "after_expiration[recovery][allow_promotion_codes]"=true
checkout.session.expired
Webhook をリッスンすると、顧客が Checkout を破棄してセッションの有効期限が切れたときに通知が届きます。リカバリーが有効な状態でセッションの有効期限が切れた場合、Webhook ペイロードに after_expiration が含まれます。これには、カゴ落ち通知メールに埋め込み可能な URL (after_expiration.recovery.url
) が記載されます。顧客がこの URL を開くと、期限切れの元のセッションをコピーした新しい Checkout セッションが作成されます。顧客は、このコピーセッションで購入を完了します。
注
セキュリティ上の理由により、セッションのリカバリー URL の有効期間は 30 日に設定され、after_expiration.recovery.expires_at
の日付をもって期限切れになります。
{
"id": "evt_123456789",
"object": "event",
"type": "checkout.session.expired",
"data": {
"object": {
"id": "cs_12356789",
"object": "checkout.session",
"consent_collection": {
"promotions": "auto",
},
"consent": {
"promotions": "opt_in"
},
"after_expiration": {
"recovery": {
"enabled": true,
"url": "https://buy.stripe.com/r/live_asAb1724",
"allow_promotion_code": true,
"expires_at": 1622908282,
}
}
}
}
}
リカバリーメールを送信する場合、期限切れセッション用の Webhook ハンドラを作成して、セッションのリカバリー URL を記載したメールを送信します。顧客が複数の Checkout セッションを破棄し、それぞれの checkout.session.expired
イベントが一斉にトリガーされることがあります。顧客にリカバリーメールを送信する際はその記録を残し、スパムメールと誤解されないよう配慮してください。
const endpointSecret = 'whsec_...';
const app = require('express')();
const bodyParser = require('body-parser');
const sendRecoveryEmail = (email, recoveryUrl) => {
console.log("Sending recovery email", email, recoveryUrl);
}
app.post('/webhook', bodyParser.raw({type: 'application/json'}), (request, response) => {
const payload = request.body;
const sig = request.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(payload, sig, endpointSecret);
} catch (err) {
return response.status(400).send(`Webhook Error: ${err.message}`);
}
if (event.type === 'checkout.session.expired') {
const session = event.data.object;
const email = session.customer_details?.email
const recoveryUrl = session.after_expiration?.recovery?.url
if (!email || !recoveryUrl) {
return response.status(200).end();
}
if (
session.consent?.promotions === 'opt_in'
&& !hasSentRecoveryEmailToCustomer(email)
) {
sendRecoveryEmail(email, recoveryUrl)
}
}
response.status(200).end();
});
デフォルトでは、Checkout セッションは作成後 24 時間で期限が切れますが、expires_at
を設定して有効期限を短縮し、より早いタイミングでカート放棄について通知を受けることができます。expires_at
には、セッション作成の 30 分後以降を設定できます。
curl https://api.stripe.com/v1/checkout/sessions \
-u sk_test_BQokikJOvBiI2HlWgH4olfQ2
: \
-d customer= \
-d "line_items[0][price]"= \
-d "line_items[0][quantity]"=1 \
-d mode=payment \
-d success_url="https://example.com/success" \
-d expires_at="{{NOW_PLUS_TWO_HOURS}}"
顧客が期限が切れた Checkout セッションのリカバリー URL を開くと、破棄されたセッションのコピーである新しい Checkout セッションが作成されます。
リカバリーメールがコンバージョンの成功に寄与したかどうかを確認するには、新しい Checkout セッションの checkout.session.completed
Webhook で recovered_from 属性を確認します。この属性は、期限が切れた元のセッションを参照します。
const endpointSecret = 'whsec_...';
const app = require('express')();
const bodyParser = require('body-parser');
const logRecoveredCart = (sessionId, recoveredFromSessionId) => {
console.log("Recording recovered session", sessionId, recoveredFromSessionId);
}
app.post('/webhook', bodyParser.raw({type: 'application/json'}), (request, response) => {
const payload = request.body;
const sig = request.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(payload, sig, endpointSecret);
} catch (err) {
return response.status(400).send(`Webhook Error: ${err.message}`);
}
if (event.type === 'checkout.session.completed') {
const session = event.data.object;
const recoveryFromSessionId = session.recovered_from
if (recoveryFromSessionId) {
logRecoveredCart(session.id, recoveryFromSessionId)
}
}
response.status(200).end();
});
カートを破棄した顧客向けに割引を提供すると、購入を完了する動機付けになります。after_expiration.recovery.allow_promotion_code
を設定することで、リカバリー URL を指定して作成された Checkout セッションに、プロモーションコードのオプションを含めるかどうかを設定できます。
curl https://api.stripe.com/v1/checkout/sessions \
-u "sk_test_BQokikJOvBiI2HlWgH4olfQ2
:" \
-d "line_items[0][price]"= \
-d "line_items[0][quantity]"=1 \
-d mode=payment \
--data-urlencode success_url="https://example.com/success" \
-d customer= \
-d "consent_collection[promotions]"=auto \
-d "after_expiration[recovery][enabled]"=true \
-d "after_expiration[recovery][allow_promotion_codes]"=true