画面カタログ Screen catalog

マーケティングポータルに存在する全画面の一覧です。URL・目的・主要操作・呼び出す API を記載しています。 ルーティングのソース・オブ・トゥルースは web/portal/marketing/src/App.tsxAuthenticatedRoutes()

A complete inventory of every screen in the marketing portal — with URL, purpose, key actions, and the API endpoints each page calls. The routing source-of-truth is AuthenticatedRoutes() in web/portal/marketing/src/App.tsx.

画面 = 薄い page wrapper: Screens are thin page wrappers: src/pages/ 直下に存在する実画面は LoginPage / DashboardPage / PlaceholderPage の 3 つだけで、その他のルートは src/features/{x, instagram-legacy, newsletter, campaigns, content, content-pool, calendar, analytics, assets, system, settings, notifications, coming-soon}/pages/ 配下のコンポーネントを直接マウントしています。PlaceholderPage は phase ラベル + 説明だけのスタブ画面です。 Only three real page modules live in src/pages/: LoginPage, DashboardPage, and PlaceholderPage. Every other route mounts a component from src/features/{x, instagram-legacy, newsletter, campaigns, content, content-pool, calendar, analytics, assets, system, settings, notifications, coming-soon}/pages/. PlaceholderPage is a stub that only renders a phase label and a note.

画面マップ Screen map

flowchart LR
  Login([/login]) -->Dash([/ Dashboard])

  Dash -->Articles[/articles]
  Articles -->ArticleNew[/articles/new]
  Articles -->ArticleEdit[/articles/:id/edit]
  Articles -->ArtCat[/articles/categories]
  Dash -->Ads[/ads]
  Ads -->AdNew[/ads/new]
  Ads -->AdEdit[/ads/:id]
  Dash -->Assets[/assets]
  Dash -->Notif[/notifications]

  Dash -->NL[/newsletter]
  NL -->Subs[/newsletter/subscribers]
  NL -->BC[/newsletter/broadcasts]
  BC -->BCNew[/newsletter/broadcasts/new]
  BC -->BCEdit[/newsletter/broadcasts/:id]

  Dash -->IG[/instagram]
  IG -->IGPosts[/instagram/posts]
  IG -->IGCal[/instagram/calendar]
  IG -->IGPostTpl[/instagram/post-templates]
  IG -->IGTpl[/instagram/templates]
  IG -->IGCat[/instagram/categories]
  IG -->IGTags[/instagram/tags]
  IG -->IGInsights[/instagram/insights]
  IG -->IGComp[/instagram/competitor]

  Dash -->X[/x]
  X -->XPosts[/x/posts]
  XPosts -->XPostNew[/x/posts/new]
  XPosts -->XPostEdit[/x/posts/:id]
  X -->XCal[/x/calendar]
  X -->XTpl[/x/templates]
  X -->XAutoSch[/x/automation/schedule]
  X -->XAutoListen[/x/automation/listen]
  X -->XInsights[/x/insights]
  X -->XComp[/x/competitor]

  Dash -->Cal[/calendar]
  Dash -->Camp[/campaigns]
  Camp -->CampNew[/campaigns/new]
  Camp -->CampEdit[/campaigns/:id]
  Dash -->Pool[/content-pool]

  Dash -->Ana[/analytics]
  Ana -->AnaArt[/analytics/articles]
  Ana -->AnaAds[/analytics/ads]

  Dash -->AI[/ai-providers]
  Dash -->Int[/integrations]
  Dash -->Stores[/stores]
  Dash -->Brand[/brand]
  Dash -->Users[/users]
  Dash -->Settings[/settings]

パブリック画面(認証前) Public screens (pre-auth)

URL 目的Purpose
/loginメール + パスワードで Supabase Auth 認証。未認証ユーザーはここにリダイレクト。Email + password auth via Supabase. Unauthenticated users redirected here.

MAIN — ダッシュボード MAIN — Dashboard

