コンテンツへスキップ

Android Play Store Review Guidelines for IAP

Android アプリを Google Play で承認されるには、Google のポリシーに準拠する必要があります。特にアプリ内購入とサブスクリプションがあるアプリの場合です。このガイドはレビューに合格するために必要なすべてをカバーしています。

デジタル商品とサービスについては、Google Play の課金システムを使用する必要があります:

デジタル商品 (Play Billing が必須):

  • プレミアム機能へのサブスクリプション
  • アプリ内通貨またはクレジット
  • デジタルコンテンツ (電子書籍、音楽、ビデオ)
  • ゲームのアップグレードとパワーアップ
  • アプリのロック解除とプレミアムティア

物理商品 (Play Billing は使用できません):

  • 物理的な商品
  • 実世界のサービス
  • 非営利団体への1回限りの寄付

:::caution 2025 要件 新しいアプリはサブスクリプションカタログを処理するために monetization.subscriptions API を使用する必要があります。レガシー課金 API は廃止されました。 :::

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// デバイスで課金が利用可能かどうかを確認します
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) throw new Error('Google Play Billing not available');
// サブスクリプション商品を取得します (ストアデータが必須—価格をハードコードしないでください)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
// プラン識別子は Google Play Console で作成した Base Plan ID です
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan', // Android では必須、iOS では無視されます
productType: PURCHASE_TYPE.SUBS,
});
console.log('Purchase token for server validation:', transaction.purchaseToken);

Google Play は購入前にすべてのコストを明確に開示することを義務付けています:

必須要素:

  • ユーザーの地域通貨での正確な価格
  • 請求頻度 (月額、年額など)
  • サブスクリプションに含まれるもの
  • 紹介オファーの総コスト
  • 請求が発生するタイミング

UI Design Best Practices

準拠した UI の例:

function SubscriptionCard({ product }) {
return (
<div className="subscription-card">
<h3>{product.title}</h3>
{/* 利用可能な場合は紹介オファーを表示します */}
{product.introductoryPrice && (
<div className="intro-offer">
<p className="intro-price">{product.introductoryPriceString}</p>
<p className="intro-period">
{product.introductoryPricePeriod}
</p>
</div>
)}
{/* 通常価格 */}
<div className="regular-price">
<p className="price">{product.priceString}</p>
<p className="period">1 {product.subscriptionPeriod} あたり</p>
</div>
{/* 明確な説明 */}
<p>{product.description}</p>
{/* 更新条件 */}
<p className="terms">
自動的に更新されます。Google Play でいつでもキャンセルできます。
</p>
<button onClick={() => handlePurchase(product)}>
今すぐサブスクライブ
</button>
</div>
);
}

サブスクリプションが自動更新される前に、Google は以下を要求します:

  • 更新が発生することを明確に通知
  • 価格を思い出させる
  • キャンセルへの簡単なアクセス

プラットフォーム全体での価格一貫性

Section titled “プラットフォーム全体での価格一貫性”

重要なルール: アプリが利用可能なすべてのプラットフォーム全体で価格は一貫している必要があります。

違反例:

  • iOS: $9.99/月
  • Android: $7.99/月
  • Web: $11.99/月

重要な理由: ユーザーは価格差をスクリーンショットして Google に報告でき、ポリシー違反をトリガーできます。

アプリにアプリ内購入が含まれている場合、以下を実行する必要があります:

  1. Play Store リストでのリンク

    • Play Console にプライバシーポリシー URL を追加
    • 公開アクセス可能である必要があります
    • アプリと同じ言語である必要があります
  2. アプリ内でのリンク

    • アプリ設定にプライバシーポリシーを表示
    • ユーザーデータを収集する前に表示
    • 簡単に見つけられるようにします

実装例:

function SettingsScreen() {
const openPrivacyPolicy = () => {
window.open('https://yourapp.com/privacy', '_blank');
};
const openTerms = () => {
window.open('https://yourapp.com/terms', '_blank');
};
return (
<div>
<h2>設定</h2>
<button onClick={openPrivacyPolicy}>
プライバシーポリシー
</button>
<button onClick={openTerms}>
利用規約
</button>
<button onClick={() => NativePurchases.showManageSubscriptions()}>
サブスクリプションを管理
</button>
</div>
);
}

Google Play はデータ安全性セクションで詳細な開示を要求します:

IAP アプリの場合、宣言してください:

  • 購入履歴の収集
  • メールアドレス (領収書用)
  • デバイス ID (不正防止用)
  • 支払い情報の処理
  • 分析データ収集

