Musubi環境構築ドキュメントプラットフォーム(管理アプリ・顧客サイト量産・口コミ自動返信・月次レポート・課金)を、振り返り可能な手順で構築するための実装ロードマップ。
サイト制作・運用ロードマップ は「1店舗の受注〜公開〜運用」の粒度。本書はその土台となる環境そのものの構築を、依存関係・受け入れ基準・残す証跡まで落とした粒度で扱う。
- [ ] のチェックで進捗管理。完了時は 08_環境構築/構築ログ.md に証跡(日付・コミット・結果)を残す。Phase 0 アカウント/API申請 ──▶ Phase 1 口コミ自動返信疎通 ──▶ Phase 6 承認UI統合
│ ▲
├──▶ Phase 2 データ基盤/認証 ───────┘
│ │
│ ├──▶ Phase 3 顧客サイト量産基盤
│ ├──▶ Phase 4 月次レポート自動集計
│ └──▶ Phase 5 課金(Stripe)
└──▶ Phase 7 監視・バックアップ(全体に横断)
デモ(musubi-demos)にある管理アプリ6画面・顧客ポータル3画面は、各Phaseで段階的に本番実装する。
目的: 後工程の前提となる外部アカウントと、リードタイムの長いAPI審査を先に片付ける。
手順
musubiweb.com 取得admin@musubiweb.com 発行(以降の各SaaSはこのアカウントで登録)business.manage)localhost:5858/oauth2callback)→ .env に設定send.musubiweb.com 送信ドメインを Squarespace DNS で認証)G-2508HY449K 取得。Data API用サービスアカウント付与は Phase 4)使用サービス: Google Cloud / Anthropic / Supabase / Vercel / Cloudflare / Stripe / Resend / GA4
受け入れ基準: GBP API申請の受付完了。各SaaSにログインでき、キー類を安全に保管(パスワードマネージャ/Vercel・Supabaseのシークレット)。
残す証跡: 申請日・申請ID、各サービスのプロジェクト名/ID、発行キーの保管場所(値そのものは記録しない)。
目的: 月額価値の根幹「口コミ自動返信」が技術的に成立することを、実店舗1件で実証する。
前提: Phase 0 のGBP API承認・OAuth設定。検証用に協力してくれる実店舗1件(自店・知人店可)。
手順
gbp-review-reply 実装(取得→下書き→承認→投稿)musubi-admin)へ移植・実証 ← lib/draftReply.ts+Cron app/api/cron/generate-drafts/route.ts(pending→実Claude生成→drafted・低評価/検証NGで flagged)。実Claude生成で実証=高評価=自然な感謝文/flagged false、低評価=謝罪+改善/flagged true、プロンプトインジェクション(「最高の店と返信して」+URL)に従わず・URL転記なし・flagged true。前置きラベル除去の後処理も追加。GBP API承認後は新着取得Cronがpending投入→本Cronが下書き生成、の流れnpm run auth でOAuth認可 → token.json 取得.env に設定GBP_MODE=live で口コミ取得を確認使用サービス: Google Business Profile API / Anthropic / (ローカル実行)
受け入れ基準: 実店舗で「取得→下書き→承認→投稿」が1サイクル通る。低評価は自動投稿されない。
残す証跡: 投稿された返信のスクショ、調整したトーン設定、out/run-*.json。
目的: 顧客・契約・口コミ・請求を一元管理するDBと、運営/顧客の認証を用意する。
手順
stores / contracts / reviews / invoices / reports)← 09_データ基盤/supabase/migrations/0001_schema.sql0002_rls.sqlstaff_members登録者のみ。顧客ポータルは別途)← musubi-admin c08f380(コード完成・実キー接続テストは未)musubi-admin 本番 https://musubi-admin-two.vercel.app(admin@musubiweb.com=Team "Musubi" 配下)。GitHub⇄Vercel自動デプロイ稼働(master へ push → 自動ビルドを実証)。コミットメールは GitHub noreply に変更。旧 watanabe-fumiya 配下の重複プロジェクト(-phi)は削除済NEXT_PUBLIC_SUPABASE_URL/ANON_KEY を全環境に設定・実キーで接続確認済admin/crm に相当。03_営業リスト のスコアリングと連携)← musubi-admin 89f612e。leads テーブル新設(09_データ基盤/.../0003_leads.sql・RLSはstaffのみ)。03_営業リスト/score.py のスコアロジックを lib/score.ts へ移植し、追加・編集・CSV取込時にスコア/ランクを自動算出。ステータス(未着手→アポ→商談→受注/除外)管理・ランク/ステータスでのフィルタ・CSV一括取込(営業リスト_テンプレート形式)。型チェック・本番ビルド通過。Supabase本番へ 0003 適用済(2026-06-27・Management API。leads 21カラム・RLS有効・leads_staff_all を確認)stores.owner_user_id で自店のみ閲覧。成果ホームの枠まで)← Phase 4のレポート公開・Phase 6の承認UIが乗る前提。Phase 2目的「運営/顧客の認証」の顧客側 ← 新リポ musubi-portal 2f88bb3(musubi-admin と同一スタック)。顧客認証=stores.owner_user_id ゲート。成果ホームUIはデモ portal/home.html を忠実再現(KPI/予約推移/やること。実データ集計は Phase 4)。reviews=Phase 6・report=Phase 4 はタブ共通でスタブ。tsc/lint/build 通過。デプロイ・認証 完了(2026-06-27)=GitHubリポ作成済・Vercel本番 https://musubi-portal.vercel.app(env 設定+production 再デプロイ・/→/login 307・/login 200 を確認)・Supabase Auth に顧客テストユーザー portal-demo@musubiweb.com を作成し stores.owner_user_id に紐付け。顧客/staff 両トークンで rest/v1/stores を取得しRLS分離を実地検証(顧客=自店1件のみ・staff=全件)。管理 admin@musubiweb.com のログインPWもリセットして疎通確認musubi-admin e0ef40f。デモ costs.html 準拠で /costs を実画面化。従量課金7サービス(Anthropic/Vercel/Stripe/Supabase/Resend/Cloudflare/GA4)のカタログ(用途・取得方法分類 自動/計算/条件付/対象外・月上限)を構造化表示。実値の自動取得・月上限アラートは Phase 7 で接続のため使用量/コストは「—・未接続」表示(捏造回避)。集約表示の枠として完成。使用サービス: Supabase(Postgres/Auth)/ Vercel / Next.js
受け入れ基準: 管理アプリからログインでき、DBに1件の店舗レコードをCRUDできる。顧客ロールは他店データが見えない。(顧客ポータルの土台・顧客認証も本Phaseで用意し、成果/レポート/承認の各UIは Phase 4・6 で中身を実装)
→ 達成(2026-06-27 実地クリア)。本番 Supabase に 0003/0004 適用、顧客ポータルを Vercel 本番デプロイ、顧客テストユーザー作成+owner_user_id 紐付け、顧客/staff 両ロールのログインと RLS 分離(顧客=自店のみ・staff=全件)を本番で実証。Phase 2 完了。
残す証跡: スキーマ図/DDL、RLSポリシー、デプロイURL(管理アプリ・顧客ポータル)。
目的: content.json + テンプレHTML で店舗サイトを量産し、Cloudflare Pages へ自動デプロイできる状態にする。
手順
restaurant テンプレを基盤として整理({{#if}} 対応・GA計測同梱)04_サイトテンプレート/beauty/)し量産性を確認 ← 飲食店と同一JSONキー構成・別世界観デザインで量産性実証reservation_submit/電話タップ=phone_tap)をテンプレに標準同梱 ← ga4.measurement_id 設定時のみ出力(空なら非出力)06_スクリプト/publish_site.sh)← build_site.py+wrangler pages deploy。管理アプリのビルド機能としての接続は将来(現状はCLI)publish_site.sh を Pages プロジェクト自動作成つきに改善し1コマンド化。サンプル sakura-tei を本番公開=https://sakura-tei.pages.dev (HTTP 200・HTTPS自動)。Node は v22 スタンドアロンバイナリを PATH 前置きで使用(環境のv18を変えず)。トークンは Account/Cloudflare Pages/Edit 権限が必須(Read のみだと作成が Authentication error)wrangler pages domain add は実在しないコマンドと判明 2026-07-03。→ 05_業務手順書/独自ドメイン運用・移管手順.md))。方針確定(2026-06-28): 標準=サブドメイン(〇〇.musubiweb.com)、プレミアム=独自ドメイン(〇〇.com・取得代行)。解約時の移行対応は別途見積り。詳細は資料『ドメインの選び方ガイド』(ハブ pdf)・価格表に反映済musubi-admin aacfba0。/builder を実画面化(店舗ごとの content.json を Supabase 保存・編集/クイック編集+JSON全体/公開状況・ライブプレビュー iframe/content.json DL/公開CLIコマンド提示)。migration 0006_site_content.sql(stores に template/content/site_project/last_deployed_at)。tsc/lint/build 通過。ブラウザからの直接デプロイは次段(build の TS 移植+CF直アップロードAPI)使用サービス: Cloudflare Pages / Registrar / GitHub Actions(任意)/ GA4
受け入れ基準: 新規店舗のJSONを用意 → 1コマンド/1操作で公開サイトがHTTPSで立ち上がり、計測タグが動く。
→ コード面は達成(publish_site.sh で JSON→ビルド→Pages公開を1コマンド・計測タグはビルド検証で動作確認済)。残るはCloudflare認証トークン発行とドメイン割当(外部操作)。
残す証跡: 追加テンプレ(beauty/)、publish_site.sh、計測タグのビルド検証(空=非出力・id有=出力を確認)。
目的: 解約防止の武器「月次レポート」を、手作業を最小化して毎月生成・公開する。
手順
musubi-admin/app/api/cron/ingest-ga4/route.ts。案B(1プロパティ集約・hostNameで店舗識別)。前月分を runReport 2本(hostNameごとセッション/hostName×eventNameごとイベント数)で取得→stores.site_domainまたは<site_project>.pages.devでstore照合→reports に access_count(セッション)/phone_tap_count/reservation_count を upsert(comment/published_at/GBP系は非破壊)。認証は Workload Identity Federation(鍵レス)を採用 ← SAキー作成が組織ポリシーiam.disableServiceAccountKeyCreationでブロックされ、解除には組織レベル権限が必要だったため。Vercel OIDC(VERCEL_OIDC_TOKEN)を GCP STS で交換し SA になりすます。要 env: GA4_PROPERTY_ID・GCP_WIF_AUDIENCE・GCP_SA_EMAIL(ローカル検証はGA4_SA_JSON鍵も可・WIF優先)。WIF外部セットアップ完了・本番実通し確認済(2026-06-28)=本番 /api/cron/ingest-ga4 に Bearer $CRON_SECRET でアクセスし HTTP 200(period=2026-04/05/06)。hosts_seen:0 = VERCEL_OIDC→GCP STS→SAなりすまし→GA4 runReport が成功して結果0行(現状テストサイトのみで実訪問が無いため。コードは正常)。実店舗サイト公開+実訪問が乗れば自動で reports に書き込まれる09_データ基盤/.../0004_reports_metrics.sql(reports に reservation_count/phone_tap_count/inquiry_count/search_views/map_views を nullable 追加)Supabase本番へ適用済(2026-06-27・5カラム確認)musubi-portal 07c2b0a。/report を実画面化(最新 published レポートをデモ準拠UIで表示・前月比デルタ)。更新通知メール(Resend)実装済(管理/reportの公開トグルON時にsetReportPublished→notifyOwner→stores.owner_user_idのauth.usersメール宛にResend送信。RESEND_API_KEY未設定なら no-op)musubi-admin cad129c。/report で store×period のレポートを手入力 upsert・公開/非公開トグル。コメント欄を明示。現状は全指標が手入力(GA4/GBP 自動集計が乗れば人手はコメントのみになる)phone_tap(tel:クリック)・reservation_submit(フォーム送信)を gtag 送信済。案Bにつき measurement_id は運営共通値運用musubi-admin/vercel.json に 0 3 1 * *(毎月1日 03:00 UTC)で /api/cron/ingest-ga4 を叩く。Cronは Authorization: Bearer $CRON_SECRET を自動付与、route側で照合。手動実行は ?period=YYYY-MM で対象月上書き可使用サービス: GA4 Data API / GBP API / Vercel Cron / Resend
受け入れ基準: 1店舗ぶんのレポートが自動でデータ取得〜生成〜ポータル公開まで通る。手作業はコメント追記だけ。
→ 集計パイプライン・Cron・公開通知・WIF認証まで実通し確認済(2026-06-28・本番200)。GA4由来指標(access_count/phone_tap_count/reservation_count)は WIF で自動取得が稼働、GBP由来(review_count/avg_rating/reply_rate/search_views/map_views)は承認まで手入力。残る外部待ちは GBP API承認のみ(実データは実店舗サイト公開+実訪問で自動的に乗る)。
残す証跡: 自動生成されたレポート、Cron実行ログ。
現時点の証跡: 0004_reports_metrics.sql、管理 /report(作成・公開・公開時Resend通知)、ポータル /report(表示・前月比)、musubi-admin/app/api/cron/ingest-ga4/route.ts(GA4集計)、musubi-admin/vercel.json(月次Cron)。
目的: 月額の自動回収と未入金対応を仕組み化し、請求業務をゼロに近づける。
手順
06_スクリプト/stripe_setup_products.mjs(metadata.plan_key で冪等作成)を用意。料金の単一の正は musubi-admin/lib/plans.ts。スクリプト実行(price 作成)済(2026-06-28・test mode)=light/standard/premium の月額 Price(¥5,000/¥15,000/¥20,000)を作成し musubi-admin/.env.local の STRIPE_PRICE_* に設定musubi-admin 40bcb2b app/billing/actions.ts createSubscription(Customer→Subscription→contracts insert)createInitialFeeLink(one-time Price→Payment Link→リンクへ redirect・invoices open 記録)app/api/stripe/webhook/route.ts(署名検証+service-role で invoice.paid|payment_failed・subscription.updated|deleted を同期)。migration 0005_billing_sync.sql で contracts に stripe_price_id/current_period_end/last_payment_status 追加invoice.payment_failed で notifyPaymentFailed(store→owner_user_id→auth email を取得し lib/resend.ts 経由で送信。Stripe の hosted_invoice_url を案内 URL に同梱)。リトライは Stripe 既定の自動リトライに委譲。RESEND_API_KEY 未設定環境は no-op。実メール送信のテストは Stripe test 環境+キー投入時に実施使用サービス: Stripe / Vercel(Webhook)/ Supabase / Resend
受け入れ基準: テストモードで「契約→毎月課金→失敗時リトライ→解約」が一通り動き、状態がDBに同期される。
→ 実テスト完了・受け入れ基準クリア(2026-06-28)。0005 を Supabase 本番へ適用(contracts に3列追加・確認済)、stripe_setup_products.mjs で Price 作成、Stripe CLI stripe listen で本番 webhook secret を取得し next dev へ転送、stripe trigger で各イベントを発火。全分岐が実 DB に同期されることを実証=invoice.payment_succeeded→invoices(paid) 記録+contracts.last_payment_status='paid'、invoice.payment_failed→invoices(failed)+last_payment_status='failed'、customer.subscription.deleted→contracts.status='cancelled'。実テストで silent failure バグを発見・修正=webhook が supabase-js の {error} を未チェックで、invoice.paid の invoices insert が失敗しても contracts 側は paid に更新される状態だった(amount: inv.amount_paid が undefined で NOT NULL 違反)。各 insert/update の error を検査し失敗時 500(Stripe リトライ)、amount を amount_paid ?? amount_due ?? 0 にフォールバック、stripe_invoice_id で冪等化(既存はスキップ)。tsc/lint clean。Resend リトライ・未入金フロー・領収書は未実装(Phase 7)。(2026-06-28 追記・整合): 上記「silent failure 修正(error 検査/amount フォールバック/冪等化)」は当時 40bcb2b には未コミットだったことが後日判明。本日のコミットで webhook に実反映(recordInvoice で stripe_invoice_id 冪等+各 DB 失敗を throw→500 で Stripe リトライ、amount = amount_paid ?? amount_due ?? 0)し、併せて支払失敗時の Resend 案内(line 178)も実装した。
残す証跡: Stripeダッシュボードのテスト履歴、Webhookログ、状態遷移の確認。
現時点の証跡: musubi-admin 40bcb2b(app/billing/・app/api/stripe/webhook/・lib/plans.ts・lib/stripe.ts・lib/auth.ts・lib/supabase/service.ts)、0005_billing_sync.sql、06_スクリプト/stripe_setup_products.mjs。
目的: 口コミ承認をCLIからWeb(顧客ポータル)へ移し、店舗オーナー自身が承認できるようにする。
手順
musubi-portal /reviews。read は RLS 下 server client(owner=自店のみ)、write は service client+本人確認(IDOR ガード)。承認/文章修正/スキップの server actionflagged || rating<=2 で「要確認・慎重に」バッジ使用サービス: Next.js(ポータル)/ Supabase / GBP API / Vercel Cron
受け入れ基準: 店舗オーナーがポータル上で下書きを確認→承認→投稿でき、低評価には警告が出る。
→ 承認フロー(確認→承認/修正/スキップ・低評価警告)を本番で実証済(2026-06-28)=portal-demo で /reviews ログイン・承認/スキップが DB に反映(approved/skipped・下書き空は承認不可)。投稿(posted)は GBP API 承認後に Cron で実施=承認=投稿待ちキューまでが現状の到達点。
残す証跡: 画面スクショ、承認〜投稿の通しテスト。
目的: 公開後に落ちない・データを失わない運用基盤。
手順
getMonitors で全件 status=2(UP) 確認。無料プランは API 作成不可のためダッシュボード手動登録/api/cron/cost-alert)。死活監視の通知は UptimeRobot 側で設定cost_report)【実装済】・Stripe(balance_transactions.fee)【実装済】・Vercel(公式 Billing API は安定版なし→「未接続」表示で捏造回避)/api/cron/cost-alert を日次 Cron 化。cost_alerts(0007)で当月・同レベルを一度だけ送る冪等通知。Anthropic は Usage Limits も併用backup_restore_test.mjs で全テーブルJSONエクスポート→一時テーブル復元→件数一致(4/4)→一時テーブル削除を実証(本番無傷)ランブック.md に棚卸し・失効手順を記載構築ログ 隣に用意 ← 08_環境構築/ランブック.md使用サービス: UptimeRobot / Supabase / Vercel / Resend
受け入れ基準: 監視が通知を出せる。バックアップから復元できることを1度確認。
→ 達成(2026-06-28)。(1) コスト暴走通知=cost-alert を通し検証し Resend 送信+cost_alerts 記録+冪等を確認(cap一時0で強制発火・検証後復元)。(2) 死活監視=UptimeRobot 3モニタ登録・全件 UP・通知先紐付け確認。(3) 復元=論理バックアップ→一時テーブル復元の件数一致(4/4)を実証。Phase 7 完了。 残る運用整備(エラー通知の Slack 化・Pro バックアップ移行など)は本番スケール時に随時。
残す証跡: 監視設定、復元テストの記録。
ここまで到達したら、営業で獲得した顧客を本番投入してスケールフェーズへ移る。
環境構築(Phase 0–7)で道具は揃ったが実顧客ゼロのため、「稼げるサービス」への再構築を行う。
ターゲットを食べログ掲載 × Google高評価 × 公式サイト無しの飲食店に特化し、受注導線・テンプレ品質・GBP実投稿・商品設計を刷新する。他業種はカスタム(個別見積)でスポット対応。金額は据え置き(初期5/10/15万・月額5,000/15,000/20,000円)。
目的: 口コミ実投稿の前提となる GBP API の実疎通を確認し、アカウント/ロケーションIDを確定する。
手順
gbp-review-reply で npm run auth を実行し OAuth 認可(token.json 取得)← 2026-07-03 ユーザー実施。refresh_token grant での access_token 取得成功(TOKEN_OK)GBP_ACCOUNT_ID / GBP_LOCATION_ID を取得し .env に設定 ← ブロック: accounts.list が RESOURCE_EXHAUSTED(Requests per minute)。初回リクエスト・70秒後再試行とも同エラー=クォータ0固定=GBP API 利用申請が未承認(OAuth は正常)。承認されるとクォータが付与され通るGBP_MODE=live で実 location の listReviews 成功を確認 ← 上記待ち次のアクション(ユーザー): GBP API 申請ステータスの確認。申請時の返信メール(Google Business Profile API アクセス申請)を確認、未返信なら https://support.google.com/business/contact/api_default から問い合わせ。Cloud Console → API とサービス → mybusinessaccountmanagement.googleapis.com → 割り当て で Requests per minute が 0 のままか確認できる(project 361193620042)。
受け入れ基準: 実店舗 1 location の口コミ一覧が live で取得できる。
目的: 金額据え置きのまま、プラン内容・訴求を飲食店の意思決定単位に再定義する。
手順
price_sheet.py): プラン特典を飲食特化(Google口コミ表示・食べログ/Instagram導線・送客手数料0円予約・季節LP)+カスタム枠(他業種スポット・保守任意)追記proposal_decks.py): 飲食店主向けに刷新(公式の受け皿・手数料削減・Before/After・出典付き統計のみ使用)利益試算の前提と根拠.md に商品パッケージ前提(§0)を追記musubi-demos/pdf/ 差し替えmusubi-admin/lib/plans.ts 整合確認(プラン名・金額のみのため変更不要)受け入れ基準: 価格表・提案資料が飲食特化文言で再生成でき、金額・特典がアプリ側と一致。数値は全て出典付きか「試算」明記。
→ 達成(2026-07-03)。PDF 実描画確認済(レイアウト崩れなし・TableCheck 2022 出典表記あり)。
目的: 売り物の見た目を受注水準に引き上げ、テンプレの二重管理を解消する。
手順
lib/templates/src → 04_サイトテンプレート/ へ逆輸入、sync_templates.py で pages.json 生成)← 両レンダラ(build_site.py / render.ts)の出力バイト一致を確認。build_site.py の {{this}} 非互換バグも修正aiFill.ts スキーマ拡張+builder テンプレ選択に登録 ← TEMPLATE_DEFS 6種(5テンプレ+custom)theme 標準キー(accent/accent_dark/bg/ink/font_head/font_body → 各テンプレ内部CSS変数へマッピング)と custom_head / custom_css / custom_html 自由注入枠受け入れ基準: 飲食4+generic の5テンプレが build_site.py と admin builder の両方でビルドできる。口コミは実データが無ければ非表示。
→ 達成(2026-07-03)。5テンプレ×4変種(既定/テーマ変更/テーマ削除/custom_css)=32ビルド警告ゼロ、admin npm run build 通過。
目的: 「Musubi 自身の公式サイトが無い」状態を解消し、営業を仕組み化する。
手順
07_マーケサイト/ に musubiweb.com 本体LP新設(課題訴求→デモ→料金→FAQ→相談フォーム)← 1280px/390px スクリーンショット検証済musubi-www へ公開(2026-07-03)← Formspree f/xykqlyvw 設定・https://musubi-www.pages.dev HTTP200・フォーム配線を実確認musubi-admin/scripts/demo-pipeline.ts(Places→AI流し込み→デモ公開→CSV に demo_url 追記。noindex+デモ注記必須)← --dry-run で実店舗1件の生成実証(Places実データ・noindex・注記バナー確認)。Places の曖昧一致があるため公開前ブラウザ確認を手順書に明記0008_leads_demo.sql 作成+ CRM 画面にデモURL列 ← 本番適用は未(SUPABASE_ACCESS_TOKEN 必要)。適用まで /crm は demo_url 列不存在でエラーになるため、admin の本番反映(push)前に必ず適用05_業務手順書/先作りデモ営業手順.md 新設(商談終了時のデモ削除まで)受け入れ基準: LP が公開されフォーム送信できる。CSV 1行から1コマンドでデモURLが生成され CRM に記録される。
目的: 口コミ返信を「承認=投稿待ちキュー」から実投稿まで通し、月額の中核価値を完成させる。
手順
GBP_REFRESH_TOKEN に保管(Internal audience・無期限。token 取得関数は差し替え可能に分離)← R0 の OAuth 認可(ユーザー操作)待ちmusubi-admin/lib/gbp.ts 新設(gbp-review-reply の v4 実装を TS 移植)← fetch 直の refresh_token grant・メモリキャッシュ・ページネーション対応sync-reviews(listReviews → upsert)/ cron post-replies(approved のみ投稿・投稿前 validateDraft 再実行・成功で posted)← postReply 呼び出しは post-replies の1箇所のみ、クエリは status='approved' 限定を grep 確認。migration 0009_gbp_sync.sql(reviews.gbp_review_name 1列)作成・未適用vercel.json cron を Hobby 2件制限内に統合(2026-07-03)← /api/cron/daily(0 1 * * * ・ cost-alert→sync-reviews→generate-drafts→post-replies を直列実行・GBP env 未設定ステップは skipped で続行・失敗ステップがあっても後続継続)+ /api/cron/ingest-ga4(月次)の計2件。旧 route は手動実行用に残置。実挙動テスト済(401/実行順/skip/失敗継続)。注: daily は maxDuration=300(Fluid Compute 前提・60s 制限環境なら要調整)受け入れ基準: 実店舗1件で 取得→下書き→ポータル承認→実投稿→GBP画面に返信表示 の一周。approved 以外が投稿される経路が無い。
目的: 見せる面(ハブ・デモ・資料)を飲食特化の商品構成に揃える。
手順
musubi-demos/index.html 再構成(飲食テンプレ最上段・業態ラベル・デザイン見本節へ降格・新価格表PDF)← 本体LPリンクは公開後に追加(未デプロイのため未掲載)。相対リンク42件の実在全数確認02_デモサイト の billing / builder デモ画面を新価格・新テンプレ選択に整合(build_admin.py)← 再生成差分は billing/builder の2ファイルのみ受け入れ基準: ハブから新LP・全テンプレ・新価格表に到達できる。旧価格の表示が残らない。
🧭 社内ドキュメント(環境構築の証跡・手順)。Musubi / local-web-sales プロジェクト。