Moving an AEM Site to Contentful
Project Spotlight: retargeting an automated AEM migration from Payload CMS to Contentful in days, to show a prospect a simpler, lower-cost stack.
Same Migration, Different CMS
A global hospitality group was looking for a way off Adobe Experience Manager (AEM). AEM's licensing is expensive and the platform takes a specialist team to run, so the group asked us to show what its brand websites would look like on a simpler, lower-cost stack. We had already migrated one of its hotel brand sites, about 80 pages, with our Automated CMS Migration tool: it captured the live site, rebuilt every component in React and loaded the content into Payload CMS.
Then the brief changed. The prospect preferred Contentful, a hosted CMS, so it would have no CMS servers of its own to run. Rather than capture the site again, we pointed the existing migration at Contentful, moved the images to Cloudinary, and had the site running from both within days.
At a Glance
About 80 Pages, Two Kinds of AEM
Brand pages built by a headless AEM app, and hotel pages built from classic AEM templates.
Retargeted, Not Redone
The content model and components from the Payload migration became the starting point for Contentful. Nothing was captured twice.
32 Content Types
A model that copied AEM row for row needed about 120 content types and 26,000 entries. The second pass brought it to 32 types and under 1,000 entries.
Three Image Systems Become One
AEM Assets stored the images, Scene7 cropped them and Akamai Image Manager optimized them for delivery. Cloudinary does all three, so hundreds of images moved there, with every named crop recreated.
Publish Is Instant
Pages are pre-rendered and cached. Publishing in Contentful refreshes only the pages that use the changed content.
Checked After Every Change
After each change to the model, every page's content in Contentful was compared with the source, and every page's HTML with its previous render.
The Challenge: Fitting AEM Into Contentful
Adobe Experience Manager
A page is a tree of components, each holding the values an author set in its dialog, along with layout and styling settings that rarely change. Some of these pages were served by a headless app reading AEM's JSON page model; others were rendered by classic AEM templates.
Contentful
Content lives as entries of typed content types, linked to each other and to assets. Each plan caps the number of content types and locales, so a model that mirrors AEM component by component may not fit at all.
How It Worked
The first migration had already done the hard part: turning a live AEM site into structured content and React components. Moving to Contentful meant carrying that structure into a different CMS, then reshaping it to suit Contentful and the authors who would use it.
Pass One: Generate the Model and Import
A model generator turned the Payload schema into Contentful content types, within the plan's limit on how many types a space can hold. An importer then loaded every page through the Contentful Management API. Each entry has a predictable ID, so running the import again updates entries in place and skips anything unchanged.
Pass Two: Reshape It for Editors
A faithful copy of AEM is not a good Contentful model. Hotel pages that always show the same sections became one hotel entry instead of a stack of blocks. Links, images and brand logos became shared types instead of a copy per component. Navigation, interface text and facts that belong in a property system moved out of page content.
Move the Images to Cloudinary
On the AEM site, images passed through three services: AEM Assets, Scene7 and Akamai Image Manager. Every image was uploaded from Scene7 to Cloudinary, which stores, crops and optimizes in one place. Scene7's named crops became Cloudinary named transformations, measured from the live crops, and each image's usage rights came along as structured metadata. A single setting serves the same pages from either Scene7 or Cloudinary, so the two could be compared side by side.
Publish to the Live Site
The Next.js front end serves pre-rendered pages. When an editor publishes, a webhook works out which pages use the changed entry and refreshes only those, after confirming Contentful is already serving the new version. Editors also get live preview, with each block on the page linked to the entry behind it.
What We Took Away
- The savings come from what you stop running. A hosted CMS removes CMS servers and their upkeep, and one media service replaces three. Those reductions, not the CMS licence alone, are what make leaving AEM pay off.
- A good migration outlives its target CMS. Because the first migration produced structured content, not copied pages, changing the destination content platform only took days to complete.
- Count content types against the plan early. Copying AEM component for component would have needed about 120 content types, far past what most Contentful plans allow. Designing for the limit from the start avoids a rebuild later.
- Settings and data aren't content. AEM pages carry layout settings that never change and facts that belong in other systems. Leaving them out of the CMS is what makes the model usable for editors.
- Prove every change. Comparing every page's content with the source, and its HTML before and after, meant the model could be restructured while the demo site was live without breaking a page.