コンテンツにジャンプ

Android Play StoreのIAPのレビュー規定

GitHub

Google PlayでAndroidアプリを承認するには、Googleのポリシーに準拠し、特にアプリ内課金やサブスクリプションがあるアプリには、特に注意が必要です。このガイドでは、レビューを成功させるために必要なすべての内容をカバーしています。

  1. 署名済みAndroidアプリバンドルを作成

    新しいGoogle Playアプリは、サイドロードされたデバッグAPKではなく、Androidアプリバンドル(.aab)としてアップロードする必要があります。

    __CAPGO_KEEP_0__ versionCode アップロードごとに増加し、Play App Signingを使用する場合は、安全にアップロードキーを保存してください。

    Android App Bundle フロー

  2. Play Consoleでアプリレコードを作成する

    まだ開発者アカウントがなければ、 Play Consoleのサインアップ次に、 ホーム > アプリ作成で、言語、アプリ/ゲームの種類、無料/有料のステータス、サポートメール、必要な宣言を承認します。

    無料/有料の設定を慎重に選択してください。Googleは、有料アプリを無料に変更することを許可していますが、無料で提供されたアプリは有料に戻すことはできません。

    Play Consoleでアプリを作成する

  3. アプリ内容とストアリストの完了

    生産レビュー前に、必要なPlay Consoleの宣言を完了してください:

    • プライバシーポリシー
    • 広告
    • アプリケーションへのアクセス
    • 対象読者とコンテンツ
    • コンテンツの評価
    • データの安全性
    • 関連する敏感なパーミッションの宣言
  4. Play-インストールされたテストトラックを実行

    開始 内部テスト 高速なQAのために。開発者アカウントが個人アカウントで、2023年11月13日以降に作成されている場合、また、以下の条件を満たす場合、閉鎖テストも完了する必要があります。 閉鎖テスト 12日以上連続してテストに参加している最低12人のテスターがプロダクションアクセス前にオプティンされている場合。

    Play Console内での内部テスト

  5. 請求金額のエンドツーエンドの検証

    Google Playからアプリをインストールし、ローカルにエクスポートされたAPKではなく。次に確認する。

    • Playから正しく製品が読み込まれる
    • ライセンステスターの購入シートは テスト購入 ライセンステスター用の購入ボタンの表示
    • 購入後、ライセンスがアンロックされる
    • 購入後、購入履歴の復元とサブスクリプション管理フローの正常動作

Google Play Billing Requirements

「Google Play Billing Requirements」

デジタル商品やサービスを利用する場合、 Google Playの請求システムを使用する必要があります。 デジタル商品(Play Billingを使用する必要があります):

プレミアム機能のサブスクリプション

  • インゲーム通貨またはクレジット
  • デジタルコンテンツ(eブック、音楽、ビデオ)
  • ゲームアップグレードとパワーアップ
  • アプリのアンロックとプレミアム階層
  • 物理商品(Play Billingを使用できません):

__CAPGO_KEEP_0__

  • 実物商品
  • 現実世界のサービス
  • 非営利団体への一時的な寄付

:::note サブスクリプション設定 Play Consoleで、Androidサブスクリプションを使用するために現在の サブスクリプション -> 基本プラン -> 提供 モデルを設定します。次に、 native-purchases基本プランIDをパスする planIdentifier. :::

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Ensure billing is available on the device
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) throw new Error('Google Play Billing not available');
// Fetch subscription products (Store data is required—never hardcode pricing)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
// Plan identifiers are the Base Plan IDs you create in Google Play Console
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan', // REQUIRED on Android, ignored on iOS
productType: PURCHASE_TYPE.SUBS,
});
console.log('Purchase token for server validation:', transaction.purchaseToken);

Google Playでは購入前にすべてのコストを明確に表示することを求めています:

必要な要素:

  • ユーザーのローカル通貨での正確な価格
  • 請求頻度(月額、年額など)
  • サブスクリプションに含まれるもの
  • 初回オファーの合計コスト
  • 課金時期

