Brands (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:
- 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. - Marketing side —
/marketing/settings"Brands" tab: the sameclient-sectionscomponent 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
| Aspect | Value |
|---|---|
| HTTP behavior | Server-side redirect('/admin/clients') (Next.js, 307/302) |
| Query params | Not preserved (none were meaningful on the old page) |
| Nav entry | None — removed from src/lib/nav.ts; the Admin section lists Clients, Users, Sync Health, ClickUp Audit, MCP Guide, System only |
| Rendering mode | force-dynamic, no cache |
Key files
| File / endpoint | Role |
|---|---|
src/app/admin/brands/page.tsx | The 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.tsx | Admin-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).