Slide 1

Slide 1 text

iOSDC 2021 知られざる課金ステータス 2021/09/18(Sat) 14:10〜14:30 Track E コネヒト株式会社 高野建太 @ohayoukenchan

Slide 2

Slide 2 text

はじめに 本セッションの概要

Slide 3

Slide 3 text

これからお話すること ・コネヒトとママリの紹介 ・オファーのおさらい ・いろいろな課金ステータスでオファーを受けてみる ・まとめ

Slide 4

Slide 4 text

このセッションのゴール ・オファーのことがちょっとワカル  →ここで言うワカルとは… ①オファーを受けた後どのようなタイミングでオファーが切り替わるか ②複数のオファーを同時に受けたときの仕様がなんとなくワカル

Slide 5

Slide 5 text

自己紹介 高野 建太 @ohayoukenchan 所属: コネヒト株式会社 経歴: to C向け事業会社を数社 専門: iOSアプリ開発たまにフロントエンド

Slide 6

Slide 6 text

コネヒトとママリの紹介 会社概要と事業内容

Slide 7

Slide 7 text

コネヒトのビジョン

Slide 8

Slide 8 text

"家族" を取りまく様々な課題の解決を目指す、 日本の中でもユニークなドメインを持つ会社です!

Slide 9

Slide 9 text

コネヒトが取り組む4つの課題

Slide 10

Slide 10 text

主力事業 / プロダクト ママの一歩を支えるブランド ママリの運営

Slide 11

Slide 11 text

ママ向けNo.1アプリ「ママリ」 ※ ・Q&Aコミュニティ  →ママ同士で悩みを相談しあうQ&Aプラットフォーム ・メディア  →育児に役立つコンテンツ(記事や動画)を毎日配信 ・ママリプレミアム  →人気順検索や限定記事などより便利に使える機能 ※妊娠中〜2歳0ヶ⽉の⼦供を持つ⼥性1023⼈を対象とした調査より「現在使っているアプリ(妊娠・⼦育て系) をすべて教えてください」で第1位 (17年8⽉実施、調査協⼒:インテージ) 本日お話する内容

Slide 12

Slide 12 text

iOSアプリ直近の動き ・一部ユーザーに対してママリプレミアム1年無料の実装 ・Bitrise移行 🚀 ・Renovate導入 🚀 ・🚧 HTTPClient刷新 (APIKit+Swift.decodable から URLSession+Swift.decodable+Combine) ・🚧 アーキテクチャ再考 RxSwift+MVVM から Combine + MVVMへ TCAも検討 ・🚧 SwiftUI移行 ( Hosting Controllerだらけになりそうで検討中)

Slide 13

Slide 13 text

iOSアプリ直近の動き ・一部ユーザーに対してママリプレミアム1年無料の実装 ・Bitrise移行 🚀 ・Renovate導入 🚀 ・🚧 HTTPClient刷新 (APIKit+Swift.decodable から URLSession+Swift.decodable+Combine) ・🚧 アーキテクチャ再考 RxSwift+MVVM から Combine + MVVMへ TCAも検討 ・🚧 SwiftUI移行 ( Hosting Controllerだらけになりそうで検討中) 本題に移ります 興味ある方あとでトークさせてください 😆

Slide 14

Slide 14 text

お試しオファーと プロモーションオファー 比較をさらっと

Slide 15

Slide 15 text

お話しないこと オファーのタイプはお試しオファーとプロモーションオファーのみ ・オファーコードについては未検証 各オファーの請求方法は無料のみ ・都度払い、前払いは未検証 グレードの変更はクロスグレードのみ ・ダウングレード、アップグレードについては未検証

Slide 16

Slide 16 text

比較 お試しオファー プロモーションオファー 主な用途 新規サブスクリプション利用者の獲得 既存のサブスクリプション利用者の維持 と過去の利用者の再登録 利用資格 App内の 新規サブスクリプション利用者 App内の既存または 過去のサブスクリプション利用者。 利用の限度 サブスクリプショングループごとに 1件のお試しオファーを利用可能 デベロッパはユーザーが何件まで オファーを利用できるか決定する オファーの限度 サブスクリプションごと、 地域ごとに、1件のオファー サブスクリプションごとに、 10件のアクティブなオファー 互換性(iOS) iOS 10以降 iOS 12.2以降 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/#providing-subscription-offers