データ安全性セクションは法的拘束力があります。不正確な宣言はアプリの削除につながる可能性があります。

1. 課金実装が欠落または不正確

Section titled “1. 課金実装が欠落または不正確”

失敗する理由:

  • デジタル商品に Google Play Billing を使用していない
  • 廃止された課金 API を使用している
  • サブスクリプションにカスタム支払いソリューションを実装している

防止:

// ✅ 正しい: native-purchases を使用 (Google Play Billing を使用)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly'
});
// ❌ 間違い: サブスクリプションにカスタム支払いプロセッサーを使用
// await CustomPayment.charge(user, 9.99);

2. 不明確な価格設定または隠れたコスト

Section titled “2. 不明確な価格設定または隠れたコスト”

失敗する理由:

  • 購入をクリックした後にのみ表示される価格
  • 事前に開示されていない追加料金
  • 曖昧なサブスクリプション条件

防止:

function PurchaseScreen({ product }) {
return (
<div>
{/* すべてのコストを事前に表示します */}
<h2>プレミアムサブスクリプション</h2>
<div className="pricing">
<p className="price">{product.priceString}/</p>
<p className="taxes">場所に基づいて税金が適用される場合があります</p>
</div>
<div className="features">
<h3>含まれるもの:</h3>
<ul>
<li>広告なしの体験</li>
<li>無制限のクラウドストレージ</li>
<li>優先サポート</li>
</ul>
</div>
<div className="terms">
<p>
サブスクリプションは自動的に更新されます。現在の期間終了の少なくとも 24 時間前にキャンセルされていない限り。
</p>
<p>
Google Play サブスクリプションで管理またはキャンセルします。
</p>
</div>
<button onClick={handlePurchase}>
サブスクリプションを開始
</button>
</div>
);
}

3. 欺瞞的なサブスクリプション パターン

Section titled “3. 欺瞞的なサブスクリプション パターン”

失敗する理由:

  • プレミアム オプションの事前選択
  • より安い代替案を非表示にする
  • キャンセルを困難にする
  • 偽りの緊迫性 (“残り 3 つのスポットだけです!”)

Description Best Practices

Marketing Guidelines

防止:

  • すべてのサブスクリプション層を均等に表示
  • キャンセルを明確でアクセス可能にする
  • カウントダウン タイマーや偽りの希少性を避ける
  • 高価なオプションを押し付けるダーク パターンを使用しない

失敗する理由:

  • 購入時にアプリがクラッシュする
  • 製品が読み込まれない
  • 購入確認が表示されない
  • 購入後にプレミアム機能がロック解除されない

防止:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// 提出前の包括的なテスト
async function testPurchaseFlow() {
try {
// 1. 製品読み込みをテストする
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Products loaded:', products.length);
// 2. 購入フローをテストする
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Purchase completed', transaction.transactionId);
// 3. 権利を確認する
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
if (
purchases.some(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
['PURCHASED', '1'].includes(purchase.purchaseState ?? '') &&
purchase.isAcknowledged,
)
) {
console.log('✓ Premium features unlocked');
}
// 4. 復元をテストする
await NativePurchases.restorePurchases();
console.log('✓ Restore works');
} catch (error) {
console.error('✗ Test failed:', error);
}
}

失敗する理由:

  • アプリにプライバシーポリシー リンクがない
  • プライバシーポリシーにアクセスできない
  • データ収集が開示されていない
  • データ安全性セクションが不正確

防止:

  • プライバシーポリシーを Play Store リストに追加
  • アプリ設定にリンクを含める
  • データ安全性セクションを正確に入力
  • 新しいデータ収集を追加する場合はポリシーを更新

代替課金システム (2025 アップデート)

Section titled “代替課金システム (2025 アップデート)”

Google は特定の地域で代替課金システムを許可するようになりました:

対象地域:

  • 欧州経済領域 (EEA)
  • 韓国
  • インド (近日公開予定)

代替課金を使用する場合の要件:

  • Google Play Billing をオプションとして提供し続ける必要があります
  • ユーザーに選択について明確に伝える
  • 地域の規制に準拠
  • サービス手数料が適用されます (削減)

ユーザーは以下を実行できる必要があります:

  • アクティブなサブスクリプションを簡単に表示
  • サポートに連絡せずにキャンセル
  • キャンセルがいつ有効になるかを理解する

実装:

import { NativePurchases } from '@capgo/native-purchases';
function ManageSubscriptionButton() {
const openManagement = async () => {
try {
// Google Play サブスクリプション管理を開きます
await NativePurchases.showManageSubscriptions();
} catch (error) {
// 直接 URL にフォールバック
const playStoreUrl = 'https://play.google.com/store/account/subscriptions';
window.open(playStoreUrl, '_blank');
}
};
return (
<button onClick={openManagement}>
Google Play でサブスクリプションを管理
</button>
);
}

必須開示:

  • キャンセルはいつ有効になりますか?
  • ユーザーは期間終了まで引き続きアクセスできますか?
  • 一部払い戻しは利用できますか?
function CancellationInfo() {
return (
<div className="cancellation-info">
<h3>キャンセルポリシー</h3>
<ul>
<li>Google Play でいつでもキャンセルできます</li>
<li>請求期間の終了まで引き続きアクセスできます</li>
<li>一部期間の払い戻しはありません</li>
<li>アクセスを再取得するいつでも再度サブスクライブできます</li>
</ul>
<button onClick={() => NativePurchases.showManageSubscriptions()}>
Google Play で管理
</button>
</div>
);
}

Pre-Submission Checklist

  1. 課金実装を確認

    • Google Play Billing を使用 (native-purchases 経由)
    • すべてのサブスクリプション製品が Play Console で作成
    • 製品が有効化および公開されている
    • すべてのターゲット国で価格設定されている
  2. 購入フローをテスト

    • ライセンステストアカウントを作成
    • 各サブスクリプションティアをテスト
    • 製品が正しく読み込まれることを確認
    • 購入完了をテスト
    • プレミアム機能がロック解除されることを確認
    • サブスクリプション復元をテスト
    • 複数のデバイスでテスト
  3. すべてのコピーをレビュー

    • 購入前に価格設定が明確に表示されている
    • すべての料金が事前に開示されている
    • サブスクリプション条件が明確である
    • キャンセルプロセスが説明されている
    • 誤解を招く主張がない
  4. プライバシーコンプライアンス

    • プライバシーポリシーが Play Console にリンクされている
    • プライバシーポリシーはアプリ内でアクセス可能です
    • データ安全性セクションが正確に完成した
    • 権限が正当化および文書化されている
  5. コンテンツレーティング

    • コンテンツレーティングアンケートを完成
    • レーティングが実際のコンテンツと一致することを確認
    • アンケートでアプリ内購入を宣言
  6. ストアリストを準備

    • アプリの説明が正確です
    • スクリーンショットは現在のバージョンを表示
    • フィーチャーグラフィックが要件を満たしている
    • すべての必須アセットがアップロードされている

初期レビュー: 平均 7 日 (より速い場合もあります) アップデート: 通常、初期提出より高速 ポリシー違反: 即座に中断される可能性があります 異議申し立て: レビューに 7-14 日

:::tip ローリングレビュー Apple と異なり、Google はアプリを継続的にレビューします。アプリはレビュー期間中いつでも公開される可能性があり、固定時間ではありません。 :::

  1. テストアカウントを追加:

    • Play Console に移動
    • セットアップ > ライセンステスト
    • テスト用のGmailアカウントを追加
  2. サンドボックスでテスト:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// ライセンステストアカウントでテスト購入を実行します
async function testInSandbox() {
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) {
console.error('Billing not supported in this environment');
return;
}
// 製品を取得します (ライセンステスターを使用する場合、テスト価格を返す)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test products:', products);
// テスト購入を実行します (料金なし)
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test purchase complete:', transaction.transactionId);
}
  1. テストバナーを確認:
    • テストアカウントで購入する場合
    • “テスト購入” 通知が表示されるはずです
    • 実際の請求は発生しません

本番リリース前:

  1. Play Console で内部テストトラックを作成
  2. APK/AAB をアップロード
  3. テスターメールアドレスを追加
  4. テスターは Play Store (テストトラック) からダウンロード
  5. 購入フローがエンドツーエンドで機能することを確認

Native Purchases のベストプラクティス

