自動更新サブスクリプションを載せた ahha を、初めて審査に出しました。2 回のリジェクトを経て通っています。
リジェクト理由はサブスクと無関係でした(ATT 未実装・年齢等級)。ただ準備の過程で整理した項目があるので残します。両ストアを並べて見ると、求めているものが似ていながら微妙に違います。
先に注意書きを
「この項目がないと必ずリジェクトされる」という因果は検証できません。実際に落ちたのは 2 件だけで、残りは「入れておいたら通った」という水準の情報です。
それでも書く理由は、初回提出では何を用意すべきかの全体像が見えないこと自体が時間を食うからです。落ちてから足すより、先に並べておくほうが速い。
Paywall 画面に必ず要るもの
Apple はサブスク商品を売る画面に情報が揃っているかを見ます。以下が全部ひとつの画面にある必要があります。
価格 — ハードコードしない
// ストアが SSOT。ロケールに合わせた価格文字列 const priceString = pkg.product.priceString;
priceString を使えば、ユーザーのストアアカウントの地域に合わせた通貨・形式で表示されます。
日本 1 か国配信でも必要です。米国や韓国のアカウントを持つユーザーがアプリに触れることはあり、そのときに実際の請求通貨と画面表記が一致していなければなりません。「¥500」と固定で書いてあると、その時点で嘘になります。
期間と自動更新の条件
・プラン名 : (商品名)
・期間 : 1 か月(自動更新)
・価格 : 月額 ¥500(税込)
・支払い : 購入確定時に App Store アカウントへ請求されます
・自動更新: 期間終了日の 24 時間前までに自動更新をオフにしない場合、
購読は自動的に更新されます
・更新請求: 現在の期間終了前 24 時間以内に更新料金が請求されます
・管理解約: 購入後、App Store アカウント設定から自動更新をオフに
することで解約・管理ができます
法的リンク 3 種
- 利用規約
- プライバシーポリシー
- 特定商取引法に基づく表記(日本配信の場合)
三つ目は日本特有の要件です。事業者名・所在地・連絡先・販売価格・支払時期・引渡時期・返品条件などを明記したページが必要になります。
復元ボタン
「購入を復元」ボタンがないとリジェクトされます。機種変更したユーザーが、すでに購入した購読を取り戻す手段が必要だからです。
読み込み中は「決める操作」を隠す
Paywall の状態を 5 つに分けました。
| 状態 | 内容 |
|---|---|
loading | ストア情報を照会中 |
ready | 照会完了・正常表示 |
loadFailed | 照会失敗 |
purchasing | 決済処理中 |
restoring | 復元処理中 |
loading と loadFailed のあいだは、CTA ボタン・復元ボタン・法的リンクを全部隠します。
価格が確定していない状態でユーザーに決済の判断をさせてはいけないからです。「価格を読み込み中…」の横に「登録する」ボタンが押せる状態で並んでいたら、その画面は間違っています。
Google Play が見ているところ
Google 側は画面よりも到達しやすさを見ます。
RevenueCat の getManagementURL() でストアの購読管理ページ URL を取り、アプリ内から直接移動できるようにしました。
null が返ることがあります。その場合のフォールバック案内も用意しておく必要があります。ボタンを押して何も起きない、が最悪です。
アプリコンテンツの申告 — 判断が割れたもの
Google Play Console の「アプリのコンテンツ」は 11 項目あり、全部埋めないと審査提出ボタンが有効になりません。そのうち判断に迷ったものです。
| 項目 | 回答 | 根拠 |
|---|---|---|
| コンテンツのレーティング | 「その他すべてのアプリ」 | ゲームではない |
| 年齢制限付きコンテンツ | はい(ギャンブル以外の行為) | 宝くじ関連 |
| デジタル商品の購入 | はい | サブスクあり |
| ターゲットユーザー | 18 歳以上のみ | 未成年向けの選択肢は外した |
| 金融機能 | デジタルコンテンツ購入 → 定期購読 | |
| 金融取引機能 | 提供しない | 送金・決済代行はない |
| アプリのアクセス権 | 特別な権限なし | ログインなしで全機能 |
| 広告 ID の使用 | はい(分析・広告マーケティング) | AdMob・Firebase |
データセーフティは SDK の実動作に合わせる
| データ | 収集 | 共有 | 目的 |
|---|---|---|---|
| 購入履歴 | ○ | × | アプリ機能 |
| クラッシュログ | ○ | × | アプリ機能・分析 |
| アプリ操作数 | ○ | × | 分析 |
| デバイス ID | ○ | ○ | 分析・広告 |
デバイス ID の「共有」にチェックを入れ忘れやすいです。AdMob が広告パートナーに渡すので共有に該当します。
そしてこの申告は、あとで iOS 側の ATT 対応と繋がります。「デバイス ID を広告目的で収集・共有する」と申告しておきながら ATT のリクエストを実装しないと、申告と実装が矛盾します。私はそれでリジェクトされました。
再提出でつまずいた「提出物 3 項目」
ここは知らないと確実に踏みます。
サブスクアプリは提出時に 3 つが一緒に上がります。
- アプリバージョン(ビルド)
- サブスクリプション商品
- サブスクリプショングループ
初回提出では自動的に組み込まれます。ところが一度リジェクトされるか、開発者が審査をキャンセルすると、商品とグループが提出物から外れます。状態が「開発者により却下」に変わります。
再提出でアプリだけ上げると、審査担当者が決済フローをテストできないのでまたリジェクトされます。
戻し方はこうです。
サブスク商品ページ → 右上「審査用に追加」→ 既存の提出物の下書きを選ぶ サブスクグループページ → 右上「審査用に追加」→ 既存の提出物の下書きを選ぶ
「新しい提出物を作成」を選ぶと別提出物に分かれてしまいます。必ず既存の下書きを選びます。
提出ダイアログで「提出準備完了の項目(3)」になっているか目視してから送るのが安全です。
公開タイミングは自分で握る
両ストアとも「審査通過後すぐ公開」が既定値です。これは変えておくことを勧めます。
| ストア | 設定 |
|---|---|
| Apple | バージョンページのリリース方法で手動リリースを選択 |
| 「公開の概要」画面で「管理対象公開」をオン |
なぜ必要かというと、ストアリンクを参照している他の資産と公開時点を揃えられるからです。
私の場合、web ランディングのストアバッジがまだ「公開予定」の状態でした。自動公開されていたら、ストアだけ開いてランディングは古いままという食い違った状態になっていたはずです。
審査期間の体感
| ストア | 体感 |
|---|---|
| Apple | 提出後およそ 1〜2 日。リジェクトもこの範囲で来る |
| 通過まで数日。Apple より長い |
両ストア同時リリースを狙うなら Google を先に出すほうがいいということになります。
チェックリスト
準備しながら作った一覧をそのまま置きます。
Paywall 画面
- 価格をストアから取得して表示(ハードコード禁止)
- 期間・自動更新条件の明示
- 利用規約リンク
- プライバシーポリシーリンク
- 特定商取引法に基づく表記リンク(日本配信)
- 購入復元ボタン
- 読み込み・失敗状態で決定操作を隠す
解約導線
- アプリ内からストアの購読管理ページへ移動できる
managementURLがnullのときのフォールバック案内
App Store Connect
- 年齢等級の設問
- アプリプライバシー申告が実際の SDK 動作と一致
- 提出物 3 項目(アプリ・商品・グループ)の確認
- リリース方法 = 手動
Google Play Console
- アプリのコンテンツ 11 項目を完了
- データセーフティが実際の SDK 動作と一致
- 広告 ID の申告
- 管理対象公開 = オン
- ストア掲載情報(説明文)が実際の機能と一致
最後の項目を強調しておきます。説明文に実際にはない機能を書いておくと、それもリジェクト理由になります。
私の場合、開発中に名前が変わった機能が説明文に旧名のまま残っていました。提出直前にコードと突き合わせて全部直しました。説明文はいちばん早く書いて、いちばん最後まで更新されない場所です。
この記事について
自社アプリ ahha(React Native + Expo Bare Workflow · RevenueCat サブスク · AdMob)の初回審査で実際に用意したものです。2026 年 8 月時点の画面と要件で、特に Google Play の設問は変更が頻繁です。
特定商取引法の表記は日本配信を前提にしています。他の国は要件が異なります。


コメント