Slide 17

Slide 17 text

知られざる課金ステータス オファーを受けた後どのようなタイミングでオファーが切り替わるか

Slide 18

Slide 18 text

プロモーションオファーが 課金前のサブスクリプションに紐づく場合

Slide 19

Slide 19 text

プロモーションオファーが課金前のサブスクリプションに紐づく場合

Slide 20

Slide 20 text

1ヶ月無料 1ヶ月自動契約更新 最大 13ヶ月 課金前のサブスクリプション 適用後の無料期間 プロモーションオファーが課金前のサブスクリプションに紐づく場合 1年無料の プロモーションオファー 適用するオファー お試しオファー無料期間中の場合

Slide 21

Slide 21 text

1ヶ月無料 1ヶ月自動契約更新 最大 13ヶ月 課金前の課金アイテム 適用後の無料期間 1年無料の プロモーションオファー 適用するオファー お試しオファー中の場合 お試しオファー無料期間が終了してから プロモーションオファー無料期間が適用される プロモーションオファーが課金前のサブスクリプションに紐づく場合

Slide 22

Slide 22 text

1ヶ月無料(課金中) 1ヶ月自動契約更新 契約期間 終了後 12ヶ月無料 課金前のサブスクリプション 適用後の無料期間 1年無料の プロモーションオファー 適用するオファー 課金中の場合 プロモーションオファーが課金前のサブスクリプションに紐づく場合

Slide 23

Slide 23 text

1ヶ月無料 1ヶ月自動契約更新 最大 13ヶ月 課金前のサブスクリプション 適用後の無料期間 1年無料の プロモーションオファー 適用するオファー お試しオファー中の場合 課金中に使うと 契約期間終了後に無料期間適用になる

Slide 24

Slide 24 text

まとめ ・サブスクリプションにプロモーションオファーが紐付いている場合、 ・お試しオファー無料期間中でなら、お試しオファーの無料期間終了後に、プ ロモーションオファーの無料期間が適用される ・課金中なら現在の契約期間終了後にプロモーションオファーの無料期間が適 用される ・ユーザーに不利益はなさそうなのでそのままお知らせすればよさそう

Slide 25

Slide 25 text

プロモーションオファーが 課金前のサブスクリプションに紐づかない場合 (契約期間が同じ場合)

Slide 26

Slide 26 text

例)1ヶ月自動継続課金のお試しオファーの 無料期間中に 別のサブスクリプションの1ヶ月自動継続課金のプロモー ションオファーを適応させるとどうなるの? プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 27

Slide 27 text

グレードと期間が同じ別のサブスクリプションに移行 プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 28

Slide 28 text

クロスグレードが発生し、 現在適用中のオファーは破棄され、 新しいオファーが適応されます プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 29

Slide 29 text

クロスグレードが発生し、 現在適応中のオファーは破棄され、 新しいオファーが適応されます クロスグレードとは? プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 30

Slide 30 text

ユーザーが、同等のレベルのサブスクリプションに切 り替えることを指します。サブスクリプションの期間 が同じであれば、新しいサブスクリプションはただち に開始されます。期間が異なる場合は、新しいサブス クリプションは次回の更新日に有効になります。 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 31

Slide 31 text

ユーザーが、同等のレベルのサブスクリプションに切 り替えることを指します。サブスクリプションの期間 が同じであれば、新しいサブスクリプションはただち に開始されます。期間が異なる場合は、新しいサブス クリプションは次回の更新日に有効になります。 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 32

Slide 32 text

同一グループ内でのグレードを示す この場合、サブスクリプションのグレードはすべて 等しい プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 33

Slide 33 text

ユーザーが、同等のレベルのサブスクリプションに切 り替えることを指します。サブスクリプションの期間 が同じであれば、新しいサブスクリプションはただち に開始されます。期間が異なる場合は、新しいサブス クリプションは次回の更新日に有効になります。 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 34

Slide 34 text

1ヶ月自動継続課金のお試しオファーの 無料期間中に 別のサブスクリプションの1ヶ月自動継続課金のプロモー ションオファーを適応させるとどうなるの? プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 35

Slide 35 text

グレードと期間が同じ別のサブスクリプションに移行 プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 36

