このページで持って帰れるもの
このページは、六本木で店舗を運営する事業者が Tufe Company に依頼しなくても、そのままコピペして自店の MEO 運用に組み込める実装パック として書きました。営業色のあるブロックは末尾の1セクションだけです。それ以外の本文は、来てくれた読者がこの1ページを閉じた後も使い続けられる資産であることを目指しています。
コピペで動く10資産
- 業態別 JSON-LD
LocalBusinessスキーマ — 飲食 / 美容 / 歯科 / 法律 / 税理士の5種 - hreflang + 多言語 GBP 属性テンプレ — 英日中3言語対応
- GBP 説明文 長文テンプレ — 業態別5本、六本木仕様
- 口コミ返信 30パターン — ★1-5 × 6シーン × 日英
- Google Apps Script — 口コミ自動通知(Slack / メール)
- n8n ワークフロー JSON — 口コミ→AI返信下書き→人間承認→投稿
- NAP 整合性チェック Bash + 正規表現 — 自社サイト/食べログ/Retty の表記ゆれ検出
- 5 KW × 3 地点 順位計測 CSV + Google Sheets 関数
- GBP 投稿カレンダー 12か月分 ICS — 六本木アートナイト・檜町公園の桜等を連動
- Places API 自店診断 curl + GBP 完全度スコア算出 Python スクリプト
すべて Tufe Company が自社 / 支援先で実運用しているコードです。プレースホルダー(◯◯ や YOUR_XXX)を自店情報に置換するだけで動きます。
六本木 MEO の市場環境(簡潔版)
六本木は港区の中でも飲食店密度・客単価帯・インバウンド比率が突出して高いエリアです。Google マップ(MEO)の検索順位は「今夜の接待先」「英語対応の歯科」のような即決クエリを直撃します。
最新のローカル検索行動データ
| 指標 | 2026年データ | 出典 |
|---|---|---|
| ローカルビジネスの口コミを「常に」読む消費者 | 41%(2025年の29%から急増) | BrightLocal Local Consumer Review Survey 2026(取得 2026-05) |
| 4.5★以上を要求する消費者 | 31%(2025年の17%から倍増) | 同上 |
| 口コミ20件未満の店舗を「検討しない」消費者 | 47% | 同上 |
| 3か月以内の新しい口コミを優先する消費者 | 74% | 同上 |
| 口コミ返信が1週間以内にされることを期待 | 81% | 同上 |
| AI ツールでローカルビジネスを調べる消費者 | 45%(2025年の6%から急増) | 同上 |
港区のローカル特性
- 港区の人口は約27万人(269,877人 / 令和8年1月1日現在)、外国人住民は約2.4万人(24,003人 / 令和8年4月末現在)で23区でも有数の外国人比率(※ 出典: 港区 各年1月1日現在の人口・世帯数 / 港区 国籍別外国人住民数(取得 2026-05))
- 訪日外国人数は過去最高水準を継続、六本木は東京観光の主要エリア(※ 出典: 日本政府観光局 JNTO 統計(取得 2026-05))
港区全体の MEO 戦略は港区 MEO対策ページ、市場分析の詳細はそちらに集約しています。本ページは六本木に的を絞って、実装コードを最優先で渡す構成にします。
資産 1: 業態別 JSON-LD LocalBusiness スキーマ(5種)
JSON-LD は GBP とは別に自社サイトに埋め込む構造化データで、Google が店舗情報を機械的に読み取るためのものです。GBP の情報と JSON-LD の情報が一致していると、検索結果の信用シグナルになります(※ 出典: Google 検索セントラル: Local Business 構造化データ(取得 2026-05))。
以下は六本木の主要業態 5種で、自店サイトの <head> または <body> 末尾に <script type="application/ld+json"> で貼り付け、プレースホルダー部分を差し替えれば動く完成形です。すべて Google Rich Results Test で構文検証済みです。
1-1. Restaurant(六本木 高級和食・接待業態)
{
"@context": "https://schema.org",
"@type": "Restaurant",
"@id": "https://yourstore.example/#restaurant",
"name": "◯◯(店舗名)",
"image": [
"https://yourstore.example/photo-exterior.jpg",
"https://yourstore.example/photo-private-room.jpg",
"https://yourstore.example/photo-course.jpg"
],
"url": "https://yourstore.example/",
"telephone": "+81-3-XXXX-XXXX",
"priceRange": "¥¥¥¥",
"servesCuisine": ["Japanese", "Kaiseki", "Sushi"],
"address": {
"@type": "PostalAddress",
"streetAddress": "六本木6-X-X ◯◯ビル X階",
"addressLocality": "港区",
"addressRegion": "東京都",
"postalCode": "106-0032",
"addressCountry": "JP"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 35.6627,
"longitude": 139.7314
},
"areaServed": [
{ "@type": "Place", "name": "六本木" },
{ "@type": "Place", "name": "麻布十番" },
{ "@type": "Place", "name": "西麻布" }
],
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],
"opens": "17:00",
"closes": "23:00"
}
],
"acceptsReservations": "True",
"menu": "https://yourstore.example/menu",
"hasMap": "https://www.google.com/maps/place/?q=place_id:YOUR_GOOGLE_PLACE_ID",
"sameAs": [
"https://tabelog.com/tokyo/A1307/A130703/XXXXXXXX/",
"https://www.instagram.com/yourstore/",
"https://goo.gl/maps/XXXX"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"reviewCount": "120"
}
}
1-2. HairSalon(六本木・表参道 美容室)
{
"@context": "https://schema.org",
"@type": "HairSalon",
"@id": "https://yoursalon.example/#salon",
"name": "◯◯(サロン名)",
"image": "https://yoursalon.example/photo.jpg",
"url": "https://yoursalon.example/",
"telephone": "+81-3-XXXX-XXXX",
"priceRange": "¥¥¥",
"address": {
"@type": "PostalAddress",
"streetAddress": "六本木7-X-X",
"addressLocality": "港区",
"addressRegion": "東京都",
"postalCode": "106-0032",
"addressCountry": "JP"
},
"geo": { "@type": "GeoCoordinates", "latitude": 35.6627, "longitude": 139.7314 },
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],
"opens": "10:00",
"closes": "20:00"
}],
"areaServed": [{ "@type": "Place", "name": "六本木" }, { "@type": "Place", "name": "表参道" }],
"knowsLanguage": ["ja", "en"],
"paymentAccepted": "Cash, Credit Card",
"sameAs": ["https://www.instagram.com/yoursalon/"]
}
1-3. Dentist(六本木 歯科・美容歯科)
{
"@context": "https://schema.org",
"@type": "Dentist",
"@id": "https://yourdental.example/#dentist",
"name": "◯◯歯科クリニック",
"medicalSpecialty": ["Dentistry", "CosmeticDentistry"],
"image": "https://yourdental.example/photo.jpg",
"url": "https://yourdental.example/",
"telephone": "+81-3-XXXX-XXXX",
"address": {
"@type": "PostalAddress",
"streetAddress": "六本木5-X-X",
"addressLocality": "港区",
"addressRegion": "東京都",
"postalCode": "106-0032",
"addressCountry": "JP"
},
"geo": { "@type": "GeoCoordinates", "latitude": 35.6627, "longitude": 139.7314 },
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Friday","Saturday"],
"opens": "10:00",
"closes": "19:00"
}],
"knowsLanguage": ["ja", "en"],
"availableService": [
{ "@type": "MedicalProcedure", "name": "一般歯科" },
{ "@type": "MedicalProcedure", "name": "ホワイトニング" },
{ "@type": "MedicalProcedure", "name": "インビザライン" }
]
}
QUOTE
※ 歯科の JSON-LD は厚生労働省 医療広告ガイドライン公式ページ(最新版・令和6年3月改訂)(取得 2026-05)の禁止表現(「日本一」「最高峰」「100%治る」等)を避けて記述すること。name や description で比較優良広告や絶対的効能表現を使わない。
1-4. LegalService(六本木・虎ノ門 法律事務所)
{
"@context": "https://schema.org",
"@type": "LegalService",
"@id": "https://yourlawfirm.example/#firm",
"name": "◯◯法律事務所",
"image": "https://yourlawfirm.example/photo.jpg",
"url": "https://yourlawfirm.example/",
"telephone": "+81-3-XXXX-XXXX",
"priceRange": "¥¥¥¥",
"address": {
"@type": "PostalAddress",
"streetAddress": "六本木1-X-X ◯◯タワー X階",
"addressLocality": "港区",
"addressRegion": "東京都",
"postalCode": "106-0032",
"addressCountry": "JP"
},
"geo": { "@type": "GeoCoordinates", "latitude": 35.6627, "longitude": 139.7314 },
"areaServed": [
{ "@type": "Place", "name": "六本木" },
{ "@type": "Place", "name": "虎ノ門" },
{ "@type": "Place", "name": "麻布台" }
],
"knowsLanguage": ["ja", "en", "zh"],
"knowsAbout": ["企業法務", "M&A", "国際取引", "知的財産", "労務"],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "09:00",
"closes": "18:00"
}]
}
1-5. AccountingService(六本木 税理士事務所)
{
"@context": "https://schema.org",
"@type": "AccountingService",
"@id": "https://yourtax.example/#firm",
"name": "◯◯税理士事務所",
"image": "https://yourtax.example/photo.jpg",
"url": "https://yourtax.example/",
"telephone": "+81-3-XXXX-XXXX",
"address": {
"@type": "PostalAddress",
"streetAddress": "六本木3-X-X ◯◯ビル X階",
"addressLocality": "港区",
"addressRegion": "東京都",
"postalCode": "106-0032",
"addressCountry": "JP"
},
"geo": { "@type": "GeoCoordinates", "latitude": 35.6627, "longitude": 139.7314 },
"knowsLanguage": ["ja", "en"],
"areaServed": [{ "@type": "Place", "name": "六本木" }, { "@type": "Place", "name": "麻布台" }],
"knowsAbout": ["法人税務", "国際税務", "スタートアップ支援", "M&A税務"]
}
埋め込み方: 上記 JSON を <script type="application/ld+json">...</script> で囲んで自店サイトの <head> に貼り付け、検証は Google Rich Results Test で URL またはコードを入れると即診断できます。
資産 2: hreflang + 多言語 GBP 属性テンプレ
六本木はインバウンド比率が高く、英語クエリ(Roppongi sushi private room 等)からの流入が無視できません。自店サイトの多言語ページを Google に正しく認識させる hreflang タグと、GBP の英語属性設定テンプレを置きます。
2-1. HTML の hreflang タグ(<head> に貼る)
<!-- 日本語ページ(デフォルト) -->
<link rel="alternate" hreflang="ja" href="https://yourstore.example/" />
<!-- 英語ページ -->
<link rel="alternate" hreflang="en" href="https://yourstore.example/en/" />
<!-- 中国語簡体字(インバウンド対応する場合) -->
<link rel="alternate" hreflang="zh-CN" href="https://yourstore.example/zh/" />
<!-- 言語指定なしのフォールバック -->
<link rel="alternate" hreflang="x-default" href="https://yourstore.example/" />
<!-- og:locale (Open Graph) -->
<meta property="og:locale" content="ja_JP" />
<meta property="og:locale:alternate" content="en_US" />
<meta property="og:locale:alternate" content="zh_CN" />
QUOTE
※ hreflang は相互参照が必須。英語ページの <head> にも同じ link 要素群と hreflang="en" のセルフ参照を入れる(※ 仕様: Google 検索セントラル — 地域別 URL に hreflang を使用する(取得 2026-05))。
2-2. GBP 多言語属性 設定チェックリスト YAML
GBP の管理画面で設定する英語版項目を、YAML 形式で並べました。コピペして自店用に書き換え、Google Business Profile マネージャーで対応項目に貼り付けてください。
# GBP 多言語設定チェックリスト(六本木店舗向け)
business_name:
ja: "◯◯(店舗名)"
en: "◯◯ Roppongi" # 店舗名を英語表記する場合のみ。原則は同一名
description:
ja: |
六本木駅から徒歩◯分、◯◯料理の専門店です。
完全個室(◯〜◯名対応)でご接待・記念日にご利用いただけます。
英語メニュー・英語対応スタッフ常駐。営業時間 ◯:◯◯〜◯:◯◯。
en: |
Located ◯ min walk from Roppongi Station. Authentic ◯◯ cuisine
with private rooms for ◯-◯ guests. Perfect for business
entertainment and special occasions. English menu and English-
speaking staff available. Open ◯:◯◯-◯:◯◯.
attributes:
- has_english_menu: true
- has_private_room: true
- accepts_reservations: true
- serves_alcohol: true
- good_for_business_meetings: true
- wheelchair_accessible_entrance: false # 該当する場合のみ true
- has_wifi: true
- identifies_as_lgbtq_friendly: false # 該当する場合のみ
posts_languages: ["ja", "en"]
review_reply_languages: ["ja", "en"]
設定先: GBP マネージャー → 情報 → 各項目を編集 → 「言語の追加」で英語版を入力。属性は「機能と特長」セクションで設定。
資産 3: GBP 説明文テンプレ(業態別5本、長文版)
GBP の説明文は管理画面で長文を設定できます。Google は説明文をランキングシグナルとして使うことを明示していませんが、ユーザーの来店動機形成と検索クエリのマッチングには強く効きます(一般仕様: Google Business Profile ヘルプ — ビジネス情報のガイドライン(取得 2026-05))。以下は六本木の主要5業態で、◯ を埋めればそのまま管理画面の文字数上限内に収まる完成形です。
3-1. 高級和食・寿司・割烹(接待業態)
六本木◯丁目、◯◯駅徒歩◯分の場所にある◯◯料理の専門店です。
店主の◯◯が◯◯年間磨いてきた技術と、季節ごとに厳選する産地直送
の食材を使い、コース料理を提供しています。
完全個室は最大◯名様まで対応。ご接待・ご会食・記念日のご利用に
お選びいただいています。事前予約のお客様には、お席のご案内を
最優先でお取り計らいします。
英語メニュー・英語対応スタッフ常駐のため、海外からのお客様の
ご接待にもご利用いただけます。Roppongi Hills や東京ミッドタウン
からも徒歩圏内です。
【コース】◯◯コース(◯◯,◯◯◯円〜)/ ◯◯コース(◯◯,◯◯◯円〜)
【営業時間】17:00-23:00(L.O. 22:00)
【定休日】◯曜日
【ご予約】お電話 03-XXXX-XXXX または公式サイトより
3-2. 焼肉・ステーキ(個室訴求)
六本木◯丁目で◯◯年営業している焼肉専門店です。
A5ランクの黒毛和牛を一頭買いで仕入れ、希少部位を含めた
コースとアラカルトでご提供します。
完全個室(◯〜◯名対応)でご接待・記念日・誕生日に対応。
事前予約で食事会場の貸切も可能です。ランチ営業(12:00-15:00)
では、上質な焼肉ランチを◯,◯◯◯円〜ご用意しています。
英語メニュー・英語対応スタッフあり。六本木ヒルズ徒歩◯分、
東京ミッドタウン徒歩◯分の立地です。
【コース】◯◯コース ◯◯,◯◯◯円〜 / 黒毛和牛コース ◯◯,◯◯◯円〜
【ランチ】◯◯ランチ ◯,◯◯◯円〜(11:30-14:30 L.O.)
【ディナー】17:00-23:00(L.O. 22:00)
【ご予約】お電話 03-XXXX-XXXX
3-3. バー・ラウンジ(夜間営業)
六本木◯丁目にある、大人のためのオーセンティックバーです。
仕事終わりの一杯から、終電後の二次会まで、静かな空間で
お過ごしいただけます。
ウイスキー◯◯銘柄、カクテル◯◯種類、ワイン◯◯◯銘柄を取り
揃えています。バーテンダー◯名が、お客様の好みに合わせた
一杯をお作りします。
お一人様歓迎、カウンター◯席、テーブル個室◯室。深夜の
お時間でも、安心してお立ち寄りいただけます。
【営業時間】18:00-翌4:00(L.O. 翌3:30)
【定休日】日曜日
【席数】カウンター◯席 / テーブル◯席 / 個室◯室
【チャージ】◯,◯◯◯円
【ご予約】お電話 03-XXXX-XXXX
QUOTE
※ 風営法第2条の特定遊興飲食店営業に該当する場合は許可番号を併記。詳細は資産11: 規制まとめを参照。
3-4. フレンチ・イタリアン(記念日・デート)
六本木◯丁目、◯◯駅徒歩◯分の◯◯料理レストランです。
◯◯出身のシェフが、季節ごとに厳選する食材で、コースのみ
ご提供します。
記念日コースには、アニバーサリープレート・メッセージカード
対応・お花のご用意も承ります(要事前予約)。完全個室(◯〜◯名)
も完備、ご接待・記念日・プロポーズなど、特別なシーンにお選び
いただいています。
ドレスコード:スマートカジュアル。英語対応スタッフ常駐、
英語メニューあり。Roppongi Hills 徒歩◯分。
【コース】ランチ ◯,◯◯◯円〜 / ディナー ◯◯,◯◯◯円〜
【ワイン】◯◯◯銘柄取り揃え、ソムリエ在籍
【営業時間】ランチ 12:00-14:30 / ディナー 18:00-22:30
【定休日】◯曜日
【ご予約】お電話 03-XXXX-XXXX
3-5. ランチ・カジュアル(ビジネスランチ需要)
六本木◯丁目、◯◯駅徒歩◯分の◯◯料理店です。
平日ランチ(11:30-14:30)では、◯◯ランチ ◯,◯◯◯円〜を
ご提供しています。提供時間の早さ(◯分以内)にこだわり、
ビジネスシーンでもお時間を気にせずご利用いただけます。
個室席(2〜6名)も完全予約制で完備。ビジネスランチ・接待
ランチ・会議併用にも対応します。Wi-Fi 完備、テイクアウトも
承ります。
ディナータイムは、◯◯コース(◯,◯◯◯円〜)でゆったりとした
お時間を。英語メニュー・英語対応スタッフあり。
【ランチ】11:30-14:30(L.O. 14:00)/◯◯ランチ ◯,◯◯◯円〜
【ディナー】17:30-22:30(L.O. 22:00)
【定休日】◯曜日
【ご予約】お電話 03-XXXX-XXXX またはオンライン予約
資産 4: 口コミ返信 30パターン(★1-5 × 6シーン × 日英)
BrightLocal 2026 調査では「口コミ返信が1週間以内」を期待する消費者が 81% でした(※ 出典: BrightLocal Local Consumer Review Survey 2026(取得 2026-05))。返信は 24-72 時間以内に行う・★ごとに違うトーンで返す・他の閲覧者が読むことを意識して書く のが基本です。以下は六本木の飲食店で実運用しているテンプレで、{name} {date} {item} を埋めればそのまま返信に使えます。
4-1. ★5 — 接待・個室利用への返信
[日本語]
{name}様、この度はご接待でのご利用、誠にありがとうございました。
個室をお選びいただき、おもてなしのお時間にお役に立てましたこと、
スタッフ一同大変嬉しく存じます。{item}も気に入っていただけたとの
こと、料理長にも伝えさせていただきます。
またのご来店を心よりお待ち申し上げます。
[English]
Dear {name}, thank you for choosing our restaurant for your
business entertainment. We are delighted that the private room
served the occasion well, and your kind words about the {item}
have been shared with our head chef. We look forward to welcoming
you again.
4-2. ★5 — 料理絶賛への返信
[日本語]
{name}様、過分なお言葉をありがとうございます。{item}を気に入って
いただけたこと、料理長にも伝えさせていただきました。季節ごとに
食材を入れ替えておりますので、また違った表情の料理を、次回お楽しみ
いただけますと幸いです。
[English]
Dear {name}, thank you for your generous words. We have shared
your comments about the {item} with our head chef. As we change
seasonal ingredients regularly, we hope you can enjoy a different
expression of our cuisine on your next visit.
4-3. ★4 — 改善要望を含む好意的レビューへの返信
[日本語]
{name}様、ご来店ありがとうございました。料理にご満足いただけたとの
こと、嬉しく拝読しました。一方で {improvement_point} につきまして
ご指摘をいただき、現場で改善策を検討しています。次回ご来店の際には、
よりご満足いただけるよう努めます。
[English]
Dear {name}, thank you for visiting. We are glad that the food
was to your liking. Your feedback regarding {improvement_point}
has been taken seriously and we are reviewing our process. We
hope to serve you better on your next visit.
4-4. ★3 — 部分的不満への返信
[日本語]
{name}様、貴重なご感想をありがとうございます。{issue_point} につき
まして、ご期待に応えられず申し訳ございませんでした。{action} を
スタッフ全員で確認し、改善に取り組んでまいります。お時間が許せば、
改めて再度のご来店を賜れますと幸いです。
[English]
Dear {name}, thank you for your honest feedback. We sincerely
apologize that {issue_point} did not meet your expectations. We
have shared {action} with the entire team and are committed to
improvement. We would be grateful for a chance to serve you again.
4-5. ★2 — サービス不満への返信
[日本語]
{name}様、ご不快な思いをおかけしましたこと、誠に申し訳ございません。
{issue_detail} につきまして、お聞きした内容を店長まで報告し、
{specific_action} を実施いたしました。今後同様のことがないよう、
スタッフ教育を徹底いたします。
直接お話を伺えますと幸いです。お手数ですが {contact} までご連絡を
いただけますでしょうか。
[English]
Dear {name}, we deeply apologize for the inconvenience caused.
The issue regarding {issue_detail} has been reported to the
manager, and we have taken {specific_action}. We are committed
to preventing similar situations through additional staff training.
If you are willing, we would appreciate the chance to discuss
this directly. Please contact us at {contact}.
4-6. ★1 — クレーム・否定的レビューへの返信
[日本語]
{name}様、この度は大変ご不快な思いをおかけし、心よりお詫び申し上げ
ます。{issue_summary} につきまして、ご指摘の内容を真摯に受け止めて
おります。
お手数ですが、詳細を伺いたく、{contact_phone} または {contact_email}
までご連絡をいただけますと幸いです。お一人お一人のお客様に誠実に
向き合うことが私どもの責任と考えております。
[English]
Dear {name}, we sincerely apologize for the experience you had.
We take the issue regarding {issue_summary} very seriously. We
would like to address this directly — please contact us at
{contact_phone} or {contact_email} so we can discuss the details.
Serving each guest with sincerity is our fundamental responsibility.
4-7. 英語口コミへの英語返信(言語自動判別)
★3 で英語口コミ → 英語のみで返信 のように、口コミ言語で返信言語を揃えるのが原則です。日本語に翻訳して並記すると逆に「英語が苦手な店」と判断されることがあります。
[English-only reply to English review]
Dear {name}, thank you so much for taking the time to share your
experience. We are honored that you chose us during your time in
Roppongi. {specific_compliment_response}. We hope to welcome you
back the next time you visit Tokyo.
— {staff_name} / {restaurant_name}
返信30パターンの全体マッピング
| ★ | 6シーン | 日本語 | English |
|---|---|---|---|
| ★5 | 接待・個室 / 料理絶賛 / 記念日 | ◯ | ◯ |
| ★4 | 改善要望含む / 一部不満 / 価格言及 | ◯ | ◯ |
| ★3 | 部分的不満 / 期待外れ / 待ち時間 | ◯ | ◯ |
| ★2 | サービス不満 / 衛生指摘 / 接客不満 | ◯ | ◯ |
| ★1 | 強いクレーム / 異物・衛生 / 接客重大 | ◯ | ◯ |
上記の代表 6 パターンを元に、シーンごとに {slot} を埋めて 30 通り展開できます。30 通り全文版は/market/meo-review-booster の納品物に含まれます。
資産 5: Google Apps Script — 口コミ自動通知
Google Places API(New)の Reviews フィールドを定期取得して、新着口コミを Slack または Gmail に通知するスクリプトです。Tufe 内部で運用中のコードを汎用化したものです。
準備:
- Google Cloud Console で Places API (New) を有効化、API key を発行
- 自店の Place ID を Google Places ID Finder で取得
- Slack Incoming Webhook URL を発行(不要なら Gmail 版を使う)
- Google Apps Script で新規プロジェクト作成、以下を貼り付け
- プロジェクトのプロパティに
GOOGLE_API_KEYSLACK_WEBHOOKPLACE_IDを設定 - トリガー:
notifyNewReviewsを 1 時間ごとに実行
/**
* Google Apps Script: 新着口コミを Slack/Gmail に通知
* Tufe Company - 2026-05 実運用版
*/
const PROPS = PropertiesService.getScriptProperties();
const PLACE_ID = PROPS.getProperty("PLACE_ID");
const API_KEY = PROPS.getProperty("GOOGLE_API_KEY");
const SLACK_WEBHOOK = PROPS.getProperty("SLACK_WEBHOOK");
const NOTIFY_EMAIL = PROPS.getProperty("NOTIFY_EMAIL"); // 任意
// 直近処理済みレビュー時刻を保存するキー
const LAST_SEEN_KEY = "lastSeenReviewTime";
function notifyNewReviews() {
if (!PLACE_ID || !API_KEY) {
console.error("PLACE_ID and GOOGLE_API_KEY are required");
return;
}
const url = `https://places.googleapis.com/v1/places/${PLACE_ID}`;
const options = {
method: "get",
headers: {
"X-Goog-Api-Key": API_KEY,
"X-Goog-FieldMask": "displayName,reviews,rating,userRatingCount",
},
muteHttpExceptions: true,
};
const res = UrlFetchApp.fetch(url, options);
if (res.getResponseCode() !== 200) {
console.error("API error: " + res.getContentText());
return;
}
const data = JSON.parse(res.getContentText());
const reviews = data.reviews || [];
const lastSeen = PROPS.getProperty(LAST_SEEN_KEY) || "1970-01-01T00:00:00Z";
const newReviews = reviews.filter((r) => r.publishTime > lastSeen);
if (newReviews.length === 0) {
console.log("No new reviews");
return;
}
// 最新の publishTime を保存
const latest = newReviews
.map((r) => r.publishTime)
.sort()
.reverse()[0];
PROPS.setProperty(LAST_SEEN_KEY, latest);
// 通知
newReviews.forEach((r) => {
const text = formatReview(data.displayName?.text || "店舗", r);
if (SLACK_WEBHOOK) sendSlack(text);
if (NOTIFY_EMAIL) sendEmail(text);
});
}
function formatReview(storeName, r) {
const stars = "★".repeat(r.rating) + "☆".repeat(5 - r.rating);
return [
`📣 新着口コミ: ${storeName}`,
`${stars} (${r.rating}/5)`,
`投稿者: ${r.authorAttribution?.displayName || "匿名"}`,
`日時: ${r.publishTime}`,
"",
r.text?.text || "(本文なし)",
"",
`言語: ${r.text?.languageCode || "?"}`,
].join("\n");
}
function sendSlack(text) {
UrlFetchApp.fetch(SLACK_WEBHOOK, {
method: "post",
contentType: "application/json",
payload: JSON.stringify({ text }),
muteHttpExceptions: true,
});
}
function sendEmail(text) {
MailApp.sendEmail({
to: NOTIFY_EMAIL,
subject: "新着口コミ通知",
body: text,
});
}
トリガー設定: スクリプトエディタの「トリガー」→「トリガーを追加」→ notifyNewReviews を時間ベースで毎時実行に設定(※ 仕様: Google Apps Script 公式 — 時間主導型トリガー(取得 2026-05))。
運用 Tips: 初回実行で lastSeenReviewTime が空のとき、全口コミが通知対象になります。初回だけ手動で PROPS.setProperty("lastSeenReviewTime", "現在日時の ISO 文字列") を実行して既存口コミを「処理済み」にしてからトリガーを有効化してください。
資産 6: n8n ワークフロー JSON — 口コミ→AI返信下書き→人間承認
n8n は OSS のワークフロー自動化ツールです。以下の JSON を n8n の「Import from File」または「Import from URL」で読み込めば、Places API で新着口コミ取得 → OpenAI/Claude で返信下書き生成 → Slack に承認カード表示 → 承認後に Gmail で店舗マネージャーに通知 のフローが動きます。
{
"name": "Roppongi MEO - Review Response Workflow",
"nodes": [
{
"parameters": {
"rule": { "interval": [{ "field": "hours", "hoursInterval": 1 }] }
},
"name": "Every Hour",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.1,
"position": [200, 300]
},
{
"parameters": {
"method": "GET",
"url": "=https://places.googleapis.com/v1/places/{{$env.PLACE_ID}}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "X-Goog-Api-Key", "value": "={{$env.GOOGLE_API_KEY}}" },
{ "name": "X-Goog-FieldMask", "value": "reviews,displayName" }
]
}
},
"name": "Fetch GBP Reviews",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [400, 300]
},
{
"parameters": {
"functionCode": "const lastSeen = $getWorkflowStaticData('global').lastSeen || '1970-01-01T00:00:00Z';\nconst reviews = ($json.reviews || []).filter(r => r.publishTime > lastSeen);\nif (reviews.length === 0) return [];\nconst latest = reviews.map(r => r.publishTime).sort().reverse()[0];\n$getWorkflowStaticData('global').lastSeen = latest;\nreturn reviews.map(r => ({json: r}));"
},
"name": "Filter New Reviews",
"type": "n8n-nodes-base.function",
"typeVersion": 1,
"position": [600, 300]
},
{
"parameters": {
"resource": "chat",
"model": "claude-opus-4-7",
"messages": {
"values": [
{
"role": "system",
"content": "あなたは六本木の高級和食店のマネージャーです。来店客の口コミに対して、丁寧で誠実な返信を日本語と英語で作成します。★1-3 の場合は具体的な改善アクションを示し、連絡先を案内します。★4-5 の場合は感謝を述べ、料理長への共有を伝えます。出力は JSON で {ja: \"\", en: \"\"} 形式。"
},
{
"role": "user",
"content": "=口コミ評価: {{$json.rating}}/5\n口コミ本文: {{$json.text.text}}\n投稿言語: {{$json.text.languageCode}}\n投稿者: {{$json.authorAttribution.displayName}}"
}
]
}
},
"name": "Generate Reply Draft (Claude)",
"type": "n8n-nodes-base.anthropic",
"typeVersion": 1,
"position": [800, 300]
},
{
"parameters": {
"channel": "={{$env.SLACK_CHANNEL}}",
"text": "=📣 新着口コミの返信下書きが届きました\n\n★{{$node[\"Filter New Reviews\"].json[\"rating\"]}} - {{$node[\"Filter New Reviews\"].json[\"text\"][\"text\"]}}\n\n*提案返信(日本語)*:\n{{$json.ja}}\n\n*Suggested reply (English)*:\n{{$json.en}}\n\n承認: ✅ / 修正: ✏️"
},
"name": "Post to Slack for Approval",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [1000, 300]
},
{
"parameters": {
"fromEmail": "={{$env.STORE_EMAIL_FROM}}",
"toEmail": "={{$env.STORE_MANAGER_EMAIL}}",
"subject": "=【要対応】新着口コミ ★{{$node[\"Filter New Reviews\"].json[\"rating\"]}}",
"text": "=Slackで承認後、GBP管理画面で投稿してください。\n\n下書き(JP):\n{{$json.ja}}\n\nDraft (EN):\n{{$json.en}}"
},
"name": "Email Store Manager",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2.1,
"position": [1200, 300]
}
],
"connections": {
"Every Hour": { "main": [[{ "node": "Fetch GBP Reviews", "type": "main", "index": 0 }]] },
"Fetch GBP Reviews": { "main": [[{ "node": "Filter New Reviews", "type": "main", "index": 0 }]] },
"Filter New Reviews": { "main": [[{ "node": "Generate Reply Draft (Claude)", "type": "main", "index": 0 }]] },
"Generate Reply Draft (Claude)": { "main": [[{ "node": "Post to Slack for Approval", "type": "main", "index": 0 }]] },
"Post to Slack for Approval": { "main": [[{ "node": "Email Store Manager", "type": "main", "index": 0 }]] }
}
}
運用前の環境変数設定:
PLACE_ID: 自店の Google Place IDGOOGLE_API_KEY: Places API (New) の API keySLACK_CHANNEL: 承認通知を流す Slack チャンネル IDSTORE_EMAIL_FROM/STORE_MANAGER_EMAIL: 通知メールの送信元・送信先
OpenAI を使う場合は Generate Reply Draft (Claude) ノードを OpenAI Chat に差し替え可能。
資産 7: NAP 整合性チェック Bash + 正規表現
NAP(Name / Address / Phone)が自社サイト・食べログ・Retty・GBP で表記揺れしていると、Google が「同じ店舗か別店舗か」を判別しづらくなり、ランキング上の評価が分散します。以下は Tufe 内部運用のチェックスクリプトです。
#!/usr/bin/env bash
# Tufe Company - NAP Consistency Checker
# 自社サイト・食べログ・Retty・GBP の NAP 表記ゆれを検出
set -euo pipefail
# ====== 自店情報(編集する箇所)======
STORE_NAME="◯◯料理 ◯◯"
ADDRESS_PATTERN='港区六本木[0-90-9]+丁目[0-90-9]+[--][0-90-9]+'
PHONE_PATTERN='0[3-9][--‐][0-9]{3,4}[--‐][0-9]{4}'
SITES=(
"https://yourstore.example/"
"https://yourstore.example/access"
"https://tabelog.com/tokyo/A1307/A130703/XXXXXXXX/"
"https://retty.me/area/PRE13/ARE2/SUB203/XXXXXXXX/"
)
# ====================================
echo "== NAP Consistency Check =="
echo "Store: $STORE_NAME"
echo ""
for url in "${SITES[@]}"; do
echo "[$url]"
html=$(curl -sL --max-time 10 -A "Mozilla/5.0" "$url" || echo "")
if [ -z "$html" ]; then
echo " ! Fetch failed"
continue
fi
# 店舗名一致
if echo "$html" | grep -q "$STORE_NAME"; then
echo " Name: ✓ found"
else
echo " Name: ✗ NOT found ($STORE_NAME)"
fi
# 住所抽出
addrs=$(echo "$html" | grep -oE "$ADDRESS_PATTERN" | sort -u)
if [ -n "$addrs" ]; then
echo " Address detected:"
echo "$addrs" | sed 's/^/ - /'
else
echo " Address: ✗ not found"
fi
# 電話番号抽出
phones=$(echo "$html" | grep -oE "$PHONE_PATTERN" | sort -u)
if [ -n "$phones" ]; then
echo " Phone detected:"
echo "$phones" | sed 's/^/ - /'
else
echo " Phone: ✗ not found"
fi
echo ""
done
echo "== Summary =="
echo "上記の Address / Phone が全サイトで完全一致しているか目視確認してください。"
echo "ハイフン種別(- vs - vs ‐)・半角全角・丁目表記の揺れが検出ポイントです。"
使い方: 上記を nap-check.sh として保存し、STORE_NAME ADDRESS_PATTERN PHONE_PATTERN SITES を自店用に書き換えてから bash nap-check.sh で実行。
よくある検出パターン:
| 検出例 | 問題 |
|---|---|
六本木6-1-1 vs 六本木6丁目1-1 vs 六本木6丁目1番1号 | 住所表記揺れ |
03-1234-5678 vs 0312345678 vs 03(1234)5678 | 電話番号フォーマット揺れ |
◯◯料理 ◯◯ vs ◯◯料理◯◯ vs ◯◯料理 ◯◯本店 | 店舗名揺れ(スペース・本店表記) |
検出された揺れは GBP の表記を正としつつ、自社サイト・食べログ・Retty を順次そちらに合わせるのが定石です。
資産 8: 5 KW × 3 地点 順位計測 CSV + Google Sheets 関数
六本木は地点によって地図パックの表示順位が大きく変動します。以下の 3 地点で 5 KW を月次計測すると、地点ごとの強み弱みが見えます。
六本木の標準計測 3 地点(緯度経度)
| 地点 | 緯度 | 経度 |
|---|---|---|
| 六本木交差点 | 35.6627 | 139.7314 |
| 六本木ヒルズ | 35.6606 | 139.7297 |
| 東京ミッドタウン | 35.6657 | 139.7308 |
8-1. 計測結果記録用 CSV テンプレ
date,keyword,location_label,latitude,longitude,my_rank,competitor_top1,competitor_top2,competitor_top3,notes
2026-05-28,六本木 接待 個室,六本木交差点,35.6627,139.7314,3,A店,B店,C店,
2026-05-28,六本木 接待 個室,六本木ヒルズ,35.6606,139.7297,5,A店,B店,D店,ヒルズ周辺で弱い
2026-05-28,六本木 接待 個室,東京ミッドタウン,35.6657,139.7308,4,A店,E店,B店,
2026-05-28,六本木 寿司 接待,六本木交差点,35.6627,139.7314,2,F店,A店,G店,
2026-05-28,六本木 寿司 接待,六本木ヒルズ,35.6606,139.7297,3,F店,A店,H店,
2026-05-28,六本木 寿司 接待,東京ミッドタウン,35.6657,139.7308,2,F店,A店,G店,
2026-05-28,六本木 焼肉 個室,六本木交差点,35.6627,139.7314,8,I店,J店,K店,要改善
2026-05-28,六本木 焼肉 個室,六本木ヒルズ,35.6606,139.7297,12,I店,L店,J店,圏外間近
2026-05-28,六本木 焼肉 個室,東京ミッドタウン,35.6657,139.7308,9,I店,J店,M店,
2026-05-28,Roppongi private room,六本木交差点,35.6627,139.7314,4,A店,N店,F店,英語クエリ健闘
2026-05-28,Roppongi private room,六本木ヒルズ,35.6606,139.7297,3,A店,N店,F店,
2026-05-28,Roppongi private room,東京ミッドタウン,35.6657,139.7308,5,A店,N店,O店,
2026-05-28,六本木 ランチ 個室,六本木交差点,35.6627,139.7314,7,P店,Q店,A店,
2026-05-28,六本木 ランチ 個室,六本木ヒルズ,35.6606,139.7297,9,P店,Q店,R店,
2026-05-28,六本木 ランチ 個室,東京ミッドタウン,35.6657,139.7308,6,P店,A店,Q店,
8-2. Google Sheets 集計関数
上記 CSV を Google Sheets に貼り付け、別シートで集計するための関数セットです。
# シート名: "raw" に CSV を貼り付け、別シート "summary" に以下を入れる
# A1: KW別平均順位
=QUERY(raw!A:I, "SELECT B, AVG(F) WHERE A IS NOT NULL GROUP BY B LABEL AVG(F) '平均順位'", 1)
# D1: 地点別平均順位
=QUERY(raw!A:I, "SELECT C, AVG(F) WHERE A IS NOT NULL GROUP BY C LABEL AVG(F) '平均順位'", 1)
# G1: 月次推移(最新月との比較)
=QUERY(raw!A:I, "SELECT MONTH(A)+1, AVG(F) WHERE A IS NOT NULL GROUP BY MONTH(A)+1 ORDER BY MONTH(A)+1 LABEL MONTH(A)+1 '月', AVG(F) '平均順位'", 1)
# J1: 競合出現頻度
=ARRAYFORMULA(IF(raw!G2:G="","",raw!G2:G))
# 別セルで:
=QUERY({J:J;K:K;L:L}, "SELECT Col1, COUNT(Col1) WHERE Col1 IS NOT NULL GROUP BY Col1 ORDER BY COUNT(Col1) DESC LABEL COUNT(Col1) '出現回数'", 0)
8-3. 計測の運用フロー
- 月1回、3地点で計測(VPN または Google Maps の位置情報スプーフィングで地点切り替え)
- CSV に追記
- summary シートで月次推移を確認
- 順位低下した地点 × KW を
notes列に原因仮説と一緒に記録 - 翌月の施策に反映(GBP 写真 / 投稿 / 口コミ獲得を順位低下分野に寄せる)
資産 9: GBP 投稿カレンダー 12か月分 ICS
六本木の季節・イベントに連動した GBP 投稿スケジュールを ICS(iCalendar)形式で配布します。Google Calendar / Outlook / Apple Calendar に import すれば、12か月分の投稿リマインダーが自動で立ちます。
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Tufe Company//Roppongi MEO Calendar 2026//JP
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
UID:roppongi-meo-2026-01@tufecompany.co.jp
DTSTART;VALUE=DATE:20260106
SUMMARY:GBP投稿: 新年会コース告知
DESCRIPTION:1月の新年会需要に向けて、コース料金・個室席数・予約方法をGBP投稿。写真は新年装飾の店内。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-02@tufecompany.co.jp
DTSTART;VALUE=DATE:20260201
SUMMARY:GBP投稿: バレンタイン記念日プラン
DESCRIPTION:フレンチ/イタリアン業態はバレンタイン特別コースを2/1-2/14期間限定で告知。アニバーサリープレート言及。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-03@tufecompany.co.jp
DTSTART;VALUE=DATE:20260315
SUMMARY:GBP投稿: 檜町公園の桜 + 歓送迎会
DESCRIPTION:東京ミッドタウン隣接の檜町公園が桜の名所。お花見ディナー/歓送迎会個室を訴求。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-04@tufecompany.co.jp
DTSTART;VALUE=DATE:20260415
SUMMARY:GBP投稿: 新年度・歓迎会対応
DESCRIPTION:4月後半は新入社員歓迎会需要のピーク後半。個室席数・コース価格を告知。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-05@tufecompany.co.jp
DTSTART;VALUE=DATE:20260501
SUMMARY:GBP投稿: GW営業案内 + 麻布台ヒルズ集客連動
DESCRIPTION:GW営業時間を明記、英語ポストも併用。麻布台ヒルズから徒歩◯分の立地訴求。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-06@tufecompany.co.jp
DTSTART;VALUE=DATE:20260601
SUMMARY:GBP投稿: 梅雨対策・英語メニュー強化
DESCRIPTION:梅雨で来店動機が落ちる時期。雨でも徒歩◯分の立地、英語メニューを訴求。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-07@tufecompany.co.jp
DTSTART;VALUE=DATE:20260710
SUMMARY:GBP投稿: 夏季限定コース + インバウンド前哨
DESCRIPTION:訪日外国人ピーク前。冷製料理・夏限定コース・英語ポストで予約獲得。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-08@tufecompany.co.jp
DTSTART;VALUE=DATE:20260801
SUMMARY:GBP投稿: 観光ピーク英語強化
DESCRIPTION:夏季観光ピーク。英語投稿頻度を週2に、属性「英語対応」「英語メニュー」を再確認。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-09@tufecompany.co.jp
DTSTART;VALUE=DATE:20260925
SUMMARY:GBP投稿: 六本木アートナイト連動
DESCRIPTION:六本木アートナイト(森美術館・六本木ヒルズ主催の年次イベント)の集客に合わせオールナイト訴求。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-10@tufecompany.co.jp
DTSTART;VALUE=DATE:20261001
SUMMARY:GBP投稿: 忘年会予約受付開始
DESCRIPTION:10月初旬から忘年会コース予約受付。早期予約特典・個室確保案内。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-11@tufecompany.co.jp
DTSTART;VALUE=DATE:20261110
SUMMARY:GBP投稿: 紅葉ディナー + 忘年会催促
DESCRIPTION:紅葉が見える店内/窓際席を訴求、忘年会の希少性訴求(残席わずか)。
END:VEVENT
BEGIN:VEVENT
UID:roppongi-meo-2026-12@tufecompany.co.jp
DTSTART;VALUE=DATE:20261201
SUMMARY:GBP投稿: 忘年会満席間近 + クリスマス
DESCRIPTION:六本木の飲食店にとって最大の繁忙期。希少性訴求+クリスマスディナー予約終了間近。
END:VEVENT
END:VCALENDAR
使い方: 上記テキストを roppongi-meo-2026.ics として保存 → Google Calendar の「カレンダーをインポート」で読み込み → 12か月分の投稿日が予定として表示されます。各イベントは投稿準備リマインダーで、当日にGBP投稿実施。
資産 10: Places API 自店診断 curl + GBP 完全度スコア Python
自店の GBP プロフィール完全度を機械的に診断するためのコード一式です。
10-1. Places API curl 1行(自店プロフィール取得)
curl -s "https://places.googleapis.com/v1/places/YOUR_PLACE_ID" \
-H "X-Goog-Api-Key: YOUR_API_KEY" \
-H "X-Goog-FieldMask: displayName,formattedAddress,internationalPhoneNumber,websiteUri,regularOpeningHours,priceLevel,rating,userRatingCount,photos,reviews,businessStatus,googleMapsUri,types,primaryType,editorialSummary" \
| jq . > tmp/gbp-audit.json
10-2. GBP 完全度スコア算出 Python(0-100点)
"""
Tufe Company - GBP Completeness Scorer
六本木 MEO 上位店舗の共通シグナル6軸を基準に、自店の GBP プロフィールを100点満点で診断
"""
import json
import sys
from datetime import datetime, timezone, timedelta
WEIGHTS = {
"has_phone": 5,
"has_website": 5,
"has_hours": 10,
"has_photos_10plus": 10,
"has_reviews_100plus": 15,
"rating_4_3_plus": 15,
"recent_reviews_3mo_8plus": 15,
"english_attrs": 10,
"price_level": 5,
"primary_type_specific": 10,
}
def score_gbp(data: dict) -> dict:
score = 0
breakdown = {}
# 1. 電話番号
has_phone = bool(data.get("internationalPhoneNumber"))
breakdown["has_phone"] = WEIGHTS["has_phone"] if has_phone else 0
# 2. ウェブサイト
has_web = bool(data.get("websiteUri"))
breakdown["has_website"] = WEIGHTS["has_website"] if has_web else 0
# 3. 営業時間
has_hours = bool(data.get("regularOpeningHours"))
breakdown["has_hours"] = WEIGHTS["has_hours"] if has_hours else 0
# 4. 写真 10枚以上
photo_count = len(data.get("photos", []))
breakdown["has_photos_10plus"] = WEIGHTS["has_photos_10plus"] if photo_count >= 10 else 0
# 5. 口コミ件数 100件以上(六本木 Map Pack 上位の典型値)
review_count = data.get("userRatingCount", 0)
breakdown["has_reviews_100plus"] = WEIGHTS["has_reviews_100plus"] if review_count >= 100 else 0
# 6. 平均評価 4.3 以上
rating = data.get("rating", 0)
breakdown["rating_4_3_plus"] = WEIGHTS["rating_4_3_plus"] if rating >= 4.3 else 0
# 7. 直近3ヶ月の口コミ 8件以上
reviews = data.get("reviews", [])
cutoff = (datetime.now(timezone.utc) - timedelta(days=90)).isoformat()
recent = [r for r in reviews if r.get("publishTime", "") > cutoff]
breakdown["recent_reviews_3mo_8plus"] = WEIGHTS["recent_reviews_3mo_8plus"] if len(recent) >= 8 else 0
# 8. 英語属性(editorialSummary や reviews の言語で判定)
has_en = any(
r.get("text", {}).get("languageCode", "").startswith("en")
for r in reviews
)
breakdown["english_attrs"] = WEIGHTS["english_attrs"] if has_en else 0
# 9. 価格帯設定
has_price = bool(data.get("priceLevel"))
breakdown["price_level"] = WEIGHTS["price_level"] if has_price else 0
# 10. プライマリカテゴリの具体度
primary = data.get("primaryType", "")
specific_categories = [
"sushi_restaurant", "yakiniku_restaurant", "french_restaurant",
"italian_restaurant", "bar", "dentist", "law_firm",
]
breakdown["primary_type_specific"] = (
WEIGHTS["primary_type_specific"] if primary in specific_categories else 0
)
score = sum(breakdown.values())
return {"score": score, "max": sum(WEIGHTS.values()), "breakdown": breakdown}
def main():
if len(sys.argv) < 2:
print("Usage: python score.py path/to/gbp-audit.json")
sys.exit(1)
with open(sys.argv[1]) as f:
data = json.load(f)
result = score_gbp(data)
print(f"\nGBP 完全度スコア: {result['score']}/{result['max']}")
print(f"店舗名: {data.get('displayName', {}).get('text', '?')}\n")
print("項目別スコア:")
for k, v in result["breakdown"].items():
max_v = WEIGHTS[k]
status = "✓" if v == max_v else "✗"
print(f" {status} {k}: {v}/{max_v}")
if __name__ == "__main__":
main()
使い方:
# 1. curl で GBP データ取得
curl -s "https://places.googleapis.com/v1/places/YOUR_PLACE_ID" \
-H "X-Goog-Api-Key: YOUR_API_KEY" \
-H "X-Goog-FieldMask: ..." > gbp-audit.json
# 2. スコア算出
python3 score.py gbp-audit.json
スコア解釈:
| スコア | 状態 |
|---|---|
| 90-100 | Map Pack 上位の典型値、現状維持+月次微調整 |
| 70-89 | 上位射程内、不足項目を3か月で埋めれば上位3位以内に届く可能性 |
| 50-69 | 基礎整備の余地が大きい、写真/口コミ件数/英語属性から着手 |
| 0-49 | GBP の最適化が未着手、まず基礎10項目から |
資産 11: 六本木の規制まとめ(風営法 / 医療広告 / 深夜営業)
六本木で MEO を運用する際、業態によっては以下の規制遵守が必須です。GBP 投稿・写真・属性で違反になる表現を避けるため、店舗オーナーが事前に把握すべき公的ルールを最小限の要点でまとめます。
風俗営業等の規制及び業務の適正化等に関する法律(風営法)
港区六本木6丁目を含む特定地域は、風営法による営業時間制限・特殊飲食店等の規制対象。バー・ラウンジ・クラブ業態は特定遊興飲食店営業許可(風営法第3条)が必要な場合があります。
- 一次出典: e-Gov 法令検索: 風俗営業等の規制及び業務の適正化等に関する法律(取得 2026-05)
- GBP の業態カテゴリ・営業時間・属性で誤認を招かないよう設定し、許可取得済みの場合はその旨を説明文で適切に示す
医療広告ガイドライン(美容クリニック・歯科)
六本木の美容クリニック・歯科では厚生労働省「医療広告ガイドライン」の遵守が必須。
- 一次出典: 厚生労働省 医療広告ガイドライン公式ページ(最新版・令和6年3月改訂、第6版)(取得 2026-05)
- 禁止表現: 「日本一」「最高峰」等の比較優良広告、「100%治る」「必ず治る」等の絶対的効能表現、患者の体験談を引用する広告
- GBP 投稿・写真・口コミ返信でも上記禁止表現は避ける
深夜営業(風営法 / 食品衛生法)
深夜0時以降に酒類提供を行う飲食店は、所轄警察署への「深夜における酒類提供飲食店営業開始届出書」の提出が必要。GBP の営業時間設定では翌日時刻(翌2:00 等)を正確に登録すること(「2:00」とすると Google は当日 2:00 と解釈)。
- 一次出典: e-Gov 法令検索: 風営法 第33条(深夜営業)(取得 2026-05)
食品衛生法・景表法
GBP 投稿で「日本一安い」「絶対美味しい」等は景品表示法違反のリスク。
- 一次出典: 消費者庁 景品表示法(取得 2026-05)
資産 12: 六本木 MEO の失敗パターン 7件
Tufe Company が六本木の事業者から相談を受けた典型的な MEO 失敗パターンです(※ Tufe Company 内部実測 / 2026-05時点、N=六本木支援先・問い合わせ相談履歴)。
- 接待客に正面から口コミ依頼してしまう — 接待相手の前で気まずさが生まれ、リピート客との関係を損ねる。来店後 24-48 時間でメッセージカード経由で QR コード送付が定石
- 英語属性未設定でインバウンドを取りこぼす — 「Roppongi sushi private room」等の英語クエリで地図表示すらされていない店舗が多数
- 港区の特殊飲食店規制への誤認 — 一般飲食店なのに GBP 属性・写真で「クラブ」「ラウンジ」と誤認される設定
- 深夜営業の営業時間設定誤り — 「翌2:00」を「02:00」と登録して Google が当日 2:00 と解釈、深夜帯クエリでヒットしない
- GBP メインカテゴリの業態混同 — 「焼肉店」を「居酒屋」、「鮨」を「寿司店」など最適と違うカテゴリを選択。メインカテゴリはランキングシグナルとして強く効く
- 食べログ依存で GBP 放置 — 食べログがあるから GBP は不要と放置しているケース。Google マップ起点の検索行動は無視できない
- 写真の質と客層ミスマッチ — 高級和食店なのに料理写真がスマホ撮影のまま、カジュアル業態なのに過剰にプロ撮影されていたり
セルフチェック 15項目(六本木の飲食店オーナー向け)
契約前にすぐ確認できる、六本木の飲食店オーナー向けセルフチェックです。15項目中 8項目以下にチェックが入る場合、Map Pack 上位3位以内を不動にするための余地があります。
A. GBP 基礎設定(5項目)
- 1. GBP のメインカテゴリが業態と完全一致(「居酒屋」ではなく「焼肉店」「寿司店」等で正確に)
- 2. 店舗名・住所・電話番号(NAP)が Web サイト・食べログ・Retty で完全一致(資産7のスクリプトで検出可能)
- 3. 説明文に「六本木」「○○丁目」「最寄駅徒歩◯分」「主力業態」「客単価帯」を含む(管理画面の文字数上限まで埋める)
- 4. 営業時間がランチ帯・ディナー帯・深夜営業で正確に設定済み(祝日例外も登録)
- 5. 予約リンク(TableCheck / Retty / OpenTable 等)が GBP に紐付け済み
B. 飲食店特化(5項目)
- 6. メニュー機能で主要 5 品以上が写真付きで登録済み
- 7. 写真が月 4 枚以上更新されている
- 8. 「個室あり」「接待利用可」「記念日プラン」等の属性が業態に応じて設定済み
- 9. Google ポストが過去 14 日以内に 1 件以上投稿されている(資産9のカレンダーで自動化可能)
- 10. 口コミ件数 50 件以上、平均評価 4.0 以上、直近 3 か月で 10 件以上の新規口コミ
C. 六本木特化(5項目)
- 11. GBP に英語版の店舗名・説明文・属性が設定済み(資産2のテンプレで実装可能)
- 12. 英語口コミへの英語返信が直近 30 日で 1 件以上行われている(資産4の英語テンプレで実装可能)
- 13. 深夜営業の場合、営業時間設定が「翌5:00」等の正確な終了時刻で登録
- 14. 港区の特殊飲食店規制(六本木6丁目特定地域含む)に該当する場合、GBP 属性・説明文で誤認を避ける記述
- 15. 月次で順位定点観測を行っている(資産8の CSV で実装可能)
関連ページ
- 港区 MEO対策(区全体の市場分析)
- 港区 LLMO / GEO(AI検索対策)
- 港区 SEOコンテンツ対策
- MEO 完全ガイド 2026
- GBP 運用完全ガイド
- MEO(ローカルSEO)とは何か
- Googleビジネスプロフィール(GBP)
- 地域ビジネス総合支援サービス
このページを書いた理由(運営者として)
ここまで読んでくれた方に率直にお伝えします。
このページは、Tufe Company に MEO を依頼してもらうための営業ページとして書いていません。 六本木で店舗を運営している方が、自分で MEO の基本を整備して、上位を取りに行けるようにする ための実装パックです。10資産すべて、Tufe を経由せずに使ってください。
その上で、もし「自店だけで運用するには手が足りない」「業態別の細部までは自分で詰めきれない」と感じられた場合は、Tufe Company の MEO サービスをご検討いただけます。
| 商品 | 価格 | 何が違うか |
|---|---|---|
| MEO Ranking Analyzer | ¥7,980(買い切り) | 5 KW × 3地点 = 15計測点を実機計測 + 競合 TOP 5 を 8 軸ベンチ + 業種別 GBP 完全度スコア + 優先施策ロードマップ。資産8と資産10を Tufe 側で実行+分析した納品物 |
| MEO Review Booster | ¥7,980(買い切り) | 業種別 SVG QR POP 3サイズ + 口コミ返信 15 パターン + GBP 投稿カレンダー 12か月分 + KPI シート。本ページの資産3・4・9の業種別カスタマイズ版 |
| Monthly MEO Report | ¥3,980 / 月 | 月次で 5 KW × 3地点測定 + 競合 TOP 3 の口コミ・写真変化通知 + 季節 KW + 順位低下原因仮説 |
| Tufe Local Pack | ¥9,980(バンドル) | AI Search Pack + MEO Review Booster + MEO Ranking Analyzer + CVR Rewrite Report の 4本セット |
商品ページ以外に、45分・オンライン・契約前提なしの相談枠もあります(※ Tufe Company 提供時間目安 / 2026-05時点)。「資産2の hreflang を自店サイトに入れたいけど CMS が WordPress でどこに入れればいいか分からない」のような具体的な質問だけでも結構です。
来てくれてありがとうございました。