Slide 1

Slide 1 text

Google Play Commerce からのアップデート Taichi Sato / syarihu Android Engineer Money Forward Inc.

Slide 2

Slide 2 text

最近のプラットフォームアップ デート 購入画面のアップデート メールリマインダー アンインストール時の通知

Slide 3

Slide 3 text

違反してない例 明確なオファー条件と請求頻度、 価格を備えたアプリ 違反の例 隠されたオファー条件、 不明確な請求頻度と価格のアプリ 詳細はこちら: goo.gle/play-trust-blog 最近のプラットフォームアップ デート

Slide 4

Slide 4 text

定期購入のカスタムプロモーションコード

Slide 5

Slide 5 text

定期購入のカスタムプロモーションコード

Slide 6

Slide 6 text

定期購入の価値を伝える

Slide 7

Slide 7 text

定期購入の価値を伝える

Slide 8

Slide 8 text

価格値下げ時のオプトインを省略

Slide 9

Slide 9 text

定期購入のリテンション

Slide 10

Slide 10 text

Account Hold & Grace Period Pause 定期購入のリテンション

Slide 11

Slide 11 text

開発者がAccount Holdにより得られた効果 8% 非自発的解約の 減少 35% 支払い失敗からの復 帰率

Slide 12

Slide 12 text

定期購入に関する変更点 設定 現在 2020年11月1日以降 Account Hold デフォルト: OFF 必須 Restore デフォルト: ON 必須 Pause デフォルト: OFF デフォルト: ON Resubscribe(新機能) デフォルト: OFF デフォルト: ON

Slide 13

Slide 13 text

Grace Period(猶予期間)

Slide 14

Slide 14 text

Grace Period(猶予期間) 定期購入の更新時にクレジットカードの期限切 れなどで支払いに失敗した場合に入る期間 猶予期間中はユーザーは引き続き定期購入に より提供されている機能を利用可能

Slide 15

Slide 15 text

Grace Period(猶予期間)

Slide 16

Slide 16 text

定期購入再購入 t1 t2 Is SKU returned in queryPurchases()? yes SUBSCRIPTION_IN_ GRACE_PERIOD Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true SUBSCRIPTION _RENEWED 定期購入有効期間

Slide 17

Slide 17 text

定期購入再購入 継続課金に失敗 猶予期間開始 t1 t2 Is SKU returned in queryPurchases()? yes SUBSCRIPTION_IN_ GRACE_PERIOD Real-time Developer Notifications expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true SUBSCRIPTION _RENEWED 定期購入有効期間 Fields in server API, Purchase.subscriptions

Slide 18

Slide 18 text

定期購入再購入 継続課金に失敗 猶予期間開始 猶予期間 (サービスは継続利用可能) t1 t2 Is SKU returned in queryPurchases()? yes yes SUBSCRIPTION_IN_ GRACE_PERIOD Real-time Developer Notifications expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 0 autoRenewing: true SUBSCRIPTION _RENEWED 定期購入有効期間 t3 Fields in server API, Purchase.subscriptions

Slide 19

Slide 19 text

定期購入再購入 継続課金に失敗 猶予期間開始 猶予期間 (サービスは継続利用可能) t1 t2 t3 Is SKU returned in queryPurchases()? yes yes no 定期購入 自動キャンセル SUBSCRIPTION_IN_ GRACE_PERIOD Real-time Developer Notifications expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 0 autoRenewing: true SUBSCRIPTION _CANCELED SUBSCRIPTION _RENEWED 定期購入有効期間 Fields in server API, Purchase.subscriptions

Slide 20

Slide 20 text

(猶予期間) 猶予期間に入ったらメールやPlayストアアプリか らユーザーに通知はされるが、アプリ上からも通 知や支払いを促す表示を行うとより効果的 猶予期間は今回は必須の対応ではないが、非 自発的な解約を防ぐためには有効な手段 Account Holdを有効にするタイミングで一緒に 有効にしておくのがおすすめ

Slide 21

