Skip to main content

Brands (retired)

Retired

This page has been retired. Brands now live inside Client detail, in the Brands tab.

  • Route: /admin/brands
  • Guard: /admin/* layout — authenticated + isAdminTier() (super_admin, admin, account_manager); lower roles are redirected to /portal, unauthenticated to /login?callbackUrl=/admin.
  • Screenshot: none — the route never renders a page. A live visit 302s to /admin/clients (verified in capture run; the duplicate screenshot was deleted).

What this route is now​

/admin/brands is no longer a standalone page. The route file (src/app/admin/brands/page.tsx) is a one-line server redirect to /admin/clients, kept alive only so old links and bookmarks do not 404. The redirect is unconditional and carries no query parameters.

Where brand management actually lives​

Brand CRUD moved to two per-client surfaces, both rendering the same shared section component:

  1. Admin side — /admin/clients/[slug]?tab=brands: the "Brands" tab of the client detail page (see the P21 doc, admin-client-detail.md). This is where an operator creates, renames, and removes brands for a tenant.
  2. Marketing side — /marketing/settings "Brands" tab: the same client-sections component mounted inside Marketing Settings, so a client-scoped user manages the same records without entering /admin.

Both surfaces write through the same admin brands API (/api/admin/brands), so there is one brand list per client regardless of which surface edited it. Brands feed the brand filter rail on the main marketing report (/marketing) and brand-scoped breakdowns.

Why the cross-client page was removed​

The old page listed brands across all tenants, but every real workflow is per-client (brands only mean something inside one client's account). The consolidated client detail hub (/admin/clients/[slug]) became the single onboarding surface, and the cross-client list was retired rather than maintained in parallel — consistent with the repo's one-source-of-truth rule. The redirect targets the client list because the route has no way to know which client the visitor wanted.

Behavior summary​

AspectValue
HTTP behaviorServer-side redirect('/admin/clients') (Next.js, 307/302)
Query paramsNot preserved (none were meaningful on the old page)
Nav entryNone — removed from src/lib/nav.ts; the Admin section lists Clients, Users, Sync Health, ClickUp Audit, MCP Guide, System only
Rendering modeforce-dynamic, no cache

Key files​

File / endpointRole
src/app/admin/brands/page.tsxThe redirect (whole page)
src/app/admin/clients/[slug] + src/components/admin/client-sections/Where the Brands tab now lives (shared with Marketing Settings)
src/app/api/admin/brands/Brands CRUD API used by the per-client tab
src/app/admin/layout.tsxAdmin-tier guard for the route

Verification​

Confirmed against both the live site (capture run: /admin/brands → /admin/clients, duplicate screenshot deleted) and the source (src/app/admin/brands/page.tsx contains only the redirect() call).