--- title: "Payload CMS — Custom Admin Panel Location" aliases: [payload-admin-route, payload-custom-route, payload-admin-location] tags: [payload-cms, nextjs, admin-panel, routing, configuration] sources: [raw/admin__admin-panel-location.md] created: 2026-05-15 updated: 2026-05-15 --- # Payload CMS — Custom Admin Panel Location Payload is flexible about where the Admin Panel lives in a Next.js App Router project. You can rename the route, nest it deeper, or co-locate it with custom admin dashboards. ## Default Folder Structure ``` app/ (or src/app/) └── (payload)/ ├── admin/ │ ├── [[...segments]]/ │ │ ├── not-found.tsx │ │ └── page.tsx │ └── importMap.js ← auto-generated, never edit manually ├── api/ │ └── [...slug]/route.ts ├── custom.scss └── layout.tsx ← safe to edit despite the "DO NOT MODIFY" warning ``` ## Scenario 1 — Rename the Route (`/admin` → `/dashboard`) 1. **Config:** ```ts buildConfig({ routes: { admin: '/dashboard' } }) ``` 2. **Move folder:** `mv app/(payload)/admin app/(payload)/dashboard` 3. **Update `layout.tsx` import:** ```ts import { importMap } from './dashboard/importMap.js' ``` 4. Restart dev server. ## Scenario 2 — Move the Entire `(payload)` Folder Moves both Admin UI and REST API under a custom prefix (e.g. `/admin/content`). > **Gotcha:** `(payload)/admin/` is a Next.js route segment, so placing `(payload)` at `app/admin/content/(payload)` gives you `/admin/content/admin`, not `/admin/content`. **Config:** ```ts buildConfig({ routes: { admin: '/admin/content/admin', api: '/admin/content/api', graphQL: '/admin/content/api/graphql', graphQLPlayground: '/admin/content/api/graphql-playground', }, admin: { importMap: { baseDir: path.resolve(dirname, './src/app/admin/content/(payload)'), importMapFile: path.resolve( dirname, './src/app/admin/content/(payload)/admin/importMap.js', ), }, }, }) ``` **Steps:** 1. `mkdir -p app/admin/content && mv app/(payload) app/admin/content/(payload)` 2. Verify `layout.tsx` import path (usually stays `'./admin/importMap.js'`) 3. `pnpm payload generate:importmap` ## Scenario 3 — Multiple Admin Dashboards ``` app/admin/ ├── content/(payload)/ ← Payload CMS ├── platform/ ← custom admin └── page.tsx ← landing page choosing between admins ``` Same config as Scenario 2; just add your custom routes alongside `(payload)`. ## Auto-Generated vs Safe-to-Edit Files | File | Auto-Generated? | Safe to Edit? | |------|----------------|--------------| | `layout.tsx` | No (created once by create-payload-app) | **Yes** — update import paths here | | `admin/importMap.js` | **Yes** (startup, HMR, manual cmd) | **No** — configure via `admin.importMap` | | `admin/[[...segments]]/page.tsx` | No | Rarely needed | | `api/[...slug]/route.ts` | No | Rarely needed | | `custom.scss` | No | Yes | > **Note:** The "DO NOT MODIFY" comment in `layout.tsx` is misleading — it was generated once during `create-payload-app` and Payload **never** overwrites it. Safe to edit import paths. ## `importMap.js` Regeneration Triggers - App startup (dev or prod build) - HMR (when component files change) - `pnpm payload generate:importmap` (manual) Never edit `importMap.js` directly — configure paths via `admin.importMap.baseDir` / `importMapFile`. ## Troubleshooting | Symptom | Fix | |---------|-----| | Import map not found | Check `admin.importMap.importMapFile` is absolute; run `pnpm payload generate:importmap` | | `layout.tsx` import error | Path must be relative from `layout.tsx` → `importMap.js`; verify after folder move | | Admin panel 404 | Verify `routes.admin` matches actual folder structure; ensure entire `(payload)` was moved | | Custom components not loading | Check `admin.importMap.baseDir`; regenerate import map | ## Key Takeaways - `routes.admin` in Payload config **must match** the actual Next.js folder path. - When you rename/move `admin/`, update the `import { importMap }` line in `layout.tsx`. - Moving `(payload)` deeper adds its subfolder names to the URL — plan the nesting accordingly. - `importMap.js` is always auto-generated; configure its location via `admin.importMap`, never edit the file. - `layout.tsx` is **safe to edit** despite the generated-file warning. - After any folder move, run `pnpm payload generate:importmap` to be safe. ## Related Articles - [[wiki/tech-patterns/payload-cms-installation|Payload CMS — Installation & Setup]] - [[wiki/tech-patterns/payload-cms-access-control-overview|Payload CMS — Access Control Overview]] - [[wiki/tech-patterns/payload-cms-admin-accessibility|Payload CMS — Admin Panel Accessibility]] - [[wiki/tech-patterns/nextjs-fastapi-fullstack|Next.js + FastAPI Fullstack Pattern]] ## Sources - `raw/admin__admin-panel-location.md` - https://payloadcms.com/docs/admin/admin-panel-location