「課金しましたが、思っていたものと違いました。返金してください」。星ひとつのそのレビューを、朝いちばんに読んだことがあります。
個人開発でアプリを出していると、レビューの返信欄はこちらの声が届く数少ない場所です。相手を待たせたくない一心で、私はその場で「返金の手続きをいたします」と返しました。
数日後、同じ方から二度目のレビューが届きました。返金されていません、という内容でした。
最初にお伝えしたいのは、あれは私が返してよい言葉ではなかった、ということです。iOS のアプリで、開発者が購入を返金する手段は用意されておりません。そして Android では、逆に自分の手で返金できてしまいます。同じ一文のレビューに対して、返事の中身がストアで入れ替わるのです。
iOS では、開発者の手元に返金ボタンがありません
App Store の購入に対する返金は、Apple が受け付けて Apple が判断します。購入した方の側の経路は三つです。
- Apple のサポートへ連絡して返金を求める経路
- reportaproblem.apple.com にサインインして返金をリクエストする経路
- 支払い方法の発行元へ申し立てる経路
いずれの経路にも、開発者が入り込む余地はありません。判断の材料も結果も、Apple と購入者のあいだで完結します。
では開発者には何も届かないのかというと、そうではありません。App Store Server Notifications を設定していれば、Apple が返金を処理した時点で REFUND 通知がサーバーへ届きます。Apple の返金通知のドキュメントでは、この通知の対象は消耗型・非消耗型・非更新サブスクリプションであると明記されております。自動更新サブスクリプションの返金はこの通知には含まれず、別の経路で拾う必要があります。
通知を受け取ったとき、読むべき場所は二つだけです。
{
"unified_receipt": {
"latest_receipt_info": [
{
"product_id": "com.example.app.coins_100",
"purchase_date_ms": "1757980800000",
"cancellation_date_ms": "1758153600000"
}
]
}
}同じ product_id の取引が複数並ぶことがありますので、purchase_date_ms がいちばん新しいものを選びます。cancellation_date_ms が、Apple が返金を実行した日時です。返金されていない取引にこのフィールドは入りません。サーバーは 200 を返す必要があります。
要するに iOS では、返金の決定は自分の外側にあり、結果だけが後から流れてきます。この順序を知っているかどうかで、レビューに書ける文が変わります。
Android では自分で返金できます。ただし取り消せません
Google Play はここが反対です。Play Console の「注文管理」を開き、注文 ID か購入者のメールアドレスの完全一致で注文を探し、全額または一部を返金できます。Play Console アプリからも同じ操作ができます。
自由度がある分、こちらには気をつける点がいくつかあります。
一つ目は、返金は取り消せないことです。押し間違えても戻す操作はありません。
二つ目は、一部返金の条件です。有料アプリには一部返金を適用できません。対象はアプリ内購入とサブスクリプションで、しかも 2018 年 3 月より後に発生した注文に限られます。
三つ目は、お金の出どころです。返金した額は次回以降の支払いから差し引かれます。Google の手数料は返ってきますが、返金によって残高がマイナスになり、その状態が 48 時間続くと、受け取り用の銀行口座から引き落とされます。小さく運用していると、この一行を読んでいるかどうかで肝が冷えます。
四つ目は権限です。アカウント所有者以外が返金するには「注文の管理」権限が必要です。自分ひとりで運用していても、いざというときに画面が出ないと慌てますので、平時に一度開いておくことをお勧めします。
返事は二通りを、あらかじめ持っておきます
| 確かめること | iOS(App Store) | Android(Google Play) |
|---|---|---|
| 開発者が返金できるか | できません | できます(Play Console の注文管理) |
| 購入者の申請先 | Apple サポートまたは reportaproblem.apple.com | Google Play のヘルプ、または開発者へ直接 |
| 一部返金 | 開発者の操作対象外 | アプリ内購入とサブスクのみ(有料アプリは不可) |
| 返金の取り消し | 該当しません | できません |
| 結果の知り方 | App Store Server Notifications の REFUND | 注文管理のステータス表示 |
この表を手元に置いてから、私は返信の文面を二つに分けました。
iOS 向けには、返金の可否を私が決められないことを先に書き、申請の入り口を具体的に案内します。「Apple の判断になります」とだけ書くと突き放して読まれますので、どこを開けばよいかまで書きます。
Android 向けには、購入日と注文の特定に必要な情報をお尋ねします。メールアドレスの完全一致でしか検索できませんので、そこを最初に聞いておくと往復が一度減ります。
どちらの文面にも、返金の話を始める前に一文を置いております——期待と違ったのは何だったのか、という問いです。
返金したあと、権利を消し忘れることがあります
ここが、私がいちばん長く取り違えていた場所です。
Google Play では、サブスクリプションの「解約」と「返金」は別の操作です。解約しても返金は起きず、購入者は請求期間の終わりまで権利を保ちます。一方、サブスクの最新の注文を返金すると、返金と同時に権利が即座に外れ、以後の更新も止まります。古い注文を返金した場合は返金だけが行われ、サブスクは有効なままです。同じ「返金」という言葉で、結果が三通りに分かれます。
iOS では、通知を受け取ったあとの後始末はすべて自前です。Apple のドキュメントも、返金された取引を保存し、監視し、適切に対処するのは開発者の責任だと書いております。さらに、その結果として行った操作はアプリ内で利用者に伝えるように、とも添えられております。
消耗型のアイテムは、とくに抜けやすいところです。返金が成立しても、既に使い切られた残高は自動では戻りません。戻すのか、戻さないのか、繰り返し返金される方をどう扱うのか——その判断は通知の外側にあります。
返金できるかどうかはストアが決めます。返金のあとに何を戻すかは、私が決めます。
この二つを混ぜないようにしてから、レビューへの返事で口ごもることがなくなりました。課金まわりの権利がどこで消えるのかについては、Family Sharing で IAP が消える4つのトリガーにも近い話を書いております。
謝ることと、約束することのあいだに線を引きました
あの朝の私は、返金できると信じていたわけではなかったのだと思います。ただ、相手の落胆を早く収めたかったのです。できるかどうかを確かめる前に、できると書いてしまいました。
いまは返信を二段に分けております。一段目は、期待と違ったことへのお詫びと、何がどう違ったのかを尋ねる一文だけ。二段目で、ストアごとの手続きを案内します。段を分けると、確かめていないことを一段目に書かずに済みます。
壁紙アプリやヒーリング音源のアプリを長く動かしていて気づいたのは、返金を求める声のうち少なくない数が、お金の話ではなかったということです。購入した機能の場所が分からない、復元の導線に気づいていない——そうした詰まりが、いちばん強い言葉で表に出てきていました。一段目の問いは、そのために置いております。返信の運用そのものを軽くする工夫は、App Store のレビュー返信を半自動化した運用記録に別途まとめました。
まずは、ご自分のストアの返信欄を開いて、直近の返信に「返金します」と書いていないかだけ確かめていただければと思います。私はそこから始めました。書いてしまっていたら、上の表の該当する列を、そのまま二通目の文面にしていただけます。
課金の設計そのものをこれから決める段階でしたら、Rork で作るモバイルアプリの収益化入門のほうが先に立つかもしれません。ここまでお付き合いくださり、ありがとうございます。