5 月の連休あけ、Google Play Console を開いたら、主力の壁紙アプリの未返信 1★ レビューが 1 ページ目にびっしり並んでいました。日本語、繁体字、タイ語、ロシア語、ペルシャ語、ウクライナ語、ポーランド語。「広告が多すぎる」「動物カテゴリーに犬と猫が混ざっている」「下手クソ」「4K と謳うなら」。
読み進めるうちに、胸のあたりが重くなってきます。どれも当たっている指摘だからです。
個人開発でアプリを続けていると、レビュー返信は v2.0.0 / v2.1.0 という大型アップデートの直後にいつも一気に発生します。5 月 10 日と 27 日の 2 セッションで、71 件(41 + 30)に返信しました。Google の自動翻訳は使わず、すべて手書きで母語に寄せる方針です。下訳の検討と語彙統一に Gemini を入れることで、温度感を落とさずに 1 セッション 30〜40 件を回す運用が成立しました。
工程と Gemini の使いどころを、ここから公開していきます。「レビュー返信に時間がとれていない」「自動翻訳に頼って機械的になっている」「広告クレームへの返信文に正解が分からない」あたりで悩んでいる方を想定しています。
なぜ Gemini を「下訳と語彙統一」だけに使うのか
最初に判断の根拠を出しておきます。Google Play のレビュー返信は、ストア上位レビュー欄に長期固定される性質があるため、新規ユーザーの DL 判断に直接効きます。スパム判定や AI 生成検出を意識して書くべきものではなく、温度感のある人格の返信に見える必要があります。
Gemini に全部任せると、3 つの典型的な失敗が出ます。
- 温度の均一化: どの言語でも同じ熱量のテンプレ感謝になる。レビュアー側が「業務 BOT」と感じて返信効果が薄まる
- 固有名詞の表記揺れ: 「広告の非表示オプション」を一回目に書いた後、二回目に「広告解除機能」と書いてしまう。同じアプリの返信群で語彙が揺れると不信感
- 過度な定型挨拶: 「誠にありがとうございます」「引き続きよろしくお願いいたします」が連打される
逆に「下訳の検討」「語彙統一の参照」「短い母語フレーズ候補」だけに切り出すと、Gemini の長所が活きます。実際の運用は次のような分業です。
- 人が必ず書くもの: 文頭の感謝(「本当にありがとうございます」「Thanks a ton!」「Grazie davvero!」など温度感のある一言)/具体的な改善コミット(「7 月以降から明るい壁紙が増える予定」「先週より広告の表示頻度を運用可能な限り下げました」)/攻撃的レビューへの 1〜2 文の事実返答
- Gemini に頼っていいもの: 短い言語フレーズの下訳(タイ語・ペルシャ語・ポーランド語など、自分の語彙が薄い言語)/一度確定した語彙の他言語版(「広告の非表示オプション」→ "option to hide ads" / 「광고 비표시 옵션」など)/文末の自然な締めの候補出し
この分業を徹底すると、1 件あたりの執筆時間は平均 90 秒〜2 分。1 セッション 30〜40 件で 1 時間ちょっと。Gemini を入れずに辞書を引いていた頃と比べて、ほぼ半分の時間になりました。
Google Play ペナルティ回避の絶対ルール
返信を量産する前に、運用上のペナルティ回避ルールを書いておきます。これは Gemini に教えても意味がない部分で、運用者自身が守らないといけません。
- 1 セッションで上限の目安は 30〜40 件。それ以上は日を分ける。短時間の大量返信はスパム判定の可能性
- 同日中に追加する場合も間隔を空ける(数十分〜数時間)
- 自動翻訳のベタ貼りはしない(Google Play は同じ翻訳エンジンを内部に持っているので、丸わかりになる)
- アフィリエイトリンク・他アプリ宣伝・SNS リンクは入れない(ポリシー違反)
Gemini 出力をそのまま貼り付けるのは「自動翻訳のベタ貼り」に分類されかねないので、必ず人の手で 1 文以上書き直すのが安全策です。
言語別の運用テーブル
11 言語ごとに、運用上の留意点をまとめておきます。これは Gemini にコンテキストとして渡してもいいし、人間が手元に置いておくのでもかまいません。
| 言語 | 文頭に置く温度フレーズ | 運用上の留意点 |
| 日本語 | 「本当に嬉しいです!」「本当にありがとうございます」 | 「誠にありがとうございます」は使わない。主語は省略してフラットに |
| 英語 | "Thanks a ton!" / "Cheers!" / "Thanks for the heads up!" | カジュアル寄り。絵文字は基本不要 |
| 繁体字中国語 | 「非常感謝您的評價與支持!」 | 台湾ユーザーが多いので簡体字は使わない。デバイス言語が繁体字なら本文が簡体字でも繁体字で返す |
| 簡体字中国語 | (現状未対応) | 繁体字版を用意して優先 |
| イタリア語 | "Grazie davvero per le belle parole!" | 文末に温度の一言を必ず添える |
| ロシア語 | "Спасибо большое за отзыв!" | デバイス言語がロシア語でも投稿が英語のことがある。本文の言語を優先 |
| 韓国語 | 「이용해 주셔서 정말 감사합니다」 | 広告の非表示オプションは「광고 비표시 옵션」で固定 |
| ペルシャ語 | 「از بازخوردتان متشکریم」 | 右から左の文字方向に注意。コピー時に句読点が反転しやすい |
| ウクライナ語 | 「Дякую за відгук」 | ロシア語と混同しないこと。キリル文字でも語彙が異なる |
| タイ語 | 「ขอบคุณมากครับ!」 | 男性形 ครับ で統一する |
| ポーランド語 | 「Dziękujemy za szczerą opinię」 | 広告非表示オプションは「opcję ukrycia reklam」で固定 |
判断基準は「レビュー本文の元の言語を最優先、デバイス言語より」。英語で書かれていてもデバイス言語が他言語なら、母語で返したほうが好印象です。
語彙表を JSON で固定し、毎回コンテキストに流し込む
表記揺れを止める一番確実な方法は、語彙を人間の記憶から追い出して、機械可読なファイルに置くことです。私は次のような glossary.json を 1 ファイルだけ持ち、Gemini 呼び出しのたびに全文を差し込んでいます。
{
"ad_hide_option": {
"ja": "広告の非表示オプション",
"en": "option to hide ads",
"ko": "광고 비표시 옵션",
"pl": "opcję ukrycia reklam",
"th": "ตัวเลือกซ่อนโฆษณา"
},
"forbidden": ["広告ゼロ", "完全に消える", "ad-free forever", "no ads at all"]
}
forbidden を同じファイルに同居させているのが要点です。AdMob のポリシー上、「広告非表示」と書くべき箇所を「広告ゼロ」と断定すると、後で説明が苦しくなります。禁止語を語彙表と一緒に渡し、さらに生成後にも機械的に照合します。
import { GoogleGenerativeAI } from "@google/generative-ai";
import fs from "node:fs";
const glossary = JSON.parse(fs.readFileSync("glossary.json", "utf8"));
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
// 語彙表を固定した状態で、ニュアンス違いの2候補を生成する
async function draftReplies(reviewBody, lang) {
const model = genAI.getGenerativeModel({ model: "gemini-2.5-flash" });
const prompt = [
"あなたは個人開発者の Google Play レビュー返信ドラフトを手伝います。",
"最終出力は人が手直しします。温度の均一化や定型句の連発は避けてください。",
`返信は必ず ${lang} で書いてください。`,
"次の語彙表の訳語は一字一句そのまま使ってください:",
JSON.stringify(glossary.ad_hide_option, null, 2),
`次の表現は禁止です: ${glossary.forbidden.join(" / ")}`,
"",
"【レビュー本文】",
reviewBody,
"",
"ニュアンスの違う返信ドラフトを2候補、--- で区切って出力してください。",
].join("\n");
const result = await model.generateContent(prompt);
const drafts = result.response.text().split("---").map((s) => s.trim());
// 生成後に禁止語を照合する。プロンプトの指示だけでは漏れる
for (const draft of drafts) {
const hit = glossary.forbidden.find((w) => draft.includes(w));
if (hit) throw new Error(`禁止表現が混入しました: ${hit}`);
}
return drafts;
}
なぜ生成後にもう一度照合するのか。プロンプトで禁止しても、レビュー本文側に「広告ゼロにして」と書かれていると、モデルがその語をそのまま引き写してくることがあるからです。71 件を回した中で、この後段チェックが実際に止めたのは 3 件でした。率にして約 4%。少ない数字に見えますが、ストア上位に固定される返信文の 4% と考えると、看過できません。
throw して止めるのは大げさに思えるかもしれません。けれど、返信は取り消しにくい性質のものです。生成の失敗はやり直せますが、送信の失敗は謝るしかない。ここは止める側に倒しています。
用語の対訳ブレを構造化出力で抑える発想は、記事本文の日英同時生成にも応用できます。詳しくは日英2版を1回の構造化出力でまとめて生成し、用語の対訳ブレを止める運用設計にまとめています。
Gemini プロンプトの最小構成
Gemini API でも Gemini Web でも構いません。1 件あたりのプロンプトはこの形に落とし込んでいます。
あなたは個人開発者の Google Play レビュー返信ドラフトを手伝います。
最終出力は人が手直しすることが前提なので、温度の均一化や定型句の連発は避けてください。
【絶対ルール】
- レビュー本文の言語で返す
- 「広告の非表示オプション」相当の表現は glossary.json の訳語で固定する
- 「無料で完全に消える」「広告ゼロ」など断定的な表現は避ける(AdMob ポリシー)
- 文頭は温度のある一言で始め、ベタな業務挨拶(誠にありがとうございます/引き続きよろしく…)は使わない
【レビュー本文】
(ここに貼る)
【レビューに対する返信構成】
1. 感謝+共感の一言(温度を込める)
2. 事実ベースの行動報告(このアップデートで X を追加した/先週より広告の表示頻度を下げた)
3. 今後の改善姿勢(具体的な予定があれば書く)
【出力】
返信ドラフトを 2 候補。ニュアンスが少し違うものを並べてください。
固有名詞・絶対ルールの語彙は両候補で同じになるようにしてください。
このプロンプトのポイントは「2 候補出させる」ことです。1 候補だと結局それをそのまま貼りたくなりますが、2 候補出させると「どっちが温度感がある?」と人間が判断する工程が入って、テンプレ感が抜けます。
具体的に、5 月 10 日に返信した例を 1 つ転記します。レビュアーはタイの男性ユーザー、内容は「カテゴリの分類精度が低い」というもの。上のプロンプトで生成させた 2 候補は、次のようなニュアンス違いになりました。
候補 A:
ขอบคุณมากครับ! สำหรับฟีดแบ็กที่ละเอียดมาก ปัญหาการจัดหมวดหมู่
ที่ท่านระบุเป็นเรื่องที่เราเองก็เห็นด้วยว่ายังต้องปรับปรุง
จะค่อย ๆ ปรับปรุงให้ดีขึ้นนะครับ
候補 B:
ขอบคุณมากครับ! ที่แชร์ฟีดแบ็กให้ครับ การจัดหมวดหมู่ของสัตว์
รวมถึงสุนัขและแมวที่ปะปนกันอยู่ตอนนี้
เราตั้งใจจะปรับปรุงในอัปเดตถัดไปครับ
A は「これからゆっくり改善する」一般論。B は「動物カテゴリ内の犬と猫の混在を次回アップデートで」と具体的に言及しています。レビュー本文に「犬と猫」の言及があったので、B を選び、文末の「ครับ」を 1 つ追加して送信。1 件あたり、この判断に 30 秒ほど。
なお、返信をワークフロー化して API から自動送信する構成も試しましたが、応答遅延の設計で手痛くつまずきました。その記録はApp Store / Google Play のレビュー返信を Gemini API で自動化したときにはまった「8秒ルール」に残しています。
「広告クレーム」専用の返信構成
レビューの 4 割くらいが広告関連です。これは個人開発で AdMob を回している以上、必ず通る道で、ここで返答の質が落ちると一気に評価が下がります。私は次のテンプレ構成を使っています。
[感謝+共感] → [このアップデートで「広告の非表示オプション」を追加した事実] → [アプリ内設定から確認可能と案内] → [今後の改善姿勢]
実際の日本語例:
ご報告ありがとうございます。広告の多さでご不便をおかけして申し訳ございません。
このたびのアップデートで「広告の非表示オプション」を追加しました。
アプリ内の設定画面からご確認いただけます。
表示の挙動も引き続き調整してまいります。
実際の英語例:
Sorry the ads were too much. We just added an option to hide ads
in the latest update — you can find it in the app settings.
Thanks for the heads up!
このテンプレを Gemini に「ロシア語版」「ペルシャ語版」「タイ語版」と派生させるだけなら、Gemini の出力は安定します。断定表現が混入しないかは、前述の後段チェックに任せます。人間の目視だけに頼ると、疲れてきた 30 件目あたりで必ず見落とします。
攻撃的レビュー・連投パターンには Gemini を使わない
レビュー対応で一番神経を使うのは攻撃的レビューと、業者の可能性がある連投レビューです。ここは Gemini に投げると無難すぎる返答になりがちで、かといって人間が感情で返すと炎上の素。私は「短く事実で返す」ルールで人間が直接書きます。
ご不便な思いをさせてしまい、申し訳ございません。
詳しい状況を教えていただけますと、改善できるか確認させていただきます。
お手数ですがアプリ内のお問い合わせよりご連絡いただけますと幸いです。
連投パターン(同期間に複数アカウントから同じ表現の 1★ が来る)は、返信を丁寧に行いつつ、観察リストに残します。私の場合は次のようなパターンを user-review-reply-playbook-ja.md に記録しました。
- 同表現「下手クソ」を使う複数アカウントの 1★ 投稿が数日内に集中
- 「動物カテゴリーに犬・猫」「充電が減る」などピンポイントすぎる同一指摘
- 「履歴 (2)」以上の投稿経歴があるアカウント
- ストアトップに長期定着している長文クレーム
これらは「経過観察対象」としてリストに残し、パターンが続くようなら Google Play サポートへ報告検討、というフロー。Gemini に頼って自動化する範囲ではなく、運用者の目で常時監視する領域です。
返信優先順位と国別フォーカス
時間が限られている時の優先順位はこの順で固定しています。
- 公開ストア上位レビュー(新規ユーザーが最初に目にする)— Google Play ストア側で
showAllReviews=true で確認
- 未返信 1★ レビュー(評価改善+離脱防止)
- 未返信 5★ レビュー(コミュニティ醸成)— 各国の母語で
- 未返信 2〜4★ レビュー(中間層)
国別の優先順位は 日本 → 台湾 → イタリア → タイ → 韓国 → ブラジル → アメリカ の順。台湾とタイはユーザー数が特に多いので、繁体字中国語とタイ語の返信を必ず母語で書きます。タイは男性形 ครับ で統一、台湾はデバイス言語ベースで繁体字に寄せる、という細かいところで温度感が変わります。
ここで現実的な制約として、自分が読めない言語のレビュー本文は、Gemini にまず英訳してもらってから人間が読む、という二段階を踏みます。Gemini の英訳は十分実用的で、私はペルシャ語・ウクライナ語・ポーランド語の本文をまずこれで読みます。読んで内容を理解した上で、返信は元の言語で書く。レビュー本文と返信ドラフトを別タブで開いておき、本文タブを Gemini に英訳させ、返信ドラフトタブで上のプロンプトを回す、という手順です。
コストの実感も添えておきます。1 件あたりの入力は語彙表込みで概ね 900〜1,200 トークン、出力は 2 候補で 300 トークン前後。gemini-2.5-flash なら 71 件を回しても数十円の桁に収まりました。月額の推移はGemini 2.5 Flash を1ヶ月使い続けた個人開発者の正直レポートに詳しく書いています。
「次のアップデートで改善する」を口先で終わらせない
レビュー返信で具体的な改善を約束したら、それを progress-and-todo-ja.md や remaining-tasks-ja.md のような長期タスクファイルに必ず登録します。私の場合、5 月の 71 件から抽出した将来のアップデート候補は次の通り。
- 検索/フィルタ機能(数千ページのスクロール疲労を解消)
- カテゴリ内閲覧位置の保存/再開機能
- 動物カテゴリーから犬・猫を除外する分類整理
- 古い低解像度画像の整理/差し替え
- 重複画像の整理
- 広告の表示頻度・X ボタンの視認性改善
「次回アップデートで改善する」と返信したら、そのスレッドの内容を Gemini に「タスク化して」と頼んで、remaining-tasks-ja.md に追記する。Gemini は文章からアクションアイテムを抽出するのが上手で、レビュー本文のニュアンスを保ったままタスクに変換できます。アプリのアップデートと、レビューで約束した内容の整合性を取るために、この一手間は省かないようにしています。
返信文もアプリ本体と同じ手触りの成果物だと、私は考えています。Gemini が下絵を引いてくれて、最後の筆は人間が入れる。この距離感が、今のところの正解だと感じています。
運用に組み込むためのチェックリスト
最後に、これから同じ運用を始める方向けに最小チェックリストを置いておきます。
- 1 セッション 30〜40 件を上限にし、複数日に分散する
- 言語ごとに「文頭の温度フレーズ」を 2〜3 種類ストックしておく(Gemini に毎回再生成させない)
- 固有語彙と禁止語を
glossary.json に 1 ファイルで持ち、毎回コンテキストに流し込む
- 生成後に禁止語を機械照合する(プロンプトの指示だけでは約 4% すり抜ける)
- Gemini には常に「2 候補」「ニュアンス違い」を要求する
- 攻撃的レビュー・連投パターンは Gemini を使わず人間が短く事実で返す
- 改善コミットしたものは
remaining-tasks-ja.md に必ず登録、Gemini にタスク化を頼んでもよい
- 自動翻訳のベタ貼り検出を避けるため、Gemini 出力は必ず 1 文以上人の手で書き直す
まず着手するなら、glossary.json を 1 ファイル作るところからで十分です。語彙が固まった瞬間に、返信の速度と落ち着きが変わります。お読みいただきありがとうございました。