URL 目的・主要操作Purpose & key actions 主な APIKey APIs
/ マーケ KPI 4 タイル(2x2 grid、≤1024px で 1 列): SnsMetricsTile / PostCalendarTile / ArticlePvTile / AdCtrTile。各タイルが個別の dashboard サブ endpoint を叩く。4 KPI tiles in a 2x2 grid (collapses to 1 column at ≤1024px): SnsMetricsTile, PostCalendarTile, ArticlePvTile, AdCtrTile. Each tile calls its own dashboard sub-endpoint. GET /v1/marketing/dashboard/sns-metrics
GET /v1/marketing/dashboard/post-calendar?year&month
GET /v1/marketing/dashboard/articles-pv?period
GET /v1/marketing/dashboard/ads-ctr
ダッシュボードの実データ状況: Dashboard data reality check: SnsMetrics は cron 未稼働で 0 埋め (PARKY-SNS-SNAPSHOT-INGEST)、PostCalendar の IG 側は mirror table 未実装で 0 (PARKY-IG-MIRROR)、ArticlesPv は GA4 連携前で view_count 累積上位 10 件 (PARKY-GA4-INTEGRATION)、AdsCtr のみ DB 実数。各レスポンスの _meta.synced / _meta.reason で同期状態を返します。 SnsMetrics returns zero-filled series until the snapshot cron lands (PARKY-SNS-SNAPSHOT-INGEST). PostCalendar IG side is 0 pending the IG mirror table (PARKY-IG-MIRROR). ArticlesPv falls back to top-10 cumulative view_count until GA4 ingest (PARKY-GA4-INTEGRATION). Only AdsCtr reflects real DB values. Inspect _meta.synced / _meta.reason in each response.

CONTENT — コンテンツ管理 CONTENT — Content management

URL 画面名Screen 目的・主要操作Purpose & key actions 主な APIKey APIs
/articles記事一覧Articles記事の一覧。カテゴリ・ステータス・日付でフィルタ。新規作成ボタンあり。List articles. Filter by category, status, or date. New article button.GET /v1/marketing/articles
/articles/categories記事カテゴリArticle categoriesカテゴリの CRUD。code をパス引数として識別(PATCH ではなく PUT)。CRUD for article categories. Identified by code path param (uses PUT, not PATCH).GET /v1/marketing/article-categories
POST /v1/marketing/article-categories
GET /v1/marketing/article-categories/{code}
PUT /v1/marketing/article-categories/{code}
DELETE /v1/marketing/article-categories/{code}
/articles/new記事作成New articleリッチテキストエディタで記事作成。カテゴリ・タグ・カバー画像・公開日時を設定。Create article with rich text editor. Set category, tags, cover image, and publish date.POST /v1/marketing/articles
/articles/:id/edit記事編集Edit article既存記事の編集・公開・下書き保存・削除。Edit, publish, save as draft, or delete existing article.PATCH/DELETE /v1/marketing/articles/:id
/ads広告一覧Ads広告バナーの一覧。ステータス・掲載期間でフィルタ。List ad banners. Filter by status or display period.GET /v1/marketing/ads
/ads/new広告作成New ad広告バナーの作成。画像・リンク先・掲載期間・掲載場所を設定。Create ad banner. Set image, link, display period, and placement.POST /v1/marketing/ads
/ads/:id広告編集Edit ad既存広告の編集・削除。掲載ステータスの変更。Edit or delete existing ad. Change display status.PATCH/DELETE /v1/marketing/ads/:id
/assetsアセットライブラリAsset library画像・動画・ドキュメントの一元管理。R2 へアップロード。タグ付き検索。Centralized media storage. Upload to R2. Tag-based search.GET /v1/marketing/assets
POST /v1/storage/upload-url
/notificationsマーケ運用通知センターMarketing notification centerマーケチーム内向けの通知(キャンペーン開始 / 配信完了 / 自動投稿エラー等)を一覧・既読化・削除。エンドユーザーへの push 配信機能ではない。In-app notification center for the marketing team (campaign starts, dispatch results, automation errors). Not a tool for sending push to end users.GET /v1/marketing/notifications
GET /v1/marketing/notifications/summary
POST /v1/marketing/notifications/{id}/read
POST /v1/marketing/notifications/mark-all-read
DELETE /v1/marketing/notifications/{id}

CONTENT — ニュースレター CONTENT — Newsletter

