自社アプリの App Store と Google Play のレビューを毎朝集めて不具合・要望・質問に分け、不具合は既存のチケットと照らして開発の Jira に起票する
App Store と Google Play に付いたレビューを毎朝 API で集め、不具合の報告・機能の要望・使い方の質問・その他に分けます。不具合は症状と端末の情報を抜き出し、既存のチケットへの追記か新規の起票かを決めて、担当が確かめてから Jira に登録します。
- 生成AI
- ChatGPT/Claude
- 連携・自動化
- Make/n8n/Zapier
- 対象業界
- EC/IT・SaaS/小売/金融
- 対象部門
- カスタマーサポート
- 対象業務
- 分類・仕分け/問い合わせ対応
- 主な課題
- 人手が足りない/情報が見つからない/期限・対応漏れが起きる
- AIで行う処理
- 分類
- 主な効果
- 対応スピード向上/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- ノーコード連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- App Store Connect と Google Play Console を開き、前日からの新しいレビューを読む
- 不具合・要望・質問・その他に分け、集計表に1行ずつ書く
- 不具合なら、Jira で似たチケットを探す
- 似たチケットがあれば、レビューの内容をコメントで追記する。無ければ新しく起票する
- 起票するときは、症状・画面・版・端末をレビューから拾って書く
- 質問には、担当が管理画面から返信を書く
- 月に一度、要望を集計表から数えてプロダクトの担当に渡す
- 自動毎朝8時に n8n が動き、両ストアの API から前回以降のレビューを取る
- 自動レビューIDで重複を外し、編集されたレビューを見分ける
- 自動本文から電話番号・メールアドレスらしい文字列を伏せる
- 自動Text Classifier が、不具合・要望・質問・その他の4つに分ける。決められないものは「Other」に出る
- 自動不具合は、症状・画面・操作・端末の情報を抜き出し、開いているレビュー起点のチケットと同じ不具合かを判定する
- 自動「追記」か「新規の起票」かの案を、担当に Slack で送る
- 人担当が案を確かめ、「登録する」か「登録しない」を選ぶ
- 自動「登録する」なら、Jira にコメントを追記するか、新しいチケットを作る
- 自動要望・質問・その他・Other を集計表に書き、質問と Other は担当の一覧に載せる
- 人担当が質問に管理画面から返信し、Other の行き先を決める
各工程の詳しい説明を読む
- App Store Connect と Google Play Console を開き、前日からの新しいレビューを読む
- 不具合・要望・質問・その他に分け、集計表に1行ずつ書く
- 不具合なら、Jira で似たチケットを探す
- 似たチケットがあれば、レビューの内容をコメントで追記する。無ければ新しく起票する
- 起票するときは、症状・画面・版・端末をレビューから拾って書く
- 質問には、担当が管理画面から返信を書く
- 月に一度、要望を集計表から数えてプロダクトの担当に渡す
(a)2つの管理画面を毎日読むのに手がかかる。 更新の直後の週は1日に数十件になり、読むのが翌日に回って、不具合の報告が開発に届くのが遅れます。
(b)同じ不具合が別々のチケットになる。 「起動すると落ちる」「開いたらすぐ閉じる」「アプリが消える」。同じ症状を利用者は違う言葉で書くので、Jira の検索で見つからず、新しいチケットが立ちます。 開発は重複を見つけて閉じる作業に時間を使います。
(c)起票の質が担当によって違う。 版や端末を書く担当と書かない担当がいて、開発は再現の条件を聞き返します。 iOS のレビューにはもともと版が書かれていないので、担当が推測で書いてしまうこともあります。
(d)要望が数えられていない。 集計表への記入は忙しい日に省かれ、月に一度渡す要望の数が実際より少なく出ます。
- 【自動】 毎朝8時に n8n が動き、両ストアの API から前回以降のレビューを取る
- 【自動】 レビューIDで重複を外し、編集されたレビューを見分ける
- 【自動】 本文から電話番号・メールアドレスらしい文字列を伏せる
- 【自動】 Text Classifier が、不具合・要望・質問・その他の4つに分ける。決められないものは「Other」に出る
- 【自動】 不具合は、症状・画面・操作・端末の情報を抜き出し、開いているレビュー起点のチケットと同じ不具合かを判定する
- 【自動】 「追記」か「新規の起票」かの案を、担当に Slack で送る
- 【人】 担当が案を確かめ、「登録する」か「登録しない」を選ぶ
- 【自動】 「登録する」なら、Jira にコメントを追記するか、新しいチケットを作る
- 【自動】 要望・質問・その他・Other を集計表に書き、質問と Other は担当の一覧に載せる
- 【人】 担当が質問に管理画面から返信し、Other の行き先を決める
7番目が、この設計の分かれ目です。 担当は900件を読む代わりに、不具合の案と、AIが決められなかったものだけを見ます。 開発に届くチケットは、すべて人が確かめたものになります。
4番目と5番目を分けているのも、意図してのことです。 仕分けは件数が多く、行き先を決めるだけなので専用のノードで速く行います。中身の抜き出しと既存チケットとの照合は、不具合に絞ってから行います。 900件すべてに重い処理をかけません。
02今回想定するシステム構成
【トリガー】毎朝8時(Schedule Trigger、時間帯は Asia/Tokyo) ▼ n8n ├─ JWT(Sign、ES256)→ HTTP Request ── App Store Connect の customerReviews ├─ HTTP Request(Google のサービスアカウント)── Google Play の reviews ├─ Data Table ── 取り込み済みのレビューID、最終更新の日時 ├─ Code ── 重複の除外、伏せ字、両ストアの形をそろえる ▼ Text Classifier + Anthropic Chat Model ├─ 不具合 ──▶ Basic LLM Chain + Structured Output Parser │ 症状・画面・端末の抜き出し、既存チケットとの照合 │ ▼ │ Slack(Send and Wait for Response:Approval) │ ▼ │ Jira Software ── コメントの追記 / 新規の起票 ├─ 要望・質問・その他 ──▶ 集計(Data Table) └─ Other ──▶ 担当の一覧へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n | Make、Zapier |
| 生成AI | Claude(n8n の Anthropic Chat Model ノード) | OpenAI API |
| チケット | Jira(n8n の Jira Software ノード) | GitHub Issues、Backlog |
| 保管 | n8n の Data Table(取り込みの記録、仕分けの結果、案と判断) | スプレッドシート |
| 通知 | Slack(n8n の Slack ノード) | Microsoft Teams |
新しく足すのは n8n と、両ストアの API の鍵だけです。 Jira と Slack は今あるものを使います。代替候補から Gemini API を外しているのは、家計簿のアプリは18歳未満の利用者がいうるためです。レビューの書き手の年齢は分かりません。
n8n を選ぶのは、両ストアの認証の違いを1つのワークフローに収められるからです。 App Store Connect の API は、自分で署名した JWT を毎回付けて呼びます。n8n の JWT の資格情報は PEM の鍵と ES256 の署名に対応しており、JWT ノードの Sign で作ったトークンを HTTP Request に渡せます。Google Play は、サービスアカウントの資格情報を「HTTP Request で使う」設定にしてスコープを足すと呼べます。
03どうやって実装するのか
処理の起点を決める
Schedule Trigger で毎朝8時に動かします。 公式ページでは、ワークフローに時間帯の設定が無ければ n8n のインスタンスの時間帯に従い、自前で置いた場合の既定は America/New York とされています。ワークフローの設定で Asia/Tokyo を指定します。
1日1回で足りるのは、Google Play の API の取れる範囲に余裕があるからです。 公式ページでは、API で取れるのは利用者が直近1週間に作成または更新したレビューだけで、それより古いものは Play Console から CSV で落とす必要があるとされています。毎日取れば、n8n が数日止まっても取りこぼしません。 1週間を超えて止まったときは、Play Console の CSV で埋めます。
更新の直後の数日は、昼にもう1回動かします。 不具合の報告が集中する時期に、開発に届くのを半日早めるためです。Schedule Trigger には複数の時刻を設定できます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| iOS のレビュー | 星、題名、本文、投稿者名、作成日時、国 | App Store Connect API |
| Android のレビュー | 星、本文(題名はタブ区切りで本文に含む)、投稿者名、最終更新の日時、言語、版、端末、OS の版 | Google Play Developer API |
| 取り込みの記録 | レビューID、ストア、最終更新の日時、仕分けの結果 | Data Table |
| 開いているチケット | レビュー起点のチケットのキー、要約、症状、画面、版 | Data Table(起票のたびに書き足す) |
| 仕分けの説明 | 4種類それぞれの意味と、迷ったときの優先順位 | Text Classifier の設定 |
質を決めるのは、いちばん下の「仕分けの説明」です。 Text Classifier の公式ページは、区分ごとに名前と説明を書き、意味が明らかでないときは説明が精度を左右するとしています。「不具合」とだけ書くと、「この機能が無いのは不具合だ」という要望が不具合に入ります。
Android のレビューの版と端末は、付かないこともあります。 公式ページでは、端末などの情報は一部の結果にだけ現れるとされ、投稿者名もまれに欠けるとされています。欠けた項目は空のまま扱い、AIに補わせません。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| iOS のレビュー | GET /v1/apps/{id}/customerReviews | 仕分けと抜き出し |
| Android のレビュー | Google Play Developer API の reviews | 仕分けと抜き出し |
| 取り込み済みのID | Data Table ノードの Get | 重複の除外、編集の検出 |
| 開いているチケット | Data Table ノードの Get | 既存チケットとの照合 |
iOS は、作成日時の新しい順に取って、前回取った日時より古いものが出たら止めます。 公式ページでは、customerReviews の sort に -createdDate を指定でき、1回に返す件数の上限(limit)は200、filter[rating] で星を絞れるとされています。返す項目は rating・title・body・reviewerNickname・createdDate・territory などで、版や端末の項目はありません。
App Store Connect のトークンは、呼ぶたびに作り直します。 公式ページでは、JWT は ES256 で署名し、aud は appstoreconnect-v1、有効期限が20分より先のトークンは(一部を除き)無効とされています。n8n では、JWT ノードの Sign で期限を短く切ったトークンを作り、HTTP Request の Authorization ヘッダーに入れます。秘密鍵は資格情報に入れ、ワークフローの中に書きません。
Android は、1ページ100件で取り、次のページの印をたどります。 公式ページでは、既定は1ページ10件で、maxResults で100件まで増やせ、次のページは nextPageToken を token に渡して取るとされています。読み取りの上限はアプリごとに1時間に200回なので、1日1回では届きません。
同じレビューIDが、最終更新の日時を変えて戻ってきたら「編集」です。 利用者が星や本文を書き直すと、Android では最終更新の日時が変わります。編集されたレビューは仕分けをやり直し、既にチケットに追記していれば、そのチケットに「レビューが編集された」と追記します。
AIへ渡す前に整形する
- 形をそろえる … 両ストアのレビューを、ストア・レビューID・星・本文・日時・国または言語・版・端末の共通の形にします。iOS の版と端末は
nullにします - 重複の除外 … Data Table と照らし、取り込み済みで更新の無いものを外します
- 伏せ字 … 電話番号・メールアドレス・会員番号らしい文字列を
[MASKED]に置き換えます - 言語の確認 … 日本語以外のレビューは、仕分けの前に印を付けます。Android は API の翻訳の指定で日本語訳を取れます
- 短すぎるもの … 「最高」「ダメ」のような数文字のものは、AIに渡さず「その他」にします
3番目は、Jira に個人の情報を流さないためです。 利用者は「サポートに連絡したのに返事が無い、[email protected]」のように連絡先を書くことがあります。チケットは社内の多くの人が読むので、ここで伏せます。 投稿者名もチケットには写しません。
4番目の翻訳は、Android だけの機能です。 公式ページでは、translationLanguage を付けると本文を訳して返し、原文は originalText に入るとされています。iOS の外国語のレビューは、原文のまま渡します。
AIに処理させる
まず Text Classifier に、4つの区分のどれかを選ばせます。 公式ページでは、区分ごとに名前と説明を持たせ、既定では1件に1つの区分を選び、どれにも当たらないときに「Other」の出力に分ける設定があるとされています。既定の動作は「捨てる」なので、必ず Other に出す設定に変えます。
| 区分 | 説明に書くこと |
|---|---|
| 不具合の報告 | アプリが意図どおりに動かない。落ちる、固まる、表示が崩れる、データが消える、同期しない、ログインできない |
| 機能の要望 | 今は無い機能や、今の動きを変えてほしいという希望。「〜できない」が仕様の範囲の話なら要望 |
| 使い方の質問 | やり方が分からない、どこにあるか分からない、という問い |
| その他 | 全体の感想、評価、料金への意見など、上の3つに当たらないもの |
説明の最後に、迷ったときの順を書きます。 不具合の報告を含むなら、要望や感想が混ざっていても不具合を選ぶ、と書きます。不具合を他の区分に落とすと、開発に届きません。
次に、不具合のレビューだけを Basic LLM Chain に渡し、中身を抜き出させます。
| させること | 中身 |
|---|---|
| 症状の要約 | 何が起きたかを1文で。利用者の言葉を残す |
| 画面・機能 | レシートの撮影、口座の連携、グラフ、ログインなど、社内の画面一覧のどれか |
| 操作 | 書かれていれば、何をしたときに起きたか |
| 既存チケットとの照合 | 開いているチケットの一覧から、同じ不具合と言えるものを1つ選ぶか、無いとする |
| 確からしさ | 同じ不具合と言い切れるか、似ているが分からないか |
| させないこと | 理由 |
|---|---|
| 版・端末・OS の補完 | API が返した値だけを使う。iOS は空のまま |
| 重大度・優先順位の決定 | 開発とプロダクトの担当が決める |
| 原因の推測 | レビューから原因は分からない |
| 返信の文面 | 返信は担当が書く |
指示内容を固定する
Basic LLM Chain のシステムメッセージに、次のように書きます。
あなたは家計簿アプリのサポート担当として、ストアのレビューのうち
「不具合の報告」と仕分けられたものから、開発に渡す情報を抜き出します。
【入力】
- レビュー(ストア、星、本文、日時、版、端末、OSの版。無い項目は null)
- 社内の画面・機能の一覧(ID と名前)
- 開いているレビュー起点のチケットの一覧(キー、要約、症状、画面、版)
【抜き出すこと】
1. symptom: 何が起きたかを1文で。利用者の言葉をできるだけ残してください。
2. feature_id: 画面・機能の一覧から1つ。分からなければ "unknown"。
3. action: 何をしたときに起きたか。書かれていなければ null。
4. match: 開いているチケットのうち、同じ不具合と言えるもののキー。無ければ null。
5. match_confidence: "same" / "similar" / "none"
【厳守事項】
- 版、端末、OSの版は、入力の値をそのまま使ってください。
null のときに推測で埋めないでください。本文に書かれていても、
入力が null なら reported_in_text に本文の言葉を写すだけにしてください。
- 同じ画面の不具合というだけで same にしないでください。
症状と操作がそろって同じと言えるときだけ same にしてください。
- 重大度、優先順位、原因は書かないでください。
- [MASKED] の中身を推測しないでください。
- 不具合の報告でないと判断したら、is_bug を false にして他の項目を空にしてください。
「本文に書かれていても、入力が null なら写すだけ」が要の一文です。 iOS のレビューに「最新版にしたら落ちる」とあっても、利用者の言う「最新版」がどの版かは分かりません。 推測で版を入れると、開発はその版で再現を試して時間を使います。本文の言葉は reported_in_text に残し、版の欄とは分けます。
「同じ画面というだけで same にしない」も効きます。 書かないと、レシートの撮影についてのレビューを全部ひとつのチケットにまとめます。別の不具合が1つのチケットに混ざると、片方を直したときに閉じられてしまいます。
出力形式を固定する
Structured Output Parser で、次の形に決めます。 公式ページでは、JSON の例から生成するとすべての項目が必須として扱われ、JSON Schema で定義することもできるとされています。
{
"review_id": "",
"store": "app_store | google_play",
"is_bug": true,
"symptom": "",
"feature_id": "",
"action": null,
"app_version": null,
"device": null,
"os_version": null,
"reported_in_text": "",
"match": null,
"match_confidence": "same | similar | none"
}
1つ目の理由は、match_confidence で案の形を変えられることです。
match_confidence | 担当への案 |
|---|---|
same | 既存のチケットにコメントで追記する案 |
similar | 候補のチケットを示し、追記か新規かを担当に選ばせる案 |
none | 新しいチケットの案(要約・症状・画面・版・端末・レビューの本文) |
2つ目は、版と端末を API の値で上書きできることです。 ワークフローは、AIの出力の app_version・device・os_version を前処理でそろえた値で必ず上書きします。AIが指示に反して埋めても、チケットに入るのは API の値だけです。
3つ目は、チケットの書き方がそろうことです。 新規のチケットは、要約・症状・操作・画面・版・端末・ストア・星・レビューの日時の欄を毎回同じ順で埋めます。開発が再現の条件を聞き返す回数が減ります。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| App Store Connect | JWT ノード(Sign)+ HTTP Request | customerReviews の取得 |
| Google Play | HTTP Request(サービスアカウントの資格情報) | reviews の取得 |
| Anthropic のモデル | Anthropic Chat Model ノード | 仕分けと抜き出し |
| Slack | Slack ノードの Send and Wait for Response | 案の提示と、登録するかの選択 |
| Jira | Jira Software ノード | Issue の Create、Issue Comment の Add |
| Data Table | Data Table ノード | 取り込みの記録、開いているチケット、集計 |
Jira へは、Jira Software ノードで書き込みます。 公式ページでは、Issue に作成・取得・更新などの操作、Issue Comment にコメントの追加などの操作があります。新規のチケットは「レビュー起点」のラベルを付けて、開発の受付の状態で作ります。 優先順位の欄は空のままにし、開発が決めます。
担当への確認には、Slack の Send and Wait for Response を承認の形で使います。 公式ページでは、Slack の中で承認・却下でき、承認できる人を指定でき、誰が応じたかが出力に残るとされています。n8n が Slack から公開の HTTPS で届くこと、Interactivity の受け口の登録、資格情報の Signing Secret が要るとされています。
Google Play のサービスアカウントには、レビューの権限を付けます。 公式ページでは、サービスアカウントで使う場合はそのアカウントに「レビューへの返信」の権限を有効にするとされています。返信は投稿しない構成でも、この設定を済ませておきます。
人が確認する
サポートの担当が、Slack に届いた不具合の案を確かめます。
similarを先に見る … 候補のチケットを開き、症状と操作が同じかを見て、追記か新規かを選びますnoneの新規の案を見る … 要約と画面が合っているかを見ます。版が空の iOS のレビューは、空のまま登録しますsameの追記の案を流し見る … 追記の先が合っていれば登録します- Other と質問の一覧を見る … Other の行き先を決め、質問には管理画面から返信します
1番を先にするのは、ここが重複のチケットの出どころだからです。 似ているが言い切れないものを新規で登録すると、開発に重複が届きます。迷ったら追記にし、開発がチケットを分けます。 分けるより、まとめたものを探すほうが手間です。
目標は、900件をならして1件1分です。 不具合の案は1件2〜3分、その他は集計に入るだけで人は見ません。
例外に対処する
| 起きること | 対応 |
|---|---|
| App Store Connect が 401 を返す | トークンの期限と鍵を確かめる。期限は20分以内 |
| Google Play の読み取りが上限に達する | 次の回に回す。1時間に200回はアプリごとの上限 |
| n8n が1週間以上止まった | Android の欠けを Play Console の CSV で埋める |
| 同じレビューが編集されて戻る | 仕分けをやり直し、追記済みならチケットに編集を追記 |
| Text Classifier が Other に出す | 担当の一覧へ。Other の多い言い回しを区分の説明に足す |
| 出力が決めた形に合わない | 1回だけやり直し、だめなら案を作らず担当の一覧へ |
| 既存のチケットが閉じられていた | 照合の一覧から外す。同じ症状が戻ったら新規の案にする |
| 担当が決めた時間までに選ばない | 登録せずに残し、翌朝の案と一緒に再通知する |
| 更新の直後に不具合の案が急増する | 1件ずつではなく、症状ごとにまとめて担当に送る |
最後の行は、組む前に決めておいてください。 不具合の入った版を出した翌朝は、同じ症状の案が数十件届きます。1件ずつ承認を求めると、担当は中身を見ずに押し始めます。 症状が同じものを1つの案にまとめ、件数を添えて送ります。
記録を残す
- 取り込んだレビューID、ストア、最終更新の日時、伏せ字にしたか
- 仕分けの結果(区分、Other に出たか)
- 不具合の抜き出しの結果と、照合した既存チケット、
match_confidence - 担当の選択(登録する/しない、追記か新規か)と、応じた人と時刻
- 作ったチケットのキーと、追記したコメント
- 区分ごと・画面ごとの日々の件数
最後の行で、新しい版を出した翌日から画面ごとの不具合の件数を毎朝見られます。
04実装レベルの3段階
最小構成では、取り込みの手間が残ります。 2つの管理画面から写す手間は今と変わりません。確かめるための段階です。 半自動化で、1件4分が2分程度になります。 読む①と記入の②は無くなりますが、不具合の③が残ります。本格構成で1分になり、この段階が本記事の想定です。 差が出るのは、既存チケットを探して起票する作業が、案を確かめるだけになるからです。 段階を飛ばさないでください。 半自動化を1か月回して区分の説明を直してから起票を足すほうが、開発に届く外れが減ります。
05工数削減シミュレーション
導入後 900件 × 1分 ÷ 60 = 15 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- iOS と Android の両方で一般向けのアプリを出し、月に数百件を超える文章付きのレビューが付く企業。サポートの担当が両ストアの管理画面を毎日開いて読み、不具合らしいものを開発に手で伝えている場合。不具合の報告がレビューにだけ書かれ、問い合わせ窓口には届かないことが多い場合。開発のチケットを Jira で管理している場合。
- レビューが月に数十件で、担当が全件を読んでも負担にならない場合。社内向けの配布でストアのレビューが付かないアプリ。レビューへの返信を自動で投稿したい場合(この構成は返信を投稿しない)。なお、不具合の重大度や修正の優先順位を決める判断はこの構成では代替できません。
07最小構成で試す方法
- 先月のレビューから100件を選ぶ(当時起票したもの、追記したもの、要望・質問・その他を混ぜる)
- 4つの区分の説明を書く
- 手元の生成AIの画面に区分の説明と10件ずつのレビューを貼り、「4つの区分のどれかを選び、決められないものは『不明』としてください」と指示する
- 当時の仕分けと突き合わせる
- 不具合と出たものについて、当時のチケットの一覧を貼り、同じ不具合のチケットを選ばせる
100件は必ずやってください。 ワークフローを組む前に、「区分の説明だけで仕分けが当たるのか」と、既存のチケットとの照合が当たるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の仕分けとほぼ同じ | n8n で組む段に進む |
| 要望が不具合に入る | 区分の説明を書き直す。構成は有効 |
| 照合が同じ画面のチケットばかり選ぶ | 指示の「同じ画面というだけで同じにしない」を強める |
2行目はほぼ必ず出ます。 「〜できない」は、不具合とも要望とも読めるからです。仕様の範囲の話かどうかを、区分の説明に例で書いてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| iOS のチケットに推測の版が入る | API に版は無い。 AIの出力を API の値で上書きする |
| Android のレビューを取りこぼす | API は直近1週間だけ。毎日取り、止まったら CSV で埋める |
| どれにも当たらないレビューが消える | Text Classifier の既定は「捨てる」。Other の出力に変える |
| 要望が不具合に入る | 区分の説明に、仕様の範囲の例を書く |
| 同じ不具合が別のチケットになる | 開いているチケットと照合し、迷ったら追記にする |
| 別の不具合が1つのチケットに混ざる | 同じ画面というだけで同じにしない |
| App Store Connect が 401 を返す | トークンの期限を20分以内にし、呼ぶたびに作る |
| 朝に動かない | ワークフローの時間帯を Asia/Tokyo にする |
| チケットに連絡先が載る | 取り込みの直後に伏せ、投稿者名を写さない |
| 更新の翌朝に承認が数十件届く | 症状ごとにまとめて送る |
| 返信を自動で投稿したくなる | 返信は公開される。 担当が書く |
上の3行が、この構成でいちばん起きやすい失敗です。 どれもストアの API と n8n のノードの仕様から来ていて、黙って起きます。 推測の版も、取りこぼしも、消えたレビューも、エラーにはなりません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: ストアに公開されたレビューの本文、投稿者名、端末の情報、開発のチケットの要約です。レビューは公開されていますが、本文に連絡先や会員番号が書かれていることがあります。
- 個人の情報をチケットに流さない … 取り込みの直後に連絡先らしい文字列を伏せ、投稿者名はチケットに写しません
- 返信を自動で投稿しない … Google Play の公式ページは、返信はストアに公開されるので機微な情報を書かないこと、自動の返信を勧めないことを示しています
- チケットは人が確かめてから登録する … 開発に届くチケットは、すべて担当の承認を経ます
- 18歳未満の利用者を前提にする … 家計簿のアプリは学生も使います。18歳未満の利用を規約で制限している生成AIのサービスは使いません
- API の鍵を絞る … App Store Connect の鍵と Google Play のサービスアカウントは、レビューの取得に要る権限だけを持たせ、資格情報として n8n に保管します
誤りが起きた場合のリスクは、不具合をその他に落として開発に届かないことと、推測の情報でチケットを汚すことの2つです。 前者は「迷ったら不具合」の順と Other の確認で、後者はAPI の値での上書きと担当の承認で防ぎます。
10まず何から始めるか
1週目:区分の説明と画面の一覧を作る
4つの区分の説明を、仕様の範囲の話か不具合かの例を添えて書きます。あわせて、社内の画面・機能の一覧(ID と名前)を作ります。
2週目:100件で試す
先月のレビューから100件を選び、手元の生成AIの画面で仕分けと既存チケットとの照合をさせて、当時の判断と突き合わせます。要望が不具合に入っていないかを最優先で見ます。
3週目:両ストアの鍵を用意する
App Store Connect の API の鍵と、Google Play のサービスアカウントを用意します。レビューの取得に要る権限だけを付けます。
4週目:取り込みと仕分けをつなぐ
n8n で両ストアから毎朝取り込み、仕分けの結果を集計と Slack に送るところまで作ります。この時点では Jira に登録しません。
2か月目: 不具合の抜き出しと既存チケットとの照合、Slack での承認、Jira への登録を足します。3か月目以降: 区分ごと・画面ごとの件数を見て区分の説明を直し、1件4分が何分になったかを実測します。更新の翌朝に、同じ症状の件数を添えたチケットが開発に届くようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
取れるのは直近1週間に作成・更新された文章付きのレビューで本番の版だけであること、1ページ既定10件・最大100件、nextPageToken、読み取りはアプリごとに1時間200回、端末などは一部の結果にだけ現れること、translationLanguage と originalText、返信は公開され自動の返信を勧めないこと、サービスアカウントにレビューの権限を付けること | Google for Developers: Reply to Reviews | 2026-10-14 |
customerReviews の項目(rating・title・body・reviewerNickname・createdDate・territory など)、sort の -createdDate、limit の上限200、filter[rating]、exists[publishedResponse] | Apple Developer: List all customer reviews for an app | 2026-10-14 |
JWT を ES256 で署名し、aud が appstoreconnect-v1、有効期限が20分より先のトークンは(一部を除き)無効であること | Apple Developer: Generating tokens for API requests | 2026-10-14 |
| ワークフローに時間帯が無ければインスタンスの時間帯に従い、自前の既定が America/New York であること | n8n Docs: Schedule Trigger | 2026-10-14 |
| JWT の資格情報が PEM の鍵と ES256 に対応すること | n8n Docs: JWT credentials | 2026-10-14 |
| サービスアカウントの資格情報を HTTP Request で使う設定と、スコープの指定 | n8n Docs: Google Service Account | 2026-10-14 |
| 区分ごとに名前と説明を持たせ、既定は1件1区分、当たらないときは既定で捨て、Other の出力に分ける設定があること | n8n Docs: Text Classifier | 2026-10-14 |
| Basic LLM Chain がプロンプトを決め、出力の形を求めるときにパーサーをつなぐこと | n8n Docs: Basic LLM Chain | 2026-10-14 |
| JSON の例から生成するとすべての項目が必須になること | n8n Docs: Structured Output Parser | 2026-10-14 |
| Jira Software ノードに Issue の作成・更新、Issue Comment の追加などの操作があること | n8n Docs: Jira Software | 2026-10-14 |
| Slack の中で承認・却下でき、承認できる人を指定でき、誰が応じたかが残ること。公開の HTTPS、Interactivity、Signing Secret が要ること | n8n Docs: Approvals in Slack | 2026-10-14 |
| Data Table ノードの行の操作に Insert・Upsert・Get などがあること | n8n Docs: Data table | 2026-10-14 |
レビューへの返信の方針と、不具合の優先順位の決め方は、自社のサポートと開発で決めてください。 本記事は両ストアの API と n8n の公開ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1551)についてのご相談はこちらから。
