You are viewing beta documentation for Navigation 4.x.
Migrations
Migrating from Navkit
If your Craft site runs Navkit (opens new window) (jainilnagar/navkit), Navigation can copy menus and node structure without modifying Navkit data — similar to Formie's plugin migrations (opens new window).
Prerequisites
- Install both Navkit and Navigation on the same Craft site.
- Back up your database and project config.
- Run the migration on staging first.
Control panel
- Go to Navigation → Settings.
- Under Migrations, choose Navkit.
- Select the menus to migrate (or choose All).
- Optionally enable Skip existing handles if you do not want to overwrite menus that already exist in Navigation.
- Click Migrate Menus and review the per-menu output log. Click Done when finished.
Console
# All Navkit menus
php craft navigation/migrate/navkit
# Specific handle(s)
php craft navigation/migrate/navkit --handle=mainMenu,footerMenu
# Skip menus whose handles already exist in Navigation
php craft navigation/migrate/navkit --skip-existingWhat is migrated
| Navkit | Navigation |
|---|---|
| Menus and handles | Menu name, handle, site settings |
| Entry, category, asset, product links | Matching element-backed node types |
| URL links | Custom node type |
| Passive links | Passive node type |
| Nested structure | Parent/child tree preserved |
Node CSS classes, target="_blank" | classes, newWindow |
rel attribute | customAttributes |
| Per-menu node custom fields | Node field values on the primary site |
| Multi-site propagation | Per-site menu settings |
If an element-backed node no longer has a resolvable linked element, it is converted to a Custom URL node and a warning is logged.
Manual follow-up
| Navkit feature | Notes |
|---|---|
| Per-menu node field layouts | Field values are copied when the same custom fields exist on the Navigation menu layout; add matching fields to the Navigation menu before migrating if needed |
| Menu field layouts | Navkit has no menu-level fields — not applicable |
| GraphQL / template clients | Update to Navigation's craft.navigation.render() or craft.navigation.nodes() |
Handle collisions
When a Navigation menu with the same handle already exists, the migrator creates a new menu with a numeric suffix (for example mainMenu1).
Template mapping
{# Navkit #}
{{ craft.navkit.render('mainMenu') }}
{# Navigation #}
{{ craft.navigation.render('mainMenu') }}Related
Last updated: July 9, 2026, 11:29:19 PM