UI デザインのベスト プラクティス

適合するUIの例:

function SubscriptionCard({ product }) {
return (
<div className="subscription-card">
<h3>{product.title}</h3>
{/* Show intro offer if available */}
{product.introductoryPrice && (
<div className="intro-offer">
<p className="intro-price">{product.introductoryPriceString}</p>
<p className="intro-period">
for {product.introductoryPricePeriod}
</p>
</div>
)}
{/* Regular price */}
<div className="regular-price">
<p className="price">{product.priceString}</p>
<p className="period">per {product.subscriptionPeriod}</p>
</div>
{/* Clear description */}
<p>{product.description}</p>
{/* Renewal terms */}
<p className="terms">
Renews automatically. Cancel anytime in Google Play.
</p>
<button onClick={() => handlePurchase(product)}>
Subscribe Now
</button>
</div>
);
}

Googleは自動更新前に次のことを必要とします:

  • 自動更新の事実を明確に伝える
  • 価格の思い出
  • キャンセルへの簡単なアクセス

プラットフォーム間の価格の明確性

「プラットフォーム間の価格の明確性」セクション

同じエンタイトルメントを複数のプラットフォームで販売する場合、製品名、請求期間、付与された利益、更新の言語を同期して、ユーザーが驚かないようにしてください。

税金、ローカル通貨、または店舗経済によって価格が正当に異なる場合がありますが、購入UIはその差異を隠すことはできず、Google Playが請求する再生コストと異なる再生コストを暗示することはできません。

プライバシーポリシーの要件

「プライバシーポリシーの要件」

必須のプライバシーポリシー

「必須のプライバシーポリシー」

アプリ内課金を含むアプリの場合、次の条件を満たす必要があります。

  1. Playストアのリストにリンク

    • Playコンソールにプライバシーポリシー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>Settings</h2>
<button onClick={openPrivacyPolicy}>
Privacy Policy
</button>
<button onClick={openTerms}>
Terms of Service
</button>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage Subscriptions
</button>
</div>
);
}

データセキュリティセクション

セクション「データセキュリティセクション」

Google Playでは、データセキュリティセクションで詳細な説明が必要です:

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

  • 購入履歴の収集
  • 請求書のためのメールアドレス
  • 詐欺防止のためのデバイスID
  • 決済情報の取り扱い
  • __CAPGO_KEEP_0__データ収集

Data Safetyセクションは法的拘束力があります。不正確な申告はアプリの削除につながる可能性があります。

Google Playレビューはバイナリだけではありません。生産リリース前に申告を完了してください。 ポリシーとプログラム > アプリコンテンツ.

最も注意してレビューするものの最小セット:

  • プライバシーポリシー: Play ConsoleのパブリックURL、必要に応じてインアプリエントリポイント
  • 広告: アプリが広告を含むかどうかを宣言する
  • アプリアクセス: 画面がロックされている場合は、レビュアーにワークシートのクレデンシャルまたはテストパスを提供してください
  • ターゲットアウディエンスとコンテンツ: アプリの実際のユーザーに合うようにコンテンツを設定してください
  • コンテンツの評価: IARCの質問紙を完了して、アプリが未評価としてマークされないようにしてください
  • データの安全性: データの収集、共有、セキュリティの実践を正確に宣言してください

1. Missing or Incorrect Billing Implementation

Section titled “1. Missing or Incorrect Billing Implementation”

Why It Fails:

  • Not using Google Play Billing for digital goods
  • Using deprecated billing APIs
  • Implementing custom payment solutions for subscriptions

Prevention:

// ✅ Correct: Use native-purchases (uses Google Play Billing)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
// ❌ Wrong: Custom payment processor for subscriptions
// await CustomPayment.charge(user, 9.99);

なぜ失敗するのか:

  • 価格は購入ボタンをクリックするまで表示されない
  • 事前にお支払いされる追加料金が明示されていない
  • 不明瞭なサブスクリプション条項

