App Store の「プロモーションテキスト」という枠を、長い間ほとんど触っていませんでした。説明文の一番上に出る170文字で、アプリの審査を通さずに差し替えられる数少ない領域です。季節やセール、新機能の告知に向いているのに、私は10年近く初期設定のまま放置していたアプリをいくつも抱えていました。
2014年から個人でアプリを作り続け、壁紙や癒し系を中心に累計5,000万ダウンロードに届いた今でも、この170文字をきちんと運用したことはありませんでした。Gemini API で週次に候補を作る小さな仕組みを1ヶ月回してみたので、過度に美化せずに所感を残しておきます。
なぜ説明文ではなくプロモーションテキストから始めたか
説明文(Description)の本文は、変更すると次のアップデートの審査を待つ必要があります。一方でプロモーションテキストは、App Store Connect 上で即時に差し替えられます。つまり「週次でこまめに回す」運用に向いているのはこちらでした。
私は最初、AI に説明文をまるごと書き直させようとしていました。けれど審査の往復が入ると、週次のリズムが崩れます。差し替えコストがほぼゼロの枠から始めるほうが、AI と人間の役割分担を試すには都合が良かったのです。宮大工だった祖父たちを思い出すと、まず削れる範囲から手を入れて様子を見る、という順番が体に馴染んでいる気がします。
週次パイプラインの最小構成
仕組みは驚くほど単純です。アプリごとに「カテゴリ・主要機能・今週の文脈(季節やセールの有無)」を1行で渡し、Gemini に170文字以内の候補を3つ出させます。そのうえで、必ず自分の目で1つを選びます。
import os
from google import genai
client = genai.Client(api_key=os.environ["YOUR_GEMINI_API_KEY"])
def draft_promo_texts(app_name: str, category: str, features: str, context: str) -> str:
prompt = f"""あなたはApp Storeのコピーライターです。
以下のアプリについて、プロモーションテキストの候補を3つ作ってください。
# 制約
- 各候補は日本語で全角70文字以内(App Storeの170字制限に対し安全側で短め)
- 誇大表現・絵文字の多用・「No.1」等の根拠なき最上級は禁止
- 今週の文脈を1つだけ自然に織り込む
- 3案はトーンを変える(実直 / 季節感 / 機能訴求)
# アプリ情報
名称: {app_name}
カテゴリ: {category}
主要機能: {features}
今週の文脈: {context}
"""
res = client.models.generate_content(
model="gemini-2.5-flash",
contents=prompt,
)
return res.text
if __name__ == "__main__":
print(draft_promo_texts(
app_name="しずく壁紙",
category="壁紙・カスタマイズ",
features="高解像度の自然壁紙、ダークモード連動、週替わり特集",
context="梅雨入り。雨の壁紙特集を今週公開",
))ポイントは2つあります。1つは、170字制限に対してわざと「70文字以内」と短めに縛っていることです。Gemini に上限ぎりぎりを狙わせると、句点で切れずに尻切れになることが何度かありました。安全側に倒したほうが、選んだあとの手直しが減ります。
もう1つは「今週の文脈を1つだけ」と明示している点です。文脈を複数渡すと、候補が欲張りになって全部入りの読みにくい文になりがちでした。
AI に任せた所と、人間が必ず触る所
1ヶ月回してみて、役割分担はかなりはっきりしました。
候補出しの初速は完全に AI の仕事です。アプリ40本分を手で考えると、それだけで週末が溶けます。Gemini に3案ずつ出させると、たたき台が数分で揃います。これは素直に助かりました。
一方で、最終的に1つを選ぶ判断と、固有名詞・季節表現の微調整は人間が必ず触りました。たとえば「梅雨入り」という言葉は、リリース地域によっては通じません。海外向けの英語版では、そのまま訳すと不自然になります。AI は「梅雨」を rainy season と置き換えてくれますが、文化的に刺さるかどうかは別の話で、ここは自分の目で確かめないと危ういと感じました。
# 候補から1つ選んだあと、人間が最終確認する観点を簡単なチェックに落とす
def sanity_check(text: str) -> list[str]:
issues = []
if len(text) > 70:
issues.append("70文字超。尻切れの可能性")
for ng in ["No.1", "世界一", "絶対", "必ず痩せ"]:
if ng in text:
issues.append(f"根拠なき最上級/誇大の疑い: {ng}")
if text.count("!") >= 3:
issues.append("感嘆符が多すぎる")
return issuesこの sanity_check は派手な機能ではありません。けれど週次で40本を回すと、AI が時々「No.1の使い心地」のような無根拠な最上級を混ぜてきます。審査リスクにもなるので、機械で弾けるものは弾く。残りを人間が読む。この線引きが、続けられるかどうかの分かれ目でした。
1ヶ月の効きと、正直わからなかった所
数字の話を正直に書きます。プロモーションテキストだけを変えた効果を、他の施策から完全に切り分けるのは難しいです。同じ週にキーワードも触っていたり、季節要因が乗っていたりするからです。
それでも、雨の壁紙特集を告知した週は、対象アプリのプロダクトページの閲覧から入手への転換が、普段より気持ち良いくらい動いた実感がありました。ただ、これが170文字のおかげなのか、特集そのものの魅力なのかは切り分けきれません。「効いた気がするが、断言はできない」というのが1ヶ月時点の正直な結論です。
逆にはっきり言えるのは、運用コストが激減したことです。以前は「説明文を直すのが億劫で結局放置」だったのが、週次でたたき台が出てくるだけで、心理的なハードルがほぼ消えました。続けられる仕組みになったこと自体が、いちばんの収穫だったかもしれません。
1ヶ月でぶつかった3つの小さな落とし穴
派手な失敗はありませんでしたが、地味に効く落とし穴がいくつかありました。
1つ目は、Gemini が稀に英数字や記号の幅を数え間違えることです。「70文字以内」と頼んでも、半角と全角が混ざると体感の長さがぶれます。だからこそ、生成段階の制約だけに頼らず、選んだあとに len() で機械的に測り直す手順を残しました。プロンプトの指示は「お願い」であって「保証」ではない、という当たり前を、40本を回す中で何度も思い出しました。
2つ目は、季節の文脈を渡しすぎると候補が似通うことです。「梅雨・新機能・週末セール」を全部渡した週は、3案ともほぼ同じ骨格になりました。トーンを変えてと頼んでも、情報量が多いと差が消えます。文脈は1つに絞るほど、3案の振れ幅が広がって選ぶ楽しさが戻ってきました。
3つ目は、つい AI の最初の1案をそのまま選びたくなることです。3案出させているのに、1案目が無難だと、そこで思考が止まりがちでした。意識して3案を声に出して読み比べるようにしたら、2案目・3案目のほうが季節に寄り添っていたことが何度もありました。選ぶ工程こそ人間の仕事だと、改めて言い聞かせています。
これから試したいこと
次は、選んだプロモーションテキストと実際の転換指標を1ヶ月分ためて、Gemini にレトロスペクティブを書かせてみようと思っています。「どのトーンの案が選ばれやすかったか」「選んだ案と転換に緩い相関はあるか」を、人間が読める要約にしてもらう段階です。判断はあくまで自分でやりますが、振り返りの初速だけ AI に借りる、という今回と同じ分担を広げたいと考えています。
もし同じように複数アプリのストア運用を1人で抱えている方がいれば、まずは審査不要のプロモーションテキストから小さく始めるのをおすすめします。差し替えコストがゼロに近い枠は、AI との役割分担を安全に試す練習台として、ちょうどよい大きさでした。お読みいただきありがとうございました。