Slide 36 text

グレードと期間が同じ別のサブスクリプションに移行 サブスクリプションが移行していて、 グレードと期間が同じ場合 現在の無料期間は即時破棄されます プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 37

Slide 37 text

1年無料 1ヶ月自動契約更新 課金前のサブスクリプション 適用後の無料期間 適用するオファー お試しオファー中の場合 1ヶ月無料 1ヶ月自動契約更新 プロモーショ ンオファー即 時適応 1年無料の プロモーションオファー プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 38

Slide 38 text

1年無料 1ヶ月自動契約更新 課金前のサブスクリプション 適用後の無料期間 適用するオファー お試しオファー中の場合 1ヶ月無料 1ヶ月自動契約更新 プロモーショ ンオファー即 時適応 1年無料の プロモーションオファー お試しオファーの無料期間はなくなります プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 39

Slide 39 text

1ヶ月自動継続課金のお試しオファーの 課金中に 別のサブスクリプションの1ヶ月自動継続課金のプロモー ションオファーを適応させるとどうなるの? プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 40

Slide 40 text

1年無料 1ヶ月自動契約更新 課金前のサブスクリプション 適用後の無料期間 適用するオファー 課金中の場合 1ヶ月無料 1ヶ月自動契約更新 課金期間は途 中で終了して 1年無料 課金期間に応 じて返金 1年無料の プロモーションオファー プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 41

Slide 41 text

1年無料 1ヶ月自動契約更新 課金前のサブスクリプション 適用後の無料期間 適用するオファー 課金中の場合 1ヶ月無料 1ヶ月自動契約更新 課金期間は途 中で終了して 1年無料 課金期間に応 じて返金 1年無料の プロモーションオファー プロモーションオファーが課金前のサブスクリプションに紐づかない場合 返金?

Slide 42

Slide 42 text

クロスグレード - App 内課金が同じ期間のものである場合、前の App 内課金から比例配分された金額は、元の支払い方法で返金され ます。新しい App 内課金は正規価格が請求され、ただちに有効に なります。お客様の更新日はクロスグレードを行った日に変更され ます。App 内課金が異なる期間のものである場合、クロスグレード は、カスタマーの次の更新日に有効になります。 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 43

Slide 43 text

まとめ ・同一グレードで、期間が同じサブスクリプションに移行する場合、クロスグ レードが発生する ・お試しオファー無料期間中の場合、お試しオファーの無料期間は破棄さ れる ・課金中の場合、契約途中だった差額が返金される(Appleの計算ロジック で) ・いずれの場合もプロモーションオファーが即適応となる ・お試しオファーでトライアル中のユーザーに注意が必要なパターン ・課金中のユーザーには返金される可能性をお知らせするパターン

Slide 44

Slide 44 text

プロモーションオファーが 課金前のサブスクリプションに紐づかない場合 (契約期間が異なる場合)

Slide 45

Slide 45 text

グレードは同じだが期間の異なるサブスクリプションに移行する場合 プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 46

Slide 46 text

7日間無料 3ヶ月自動契約更新 課金前のサブスクリプション 適用後の無料期間 適用するオファー お試しオファー中の場合 1ヶ月無料 1ヶ月自動契約更新 7日+1年 (最大) 1年無料の プロモーションオファー プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 47

Slide 47 text

7日間無料 3ヶ月自動契約更新 課金前のサブスクリプション 適用後の無料期間 適用するオファー 課金中の場合 1ヶ月無料 1ヶ月自動契約更新 現在の契約期 間終了後 1年 1年無料の プロモーションオファー プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 48

Slide 48 text

クロスグレード - App 内課金が同じ期間のものである場合、前の App 内課金から比例配分された金額は、元の支払い方法で返金され ます。新しい App 内課金は正規価格が請求され、ただちに有効に なります。お客様の更新日はクロスグレードを行った日に変更され ます。App 内課金が異なる期間のものである場合、クロスグレード は、カスタマーの次の更新日に有効になります。 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ 再掲 プロモーションオファーが課金前のサブスクリプションに紐づかない場合

Slide 49

Slide 49 text

