- Millions
- of nodes moved
- D7 → D10
- monolith to modern, one estate
- 0
- records lost — counts reconciled every run
Drupal 7 to modern Drupal is not an update — it's a re-platforming wearing an update's name. Field storage changed, entity references changed, the theme layer changed completely. What survives is the data, and only if the migration treats the data as the entire point.
The client's estate had years of accumulated content models: nested references, field collections, editorial workflows encoded in the structure itself. The rebuild was the easy half. Moving the history without breaking a single relationship was the job.
Custom migration paths over the migrate UI defaults
Millions of nodes with deep entity-reference webs — the default paths flatten what the business logic depends on. Hand-built migrations preserve the relationships the defaults discard.
Counts as the contract
Every entity type reconciled source-to-destination, every run. A migration that "looks done" and a migration whose numbers match are different claims; only one survives an audit.
Increments against a live site
The site kept publishing through the whole migration. Delta runs picked up new content; the cutover window was measured in minutes, not weekends.
Behat tests standardized across the shop
An untested migration is a rumor. The test suite became the agency standard afterward — the migration paid for its own guardrails.
Facing the same trip?
The Drupal upgrade assessment(from $2,500) maps your version of this journey module by module — and the Peace of Mind program keeps the destination from ever becoming a departure point again.