Media > AI活用ユースケース > カスタマーサポート > 自社アプリの App Store と Google Play のレビューを毎朝集めて不具合・要望・質問に分け、不具合は既存のチケットと照らして開発の Jira に起票する

自社アプリの App Store と Google Play のレビューを毎朝集めて不具合・要望・質問に分け、不具合は既存のチケットと照らして開発の Jira に起票する

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

App Store と Google Play に付いたレビューを毎朝 API で集め、不具合の報告・機能の要望・使い方の質問・その他に分けます。不具合は症状と端末の情報を抜き出し、既存のチケットへの追記か新規の起票かを決めて、担当が確かめてから Jira に登録します。

サマリー
生成AI
ChatGPT/Claude
連携・自動化
Make/n8n/Zapier
対象業界
EC/IT・SaaS/小売/金融
対象部門
カスタマーサポート
対象業務
分類・仕分け/問い合わせ対応
主な課題
人手が足りない/情報が見つからない/期限・対応漏れが起きる
AIで行う処理
分類
主な効果
対応スピード向上/工数削減/機会損失防止
導入難易度
★★★☆☆
実装レベル
本格構成
費用感
ノーコード連携(中)
人間の確認
条件付き
現在工数
60h/月
AI導入後
15h/月
想定削減
75%
年間削減
540h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. App Store Connect と Google Play Console を開き、前日からの新しいレビューを読む
  2. 不具合・要望・質問・その他に分け、集計表に1行ずつ書く
  3. 不具合なら、Jira で似たチケットを探す
  4. 似たチケットがあれば、レビューの内容をコメントで追記する。無ければ新しく起票する
  5. 起票するときは、症状・画面・版・端末をレビューから拾って書く
  6. 質問には、担当が管理画面から返信を書く
  7. 月に一度、要望を集計表から数えてプロダクトの担当に渡す
導入後(After)
  1. 自動毎朝8時に n8n が動き、両ストアの API から前回以降のレビューを取る
  2. 自動レビューIDで重複を外し、編集されたレビューを見分ける
  3. 自動本文から電話番号・メールアドレスらしい文字列を伏せる
  4. 自動Text Classifier が、不具合・要望・質問・その他の4つに分ける。決められないものは「Other」に出る
  5. 自動不具合は、症状・画面・操作・端末の情報を抜き出し、開いているレビュー起点のチケットと同じ不具合かを判定する
  6. 自動「追記」か「新規の起票」かの案を、担当に Slack で送る
  7. 人担当が案を確かめ、「登録する」か「登録しない」を選ぶ
  8. 自動「登録する」なら、Jira にコメントを追記するか、新しいチケットを作る
  9. 自動要望・質問・その他・Other を集計表に書き、質問と Other は担当の一覧に載せる
  10. 人担当が質問に管理画面から返信し、Other の行き先を決める
各工程の詳しい説明を読む
  1. App Store Connect と Google Play Console を開き、前日からの新しいレビューを読む
  2. 不具合・要望・質問・その他に分け、集計表に1行ずつ書く
  3. 不具合なら、Jira で似たチケットを探す
  4. 似たチケットがあれば、レビューの内容をコメントで追記する。無ければ新しく起票する
  5. 起票するときは、症状・画面・版・端末をレビューから拾って書く
  6. 質問には、担当が管理画面から返信を書く
  7. 月に一度、要望を集計表から数えてプロダクトの担当に渡す

(a)2つの管理画面を毎日読むのに手がかかる。 更新の直後の週は1日に数十件になり、読むのが翌日に回って、不具合の報告が開発に届くのが遅れます。

(b)同じ不具合が別々のチケットになる。 「起動すると落ちる」「開いたらすぐ閉じる」「アプリが消える」。同じ症状を利用者は違う言葉で書くので、Jira の検索で見つからず、新しいチケットが立ちます。 開発は重複を見つけて閉じる作業に時間を使います。