まとめ ・サブスクリプションの期間が異なる場合、クロスグレードは次回更新時に有 効となる ・挙動としては、サブスクリプションにプロモーションオファーが紐付いてい る場合と同じ ・お試しオファーでトライアル期間中のユーザーに不利益は発生しない ・課金中のユーザーには契約期間終了まで無料期間にならないことをお知らせ する必要がありそう

Slide 50

Slide 50 text

プロモーションオファー無料期間中に プロモーションオファーを適用させるとどうなるの?

Slide 51

Slide 51 text

自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ プロモーションオファーからプロモーションオファー 同一サブスクリプション内で提供する想定

Slide 52

Slide 52 text

プロモーションオファーからプロモーションオファー 課金前のプロモーションオファーの無料期間は 維持したまま、新しいプロモーションオファーは pending_renewal_infoに記録されます

Slide 53

Slide 53 text

プロモーションオファーからプロモーションオファー 課金前のプロモーションオファーの無料期間は 維持したまま、新しいプロモーションオファーは pending_renewal_infoに記録されます ぺんでぃんぐりにゅーあるいんふぉ is 何?

Slide 54

Slide 54 text

プロモーションオファーからプロモーションオファー レシート情報の一部です

Slide 55

Slide 55 text

プロモーションオファーからプロモーションオファー pending_renewal_infoは配列で、各要素には product_idで識別される各自動更新サブスクリプ ションの保留中の更新情報が含まれています。保留中 の更新とは、システムが将来的に予定している更新 や、過去に何らかの理由で失敗した更新を指します。 responseBody.Pending_renewal_info https://developer.apple.com/documentation/appstorereceipts/responsebody/pending_renewal_info

Slide 56

Slide 56 text

12ヶ月無料のプロモーションオ ファー(1ヶ月自動契約更新) 12ヶ月無料のプロモーションオ ファー(1ヶ月自動契約更新) 6ヶ月無料のプロモーションオ ファー(1ヶ月自動契約更新) 現在の オファー終了後 12ヶ月(予定) 現在の オファー終了後 6ヶ月(予定) 課金前のサブスクリプション 適用するオファー 課金後の無料期間 プロモーションオファーからプロモーションオファー

Slide 57

Slide 57 text

まとめ ・サブスクリプションが同一の場合、次の無料期間はペンディングされる

Slide 58

Slide 58 text

プロモーションオファー無料期間中に プロモーションオファーを適応させ、 再度プロモーションオファーを適応させるとどうなるの?

Slide 59

Slide 59 text

自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ ここで何度もオファー を提供する想定 プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー

Slide 60

Slide 60 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー 12ヶ月無料期間中 プロモーションオファー (1ヶ月自動契約更新) 6ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) 現在のサブスクリプションオ ファー pending中のアイテム ペンディングされている状態でさらにオファー適応 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新)

Slide 61

Slide 61 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー 12ヶ月無料期間中 プロモーションオファー (1ヶ月自動契約更新) 6ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) pending中のアイテム こうなることを期待 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) 現在のサブスクリプションオ ファー

Slide 62

Slide 62 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー 12ヶ月無料期間中 プロモーションオファー (1ヶ月自動契約更新) 6ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) pending中のアイテム こうなることを期待 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) 現在の無料期間と 合わせて最大 30ヶ月無料!! 現在のサブスクリプションオ ファー

Slide 63

Slide 63 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー 12ヶ月無料期間中 プロモーションオファー (1ヶ月自動契約更新) 6ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) pending中のアイテム こうなることを期待 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) 現在の無料期間と 合わせて最大 30ヶ月無料!! 現在のサブスクリプションオ ファー 実際の挙動

Slide 64

Slide 64 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー 12ヶ月無料期間中 プロモーションオファー (1ヶ月自動契約更新) 現在のサブスクリプションオ ファー pending中のアイテム ?! 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新)

Slide 65

Slide 65 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー 12ヶ月無料期間中 プロモーションオファー (1ヶ月自動契約更新) 現在の課金状態 pending中のアイテム ?! 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) なにがおこったの?

Slide 66

Slide 66 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー pending_renewal_info pending_renewal_infoの情報が入れ替わった 6ヶ月無料 プロモーションオファー (1ヶ月自動契約更新)

Slide 67

Slide 67 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー pending_renewal_info pending_renewal_infoの情報が入れ替わった 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新)

Slide 68

