アプリ内課金の価格改定した話

# はじめに

NewsPicksの桐畑です。
先日、NewsPicksではiOSとAndroidアプリの定期購読価格を改定いたしました。
今回、その時の具体的な手順や注意すべきポイントをお伝えしたいと思います。

※なお、2019年11月時点の話となります。動作をなんら保証する情報ではありませんので、その点ご留意ください。

# アプリ内課金について

iOSとAndroidのアプリ内課金には大きく、`都度課金` / `定期購読課金` があります。

`都度課金` は、課金したタイミングに応じてアプリ内のサービス（ポイントやガチャ用の魔法石など）が発生するタイプの課金です。
*例：5,000円で魔法石300個を購入*

`定期購読課金` は、その名の通り定期的に課金が発生し、課金継続期間中はサービスが利用できます。
*例：毎月 1,600円が課金されて、課金期間中は記事と動画見放題 。*


# 定期購読の価格改定方法

また、定期購読の価格改定方法にも大きく以下の２パターンがあります。

## 1. 全ユーザーに一律で新価格を適用

既存ユーザー / 新規ユーザー問わず、シンプルに一律新価格を適用する方法です。

定期購読は自動で課金されていく仕様上、ユーザーの価格改定への同意が必要になります。同意してもらえないと自動更新となりません。

価格改定の同意は通常、メール/プッシュ通知などでAppleStore/GooglePlayからアナウンスされますが、オプトインとなるため、相当数の既存ユーザーが自動更新しないリスクが想定されます。
（実際に試したわけではないのですが、Appleの方いわく、アプリによってはかなりの離脱数があったそうです。）

## 2. 既存ユーザーの価格・自動更新維持 / 新規ユーザーから新価格適用

既存ユーザーは価格は据え置きとして自動更新を継続してもらいつつ、新規ユーザーから新価格を適用することができます。1に比べて、既存ユーザーの解約リスクを最小限にすることができます。