Slide 21 text

Account Hold(アカウントの一時停止)

Slide 22

Slide 22 text

(アカウントの一時停止) 定期購入の更新時にクレジットカードの期限切 れなどで支払いに失敗した場合になる状態 猶予期間が有効の場合は猶予期間後にアカウ ントの一時停止状態になる 猶予期間との違いは、定期購入サービスは利用 できないこと

Slide 23

Slide 23 text

2020年11月1日から: 必須 現在: デフォルトOFF (アカウントの一時停止)

Slide 24

Slide 24 text

t1 t2 Is SKU returned in queryPurchases()? yes Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true SUBSCRIPTION _RENEWED 定期購入有効期間 定期購入再購入

Slide 25

Slide 25 text

猶予期間 (サービスは継続利用可能) t1 t2 t3 Is SKU returned in queryPurchases()? yes yes SUBSCRIPTION_IN_ GRACE_PERIOD Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 0 autoRenewing: true SUBSCRIPTION _ON_HOLD 継続課金に失敗 アカウントの一時停止開始 SUBSCRIPTION _RENEWED 定期購入有効期間 定期購入再購入 継続課金に失敗 猶予期間開始

Slide 26

Slide 26 text

猶予期間 (サービスは継続利用可能) t1 t2 t3 Is SKU returned in queryPurchases()? yes yes SUBSCRIPTION_IN_ GRACE_PERIOD Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 0 autoRenewing: true アカウントの一時停止 (サービスは利用不可) expiryTimeMillis: time of grace period end (t3) paymentState: 0 autoRenewing: true t4 no SUBSCRIPTION _ON_HOLD SUBSCRIPTION _RENEWED 定期購入有効期間 定期購入再購入 継続課金に失敗 猶予期間開始 継続課金に失敗 アカウントの一時停止開始

Slide 27

Slide 27 text

猶予期間 (サービスは継続利用可能) t1 t2 t3 Is SKU returned in queryPurchases()? yes yes no 定期購入 自動キャンセル SUBSCRIPTION_IN_ GRACE_PERIOD Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t2) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 0 autoRenewing: true SUBSCRIPTION _CANCELED アカウントの一時停止 (サービスは利用不可) expiryTimeMillis: time of grace period end (t3) paymentState: 0 autoRenewing: true t4 no SUBSCRIPTION _ON_HOLD SUBSCRIPTION _RENEWED 定期購入有効期間 定期購入再購入 継続課金に失敗 猶予期間開始 継続課金に失敗 アカウントの一時停止開始

Slide 28

Slide 28 text

アカウントの一時停止状態では購入情報が取得 できず、定期購入サービスの有効期間も切れて いるため、課金していないのとほぼ同じ状態 他プラットフォームで二重課金されないように、 アカウントの一時停止に入ったときと解決したと きに、サービス側で検知できるようになっている 必要がある (アカウントの一時停止)

Slide 29

Slide 29 text

サービス側で課金状態の変更を自動で検知でき るようになっていれば、アカウントの一時停止の 有効化は可能 (アカウントの一時停止)

Slide 30

Slide 30 text

メールやPlayストアアプリから通知はされるが、 アプリ上からもアカウントの一時停止状態である ことを通知し、支払いを促す表示を行うとより効 果的 アカウントの一時停止の検知はアプリから行え ないため、サーバーとの連携は必須 (アカウントの一時停止)

Slide 31

Slide 31 text

Restore(アカウントの復元)

Slide 32

Slide 32 text

(アカウントの復元) ユーザーが自発的にキャンセルした定期購入 (解約予約)が実際に解約されるまでの間に、 ユーザーが解約予約をキャンセルできる機能 解約予約のキャンセルはGoogle Play Subscriptions Centerから行える RestoreはResubscribeの機能の一部 2020年11月1日から: 必須 現在: デフォルトON

Slide 33

Slide 33 text

t1 Is SKU returned in queryPurchases()? yes Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t3) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 1 autoRenewing: true SUBSCRIPTION _RENEWED 定期購入有効期間 定期購入再購入 t3

