Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOSDC2021 知られざる課金ステータス

Ab1b72230a5b6ddc97322af27ad91618?s=47 ohayoukenchan
September 18, 2021
2.6k

iOSDC2021 知られざる課金ステータス

登壇で発表した内容です

Ab1b72230a5b6ddc97322af27ad91618?s=128

ohayoukenchan

September 18, 2021
Tweet

Transcript

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

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

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

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

  5. 自己紹介 高野 建太 @ohayoukenchan 所属: コネヒト株式会社 経歴: to C向け事業会社を数社 専門:

    iOSアプリ開発たまにフロントエンド
  6. コネヒトとママリの紹介 会社概要と事業内容

  7. コネヒトのビジョン

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

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

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

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

    (17年8⽉実施、調査協⼒:インテージ) 本日お話する内容
  12. iOSアプリ直近の動き ・一部ユーザーに対してママリプレミアム1年無料の実装 ・Bitrise移行 🚀 ・Renovate導入 🚀 ・🚧 HTTPClient刷新 (APIKit+Swift.decodable から

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

    URLSession+Swift.decodable+Combine) ・🚧 アーキテクチャ再考 RxSwift+MVVM から Combine + MVVMへ TCAも検討 ・🚧 SwiftUI移行 ( Hosting Controllerだらけになりそうで検討中) 本題に移ります 興味ある方あとでトークさせてください 😆
  14. お試しオファーと プロモーションオファー 比較をさらっと

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

  16. 比較 お試しオファー プロモーションオファー 主な用途 新規サブスクリプション利用者の獲得 既存のサブスクリプション利用者の維持 と過去の利用者の再登録 利用資格 App内の 新規サブスクリプション利用者

    App内の既存または 過去のサブスクリプション利用者。 利用の限度 サブスクリプショングループごとに 1件のお試しオファーを利用可能 デベロッパはユーザーが何件まで オファーを利用できるか決定する オファーの限度 サブスクリプションごと、 地域ごとに、1件のオファー サブスクリプションごとに、 10件のアクティブなオファー 互換性(iOS) iOS 10以降 iOS 12.2以降 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/#providing-subscription-offers
  17. 知られざる課金ステータス オファーを受けた後どのようなタイミングでオファーが切り替わるか

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

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

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

    お試しオファー無料期間中の場合
  21. 1ヶ月無料 1ヶ月自動契約更新 最大 13ヶ月 課金前の課金アイテム 適用後の無料期間 1年無料の プロモーションオファー 適用するオファー お試しオファー中の場合

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  40. 1年無料 1ヶ月自動契約更新 課金前のサブスクリプション 適用後の無料期間 適用するオファー 課金中の場合 1ヶ月無料 1ヶ月自動契約更新 課金期間は途 中で終了して

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

    1年無料 課金期間に応 じて返金 1年無料の プロモーションオファー プロモーションオファーが課金前のサブスクリプションに紐づかない場合 返金?
  42. クロスグレード - App 内課金が同じ期間のものである場合、前の App 内課金から比例配分された金額は、元の支払い方法で返金され ます。新しい App 内課金は正規価格が請求され、ただちに有効に なります。お客様の更新日はクロスグレードを行った日に変更され

    ます。App 内課金が異なる期間のものである場合、クロスグレード は、カスタマーの次の更新日に有効になります。 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ プロモーションオファーが課金前のサブスクリプションに紐づかない場合
  43. まとめ ・同一グレードで、期間が同じサブスクリプションに移行する場合、クロスグ レードが発生する ・お試しオファー無料期間中の場合、お試しオファーの無料期間は破棄さ れる ・課金中の場合、契約途中だった差額が返金される(Appleの計算ロジック で) ・いずれの場合もプロモーションオファーが即適応となる ・お試しオファーでトライアル中のユーザーに注意が必要なパターン ・課金中のユーザーには返金される可能性をお知らせするパターン

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

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

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

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

    1年 1年無料の プロモーションオファー プロモーションオファーが課金前のサブスクリプションに紐づかない場合
  48. クロスグレード - App 内課金が同じ期間のものである場合、前の App 内課金から比例配分された金額は、元の支払い方法で返金され ます。新しい App 内課金は正規価格が請求され、ただちに有効に なります。お客様の更新日はクロスグレードを行った日に変更され

    ます。App 内課金が異なる期間のものである場合、クロスグレード は、カスタマーの次の更新日に有効になります。 自動更新サブスクリプション https://developer.apple.com/jp/app-store/subscriptions/ 再掲 プロモーションオファーが課金前のサブスクリプションに紐づかない場合
  49. まとめ ・サブスクリプションの期間が異なる場合、クロスグレードは次回更新時に有 効となる ・挙動としては、サブスクリプションにプロモーションオファーが紐付いてい る場合と同じ ・お試しオファーでトライアル期間中のユーザーに不利益は発生しない ・課金中のユーザーには契約期間終了まで無料期間にならないことをお知らせ する必要がありそう

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

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

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

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

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

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

  56. 12ヶ月無料のプロモーションオ ファー(1ヶ月自動契約更新) 12ヶ月無料のプロモーションオ ファー(1ヶ月自動契約更新) 6ヶ月無料のプロモーションオ ファー(1ヶ月自動契約更新) 現在の オファー終了後 12ヶ月(予定) 現在の

    オファー終了後 6ヶ月(予定) 課金前のサブスクリプション 適用するオファー 課金後の無料期間 プロモーションオファーからプロモーションオファー
  57. まとめ ・サブスクリプションが同一の場合、次の無料期間はペンディングされる

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

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

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

    pending中のアイテム ペンディングされている状態でさらにオファー適応 12ヶ月無料 プロモーションオファー (1ヶ月自動契約更新)
  61. プロモーションオファー無料期間中にプロモーションオファーを適応させ、 再度プロモーションオファー 12ヶ月無料期間中 プロモーションオファー (1ヶ月自動契約更新) 6ヶ月無料 プロモーションオファー (1ヶ月自動契約更新) pending中のアイテム こうなることを期待

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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