サブスクリプションビジネスを成長させるために、「解約すると決めた理由」を知ることはとても重要です。
顧客が目的を達成したことによる円満解約なのか、サービスやサポートに対する不満が原因なのか。
原因を分析することで、サービスの解約率を低く抑え、収益率を高めることが可能です。
Customer Portalを利用して、追加の開発無しで解約理由のアンケートを追加する
Stripeでサブスクリプションを提供している場合、Customer Portalを利用して簡単に解約者へのアンケートを行えます。
Stripe ダッシュボードから解約者アンケートを有効化する
解約時のアンケート機能は、ダッシュボードから設定できます。
まずは[製品の設定 > カスタマーポータル]にアクセスしましょう。
カスタマーポータルの設定画面が表示されます。
[キャンセル]をクリックすると、[カスタマーポータルでサブスクリプションをキャンセルできるようにするか]の設定項目が開きます。
ここで[サブスクリプションをキャンセル]を有効化しましょう。
[サブスクリプションをキャンセル]を有効化すると、[キャンセル理由を収集する]ボタンが表示されます。
[キャンセル理由を収集する]を有効化しましょう。
アンケートに表示する項目・表示しない項目を選ぶ画面が開きました。
アンケートの選択肢に表示したいものを選んで、[閉じる]をクリックしましょう。
最後に[変更を保存]をクリックして、確定します。
Stripe APIでCustomer Portalの解約者アンケートを有効化する方法
複数のCustomer Portal設定を組み合わせて利用している場合、APIから設定を変更する必要があります。
その場合、billingPortal.configurations.update
APIを利用しましょう。
await stripe.billingPortal.configurations.update('bpc_xxx', {
features: {
subscription_cancel: {
cancellation_reason: {
enabled: true,
options: [
'customer_service',
'unused'
]
}
}
}
})
解約理由を確認する方法
ユーザーが解約時に入力したアンケート結果は、ダッシュボードまたはAPIから確認・収集できます。
ダッシュボードでは、サブスクリプションの詳細から確認
サブスクリプションごとの解約理由は、ダッシュボードのサブスクリプション詳細ページで確認できます。
解約理由とは別に、「ユーザーが平均何ヶ月契約を続けているか」のコホート図もダッシュボードから確認できます。
APIで解約理由を収集する
バッチ処理などで分析データを収集したい場合は、APIを利用します。
「キャンセル済みのサブスクリプション」を一覧取得し、必要に応じてレスポンスからアンケート結果の抽出や絞り込みなどを行いましょう。
const subscriptions: Stripe.Subscription[] = []
// 全件取得する際は、for awaitを利用する
// @see https://stripe.com/docs/api/pagination/auto
for await (const subscription of stripe.subscriptions.list({
status: 'canceled',
limit: 100,
})) {
// 解約理由のデータがないサブスクリプションを除外する場合
if (
!subscription.cancellation_details ||
!Object.values(subscription.cancellation_details).find(value => !!value)
) {
continue
}
subscriptions.push(subscription)
}
Webhookイベントから、解約理由を取得する
customer.subscription.deleted
やcustomer.subscription.updated
のWebhookイベントでも、解約理由を取得できます。
WebhookやIPaaSを利用することで、「Slackなどの社内ツールへの通知」や「外部の分析基盤やCRMへのデータ送信」なども自動化できます。
[有料オプション] Stripe Sigmaで解約理由をSQLから取得する
Stripe Sigmaを利用すると、SQLを使って様々な条件・角度から解約理由を調査できます。
例えば、次のSQLを利用して「どの理由で解約されることが多いのか」を調べることができます。
SELECT
subscriptions.cancellation_reason,
count(*) as reason_count
FROM subscriptions
WHERE subscriptions.cancellation_reason IS NOT NULL
GROUP by subscriptions.cancellation_reason
また、他にも次のSQLで、商品や料金ごとのキャンセル理由を集計できます。
SELECT
products.name AS product_name,
SUM(CASE WHEN subscriptions.cancellation_reason = 'other' THEN 1 ELSE 0 END) AS other_count,
SUM(CASE WHEN subscriptions.cancellation_reason = 'too_expensive' THEN 1 ELSE 0 END) AS too_expensive_count,
SUM(CASE WHEN subscriptions.cancellation_reason = 'unused' THEN 1 ELSE 0 END) AS unused_count,
SUM(CASE WHEN subscriptions.cancellation_reason = 'missing_features' THEN 1 ELSE 0 END) AS missing_features_count
FROM subscriptions
JOIN prices
ON subscriptions.price_id = prices.id
LEFT JOIN products -- join plans on products to get product name
ON prices.product_id = products.id
WHERE
subscriptions.cancellation_reason IS NOT NULL
GROUP BY products.name
「取引データは、1日以内にクエリ可能」のため、リアルタイムのデータを取得したい場合にはご注意ください。
https://stripe.com/docs/stripe-data/available-data?locale=ja-JP
[One more tips] AWSなどの外部サービスで分析する
Amazon S3とAmazon QuickSightなどを利用することで、「どの理由で解約されることが多いか」などをプランや製品ごとに分析することも可能です。
関連ドキュメント
- 全件取得する際のAPI実装方法: https://stripe.com/docs/api/pagination/auto
- Subscriptionの
cancellation_details
オブジェクトの詳細: https://stripe.com/docs/api/subscriptions/object#subscription_object-cancellation_details - Customer Portalの設定変更方法: https://stripe.com/docs/customer-management/configure-portal