Move Content Between Environments

Transport packages the entries, assets, categories, and globals you choose into a portable .zip — then imports them into another Craft CMS site, resolving every reference by UID so nothing breaks when IDs differ.

Works with 15+ Craft plugins & field types

$99 one-time license fee + $79/year for updates

Transport
15+

Plugins & Field Types Supported

Transport handles every element and field out of the box for self-contained values, and adds dedicated handlers wherever a plugin embeds environment-local IDs — so your relations survive the trip. Handlers load only when the host plugin is installed.

Craft core

Supported & tested

Entries, categories, tags, users, assets, addresses, globals

Matrix

Supported & tested

Nested entries serialized recursively

Relations

Supported & tested

Entries, assets, categories, tags, users — IDs ↔ UIDs

Asset files

Supported & tested

Real file bytes bundled and recreated in the target volume

Verbb Hyper

Supported & tested

Element links made fully portable

FreeLink

Supported & tested

Relations-backed link targets rewritten as UIDs

FreeNav

Supported & tested

Menu-handle field values — portable as-is

Craft Commerce 5

Supported & tested

Products & variants (orders, inventory & pricing out of scope)

Google Maps

Supported & tested

Address fields; environment-specific owner keys stripped

SEOMatic

Supported & tested

SEO, OG & Twitter image references made portable

Verbb Navigation

Supported & tested

Nodes migrate with element links, custom URLs & nesting

Formie

Supported & tested

Form definitions and submissions (form resolved by handle)

Solspace Calendar

Supported & tested

Events with dates, recurrence rules & author

Neo

Experimental

Block-based field handler

Super Table

Experimental

Block-based field handler

Using a plugin that isn’t listed? Self-contained field values already work via the generic handler — and you can register your own element or field handlers without modifying Transport. See the extending guide →

How It Works

Export a portable package on one site, import it on another. Every reference is resolved by UID, so nothing breaks when IDs differ.

# On staging — export the content you choose
$ craft transport/export --types=entries,assets --site=default --output=content.zip
Serializing elements ████████████████████ 100% (142/142)
Wrote package: content.zip — 142 elements + 38 asset files
# On production — preview without touching anything
$ craft transport/import content.zip --dry-run
Import report — dry run (nothing saved) · 6.2s
  Added 118 · Updated 24 · Skipped 0 · Failed 0
# Looks good — run it for real
$ craft transport/import content.zip
Import report — completed · 11.4s · every element listed
Snapshot #42 saved — roll back any time.
1

Export

Pick a site, the element types, optionally a section, and whether to bundle asset files. The export runs in the background; collect the .zip from History.

2

Configure

Review every element with its action — Add, Update, or Unchanged — and choose which to import. Pre-flight validation flags missing schema.

3

Preview

See field-level changes side by side. Uncheck any field to keep the target’s current value. Run a dry run first if you like.

4

Run

The import runs on the queue, so it can’t time out. You get a detailed report — and an email if you want one. Every import is snapshotted first, so a one-click rollback is always available.

Features

Everything you need to move content safely between Craft CMS environments.

Portable Packages

Every export is a .zip of human-readable JSON — a manifest.json plus per-type element files — with real asset files bundled alongside. Inspect it, version it, hand it off. It’s independent of any single environment.

UID-Based Identity

Relations, authors, parents, and Matrix/Hyper links are all stored as UIDs and resolved to local IDs on import. No fragile ID mapping, no broken references when the same content has different IDs on each site.

Recognizes Content You Already Have

The same page often exists on both environments with completely different UIDs — a single created independently on each, or content that predates Transport. Instead of duplicating it (or failing outright when Craft can’t make its URI unique), Transport recognizes it by its natural key — a single’s section, a slug within its section, an asset’s filename — and updates it. You see exactly what was matched before you run.

Automatic Dependency Ordering

A topological sort imports each element only after the elements it depends on — structure parents, authors, and relations — with cycle detection built in. You never have to think about import order.

Field-Level Diff & Selective Merge

Review each changed field side by side — current value vs. incoming — and accept or reject it individually before importing. Keep the target’s value on the fields you want to leave alone.

Asset File Transfer

Transport bundles the real files from any volume and recreates them in the target — not just the asset metadata. Or export metadata only when the files already live in the destination.

Multi-Site Support