Section titled “Native Purchases のベストプラクティス”
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string, planIdentifier?: string) {
try {
setLoading(true);
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: productId,
planIdentifier,
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
console.log('Purchase token:', transaction.purchaseToken ?? transaction.receipt);
// 成功 - ストアから権利を確認します
const { purchases } = await NativePurchases.getPurchases({
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
const isOwned = purchases.some(
(purchase) =>
purchase.productIdentifier === productId &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (isOwned) {
unlockPremiumFeatures();
showSuccess('プレミアムがアクティブ化されました!');
}
} catch (error: any) {
// 特定のエラーケースを処理します
switch (error.code) {
case 'USER_CANCELLED':
// ユーザーがバックアウト - エラーは不要
console.log('Purchase cancelled');
break;
case 'ITEM_ALREADY_OWNED':
// 既に所有している - 代わりに復元
showInfo('既にこれを所有しています! 復元中...');
await NativePurchases.restorePurchases();
break;
case 'ITEM_UNAVAILABLE':
showError('このサブスクリプションは現在利用できません。後でもう一度お試しください。');
break;
case 'NETWORK_ERROR':
showError('ネットワークエラー。接続を確認して、もう一度お試しください。');
break;
default:
showError('購入に失敗しました。もう一度お試しください。');
console.error('Purchase error:', error);
}
} finally {
setLoading(false);
}
}
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
function RestorePurchasesButton() {
const [loading, setLoading] = useState(false);
const handleRestore = async () => {
setLoading(true);
try {
await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const hasSubscription = purchases.some(
(purchase) => purchase.productType === 'subs' && purchase.isAcknowledged,
);
if (hasSubscription) {
unlockPremiumFeatures();
showSuccess('サブスクリプションが復元されました!');
return;
}
// 必要に応じて1回限りのロック解除を確認
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasInApp = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
if (hasInApp) {
unlockPremiumFeatures();
showSuccess('以前の購入が復元されました!');
return;
}
showInfo('以前の購入は見つかりませんでした。');
} catch (error) {
showError('購入の復元に失敗しました。もう一度お試しください。');
} finally {
setLoading(false);
}
};
return (
<button onClick={handleRestore} disabled={loading}>
{loading ? '復元中...' : '購入を復元'}
</button>
);
}

サブスクリプション状態を確認

Section titled “サブスクリプション状態を確認”
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function checkSubscriptionStatus() {
try {
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const subscription = purchases.find(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (!subscription) {
showPaywall();
return;
}
console.log('Subscription active:', {
productId: subscription.productIdentifier,
expiresAt: subscription.expirationDate,
willRenew: subscription.willCancel === false,
purchaseToken: subscription.purchaseToken,
});
unlockPremiumFeatures();
} catch (error) {
console.error('Failed to check subscription:', error);
}
}

支払いポリシー:

  • Google Play Billing を使用していない
  • サブスクリプション条件が誤解を招く
  • コストが隠されている

ユーザーデータポリシー:

  • プライバシーポリシーがない
  • データ安全性宣言が不正確
  • 権限が過剰
  1. 違反通知をレビュー

    • 引用された特定のポリシーを読む
    • Google が何をフラグを立てたかを理解する
    • 提供された例を確認
  2. 問題を修正

    • 根本原因に対処し、症状だけではない
    • 修正後に徹底的にテスト
    • 行われたすべての変更を文書化
  3. 異議申し立てを提出 (該当する場合)

    Clarification and Appeal Process

    件名: ポリシー違反異議申し立て - [アプリ名]
    親愛なる Google Play レビュー チーム,
    私のアプリが [ポリシー X.Y] に違反していることが通知されています。
    コンプライアンスを確保するために次の変更を加えました:
    1. [加えた特定の変更]
    2. [加えた特定の変更]
    3. [加えた特定の変更]
    更新版 [バージョン番号] は、提起されたすべての懸念事項に対処しています。
    検証用のテストアカウント:
    メール: test@example.com
    パスワード: TestPass123
    ご検討ありがとうございます。

    Request Documentation Example

  4. 再提出またはアップデート

    • 修正版をアップロード
    • レビューの再提出
    • Play Console でステータスを監視

エキスパートの助けが必要ですか?

Section titled “エキスパートの助けが必要ですか?”

Play Store レビューのナビゲートは複雑である可能性があります。特に新しい 2025 テスト要件があります。パーソナライズされた支援が必要な場合:

チームとのコンサルテーション通話を予約 次のことをお手伝いします:

  • Play Store レビューの完全な準備
  • テストトラックのセットアップとテスター採用
  • IAP 実装レビュー
  • データ安全性とプライバシーのコンプライアンス
  • 却下トラブルシューティングと異議申し立て
  • 完全なアプリ提出プロセス

当社の専門家は数百のアプリの成功した Play Store 提出をガイドしており、2025 年の要件をナビゲートするのに役立ちます。

実装でサポートが必要ですか?