URL 画面名Screen 目的・主要操作Purpose & key actions 主な APIKey APIs
/newsletterニュースレター HUBNewsletter hub概要と subscribers / broadcasts への動線。Overview tile linking to subscribers / broadcasts.GET /v1/marketing/newsletter/subscribers/summary
/newsletter/subscribers購読者一覧Subscribers購読者の CRUD・タグサマリ・状態別件数・ダブルオプトイン再送。Subscriber CRUD, tag summary, status counts, double-opt-in re-confirmation.GET /v1/marketing/newsletter/subscribers
GET /v1/marketing/newsletter/subscribers/tag-summary
GET /v1/marketing/newsletter/subscribers/summary
POST /v1/marketing/newsletter/subscribers
PUT /v1/marketing/newsletter/subscribers/{id}
DELETE /v1/marketing/newsletter/subscribers/{id}
POST /v1/marketing/newsletter/subscribers/verify-reconfirm
/newsletter/broadcasts配信一覧Broadcastsdraft / scheduled / sending / sent / failed / canceled をフィルタ表示。Filter by draft / scheduled / sending / sent / failed / canceled.GET /v1/marketing/newsletter/broadcasts
/newsletter/broadcasts/new配信作成New broadcastHTML + テキスト本文 / 件名 / 対象を設定して draft 作成。送信は dry-run トグル + 件数モーダル必須。Compose HTML + text / subject / audience as a draft. Sends require dry-run toggle + recipient-count modal.POST /v1/marketing/newsletter/broadcasts
/newsletter/broadcasts/:id配信編集 / 送信ライフサイクルEdit & send lifecycleテスト送信 → 予約 → 即時送信 → 取消 → 複製。実送信は cron EVERY_MINUTEhandleNewsletterBroadcast 経由で Resend。Test → schedule → send-now → cancel → duplicate. Real dispatch happens via handleNewsletterBroadcast on the EVERY_MINUTE cron through Resend.GET /v1/marketing/newsletter/broadcasts/{id}
PUT /v1/marketing/newsletter/broadcasts/{id}
POST /v1/marketing/newsletter/broadcasts/{id}/send-test
POST /v1/marketing/newsletter/broadcasts/{id}/schedule
POST /v1/marketing/newsletter/broadcasts/{id}/send-now
POST /v1/marketing/newsletter/broadcasts/{id}/cancel
POST /v1/marketing/newsletter/broadcasts/{id}/duplicate

SNS — Instagram (instagram-legacy) SNS — Instagram (instagram-legacy)

現状は admin alias の旧 instagram-legacy: Currently the admin-aliased instagram-legacy stack: /v1/marketing/instagram/posts/v1/marketing/instagram/templates 等は admin handler の alias mount で、Supabase 直管理の旧 IG キャンペーン CRUD を使い回しています。/instagram/instagram/calendar/instagram/insightsPlaceholderPage(route tree のみ)。投稿エディタ・テンプレート・カテゴリ・タグ・competitor は features/instagram-legacy/pages/ の実画面で動作中。Instagram Graph API 連携は Phase 5。 /v1/marketing/instagram/posts, /v1/marketing/instagram/templates, etc. are mounted as aliases of the admin handler — they reuse the legacy IG campaign CRUD stored directly in Supabase. /instagram, /instagram/calendar, and /instagram/insights are PlaceholderPage stubs (route tree only). The editor, templates, categories, tags, and competitor screens live in features/instagram-legacy/pages/. Instagram Graph API hookup is Phase 5.
URL 画面名Screen 目的・主要操作Purpose & key actions 実装状態Status
/instagramIG ダッシュボードIG dashboardInstagram 全体の統計サマリー(予定)。Instagram overall stats summary (planned).PlaceholderPage (Phase 3)
/instagram/posts投稿(旧 CampaignsPage)Posts (legacy CampaignsPage)Instagram 投稿(カルーセルキャンペーン)の管理。features/instagram-legacy/pages/CampaignsPage.tsx を /instagram/posts に再配置。Manage Instagram posts (carousel campaigns). Powered by features/instagram-legacy/pages/CampaignsPage.tsx mounted at /instagram/posts.live
/instagram/posts/:id投稿エディタPost editorスライドエディタ・AI 生成・PNG/ZIP エクスポートを含む投稿エディタ。Slide editor with AI generation and PNG / ZIP export.live
/instagram/calendar予約カレンダーBooking calendar投稿予約のカレンダービュー(予定)。Calendar view for scheduled IG posts (planned).PlaceholderPage (Phase 3)
/instagram/post-templates投稿テンプレートPost templatesInstagram 投稿文のテンプレート CRUD。CRUD for Instagram caption / post templates.live
/instagram/templatesスライドテンプレートSlide templatesカルーセル投稿用スライドテンプレートの管理。Manage slide templates for carousel posts.live
/instagram/categoriesカテゴリ管理CategoriesInstagram 投稿のカテゴリ CRUD。CRUD for Instagram post categories.live
/instagram/tagsタグ管理TagsInstagram 投稿のタグ CRUD。CRUD for Instagram post tags.live
/instagram/insightsインサイトInsightsInstagram Graph API からインサイトを取得(予定)。Pull insights from Instagram Graph API (planned).PlaceholderPage (Phase 5)
/instagram/competitor競合分析Competitor競合アカウントの公開情報を分析。Analyze public data from competitor accounts.live