Slide 34

Slide 34 text

解約予約期間 (この間は復元可能) t1 t2 t3 Is SKU returned in queryPurchases()? yes yes SUBSCRIPTION _CANCELED Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t3) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 1 autoRenewing: false SUBSCRIPTION _EXPIRED SUBSCRIPTION _RENEWED 定期購入有効期間 定期購入再購入 ユーザーが自発的に解約 (解約予約)

Slide 35

Slide 35 text

解約予約期間 (この間は復元可能) t1 t2 t3 Is SKU returned in queryPurchases()? yes yes SUBSCRIPTION _CANCELED Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t3) paymentState: 1 autoRenewing: true expiryTimeMillis: time of grace period end (t3) paymentState: 1 autoRenewing: false 定期購入解約 expiryTimeMillis: time of grace period end (t3) paymentState: 1 autoRenewing: false no SUBSCRIPTION _EXPIRED SUBSCRIPTION _RENEWED 定期購入有効期間 定期購入再購入 ユーザーが自発的に解約 (解約予約)

Slide 36

Slide 36 text

定期購入再購入 t1 Real-time Developer Notifications expiryTimeMillis: time of next renewal (t4) paymentState: 1 autoRenewing: true SUBSCRIPTION _RENEWED 定期購入有効期間 Is SKU returned in queryPurchases()? yes t4 Fields in server API, Purchase.subscriptions yes 定期購入再購入

Slide 37

Slide 37 text

定期購入再購入 t1 t2 t4 SUBSCRIPTION _CANCELED Real-time Developer Notifications expiryTimeMillis: time of next renewal (t4) paymentState: 1 autoRenewing: true expiryTimeMillis: time of subscription end (t4) paymentState: 1 autoRenewing: false SUBSCRIPTION _RENEWED 定期購入有効期間 Is SKU returned in queryPurchases()? yes yes SUBSCRIPTION _EXPIRED 解約予約期間 (この間は復元可能) ユーザーが自発的に解約 (解約予約) no 定期購入解約 Fields in server API, Purchase.subscriptions

Slide 38

Slide 38 text

定期購入再購入 t1 t2 t4 SUBSCRIPTION _CANCELED Real-time Developer Notifications Fields in server API, Purchase.subscriptions expiryTimeMillis: time of next renewal (t4) paymentState: 1 autoRenewing: true expiryTimeMillis: time of subscription end (t4) paymentState: 1 autoRenewing: false SUBSCRIPTION _RENEWED 定期購入有効期間 Is SKU returned in queryPurchases()? yes yes t3 SUBSCRIPTION _RESTARTED 解約予約を キャンセル SUBSCRIPTION _RENEWED expiryTimeMillis: time of next renewal (t4) paymentState: 1 autoRenewing: true 解約予約期間 (この間は復元可能) ユーザーが自発的に解約 (解約予約) yes

Slide 39

Slide 39 text

(アカウントの復元) Google Play Subscriptions Centerからしか行 えないことと、Purchase Tokenや定期購入の有 効期間も変わらないため、基本的には対応しな くても問題ない

Slide 40

Slide 40 text

Resubscribe(定期購入の再開)

Slide 41

Slide 41 text

(定期購入の再開) 解約予約した定期購入を再開できる機能 Resubscribeには3種類のパターンがある

Slide 42

Slide 42 text

(定期購入の再開) ● 解約予約した定期購入の有効期限が切れる前 ○ アプリ内から定期購入を再開する ○ Google Play Subscriptions Centerから定期 購入を再開する(Restore) ● 定期購入の有効期限が切れたあと ○ Google Play Subscriptions Centerから最大1 年の間に同じSKUを再購入する

Slide 43

Slide 43 text

有効期限が切れる前 Restoreとアプリ内から行うResubscribeでは定 期購入の有効期間が変わらないのは同じ アプリ内から行うResubscribeではPurchase Tokenが新しく生成されるのがRestoreとの違い