Per-site title, slug, enabled status, and field values travel with the package, with optional site mapping so you can move content between sites that don’t share the same handles.

Never Times Out

Control panel exports and imports run on Craft’s queue, so the size of your content set stops being a constraint — no request timeouts, no half-finished imports, no babysitting a spinner. Queue it, walk away, and let Transport email you the report when it lands.

Reports That Tell You Everything

Every run records what happened to each element — added, updated, skipped, or failed — with the reason for every skip and failure, a breakdown per element type, and how long it took. Read it in the control panel, in your inbox, or streaming live in your terminal.

Snapshot-Based Rollback

Every import is snapshotted before it runs. If something looks wrong, roll it back with one click — updated elements return to their prior state and created elements are removed. Rollbacks are themselves reversible.

Full CLI

Script exports, imports, history, and rollbacks straight from the command line — perfect for CI pipelines and scheduled deployments. Console runs never queue: they work synchronously with a live progress bar and finish with the full report, so you can watch exactly what a deployment did.

Frequently Asked Questions

Common questions about Transport.

The $99 one-time fee gives you a single-site license for Transport, including every feature: portable .zip packages, UID-based reference resolution, automatic dependency ordering, field-level diff and selective merge, asset file transfer, multi-site support, queue-backed exports and imports with completion emails, detailed run reports, snapshot-based rollback, the full CLI, and all built-in plugin integrations. You also get one year of updates.

After the first year you can renew for $79/year to keep receiving updates and new features. If you choose not to renew, your installed version keeps working — you just won’t get updates.

No. Transport moves content, not schema. Sections, fields, entry types, volumes, and global sets are managed by Craft’s Project Config. Deploy your Project Config first, then use Transport for the content. Its pre-flight validation checks that the required schema already exists in the target before importing.

Every reference — relations, authors, structure parents, Matrix and Hyper links — is stored as a UID rather than a numeric ID. On import, Transport resolves each UID to the matching element’s local ID in the target site. That’s why content keeps working even when the same entry has a different ID on each site.

Transport works with any self-contained field out of the box, plus dedicated, tested handlers for Craft core element types, Matrix, relations, asset files, Verbb Hyper, FreeLink, FreeNav, Craft Commerce 5, Google Maps, SEOMatic, Verbb Navigation, Formie, and Solspace Calendar — with experimental handlers for Neo and Super Table. Handlers load only when the host plugin is installed. See the integrations guide for the full list and status of each.

Yes. Every import is snapshotted before it runs. From Transport → History you can roll back a completed import with one click — updated elements return to their prior state and elements the import created are deleted. Rollbacks are themselves snapshot-protected, so they can be undone too.

Yes. Transport has a full CLI for exports, imports (including dry runs), history, and rollbacks — ideal for CI pipelines and scheduled deployments. Anything the control panel can do, the CLI can do.

Products and variants are supported and tested — product type, SKU, base price, dimensions, tax and shipping categories, and custom fields. Orders, inventory levels, and catalog pricing are intentionally excluded — that data is environment-specific and shouldn’t be copied between sites.

No. Control panel exports and imports run as queue jobs rather than in the request, so the size of your content set isn’t a constraint — queue it, leave the page, and pick up the finished package or report in Transport → History. Tick “email me when it finishes” and it comes to your inbox instead. Console runs are synchronous by design, streaming live progress to the terminal so you can watch a deployment work.

Transport updates it rather than adding a second copy. Content routinely exists on two sites with unrelated UIDs — a single created independently on each, or content that predates Transport — so when a package element’s UID isn’t found, Transport matches the element that already exists by its natural key: a single’s section, a slug within its section or group, an asset’s filename in its folder, a user’s email. Matched elements are flagged in the import wizard before you run, and you can switch the behavior off for strict UID-only identity.

A detailed report of every element — added, updated, skipped, or failed — with the reason behind each skip and failure, a breakdown per element type, and how long it took. It’s stored with the run in Transport → History, printed at the end of every CLI run, and emailed to whoever started a queued run.

Transport requires Craft CMS 5.3 or later, PHP 8.2 or later, and the PHP ext-zip extension. It supports both MySQL and PostgreSQL databases.

Ready to ship content with confidence?

Get Transport for your Craft CMS project today.

$99 one-time license · $79/year for updates