SNS — X (Twitter) SNS — X (Twitter)

URL 画面名Screen 目的・主要操作Purpose & key actions 主な APIKey APIs
/xX ダッシュボードX dashboard登録済み X アカウントを横断して投稿状況・自動化稼働状況を表示。アカウント切替に x_accounts を使用。Cross-account view of post status and automation activity. Account switcher reads x_accounts.GET /v1/marketing/x/accounts
GET /v1/marketing/x/posts?status=…
GET /v1/marketing/x/automation-log
/x/postsポスト一覧PostsX ポスト一覧。status (draft / scheduled / publishing / published / failed / canceled の 6 値) ・account_id・本文 ILIKE 検索。List X posts. Filter by status (6-value enum: draft / scheduled / publishing / published / failed / canceled), account_id, and body ILIKE search.GET /v1/marketing/x/posts
/x/posts/newポスト作成New postテキスト・メディアを入力して draft 作成。Compose text + media; saved as draft.POST /v1/marketing/x/posts
/x/posts/:idポスト編集 / 予約 / 即時公開Edit / schedule / publish-nowdraft / scheduled の更新と物理削除、status 遷移は専用 verb で安全側に分離。Update draft / scheduled rows and hard-delete. Status transitions are split into dedicated verbs for safety.PUT /v1/marketing/x/posts/{id}
DELETE /v1/marketing/x/posts/{id}
POST /v1/marketing/x/posts/{id}/schedule
POST /v1/marketing/x/posts/{id}/publish-now
/x/calendar予約カレンダーCalendarscheduled ポストを月/週ビューで確認。Month / week view of scheduled posts.GET /v1/marketing/x/posts?status=scheduled
/x/templatesポストテンプレートTemplatesX ポスト用キャプションテンプレート。FE のみ: 専用 BFF endpoint は未提供で、テンプレートは marketing_assets / content_pool 経由で管理。X-post caption templates. Front-end only: no dedicated BFF endpoint; templates are managed through marketing_assets / content_pool.
/x/automation/schedule自動投稿ルールAuto-post schedule rules曜日・時間帯・コンテンツプールを指定した定期投稿ルール。handleXScheduleRuleFire cron が EVERY_MINUTE で発火。Recurring auto-post rules by day / time / content pool. Fired by the handleXScheduleRuleFire cron (EVERY_MINUTE).GET /v1/marketing/x/schedule-rules
POST /v1/marketing/x/schedule-rules
PUT /v1/marketing/x/schedule-rules/{id}
PATCH /v1/marketing/x/schedule-rules/{id}/toggle
DELETE /v1/marketing/x/schedule-rules/{id}
/x/automation/listen監視&自動リアクションListen & auto-reactキーワード監視ルールとマッチ時アクション(いいね / リプライ / RT)。handleXListen cron が 5 分毎に発火。Keyword monitoring rules with auto-react (like / reply / RT). Driven by the handleXListen cron (every 5 min).GET /v1/marketing/x/listen-rules
POST /v1/marketing/x/listen-rules
PUT /v1/marketing/x/listen-rules/{id}
PATCH /v1/marketing/x/listen-rules/{id}/toggle
DELETE /v1/marketing/x/listen-rules/{id}
GET /v1/marketing/x/automation-log
/x/insightsインサイトInsights期間別インプレッション・エンゲージメント・フォロワー推移。scaffold: BFF は現状 stub。実集計は handleXInsights cron (10 分毎) が x_posts を更新する経路で稼働。Period-based impressions / engagement / follower trend. scaffold: BFF currently returns a stub. Live ingestion runs via the handleXInsights cron (every 10 min) which updates x_posts rows.GET /v1/marketing/x/insights
/x/competitor競合分析Competitor競合 X アカウントの登録・削除と公開メトリクス追跡。Register / remove competitor X accounts and track public metrics.GET /v1/marketing/x/competitors
POST /v1/marketing/x/competitors
DELETE /v1/marketing/x/competitors/{handle}