(c)起票の質が担当によって違う。 版や端末を書く担当と書かない担当がいて、開発は再現の条件を聞き返します。 iOS のレビューにはもともと版が書かれていないので、担当が推測で書いてしまうこともあります。

(d)要望が数えられていない。 集計表への記入は忙しい日に省かれ、月に一度渡す要望の数が実際より少なく出ます。

  1. 【自動】 毎朝8時に n8n が動き、両ストアの API から前回以降のレビューを取る
  2. 【自動】 レビューIDで重複を外し、編集されたレビューを見分ける
  3. 【自動】 本文から電話番号・メールアドレスらしい文字列を伏せる
  4. 【自動】 Text Classifier が、不具合・要望・質問・その他の4つに分ける。決められないものは「Other」に出る
  5. 【自動】 不具合は、症状・画面・操作・端末の情報を抜き出し、開いているレビュー起点のチケットと同じ不具合かを判定する
  6. 【自動】 「追記」か「新規の起票」かの案を、担当に Slack で送る
  7. 【人】 担当が案を確かめ、「登録する」か「登録しない」を選ぶ
  8. 【自動】 「登録する」なら、Jira にコメントを追記するか、新しいチケットを作る
  9. 【自動】 要望・質問・その他・Other を集計表に書き、質問と Other は担当の一覧に載せる
  10. 【人】 担当が質問に管理画面から返信し、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 ──▶ 担当の一覧へ