Slide 44

Slide 44 text

有効期限が切れる前 Resubscribeではアプリ内からの再開となるため、 アプリ内に「再開」ボタンを設置する必要がある isAutoRenewingで解約予約中かを判別して導線 を表示する 考慮することが増えてしまうため、アプリ内に再開 導線を出すよりはGoogle Play Subscrition Center を開くようにするのがおすすめ 詳細はこちら: developer.android.com/goo gle/play/billing/subs#deep- link

Slide 45

Slide 45 text

有効期限が切れたあと Billing Library 2+を使用している場合、ユー ザーは定期購入の有効期限が切れてから最大 1年間、Google Play Subscriptions Centerから 定期購入を再購入できる アプリの外部で行われるアプリ外購入となる サービス側でアプリ外購入を検知して、自社 サーバーで購入情報を処理できるようにしておく 必要がある

Slide 46

Slide 46 text

(定期購入の再開) 2020年11月1日から: デフォルトON 現在: デフォルトOFF

Slide 47

Slide 47 text

Pause(定期購入の一時停止)

Slide 48

Slide 48 text

(定期購入の一時停止) ユーザーが一定期間だけ定期購入を一時停止 できる機能 一週間から3ヶ月の期間で定期購入を一時停止 できる 年間定期購入は一時停止できない

Slide 49

Slide 49 text

(定期購入の一時停止) 解約以外の請求を止める選択肢ができた 海外出張など、一時的に使わないユーザーを 引き止められる ユーザーの自発的な解約を防ぐことが期待でき る

Slide 50

Slide 50 text

定期購入再購入 t1 t2 Real-time Developer Notifications Fields in server API, Purchase.subscription s expiryTimeMillis: time of next renewal (t2) autoResumeTimeMillis: n/a SUBSCRIPTION _RENEWED Is SKU returned in queryPurchases()? 定期購入 有効期間

Slide 51

Slide 51 text

定期購入再購入 t1 Real-time Developer Notifications Fields in server API, Purchase.subscription s expiryTimeMillis: time of next renewal (t2) autoResumeTimeMillis: n/a SUBSCRIPTION _RENEWED Is SKU returned in queryPurchases()? SUBSCRIPTION_PAUSE_ SCHEDULE_CHANGE 定期購入 一時停止予約 定期購入 有効期間 expiryTimeMillis: time of pause start (t2) autoResumeTimeMillis: time of pause end (t3) t2 SUBSCRIPTION _CANCELED 定期購入 一時停止開始

Slide 52

Slide 52 text

定期購入再購入 t1 t2 SUBSCRIPTION _CANCELED Real-time Developer Notifications Fields in server API, Purchase.subscription s expiryTimeMillis: time of next renewal (t2) autoResumeTimeMillis: n/a expiryTimeMillis: time of pause start (t2) autoResumeTimeMillis: time of pause end (t3) SUBSCRIPTION _RENEWED Is SKU returned in queryPurchases()? expiryTimeMillis: time of next renewal (t4) autoResumeTimeMillis: n/a SUBSCRIPTION_PAUSE_ SCHEDULE_CHANGE 定期購入 一時停止予約 t3 定期購入 有効期間 一時停止 (サービスは利用不可) 定期購入 一時停止開始 定期購入 有効期間 SUBSCRIPTION _RENEWED 一時停止終了 定期購入再購入

Slide 53

Slide 53 text

定期購入再購入 t1 t2 SUBSCRIPTION _CANCELED Real-time Developer Notifications Fields in server API, Purchase.subscription s expiryTimeMillis: time of next renewal (t2) autoResumeTimeMillis: n/a expiryTimeMillis: time of pause start (t2) autoResumeTimeMillis: time of pause end (t3) SUBSCRIPTION _RENEWED Is SKU returned in queryPurchases()? expiryTimeMillis: time of pause start (t2) autoResumeTimeMillis: n/a SUBSCRIPTION_PAUSE_ SCHEDULE_CHANGE 定期購入 一時停止予約 t3 再購入に失敗 定期購入の一時停止終了 アカウントの一時停止開始 アカウントの一時停止 (サービスは利用不可) 定期購入の一時停止 (サービスは利用不可) 定期購入 一時停止開始 定期購入 有効期間 SUBSCRIPTION_ _ON_HOLD