参考： [Apple自動更新サブスクリプション#価格管理](https://developer.apple.com/jp/app-store/subscriptions/#managing-prices-for-existing-subscribers)

※ちなみに値下げの価格改定の場合、同意は必要ないようです。値下げした新価格で自動更新が走るようになるようです。

NewsPicksでは `定期購読課金` を利用しており、今回は `2. 既存ユーザーの価格・自動更新維持 / 新規ユーザーから新価格適用` の方法で価格を改定いたしました。そちらの手順を共有させていただきたいと思います。

# 価格改定手順

実際に定期購読の価格改定の手順をご紹介いたします。
iOSはiTunesConnectの価格変更機能、
Androidは旧価格のプランAと、新価格のプランB作成して切り替えました。

## iOS編

iTunesConnectで提供されている価格変更機能を使った手順となります。

### 1. iTunesConnectで対象のアプリ内課金を開く

**[マイアプリ] > [機能] > [アプリ内課金]** を選択して価格改定対象のアプリ内課金を開きます。

### 2. 価格変更の計画を作成

**サブスクリプション価格** のプラスボタンから 変更を計画します。

<img width="568" alt="サブスクリプション価格の変更を計画.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130/9ff8dfb6-f71b-150e-ebbf-dbc3286cd780.png">

### ３. 対象となる国・地域を選択

デフォルトで全ての国・地域でチェックが入っているのでそのまま `次へ` を押します。

### 4. 開始日と変更価格を入力

新価格と開始日を入力して `次へ` を押します。
（後の *注意すべきポイント* にも書きますが、タイムゾーンは考慮されているものの、実際には前日の23時に更新されたので注意が必要です。）

<img width="832" alt="開始日と価格.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130/9efcde92-ea5f-57d7-96d8-65dd1ce603c7.png">


### 5. 地域・国ごとの価格入力

自動その時のレートで変換・補完されます。得に問題なければ `次へ`

### 6. 既存サブスクリプションの購読オプション

既存ユーザーの価格は維持して、新規ユーザーにのみなので、 `既存のサブスクリプション登録者については現在の価格を維持`にチェックして `終了` (＝おそらく保存して終了の意味)

<img width="839" alt="既存サブスクリプションの購読オプション.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130/3414adaf-3d86-6ffb-d051-4015f742f39e.png">

### 7. サブスクリプション価格画面で `保存` 

右上にある `保存` ボタンを押さないと設定が消えます。

簡単ですね！
以上の手順で価格改定の設定ができました。これで開始日以降、新規価格が有効となります。


## Android編

既存の購読プランとは別に、新価格の購読プランを作成して、アプリケーション側で制御する方法で価格を変更しました。

### 1. GooglePlayConsoleで定期購入画面を開く

**[アプリ] > [ストアでの表示] > [アプリ内サービス] > [定期購入]** を選択して定期購入画面を開きます。

### 2. 定期購入を作成

`定期購入作成` から定期購入を作成します。

アイテムIDの設定。アプリケーション側でハンドリングすることになるので、既存の定期購入のアイテムIDを鑑みて管理し易い名前に。
（スクリーンショットはサンプルです。）

<img width="977" alt="アイテムID.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130/ae2eaaf5-17b1-e885-5a34-6c7e85854c3f.png">

### ３. 定期購入の詳細を入力

既存の定期購入を参考に入力します。（価格の変更が目的であれば同じもので）

<img width="967" alt="定期購入の詳細.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130/ddc9c10b-0870-00b6-a8e8-9a491af2f393.png">

### 4. 価格設定を入力

こちらも既存の定期購入を参考に、価格だけ新しい値を入力します。
（価格設定時、税抜き表示の注釈が表示されますが、JPYに関しては入力した値が適用になるようです。）


<img width="958" alt="価格設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130/de1d7dd8-3660-1a02-dc08-d8afa3c63e88.png">

### 5. 保存して定期購入を作成

右下の`保存`ボタンを押して作成します。

ここまででコンソール上の操作は完了です。


### 6. 価格変更日以後に、アプリケーション側でアイテムIDを切り替える

価格を変更したい日以降に参照する `アイテムID` を、`既存の定期購入` から `新規で作成した定期購入` に切り替わるようにアプリを実装します。
（こちら個々のアプリの実装によるので、簡単な手順でなくて申し訳ですが・・・）



# 注意するべきポイント(iOS)

iOSの価格変更で、注意すべきポイントがあったので、こちらで共有させていただきます。

## 再購読時の価格について

価格変更日以後、完全の新規購読ユーザーは新しい価格で提供されます。
対して、既存ユーザーの再購読は状況に応じて異なるようです。

- ユーザーが意図せず解約状態となり復帰した場合(BillingRetry)

クレジットカードの有効期限切れなどで正常に決済ができなかった場合がこの状態となります。プラットフォーム側で一定期間、再購読を実施する仕組みになっています。（BillingRetyという機能）
再購読施行中に復帰できた場合は、以前の価格での再購読となります。

- 意図して解約した場合

意図して解約した場合も、すぐの再契約では新価格が適用されず、60日経過後に適用となるようなので注意が必要です。


## 価格変更が実際には1時間早かった

2019/09/01と2019/11/01で2回価格変更を実施しているのですが、変更された時間が実際には 2019/08/31 23:00:00 と 2019/10/31 23:00:00でした。
1時間早かったことから、ざっくりタイムゾーンまとめらている（？）のではと推察します。（具体的には、+09:00 と+08:00のタイムゾーンがまとめて処理されているのかなと・・・）

# さいごに

iOSはコンソールで随分簡単に価格改定ができるようになっていました！
（事前の確認とか、周辺の開発で、実際にはそれなりに大変だったのですが・・・）

明日は、 @yoshitomi0124 による 「マーケでもsql書けたことでよかったこと」 の予定です。
乞うご期待ください。