3年前まで、私は Beautiful HD Wallpapers のレビューを毎週末に手で返信していました。当時すでに月間アクティブユーザーは200万人を超えていて、英語・日本語・スペイン語・アラビア語・インドネシア語など20言語以上のレビューが毎日届いていました。週末の3時間を返信作業に費やしながら、「これはもう人間がやる作業ではない」と感じていました。
そこから試行錯誤を経て Claude API による自動返信システムを本番稼働させるまでの道のりを、この記事に記録しておきます。公式ドキュメントには書かれていない制約や、実際に失敗したパターンも含めて、正直に書きます。
Law of Attraction Everyday や Relaxing Healing でも同様でした。ヒーリング系アプリのユーザーは感情的なレビューを書くことが多く、「このアプリが私の人生を変えた」という真剣なメッセージに対して定型文で返すのは失礼だという感覚がありました。かといって、毎日100件以上届くレビューを全て個別に返信するのは物理的に不可能です。
App Store のレビューへの返信率は評価アルゴリズムに影響するという指摘もあり(Apple は公式には非公開)、返信しないのも得策ではないという判断がありました。最初は ChatGPT に返信案を作らせて手動でコピペするという方法を試みました。これは機能しましたが、スケールしませんでした。App Store Connect API を使って自動化を試みたとき、最初の「落とし穴」に遭遇しました。
App Store の「非公式制限」という最初の壁
App Store Connect API にはレビュー返信のエンドポイントが存在します。仕様上は問題ないように見えますが、実際に連続して返信を送ると、ある時点から返信が受け付けられなくなる現象が起きました。
多言語返信生成のモデル候補として、複数の API を比較検討しました。最終的に Claude API を選んだ理由は、文脈から感情を読む能力の高さと各言語での自然なトーン維持にあります。
私のアプリは、壁紙(Beautiful HD Wallpapers)から引き寄せの法則(Law of Attraction Everyday)まで、様々な感情的価値を提供しています。返信のトーンがアプリの世界観と合っているかどうかは、ユーザー体験に直接影響します。「このアプリで毎日が変わった」という感動的なレビューに対して、機械的な謝辞を返すと逆効果です。Claude はこの「文脈に沿ったトーン」を他のモデルよりも安定して維持できると実感しています。
システム全体の構成は、レビュー取得 → 前処理 → Claude API による生成 → 品質フィルタ → スロットラー経由での投稿、というパイプラインです。各ステップを疎結合に設計することで、1つのステップが失敗しても全体が止まらない構造にしています。
Claude はデフォルトで丁寧な返信を生成しますが、1,000件以上の返信を生成すると、冒頭の「ご評価いただきありがとうございます」や末尾の「これからもよろしくお願いします」のような定番フレーズが繰り返されます。個々のレビューには自然に見えても、App Store の検出システムからは「同じ文面を大量に送っている」と判断されるリスクがあります。
例えば Law of Attraction Everyday では、過度に元気のいい返信よりも「静かな励まし」が合うと判断しています。「そのアプリのおかげで毎日が変わりました」というレビューに対して「素晴らしいですね!」より「お役に立てていることを、静かに嬉しく思います」の方が世界観に合います。このようなトーン判断をシステムプロンプトで規定することで、アプリの個性が返信に反映されるようになりました。
インドネシア語では、フォーマル(Anda)とインフォーマル(kamu)の使い分けが文脈に依存するため、ユーザー向けの返信では常に「Anda」を使う指示を入れる必要がありました。指示なしでは Claude がどちらを使うか予測不能でした。
ポルトガル語は地域によって大きく異なります。ブラジルポルトガル語と欧州ポルトガル語は語彙も表現も異なるため、App Store のストアフロント(ブラジルか欧州か)でルーティングを分けています。App Store のレビューにはストアフロントの情報が含まれているため、この分岐は自動化できます。
言語検出については、App Store のレビューにはストアフロントのロケールが付いていますが、そのロケールの言語でレビューが書かれているとは限りません。米国ストアフロントのレビューがスペイン語で書かれることもあります。そのため、言語検出はストアフロントロケールではなくレビュー本文のテキストから行う必要があります。langdetect ライブラリを主に使い、20文字以下の短いテキストや langdetect が自信を持てない場合は Claude Haiku に言語判定を委ねるという二段構えにしています。
本番稼働から学んだ運用上の教訓
システムを本番稼働させてから数ヶ月で、いくつかの予想外の問題に直面しました。
教訓1: 返信が投稿されたか確認するポーリングが必要
App Store Connect API への返信投稿は、HTTPステータスが200でも実際に反映されるまでに数分かかることがあります。投稿後すぐに「完了」とログに記録していたため、後から確認したときに返信が存在しないケースが複数発生しました。現在は返信投稿後に30秒待って確認するポーリングを実装しています。最大5回確認して反映されない場合は手動確認キューへ移します。
ある日、Claude API のコストが通常の3倍になっていることに気づきました。原因を調べると、類似度チェックで再生成を繰り返すループが正常に終了していなかったのです。再生成の上限回数を設定していたにもかかわらず、バグで上限が機能していませんでした。1日あたりの上限金額を設定してアラートと自動停止を実装することで、このような問題を早期に検知できるようになりました。
また、アプリをまたぐジョブの処理順序は最小ヒープで管理しています。Beautiful HD Wallpapers の未返信レビューが100件、Law of Attraction Everyday が30件ある場合、単純に Beautiful HD を全部先に処理するのではなく、優先度に応じて混在させることで各アプリのユーザーへの公平性を保てます。
実際の成果と数値
現在のシステムで達成できていること:
返信率は全レビューの92%が48時間以内に返信できています(以前は15%)。処理できる言語は33言語です。月額コストは Claude API と運用コスト合計で月1万円以下に収まっています。手動介入率は7〜8%で、主に技術的なバグ報告と感情的な否定レビューが対象です。
残っている課題は、返信がユーザーの評価変更に与える影響の測定です。「返信を受け取ったユーザーが評価を上げた割合」のデータを取るには App Store Connect API の制約もあり、現時点では正確な測定が難しい状況です。Google Play の方がデータが取りやすく、一定の相関は確認できていますが、App Store 側は引き続き模索中です。
プロンプトキャッシュによるコスト削減の仕組み
Claude API のプロンプトキャッシュは、同じシステムプロンプトを繰り返し使う場面で大きな効果を発揮します。入力トークンが1,024以上ある場合にキャッシュが有効化され、キャッシュヒット時のコストはキャッシュなしの場合の約10%に下がります。
私のシステムでは、アプリ別・言語別のシステムプロンプトが約1,400〜2,000トークンあります。Beautiful HD Wallpapers の日本語向けプロンプト、英語向けプロンプト、スペイン語向けプロンプト……というように、組み合わせごとにシステムプロンプトが存在します。これをキャッシュすることで、同一のシステムプロンプトを使う2件目以降のリクエストは大幅にコストが下がります。
特に日本語では「引き続きよろしくお願いいたします」「今後ともご愛顧ください」「お役に立てれば幸いです」などの締めフレーズが固定化しやすいです。英語でも「Thank you for your kind words」「We appreciate your feedback」のような定番フレーズが多用されていました。
次のステップは、レビューの傾向分析と開発優先度への反映です。毎日届く何百件ものレビューを Claude API で集約・分析し、「どの機能に不満が集中しているか」「どの国のユーザーがどんな期待を持っているか」を定量的に把握するパイプラインを構築したいと考えています。返信の自動化は「後処理」ですが、分析は「前処理」として開発計画に組み込めます。
個人開発を2014年から続けてきて感じるのは、ユーザーと誠実に向き合おうとするとリソースがいくらあっても足りないということです。だからこそ、反復的で定型的な部分を AI に任せ、自分の判断が必要な部分に集中できる体制を作ることは、作り手の誠実さを損なうのではなく、むしろ守ることにつながると思っています。
同じ課題を持つ個人開発者の参考になれば嬉しいです。
シェア
お読みいただきありがとうございます
Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。