Slide 54

Slide 54 text

(定期購入の一時停止) 2020年11月から: デフォルト ON 現在: デフォルトOFF

Slide 55

Slide 55 text

Play Billing Library

Slide 56

Slide 56 text

AIDLを抽象化した課金ライブラリ Play Billingとの接続管理などを内蔵 アップグレードが簡単 Recap

Slide 57

Slide 57 text

新しい定期購入プロモーション機能 Purchase attribution Kotlin extension、Unity plug-in 新しいバージョンが利用可能

Slide 58

Slide 58 text

に アップグレードする gradleファイルをアップデートする compile 'com.android.billingclient:billing:2.0' compile 'com.android.billingclient:billing:3.0' APIの変更を反映する(リリースノートを参照): goo.gle/play-billing-release-notes 1 2

Slide 59

Slide 59 text

購入を特定のゲーム内キャラクターに関連付ける 非推奨のdeveloper payloadを回避する

Slide 60

Slide 60 text

val params = BillingFlowParams.newBuilder()

Slide 61

Slide 61 text

val params = BillingFlowParams.newBuilder() // Specify an obfuscated identifier to uniquely identify the // user’s account. .setObfuscatedAccountId(obfuscatedAccountId)

Slide 62

Slide 62 text

val params = BillingFlowParams.newBuilder() // Specify an obfuscated identifier to uniquely identify the // user’s account. .setObfuscatedAccountId(obfuscatedAccountId) // Optionally, specify an obfuscated identifier to uniquely // identify the character profile with the user’s account. .setObfuscatedProfileId(obfuscatedProfileId)

Slide 63

Slide 63 text

val params = BillingFlowParams.newBuilder() // Specify an obfuscated identifier to uniquely identify the // user’s account. .setObfuscatedAccountId(obfuscatedAccountId) // Optionally, specify an obfuscated identifier to uniquely // identify the character profile with the user’s account. .setObfuscatedProfileId(obfuscatedProfileId) billingClient.launchBillingFlow(activity, params.build())

Slide 64

Slide 64 text

// After a successful purchase val accountIds = purchase.getAccountIdentifiers() accountIds.getObfuscatedAccountId() accountIds.getObfuscatedProfileId()

Slide 65

Slide 65 text

のサポート 予測可能なリリース 2年間のサポート期間 ユーザーは新しい支払いオプションやUX、パ フォーマンス、セキュリティアップデートなどを受 け取れるメリットがある すべてのユーザーにとってより良い体験を

Slide 66

Slide 66 text

のサポート Billing Library 2+では、acknowledgeや Pending transactionsなどの新しい仕組みが導 入されている AIDLやBilling Library 1+からアップデートする際 には注意 すべてのユーザーにとってより良い体験を

Slide 67

Slide 67 text

要件 June 3 Nov. 1 Aug. 2 Nov. 1 Billing Library version requirements Billing Library 3 Launched New apps require Billing Library 3+ Updates require Billing Library 3+ 2020 2021

Slide 68

Slide 68 text

June 3 Nov. 1 Aug. 2 Nov. 1 Billing Library version requirements Billing Library 3 Launched New apps require Billing Library 3+ Updates require Billing Library 3+ 2020 2021 All subscription apps require - Account hold - Restore By default, all subscription apps have - Pause - Resubscribe Subscription featurerequirem ents 要件

Slide 69

Slide 69 text

新しいドキュメント: goo.gle/play-commerce

Slide 70

Slide 70 text

詳細はこちら: link.medium.com/p52eGFEj58

Slide 71

Slide 71 text

詳細はこちら: youtu.be/UjZxICZXOa8

Slide 72

Slide 72 text

Thank you