予防:

function PurchaseScreen({ product }) {
return (
<div>
{/* Show ALL costs upfront */}
<h2>Premium Subscription</h2>
<div className="pricing">
<p className="price">{product.priceString}/month</p>
<p className="taxes">Taxes may apply based on location</p>
</div>
<div className="features">
<h3>Includes:</h3>
<ul>
<li>Ad-free experience</li>
<li>Unlimited cloud storage</li>
<li>Priority support</li>
</ul>
</div>
<div className="terms">
<p>
Subscription renews automatically unless cancelled at least
24 hours before the end of the current period.
</p>
<p>
Manage or cancel in Google Play Subscriptions.
</p>
</div>
<button onClick={handlePurchase}>
Start Subscription
</button>
</div>
);
}

3. 不正なサブスクリプションパターン

セクション「3. 不正なサブスクリプションパターン」

なぜ失敗するのか:

  • プレミアムオプションが事前に選択されている
  • 安価な代替案が隠されている
  • キャンセルが困難になっている
  • Fake urgency (“Only 3 spots left!”)

Description Best Practices

Marketing Guidelines

Prevention:

  • Display all subscription tiers equally
  • Make cancellation clear and accessible
  • Avoid countdown timers or fake scarcity
  • Don’t use dark patterns to push expensive options

Why It Fails:

  • App crashes when purchasing
  • 製品が読み込まれない
  • 購入確認が表示されない
  • プレミアム機能が購入後にロックされない
  • テストはサイドロードされたビルドのみで行われ、Playストアでインストールされたテストトラックでは行われなかった

対策:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Comprehensive testing before submission
async function testPurchaseFlow() {
try {
// 1. Test product loading
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Products loaded:', products.length);
// 2. Test purchase flow
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Purchase completed', transaction.transactionId);
// 3. Verify entitlements
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. Test restore
await NativePurchases.restorePurchases();
console.log('✓ Restore works');
} catch (error) {
console.error('✗ Test failed:', error);
}
}

5. プライバシーポリシーの違反

「5. プライバシーポリシーの違反」セクション

なぜ失敗するのか:

  • アプリ内にプライバシーポリシーへのリンクがない
  • プライバシーポリシーがアクセスできない
  • データ収集が明らかになっていない
  • データセキュリティセクションの不正確さ

予防:

  • プレイストアリストイングにプライバシーポリシーを追加する
  • アプリ設定にリンクを含める
  • データセキュリティセクションを正確に埋める
  • 新しいデータ収集を追加する際にポリシーを更新する

Googleの代替課金プログラムは地域によって異なり、変更される可能性があります。標準のGoogle Play Billing以外のものを使用したい場合は、実装前にPlay Consoleで、正確な市場の適格性、必要なAPI、披露言語を確認する必要があります。

簡単なキャンセル

キャンセルのセクション

ユーザーは次のことができる必要があります:

  • サブスクリプションを簡単に表示
  • サポートに連絡することなくキャンセル
  • キャンセルの効果がいつ発生するかを理解

実装:

import { NativePurchases } from '@capgo/native-purchases';
function ManageSubscriptionButton() {
const openManagement = async () => {
try {
// Opens Google Play subscription management
await NativePurchases.manageSubscriptions();
} catch (error) {
// Fallback to direct URL
const playStoreUrl = 'https://play.google.com/store/account/subscriptions';
window.open(playStoreUrl, '_blank');
}
};
return (
<button onClick={openManagement}>
Manage Subscription in Google Play
</button>
);
}

必要な披露:

  • キャンセルが有効になるのはいつですか?
  • 期間が終わるまでユーザーはアクセスを維持することができますか?
  • 部分的な返金は利用可能ですか?
function CancellationInfo() {
return (
<div className="cancellation-info">
<h3>Cancellation Policy</h3>
<ul>
<li>Cancel anytime in Google Play</li>
<li>Access continues until end of billing period</li>
<li>No refunds for partial periods</li>
<li>Resubscribe anytime to regain access</li>
</ul>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage in Google Play
</button>
</div>
);
}