Slide 68 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー pending_renewal_info 最新のものが適応され、古いものは破棄FIFOみたいなイメージ 12ヶ月無料 6ヶ月無料 12ヶ月無料 in out

Slide 69

Slide 69 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー pending_renewal_info プロモーションオファーはスタック出来ると思っていた 12ヶ月無料 6ヶ月無料 12ヶ月無料

Slide 70

Slide 70 text

プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー pending_renewal_info プロモーションオファーはスタック出来ると思っていた 12ヶ月無料 6ヶ月無料 12ヶ月無料

Slide 71

Slide 71 text

pending_renewal_infoで保持できるオファーは1つのみ 現在のオファーが請求イベントに入る前に 複数のオファーを受け入れた場合 時系列で最新のものがアクティブになる プロモーションオファーは1つのみアクティブ という解釈でよさそう(念の為サポートセンターに問い合わせました) プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー

Slide 72

Slide 72 text

まとめ ・プロモーションオファーは開発者の設計次第で何度でも適用出来る。ユーザー体 験を調整するにはレシート情報を見て適切に振り分けること ・プロモーションオファーはスタックされない、FIFOのイメージを忘れずに ・プロモーションオファーは容量用法を守って適切なご利用を ・現在ペンディング中のオファーを持つユーザーには、オファーを喪失することを お知らせする必要がありそう

Slide 73

Slide 73 text

まとめ おぶ まとめ ・同一サブスクリプションのプロモーションオファーを適用する場合 お試しオファー無料中の場合、お試しオファー終了後にプロモーションオ ファー適用になる 課金中の場合、契約期間終了後にプロモーションオファー適用になる

Slide 74

Slide 74 text

まとめ おぶ まとめ ・別のサブスクリプション(期間が同じ)のプロモーションオファーを適用する場 合 お試しオファー無料中の場合、お試しオファーは即終了しプロモーションオ ファーの無料期間になる 課金中の場合、現在の契約は終了し、プロモーションオファーの無料期間にな る。そして契約期間の差額分返金される

Slide 75

Slide 75 text

まとめ おぶ まとめ ・別のサブスクリプション(期間が異なる)のプロモーションオファーを適用する 場合 お試しオファー無料中の場合、お試しオファー終了後にプロモーションオ ファー適用になる 課金中の場合、契約期間終了後にプロモーションオファー適用になる ・同一サブスクリプションのプロモーションオファーを適用する場合と同じ挙動

Slide 76

Slide 76 text

まとめ おぶ まとめ ・プロモーションオファー無料期間中にプロモーションオファー - レシート情報のpending_renewal_infoに記録され、次回更新日に有効になる (予定) - pending_renewal_infoは常に最新のオファーしか記録しないので複数のプロ モーションオファーを適用待ちにできない

Slide 77

Slide 77 text

まとめ おぶ まとめ ・プロモーションオファー無料期間中にプロモーションオファー - レシート情報のpending_renewal_infoに記録され、次回更新日に有効になる (予定) - pending_renewal_infoは常に最新のオファーしか記録しないので複数のプロ モーションオファーを適用待ちにできない ありがとうございました。

Slide 78

Slide 78 text

本番で検証するときのtips 検証時に気づいたことなどのシェア

Slide 79

Slide 79 text

気づき(sandbox編) ・sandboxでの7日間は5分なので7日間無料状態で課金を試すときは鍛錬が 必要 ・sandboxアカウント名を短くしたり、事前に課金開始画面を開いておい たり。DBでレシート検証するユーザーの情報を事前に容易したり ・sandbox環境で何度やっても想定通り行かない日がある。(私は expire_dateを過ぎても全く更新されない地雷を踏みました)ダメな日は別の 仕事したほうがいいかも。

Slide 80

Slide 80 text

気づき(レシート編) ・サーバー側で現在の自動継続課金の有効期限を、レシート内の一番未来の expire_date_msでソートして取得していたが、お試しオファー1年無料の後 に、6ヶ月無料を適用させた場合、有効期限が6ヶ月後を想定しているのに対 して、破棄された1年無料の有効期限を取得してしまっていた。サーバー側で 保持した有効期限はクライアント側で表示ロジックの制御に使用していたの で、有効期限が異なり、ユーザーに適切な体験を提供できなくなりそうだっ た。最新のレシートの有効期限を取得することで回避