キーワード設定数の上限拡張(店舗別設定対応)
概要
| 項目 | 内容 |
|---|---|
| ステータス | 🔵 提案中 |
| Issue | - |
| 担当 | - |
1ロケーションあたりのキーワード登録上限を 店舗ごと/契約ごとに可変 にし、システム全体のハードリミットを 15件 に拡張する。PlacesAPI 連携とキーワード追加課金のビジネス検討を踏まえた設計。
提案内容
背景・課題
- 現状のキーワード件数上限は 8 件(DB 制約は無いが、UI / Export / JSON 構造が 8 件前提)
- 顧客から 10 件以上のキーワード追跡 の要望が増加
- キーワード追加課金の検討:「1 件追加で月額◯◯円」のようなオプション課金にしたいビジネス意向
- 採用率は店舗ごとに変動見込み:全店舗が一律に増件するわけではない
- スクレイピング処理は約 33 店舗、PlacesAPI 連携は約 1,921 店舗で稼働中
→ 必要なのは「店舗ごと/契約ごとに上限可変」+「システム全体のハードリミット = 15」
提案するソリューション
主な特徴:
- システム全体のハードリミット = 15 件、最小 = 8 件(既存契約据え置き)
- 店舗単位 or 契約単位どちらでも追加課金できるデータモデル(後から販売粒度を変えても DB を直さなくて済む)
- PlacesAPI / スクレイピング / Laravel エクスポートの JSON 構造を 15 件枠で統一
- 管理画面に店舗別上限設定 UI を新設、ActivityLog で課金根拠の監査ログを残す
- 課金プラットフォーム連携は本案件範囲外(手動設定でリリース → 連携は後続案件)
機能一覧
| # | 機能名 | 説明 | 優先度 |
|---|---|---|---|
| 1 | 上限設定テーブル新設 | 店舗/契約単位で max_keywords を保持(fallback ロジック付き) | 高 |
| 2 | 管理者UI(営業/CS向け) | 店舗別キーワード上限設定 + ActivityLog 連携 | 高 |
| 3 | 顧客UI改修 | 上限を API から取得し、可変入力欄を動的生成 | 高 |
| 4 | バックエンドバリデーション | FormRequest で店舗別上限と照合 | 高 |
| 5 | PlacesAPI export_data 改修 | [:8] 切り捨てを 15 件枠に拡張 | 高 |
| 6 | スクレイピング側改修 | fill_export_data / error array / slice の 3 箇所 | 高 |
| 7 | CSV 仕様統一 | 「以前のキーワード9〜N」分岐の整理 | 中 |
| 8 | ランキング表示改修 | チャート・テーブル等の可変対応 | 中 |
| 9 | PlacesAPI レート確認 | 現3キー構成(QPM 1800)で 15件化を吸収可能 | 確認のみ |
画面モック
キーワード管理
登録キーワード8 / 8件
1MEO対策
2美容室 渋谷
3ヘアサロン
4カット 安い
5縮毛矯正
6トリートメント
7ヘッドスパ
8カラー 渋谷
上限に達しています。上限撤廃モードを有効にしてください。
変更内容
| 項目 | 現行 | 変更後 |
|---|---|---|
| キーワード上限 | 8件 | 無制限(推奨10件以上) |
| スクレイピング | 8件固定 | 登録数に応じて動的 |
| 表示 | 固定レイアウト | スクロール対応 |
※ 管理者向けの店舗別上限設定画面のモックは別途追加予定。
設計検討事項
データモデル
契約/店舗どちらの単位でも課金できるよう、上限値を持つテーブルを新設:
mappy_keyword_limit_settings
├─ id BIGINT PK
├─ scope_type ENUM('contract','location') -- 適用範囲
├─ scope_id BIGINT -- user_id or gbp_location_id
├─ system_id BIGINT
├─ max_keywords TINYINT UNSIGNED (8〜15)
├─ effective_from DATE
├─ effective_to DATE NULLABLE
├─ memo VARCHAR(255) -- 営業メモ
└─ created_at / updated_at判定ロジック:location 設定 → contract 設定 → デフォルト 8 のフォールバック。
PlacesAPI 側の影響
- 1ロケーションあたり 8→15 件で API 呼び出し +87%
- 現在の 3 GCP プロジェクトキー構成(QPM 1800 容量)で 必要 QPM 940 → 余裕あり(プロジェクト増設不要)
- 利用料は Basic SKU で 無料
- 所要時間:200秒 → ~375秒(夜間バッチで吸収可能)
スクレイピング側の影響
- 残存 ~33 店舗のみ → 全件 15 件化でも所要時間 +39 分
- ハードコード修正は 3 箇所のみ(utils/search_ranking_process_aws.py)
課金システム連携の方針
mappy は外部プラットフォーム(KUCHIKOMIONE / G-COR / pipit)からの支払い通知を受け取る構造で、課金エンジンは持たない。本案件は 「管理画面で手動設定可能」までを範囲とし、課金プラットフォーム側の商品マスタ追加・通知 payload 拡張は別建ての後続案件とする。
概算工数(AI前提)
体制
| 役割 | 人数 | 担当内容 |
|---|---|---|
| 設計者 | 1名 | 要件確認 → AIに設計書作成指示 → レビュー → 製造へ指示 |
| 製造者 | 1名 | ISSUEを元にAIに作成指示 → コードレビュー → テスト実施 → デプロイ |
工数内訳
| # | 作業項目 | AIリテイク | レビュー | 工数(人日) | 担当 |
|---|---|---|---|---|---|
| 1 | 要件確認・設計書作成 | 2回 | 0.5日/回 | 1.0 | 設計者 |
| 2 | DB・API設計(上限テーブル含む) | 2回 | 0.5日/回 | 1.0 | 設計者 |
| 3 | 上限テーブル新設・migration | 1回 | 0.5日/回 | 0.5 | 製造者 |
| 4 | 管理者UI(店舗別上限設定) | 3回 | 0.5日/回 | 2.0 | 製造者 |
| 5 | 顧客UI改修(API取得化・可変入力欄) | 2回 | 0.5日/回 | 1.0 | 製造者 |
| 6 | バリデーション・モデル改修 | 1回 | 0.5日/回 | 0.5 | 製造者 |
| 7 | PlacesAPI export_data 改修 | 1回 | 0.5日/回 | 0.5 | 製造者 |
| 8 | スクレイピング側改修 | 1回 | 0.5日/回 | 0.5 | 製造者 |
| 9 | CSV ラベル統一 + 出力テスト | 2回 | 0.5日/回 | 1.0 | 製造者 |
| 10 | ランキング表示改修 | 2回 | 0.5日/回 | 1.0 | 製造者 |
| 11 | 結合テスト | 2回 | 0.5日/回 | 1.5 | 製造者 |
| 12 | デプロイ・動作確認 | 1回 | 0.5日/回 | 0.5 | 製造者 |
| 合計 | 11.0 |
前提条件・制約
- ハードリミット = 15、最小 = 8(既存契約据え置き)
- 課金プラットフォーム連携は本案件範囲外(手動設定でリリース、連携は後続案件で対応)
- PlacesAPI 既存 3 キー構成で 15件化のリクエスト増を吸収(追加プロジェクト不要)
- CSV「以前のキーワード9〜N」ラベルの真意は要確認(typo 説 / 履歴用途説)
スケジュール
| タスク | 担当 | 日数 | 5/25 | 5/26 | 5/27 | 5/28 | 5/29 | 5/30 | 5/31 | 6/1 | 6/2 | 6/3 | 6/4 | 6/5 | 6/6 | 6/7 | 6/8 | 6/9 | 6/10 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 月 | 火 | 水 | 木 | 金 | 土 | 日 | 月 | 火 | 水 | 木 | 金 | 土 | 日 | 月 | 火 | 水 | |||
| 要件確認・設計書作成 | 設計者 | 1d | |||||||||||||||||
| DB・API設計 | 設計者 | 1d | |||||||||||||||||
| 上限テーブル新設 | 製造者 | 1d | |||||||||||||||||
| 設計レビュー・製造指示 | 設計者 | 1d | |||||||||||||||||
| 管理者UI | 製造者 | 2d | |||||||||||||||||
| 顧客UI改修 | 製造者 | 1d | |||||||||||||||||
| バリデーション・モデル改修 | 製造者 | 1d | |||||||||||||||||
| PlacesAPI/スクレイピング改修 | 製造者 | 1d | |||||||||||||||||
| CSV・ランキング表示改修 | 製造者 | 2d | |||||||||||||||||
| 結合テスト | 製造者 | 2d | |||||||||||||||||
| デプロイ・動作確認 | 製造者 | 1d |