提出前にチェックリスト

提出前にチェックリスト

請求処理の確認

  1. Google Play Billing (native-purchases)を使用する

    • すべてのPlay Consoleで作成されたサブスクリプション製品
    • 基本プランとオファーが正しく設定されているかどうか
    • __CAPGO_KEEP_0__
    • 製品は有効化され、公開されます
    • すべての対象国に価格が設定されます
  2. テスト購入フロー

    • ライセンステストアカウントを作成する
    • プレイテストトラックからビルドをインストールする
    • 各サブスクリプション階層をテストする
    • 製品が正しく読み込まれることを確認する
    • 購入の完了をテストする
    • 「テスト購入」 バナーが表示されることを確認する プレミアム機能がアンロックされることを確認する
    • Verify products load correctly in Japanese locale
    • サブスクリプションの復元テスト
    • 複数のデバイスでテスト
  3. すべてのコピーの確認

    • 購入前に明確に価格が表示される
    • すべての手数料が事前に明示される
    • サブスクリプションの条件が明確
    • キャンセルプロセスが説明されている
    • 誤解を招く宣伝はなし
  4. アプリのコンテンツとプライバシー

    • Play Consoleでプライバシーポリシーがリンクされている
    • アプリ内でプライバシーポリシーがアクセス可能
    • 広告の申告が完了
    • アプリへのアクセス方法が追加されました。アプリがゲートされていた場合
    • データセーフティのセクションが正確に完了されました
    • 許可が正当化され、文書化されました
  5. コンテンツレーティングとターゲットアウディエンス

    • コンテンツレーティングの質問紙を完了してください
    • ターゲットアウディエンスとコンテンツのセクションを完了してください
    • 実際のコンテンツと一致するレーティングを確保してください
    • 質問紙でインアプリ購入を宣言してください
  6. ストアリストの準備

    • アプリの説明が正確です
    • 短い説明は80文字以内です
    • フルな説明は4000文字以内です
    • 少なくとも2つの携帯電話のスクリーンショットがアップロードされました。
    • 1024x500の機能グラフィックがアップロードされました。
    • スクリーンショットは現在のバージョンを表示しています。
    • 必要なすべてのアセットがアップロードされました。

新しい個人アカウントの生産アクセス: あなたが申請した後、通常7日以内に 最初の生産レビュー: 初回リリースよりも速い場合もありますが、依然としてレビューされます。 更新: 初回リリースよりも速い場合もありますが、依然としてレビューされます。 Appeals: 数日間の計画を立て、正確な修正とレビュアーへの指示を提供する

:::tip Rolling Reviews AppleとGoogleのレビュー方法は異なります。アプリはレビュー期間中いつでも公開される可能性があり、固定時間ではなくいつでも

提出前にテスト

提出前にテスト

ライセンステスト

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

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

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Test purchases with license test account
async function testInSandbox() {
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) {
console.error('Billing not supported in this environment');
return;
}
// Fetch products (returns test pricing when using a license tester)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test products:', products);
// Make test purchase (no charge)
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test purchase complete:', transaction.transactionId);
}
  1. 検証テストバナー:
    • テストアカウントで購入する場合
    • 「テスト購入」通知を確認する
    • 実際の請求は発生しません

内部テストとクローズドテスト

内部テストとクローズドテストのセクション

リリース前の生産:

  1. 作成する 内部テスト トラックで迅速なQAまたは クローズドテスト より広範なテストのためにトラック
  2. Google Playにアップロードするために署名された .aab テストリリースを公開
  3. テスターのメールアドレスを追加してオプティンリンクを共有
  4. Google Playからビルドをインストールするようにテスターに指示
  5. PlayでインストールされたビルドでGoogle Playの購入フローのエンドツーエンドの検証
  6. 2023年11月13日以降に個人開発者アカウントが作成された場合、少なくとも14日間連続して閉鎖テストにオプティンしたテスターが12人以上いるようにして、生産用に申請する前に