役割想定する製品代替候補
ワークフローn8nMake、Zapier
生成AIClaude(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どうやって実装するのか

Step1

処理の起点を決める

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 には複数の時刻を設定できます。

Step2

入力データを集める

データ中身取得元
iOS のレビュー星、題名、本文、投稿者名、作成日時、国App Store Connect API
Android のレビュー星、本文(題名はタブ区切りで本文に含む)、投稿者名、最終更新の日時、言語、版、端末、OS の版Google Play Developer API
取り込みの記録レビューID、ストア、最終更新の日時、仕分けの結果Data Table
開いているチケットレビュー起点のチケットのキー、要約、症状、画面、版Data Table(起票のたびに書き足す)
仕分けの説明4種類それぞれの意味と、迷ったときの優先順位Text Classifier の設定

質を決めるのは、いちばん下の「仕分けの説明」です。 Text Classifier の公式ページは、区分ごとに名前と説明を書き、意味が明らかでないときは説明が精度を左右するとしています。「不具合」とだけ書くと、「この機能が無いのは不具合だ」という要望が不具合に入ります。

Android のレビューの版と端末は、付かないこともあります。 公式ページでは、端末などの情報は一部の結果にだけ現れるとされ、投稿者名もまれに欠けるとされています。欠けた項目は空のまま扱い、AIに補わせません。

Step3

データの取得方法を決める

取るものどこから何に使うか
iOS のレビューGET /v1/apps/{id}/customerReviews仕分けと抜き出し
Android のレビューGoogle Play Developer API の reviews仕分けと抜き出し
取り込み済みのIDData 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 では最終更新の日時が変わります。編集されたレビューは仕分けをやり直し、既にチケットに追記していれば、そのチケットに「レビューが編集された」と追記します。

Step4

AIへ渡す前に整形する

  1. 形をそろえる … 両ストアのレビューを、ストア・レビューID・星・本文・日時・国または言語・版・端末の共通の形にします。iOS の版と端末は null にします
  2. 重複の除外 … Data Table と照らし、取り込み済みで更新の無いものを外します
  3. 伏せ字 … 電話番号・メールアドレス・会員番号らしい文字列を [MASKED] に置き換えます
  4. 言語の確認 … 日本語以外のレビューは、仕分けの前に印を付けます。Android は API の翻訳の指定で日本語訳を取れます
  5. 短すぎるもの … 「最高」「ダメ」のような数文字のものは、AIに渡さず「その他」にします

3番目は、Jira に個人の情報を流さないためです。 利用者は「サポートに連絡したのに返事が無い、[email protected]」のように連絡先を書くことがあります。チケットは社内の多くの人が読むので、ここで伏せます。 投稿者名もチケットには写しません。

4番目の翻訳は、Android だけの機能です。 公式ページでは、translationLanguage を付けると本文を訳して返し、原文は originalText に入るとされています。iOS の外国語のレビューは、原文のまま渡します。

Step5

AIに処理させる

まず Text Classifier に、4つの区分のどれかを選ばせます。 公式ページでは、区分ごとに名前と説明を持たせ、既定では1件に1つの区分を選び、どれにも当たらないときに「Other」の出力に分ける設定があるとされています。既定の動作は「捨てる」なので、必ず Other に出す設定に変えます。

区分説明に書くこと
不具合の報告アプリが意図どおりに動かない。落ちる、固まる、表示が崩れる、データが消える、同期しない、ログインできない
機能の要望今は無い機能や、今の動きを変えてほしいという希望。「〜できない」が仕様の範囲の話なら要望
使い方の質問やり方が分からない、どこにあるか分からない、という問い
その他全体の感想、評価、料金への意見など、上の3つに当たらないもの

説明の最後に、迷ったときの順を書きます。 不具合の報告を含むなら、要望や感想が混ざっていても不具合を選ぶ、と書きます。不具合を他の区分に落とすと、開発に届きません。

次に、不具合のレビューだけを Basic LLM Chain に渡し、中身を抜き出させます。

させること中身
症状の要約何が起きたかを1文で。利用者の言葉を残す
画面・機能レシートの撮影、口座の連携、グラフ、ログインなど、社内の画面一覧のどれか
操作書かれていれば、何をしたときに起きたか
既存チケットとの照合開いているチケットの一覧から、同じ不具合と言えるものを1つ選ぶか、無いとする
確からしさ同じ不具合と言い切れるか、似ているが分からないか
させないこと理由
版・端末・OS の補完API が返した値だけを使う。iOS は空のまま
重大度・優先順位の決定開発とプロダクトの担当が決める
原因の推測レビューから原因は分からない
返信の文面返信は担当が書く
Step6

指示内容を固定する

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つのチケットに混ざると、片方を直したときに閉じられてしまいます。

Step7

出力形式を固定する

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つ目は、チケットの書き方がそろうことです。 新規のチケットは、要約・症状・操作・画面・版・端末・ストア・星・レビューの日時の欄を毎回同じ順で埋めます。開発が再現の条件を聞き返す回数が減ります。

Step8

システムへ連携する

つなぎ先方式内容
App Store ConnectJWT ノード(Sign)+ HTTP RequestcustomerReviews の取得
Google PlayHTTP Request(サービスアカウントの資格情報)reviews の取得
Anthropic のモデルAnthropic Chat Model ノード仕分けと抜き出し
SlackSlack ノードの Send and Wait for Response案の提示と、登録するかの選択
JiraJira Software ノードIssue の Create、Issue Comment の Add
Data TableData Table ノード取り込みの記録、開いているチケット、集計

Jira へは、Jira Software ノードで書き込みます。 公式ページでは、Issue に作成・取得・更新などの操作、Issue Comment にコメントの追加などの操作があります。新規のチケットは「レビュー起点」のラベルを付けて、開発の受付の状態で作ります。 優先順位の欄は空のままにし、開発が決めます。

担当への確認には、Slack の Send and Wait for Response を承認の形で使います。 公式ページでは、Slack の中で承認・却下でき、承認できる人を指定でき、誰が応じたかが出力に残るとされています。n8n が Slack から公開の HTTPS で届くこと、Interactivity の受け口の登録、資格情報の Signing Secret が要るとされています。

Google Play のサービスアカウントには、レビューの権限を付けます。 公式ページでは、サービスアカウントで使う場合はそのアカウントに「レビューへの返信」の権限を有効にするとされています。返信は投稿しない構成でも、この設定を済ませておきます。

Step9

人が確認する

サポートの担当が、Slack に届いた不具合の案を確かめます。

  1. similar を先に見る … 候補のチケットを開き、症状と操作が同じかを見て、追記か新規かを選びます
  2. none の新規の案を見る … 要約と画面が合っているかを見ます。版が空の iOS のレビューは、空のまま登録します
  3. same の追記の案を流し見る … 追記の先が合っていれば登録します
  4. Other と質問の一覧を見る … Other の行き先を決め、質問には管理画面から返信します

1番を先にするのは、ここが重複のチケットの出どころだからです。 似ているが言い切れないものを新規で登録すると、開発に重複が届きます。迷ったら追記にし、開発がチケットを分けます。 分けるより、まとめたものを探すほうが手間です。

目標は、900件をならして1件1分です。 不具合の案は1件2〜3分、その他は集計に入るだけで人は見ません。

Step10

例外に対処する

起きること対応
App Store Connect が 401 を返すトークンの期限と鍵を確かめる。期限は20分以内
Google Play の読み取りが上限に達する次の回に回す。1時間に200回はアプリごとの上限
n8n が1週間以上止まったAndroid の欠けを Play Console の CSV で埋める
同じレビューが編集されて戻る仕分けをやり直し、追記済みならチケットに編集を追記
Text Classifier が Other に出す担当の一覧へ。Other の多い言い回しを区分の説明に足す
出力が決めた形に合わない1回だけやり直し、だめなら案を作らず担当の一覧へ
既存のチケットが閉じられていた照合の一覧から外す。同じ症状が戻ったら新規の案にする
担当が決めた時間までに選ばない登録せずに残し、翌朝の案と一緒に再通知する
更新の直後に不具合の案が急増する1件ずつではなく、症状ごとにまとめて担当に送る

最後の行は、組む前に決めておいてください。 不具合の入った版を出した翌朝は、同じ症状の案が数十件届きます。1件ずつ承認を求めると、担当は中身を見ずに押し始めます。 症状が同じものを1つの案にまとめ、件数を添えて送ります。

Step11

記録を残す

  • 取り込んだレビューID、ストア、最終更新の日時、伏せ字にしたか
  • 仕分けの結果(区分、Other に出たか)
  • 不具合の抜き出しの結果と、照合した既存チケット、match_confidence
  • 担当の選択(登録する/しない、追記か新規か)と、応じた人と時刻
  • 作ったチケットのキーと、追記したコメント
  • 区分ごと・画面ごとの日々の件数

最後の行で、新しい版を出した翌日から画面ごとの不具合の件数を毎朝見られます。

04実装レベルの3段階

最小構成:レビューを手で生成AIの画面に貼り、仕分けさせる / 仕分け
半自動化:上記+n8n で両ストアから毎朝取り込み、仕分けの結果を集計表と Slack に送る / 取り込みと仕分け
本格構成:上記+不具合の抜き出し、既存チケットとの照合、承認、Jira への登録 / 仕分けから起票まで

最小構成では、取り込みの手間が残ります。 2つの管理画面から写す手間は今と変わりません。確かめるための段階です。 半自動化で、1件4分が2分程度になります。 読む①と記入の②は無くなりますが、不具合の③が残ります。本格構成で1分になり、この段階が本記事の想定です。 差が出るのは、既存チケットを探して起票する作業が、案を確かめるだけになるからです。 段階を飛ばさないでください。 半自動化を1か月回して区分の説明を直してから起票を足すほうが、開発に届く外れが減ります。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
3 名
月間件数
900 件
1件あたり現在時間
4 分
1件あたり導入後時間
1 分
現在  900件 × 4分 ÷ 60 = 60 時間/月
導入後 900件 × 1分 ÷ 60 = 15 時間/月
月間削減時間
45h
削減率
75%
年間削減時間
540h
年間金額換算(時間単価3,500円)
189万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. iOS と Android の両方で一般向けのアプリを出し、月に数百件を超える文章付きのレビューが付く企業。サポートの担当が両ストアの管理画面を毎日開いて読み、不具合らしいものを開発に手で伝えている場合。不具合の報告がレビューにだけ書かれ、問い合わせ窓口には届かないことが多い場合。開発のチケットを Jira で管理している場合。
向いていない
  1. レビューが月に数十件で、担当が全件を読んでも負担にならない場合。社内向けの配布でストアのレビューが付かないアプリ。レビューへの返信を自動で投稿したい場合(この構成は返信を投稿しない)。なお、不具合の重大度や修正の優先順位を決める判断はこの構成では代替できません。

07最小構成で試す方法

  1. 先月のレビューから100件を選ぶ(当時起票したもの、追記したもの、要望・質問・その他を混ぜる)
  2. 4つの区分の説明を書く
  3. 手元の生成AIの画面に区分の説明と10件ずつのレビューを貼り、「4つの区分のどれかを選び、決められないものは『不明』としてください」と指示する
  4. 当時の仕分けと突き合わせる
  5. 不具合と出たものについて、当時のチケットの一覧を貼り、同じ不具合のチケットを選ばせる

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ガバナンス上の注意点

この構成で扱うデータ: ストアに公開されたレビューの本文、投稿者名、端末の情報、開発のチケットの要約です。レビューは公開されていますが、本文に連絡先や会員番号が書かれていることがあります。

  1. 個人の情報をチケットに流さない … 取り込みの直後に連絡先らしい文字列を伏せ、投稿者名はチケットに写しません
  2. 返信を自動で投稿しない … Google Play の公式ページは、返信はストアに公開されるので機微な情報を書かないこと、自動の返信を勧めないことを示しています
  3. チケットは人が確かめてから登録する … 開発に届くチケットは、すべて担当の承認を経ます
  4. 18歳未満の利用者を前提にする … 家計簿のアプリは学生も使います。18歳未満の利用を規約で制限している生成AIのサービスは使いません
  5. 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技術仕様の確認日・参考情報

技術仕様確認日:2026-10-14/最終更新:2026-10-15
確認した内容情報源確認日
取れるのは直近1週間に作成・更新された文章付きのレビューで本番の版だけであること、1ページ既定10件・最大100件、nextPageToken、読み取りはアプリごとに1時間200回、端末などは一部の結果にだけ現れること、translationLanguage と originalText、返信は公開され自動の返信を勧めないこと、サービスアカウントにレビューの権限を付けることGoogle for Developers: Reply to Reviews2026-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 app2026-10-14
JWT を ES256 で署名し、aud が appstoreconnect-v1、有効期限が20分より先のトークンは(一部を除き)無効であることApple Developer: Generating tokens for API requests2026-10-14
ワークフローに時間帯が無ければインスタンスの時間帯に従い、自前の既定が America/New York であることn8n Docs: Schedule Trigger2026-10-14
JWT の資格情報が PEM の鍵と ES256 に対応することn8n Docs: JWT credentials2026-10-14
サービスアカウントの資格情報を HTTP Request で使う設定と、スコープの指定n8n Docs: Google Service Account2026-10-14
区分ごとに名前と説明を持たせ、既定は1件1区分、当たらないときは既定で捨て、Other の出力に分ける設定があることn8n Docs: Text Classifier2026-10-14
Basic LLM Chain がプロンプトを決め、出力の形を求めるときにパーサーをつなぐことn8n Docs: Basic LLM Chain2026-10-14
JSON の例から生成するとすべての項目が必須になることn8n Docs: Structured Output Parser2026-10-14
Jira Software ノードに Issue の作成・更新、Issue Comment の追加などの操作があることn8n Docs: Jira Software2026-10-14
Slack の中で承認・却下でき、承認できる人を指定でき、誰が応じたかが残ること。公開の HTTPS、Interactivity、Signing Secret が要ることn8n Docs: Approvals in Slack2026-10-14
Data Table ノードの行の操作に Insert・Upsert・Get などがあることn8n Docs: Data table2026-10-14

レビューへの返信の方針と、不具合の優先順位の決め方は、自社のサポートと開発で決めてください。 本記事は両ストアの API と n8n の公開ページで確認できた範囲だけを扱っています。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-1551)についてのご相談はこちらから。

AI活用について相談する
目次