SNS — 将来対応 (Placeholder) SNS — Coming soon (Placeholder)

URL プラットフォームPlatform 状況Status
/threadsThreadsPlaceholder(将来対応予定)Placeholder — planned for future
/tiktokTikTokPlaceholder(将来対応予定)Placeholder — planned for future
/youtubeYouTubePlaceholder(将来対応予定)Placeholder — planned for future
/lineLINE 公式Placeholder(将来対応予定)Placeholder — planned for future

CAMPAIGNS — キャンペーン管理 CAMPAIGNS — Campaign management

URL 画面名Screen 目的・主要操作Purpose & key actions 主な APIKey APIs
/calendar横断カレンダーCross calendarfrom-to 範囲の X / Newsletter / IG-legacy / 記事公開を 1 画面に集約。Single view of X / newsletter / IG-legacy / article-publish events in a from-to window.GET /v1/marketing/calendar?from&to
/campaignsキャンペーン一覧Campaignsstatus / 期間 / channel フィルタ。items_count は LIMIT 後 ANY+GROUP BY で後付集計。Filter by status / date range / channel. items_count is computed post-LIMIT via ANY() + GROUP BY (no N+1).GET /v1/marketing/campaigns
/campaigns/newキャンペーン作成New campaign名前・目的・期間 (start_date / end_date)・初期 status を設定。active 作成時は marketing_notifications を best-effort で発火。Set name, goal, date range, initial status. Creating with status='active' fires a best-effort marketing_notifications entry.POST /v1/marketing/campaigns
/campaigns/:idキャンペーン編集Edit campaign編集・削除に加え、関連コンテンツ (article / ad / x_post / newsletter) のリンク追加・解除と metrics 取得。Update / delete plus linked-item add / remove (article / ad / x_post / newsletter) and metrics fetch.GET /v1/marketing/campaigns/{id}
PUT /v1/marketing/campaigns/{id}
DELETE /v1/marketing/campaigns/{id}
POST /v1/marketing/campaigns/{id}/items
DELETE /v1/marketing/campaigns/{id}/items/{item_kind}/{item_ref}
GET /v1/marketing/campaigns/{id}/metrics
/content-poolコンテンツプールContent poolarticle / ad / x_post / newsletter を横断検索する再利用候補ビュー。X 自動投稿ルールから参照。専用テーブルは存在せず、検索結果ビューロジックです。Cross-search of article / ad / x_post / newsletter rows for reuse. Referenced by X auto-post rules. No dedicated table — this is a search view.GET /v1/marketing/content-pool
GET /v1/marketing/content-pool/suggest

ANALYTICS — アナリティクス ANALYTICS

URL 画面名Screen 目的・主要操作Purpose & key actions 主な APIKey APIs
/analytics統合レポートSummary report期間指定の総括 (default = 直近 30 日 UTC) + チャネル別。GA4 取込前は articles.view_count 累積値で代替。Period summary (default = last 30 days UTC) + cross-channel slice. Falls back to cumulative articles.view_count until GA4 ingest lands.GET /v1/marketing/analytics/summary
GET /v1/marketing/analytics/cross-channel
/analytics/articles記事パフォーマンスArticle analytics記事別 PV ランキング(最大 ARTICLE_RANKING_MAX_LIMIT)。GA4 連携前は累積値。Per-article PV ranking (capped at ARTICLE_RANKING_MAX_LIMIT). Cumulative fallback until GA4 hookup.GET /v1/marketing/analytics/articles
/analytics/ads広告配信レポートAd delivery report広告ごとの impressions / clicks / CTR。Per-ad impressions / clicks / CTR.GET /v1/marketing/analytics/ads