Google PlayのBillingの検証のためにPlayでインストールされたテストビルドが、サイドロードされたデバッグビルドの代わりにはならない

ネイティブ購入のためのベストプラクティス

「ネイティブ購入のためのベストプラクティス」のセクション
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);
// Success - check entitlements from the store
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('Premium activated!');
}
} catch (error: any) {
// Handle specific error cases
switch (error.code) {
case 'USER_CANCELLED':
// User backed out - no error needed
console.log('Purchase cancelled');
break;
case 'ITEM_ALREADY_OWNED':
// They already own it - restore instead
showInfo('You already own this! Restoring...');
await NativePurchases.restorePurchases();
break;
case 'ITEM_UNAVAILABLE':
showError('This subscription is currently unavailable. Please try again later.');
break;
case 'NETWORK_ERROR':
showError('Network error. Please check your connection and try again.');
break;
default:
showError('Purchase failed. Please try again.');
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('Subscriptions restored!');
return;
}
// Check one-time unlocks if needed
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasInApp = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
if (hasInApp) {
unlockPremiumFeatures();
showSuccess('Previous purchases restored!');
return;
}
showInfo('No previous purchases found.');
} catch (error) {
showError('Failed to restore purchases. Please try again.');
} finally {
setLoading(false);
}
};
return (
<button onClick={handleRestore} disabled={loading}>
{loading ? 'Restoring...' : 'Restore Purchases'}
</button>
);
}

サブスクリプションのステータスを確認

サブスクリプションのステータスを確認のセクション
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. 適用可能な場合は申し立てを提出する

    説明と申し立てのプロセス

    Subject: Policy Violation Appeal - [App Name]
    Dear Google Play Review Team,
    I have received notification that my app violates [Policy X.Y].
    I have made the following changes to comply:
    1. [Specific change made]
    2. [Specific change made]
    3. [Specific change made]
    The updated version [version number] addresses all concerns raised.
    Test account for verification:
    Email: test@example.com
    Password: TestPass123
    Thank you for your consideration.

    ドキュメントの例を要求する

  4. 再提出または更新

    • 修正したバージョンをアップロードする
    • 再提出のためのレビュー
    • Play Consoleのステータスを監視

専門家の助けが必要ですか?

専門家の助けが必要ですか?のセクション

Play Storeのレビューをナビゲートすることは複雑です。特に、請求書の準拠、Appのコンテンツの宣言、テストトラックの設定を組み合わせる必要がある場合です。個別のアシスタンスが必要な場合:

__CAPGO_KEEP_0__のカスタマーコールを予約してください __CAPGO_KEEP_1__のためのヘルプ

  • Play Storeのレビュー準備を完了
  • テストトラックの設定とテスターの募集
  • IAPの実装レビュー
  • データの安全性とプライバシーへの準拠
  • 拒否のトラブルシューティングとアピール
  • Play Storeへのアプリの提出プロセスを完了

Capgoの専門家は、現在の要件を乗り越えるために、数百のアプリを成功したPlay Storeの提出を導きました。

__CAPGO_KEEP_2__

サポート

実装の際に必要なサポートを受けたい場合はどうですか?

If you are using IAP の Android Play Store レビュー ガイドラインのセクションのタイトル “” to plan security and compliance, connect it with Capgo を使用して IAP の Android Play Store レビュー ガイドラインのセクションを計画する場合、セキュリティとコンプライアンスのために接続してください、@capgo/native-purchases @capgo/native-purchasesのネイティブ機能のために 暗号化 暗号化の実装詳細のために 法的合致 __CAPGO_KEEP_0__ セキュリティ スキャナーの製品ワークフロー、そして Capgo セキュリティの製品ワークフロー for the product workflow in Capgo Security Scanner, and Capgo Security for the product workflow in Capgo Security.