「なぜ日本でこんなに売れないんだろう?」と思ったことはないでしょうか。アプリの品質に問題はなく、レビューも悪くありません。でも収益が伸びありません。その原因の一つが価格帯設定のミスです。
App StoreとGoogle Playには「Tier(価格帯)」と呼ばれる価格システムがあります。日本の¥250がそのまま$1.99になっているとは限りません。Tierの仕組みを理解せず、デフォルト設定のままにしているアプリは、特定の国で過大または過小な価格になっていることがあります。
App Storeの価格Tier構造を理解する
Apple Developer Portalでは、アプリやIAPの価格を「Price Point」で設定します。2023年以降、Appleは価格管理システムを刷新し、国ごとに個別に価格を指定できるようになりました。
重要なのは、「基準通貨で設定された価格が各国に自動換算される」だけでなく、特定国向けに個別価格を上書き設定できる点です。
たとえば:
- 米国: $0.99(Tier 1相当)
- 日本: ¥160(自動換算)/ ¥250に上書き(推奨)
- インド: ₹99(自動換算)/ ₹79に上書き(購買力平価に合わせる)
自動換算に任せると、購買力平価(PPP)を無視した価格になりがちです。インドでは$0.99の自動換算価格が現地感覚では「高すぎる」ことがあります。一方、日本では¥160より¥250の方がむしろ売れることもあります(安すぎると品質を疑われる)。
Google Playの価格設定:ローカル価格の重要性
Google Play Consoleでは、「価格と販売/配布地域」から国別の価格を個別設定できます。
Google Playが特にユニークなのは、ローカル価格の推奨機能です。Play Consoleが各国の購買力に基づいた推奨価格を提示してくれます。この推奨価格を採用したアプリでは、採用前と比べてインストール率が向上するケースが多く報告されています。
具体的な操作:
- Play Console → アプリを選択 → 「収益化」→「製品」→「アプリ内アイテム」
- 対象のIAPを選択
- 「価格の変換」タブ → 「ローカル価格を取得」をクリック
- 推奨価格を確認し、調整して保存
特に見直しが有効な国:ブラジル(BRL)、インド(INR)、メキシコ(MXN)、トルコ(TRY)、ロシア(RUB)。これらの国では購買力と通貨の実力が乖離しやすく、ローカル価格最適化の効果が大きいです。
国別収益を分析する:Antigravityの活用
Antigravityを使ってApp Store ConnectやPlay Consoleのデータを分析し、どの国・価格帯が収益に貢献しているかを可視化します。
# analyze_revenue_by_country.py
# App Store Connect APIからダウンロード・売上データを取得して分析
import requests
import jwt
import time
from datetime import datetime, timedelta
# App Store Connect API 認証
def get_auth_token(key_id: str, issuer_id: str, private_key: str) -> str:
"""JWT トークンを生成する"""
payload = {
"iss": issuer_id,
"iat": int(time.time()),
"exp": int(time.time()) + 1200, # 20分
"aud": "appstoreconnect-v1",
}
headers = {
"alg": "ES256",
"kid": key_id,
}
return jwt.encode(payload, private_key, algorithm="ES256", headers=headers)
def get_sales_by_country(
app_id: str,
key_id: str,
issuer_id: str,
private_key: str,
days: int = 30,
) -> dict:
"""過去N日間の国別売上を取得する"""
token = get_auth_token(key_id, issuer_id, private_key)
headers = {"Authorization": f"Bearer {token}"}
# Sales and Trends レポートを取得
# 実際はCSVレポートのダウンロードAPIを使用
# ここでは簡略化した擬似コード
country_revenue = {}
for i in range(days):
date = (datetime.now() - timedelta(days=i)).strftime("%Y-%m-%d")
resp = requests.get(
f"https://api.appstoreconnect.apple.com/v1/salesReports",
headers=headers,
params={
"filter[reportType]": "SALES",
"filter[reportSubType]": "SUMMARY",
"filter[frequency]": "DAILY",
"filter[reportDate]": date,
"filter[vendorNumber]": "YOUR_VENDOR_NUMBER",
},
)
if resp.status_code == 200:
# CSVをパースして国別売上を集計
for row in parse_csv(resp.content):
country = row.get("Country Code", "UNKNOWN")
revenue = float(row.get("Developer Proceeds", 0))
country_revenue[country] = country_revenue.get(country, 0) + revenue
return dict(sorted(country_revenue.items(), key=lambda x: x[1], reverse=True))
def parse_csv(content: bytes) -> list:
"""Apple CSVレポートをパースする(簡略化)"""
import csv
import io
import gzip
# Apple のレポートはgzip圧縮されている
try:
content = gzip.decompress(content)
except Exception:
pass
reader = csv.DictReader(io.StringIO(content.decode("utf-8")), delimiter="\t")
return list(reader)
# 分析結果の可視化
def analyze_pricing_opportunity(country_revenue: dict) -> list:
"""価格最適化の機会がある国を特定する"""
# 購買力平価インデックス(参考値・2026年)
PPP_INDEX = {
"JP": 0.72, # 日本: ドルの購買力が低い(円安)→ 価格調整の余地
"IN": 0.32, # インド: PPPが低い → ローカル価格化が重要
"BR": 0.45, # ブラジル
"MX": 0.41, # メキシコ
"TR": 0.28, # トルコ
"US": 1.00, # 基準
"GB": 0.91, # 英国
"DE": 0.85, # ドイツ
"AU": 0.86, # オーストラリア
"KR": 0.70, # 韓国
}
opportunities = []
for country, revenue in country_revenue.items():
if country in PPP_INDEX:
ppp = PPP_INDEX[country]
if ppp < 0.50:
opportunities.append({
"country": country,
"current_revenue": revenue,
"ppp_index": ppp,
"action": "ローカル価格を下げると購買率向上が見込まれます",
"priority": "HIGH",
})
elif ppp < 0.75:
opportunities.append({
"country": country,
"current_revenue": revenue,
"ppp_index": ppp,
"action": "ローカル価格を検討してください",
"priority": "MEDIUM",
})
return sorted(opportunities, key=lambda x: x["current_revenue"], reverse=True)
# 実行
if __name__ == "__main__":
revenue = get_sales_by_country(
app_id="YOUR_APP_ID",
key_id="YOUR_KEY_ID",
issuer_id="YOUR_ISSUER_ID",
private_key=open("AuthKey.p8").read(),
days=30,
)
print("=== 国別売上 Top 10 ===")
for i, (country, amount) in enumerate(list(revenue.items())[:10], 1):
print(f"{i:2}. {country}: ${amount:.2f}")
opportunities = analyze_pricing_opportunity(revenue)
print("\n=== 価格最適化の機会 ===")
for opp in opportunities:
print(f"[{opp['priority']}] {opp['country']}: {opp['action']}")サブスクリプション価格の最適化:よくある失敗パターン
個人開発者がサブスクリプション価格で陥りやすいパターンを整理します。
失敗パターン1: 全世界統一価格
米国向けに$4.99/月で設定し、他の国も自動換算に任せる。インドでは₹415/月になり、現地の感覚では高すぎて購入されありません。
失敗パターン2: 安すぎる日本価格
¥250/月の設定は、品質への不安感を与える場合があります。日本では¥480〜¥600が「ちょうどいい」と感じられるゾーンであることが多く、過剰に安くすると価値を疑われることがあります。
失敗パターン3: 価格変更を怖がる
既存ユーザーへの影響を恐れて価格を変えありません。Appleの価格保持機能(Preserve Price)を使えば、既存サブスクライバーの価格は変えずに新規ユーザーの価格だけ変更できます。価格改定は思ったより柔軟にできます。
実践的な価格テスト:まずここから始める
価格最適化は「分析 → 仮説 → テスト → 計測」のサイクルです。まず以下から始めることをお勧めします。
-
現在の国別収益を確認する: App Store ConnectまたはPlay Consoleで「収益」→「地域」を開き、どの国が収益の何%を占めているか把握する
-
ボリュームはあるのに収益が低い国を探す: ダウンロード数は多いのに収益が低い国は、価格が高すぎるか、購買力に合っていない可能性があります
-
1国だけローカル価格を試す: いきなり全国変更せず、1カ国でテストして効果を見る(例: インドだけローカル価格に下げる)
-
90日後に比較する: RevenueCatやApp Store Connectのコホートレポートで、変更前後の購買率を比較する
価格設定は「設定したら終わり」ではなく、継続的に改善していくものです。Antigravityを使って分析を自動化し、定期的な見直しサイクルを作ることが長期的な収益最大化につながります。
プレミアム記事「RevenueCat と Antigravity AI を使ったサブスクリプションチャーン防止パイプラインの実装」では、解約予測モデルと自動ウィンバックフローの完全実装を解説しています。