SYSTEM — システム設定 SYSTEM — Configuration

URL 画面名Screen 目的Purpose 主な APIKey APIs
/ai-providersAI プロバイダー(読取専用)AI providers (read-only)登録済み AI プロバイダー一覧の閲覧。CRUD は admin portal 側 (/v1/admin/ai-providers) で行うため、Marketing portal 専用の ai-providers endpoint(/v1/marketing 配下)は存在しないView-only listing of AI providers. CRUD lives in the admin portal (/v1/admin/ai-providers); there is no dedicated ai-providers endpoint under /v1/marketing.GET /v1/admin/ai-providers
(admin alias)
/integrations外部連携IntegrationsX / Resend / GA4 等の接続設定。秘匿フィールドは AES-GCM 暗号化保管。OAuth start/callback と GA4 SA JSON 投入は /oauth/* + /integrations/ga4X / Resend / GA4 connection config. Secret fields stored AES-GCM encrypted. OAuth start/callback and GA4 SA JSON upload sit on /oauth/* + /integrations/ga4.GET /v1/marketing/integrations
PUT /v1/marketing/integrations/{provider}
GET /v1/marketing/oauth/meta/start / /v1/marketing/oauth/x/start / /v1/marketing/oauth/search-console/start
同 callback 群
POST /v1/marketing/integrations/ga4/upload-sa-json
/storesApp Store / Play StoreStoresストア連携設定の取得・更新と手動同期。scaffold: 同期 cron は未稼働で /sync_meta stub を返す。Get / update store integration config and trigger manual sync. scaffold: no scheduled handler — /sync returns a stub _meta.GET /v1/marketing/stores/{store}
PUT /v1/marketing/stores/{store}
POST /v1/marketing/stores/{store}/sync
/brandブランド設定Brandmarketing.marketing_brand のロゴ / ブランドカラー / フォントを管理。Manage marketing.marketing_brand (logo / colors / fonts).GET /v1/marketing/brand
PUT /v1/marketing/brand
/usersユーザー管理(参照)Users (view)マーケポータルにアクセスする admin ユーザー一覧を表示。招待・編集・削除は admin portal で実施(権限管理は admin の RBAC を共有)。Lists admin users with marketing portal access. Invite / edit / delete happen in the admin portal; RBAC is shared with the admin RBAC.read via admin alias
/settingsポータル設定Portal settings通知・テーマ・タイムゾーン等のクライアント側設定。サーバ永続化はなし。Client-side preferences (notifications, theme, timezone). Not server-persisted.

CONTENT — アセット CONTENT — Assets

URL 画面名Screen 目的・主要操作Purpose & key actions 主な APIKey APIs
/assetsアセットライブラリAsset library画像・動画・PDF を Cloudflare R2 へ presigned PUT でアップロード → confirm で marketing_assets 行確定 → メタ更新/削除。Upload images / video / PDF to Cloudflare R2 via presigned PUT, then confirm to materialize the marketing_assets row; metadata edits / deletes available.GET /v1/marketing/assets
POST /v1/marketing/assets/upload
POST /v1/marketing/assets/{id}/confirm
GET /v1/marketing/assets/{id}
PUT /v1/marketing/assets/{id}
DELETE /v1/marketing/assets/{id}

アクティビティログ(ヘッダ表示) Activity log (header dropdown)

画面ルートはなく、AppLayout のヘッダから読み込まれる活動履歴 (marketing_activity_log) です。

No standalone route — surfaced from the AppLayout header. Reads marketing_activity_log.

用途Purpose 主な APIKey APIs
マーケ運用の活動履歴フィードMarketing-ops activity feed GET /v1/marketing/activity

レガシー URL リダイレクト Legacy URL redirects

以下の旧パスは Instagram セクション配下のパスへ 301 リダイレクトされます(Instagram ツールのリファクタリング前の URL)。

The following old paths redirect (301) to their Instagram-section equivalents, preserved from the pre-refactor Instagram tool.

旧 URLOld URL リダイレクト先Redirects to
/posts/instagram/posts
/posts/:id/instagram/posts/:id
/post-templates/instagram/post-templates
/templates/instagram/templates
/categories/instagram/categories
/tags/instagram/tags
/competitor/instagram/competitor