Erik KurjakAI Product Engineer
← All work

Carvago / AI CMS Migration

Rethinking the CMS after an acquisition.

I owned Carvago’s CMS strategy and implementation: introducing Contentful, bringing in Instamotion’s content after the acquisition, and migrating to a self-hosted Strapi setup when the economics changed.

Role
Senior Frontend Engineer
Stack
Next.js · TypeScript · Contentful · Strapi

01 / Ownership

Build the foundation. Own what comes next.

When I introduced Contentful, Carvago was not using a CMS. I took ownership of the strategic implementation and established the processes around it, giving the company a foundation for managing and publishing content.

The acquisition of Instamotion changed the scope. Its website was built around Contentful, with more than 10,000 pages and around 100,000 components to bring into Carvago’s setup. I owned the next stage too: researching the options, discussing the direction with our CTO, and carrying the migration through to a system the teams could use.

pages in the migration scope
10,000+
content components to migrate
100,000

02 / The decision

The acquisition changed the economics.

The initial plan was to move Instamotion’s pages and components into Carvago’s Contentful setup. At that volume, our monthly cost would rise from around €800 to €3,200. That increase was unacceptable for us, so I started researching alternatives and discussed the findings with our CTO.

We identified self-hosted Strapi as a viable direction, with hosting at roughly $75 per month. It meant taking responsibility for operating the CMS ourselves, but gave us a much more affordable foundation for the combined content estate.

Original Contentful setup
€800 / month

Approximate monthly cost before consolidation

Expanded Contentful setup
€3,200 / month

Projected monthly cost with the acquired content

Self-hosted Strapi
~$75 / month

Approximate monthly hosting cost

Project figures at the time of the decision. Contentful subscription costs and Strapi hosting costs have different scopes; currencies are shown as quoted.

03 / First migration

Bring everything into one place first.

The move happened in two stages. First, I migrated Instamotion’s content into Carvago’s Contentful setup, including its pages, components, and all environments. That consolidation was successful and brought everything into the Carvago CMS before the move to Strapi.

The second stage was much harder. The existing component structures did not map directly to Strapi. A successful transfer needed to preserve how pages were assembled, including deeply nested components and the dependencies between them.

04 / Content models

A migration between two different structures.

I found ways to move content from Contentful to Strapi, but the component structures inherited from Instamotion were not compatible with a straightforward migration. Moving the records was only part of the work; the relationships and nesting also had to make sense in the destination model.

These vendor interface examples show the editing environments involved. The migration work sat behind those interfaces: translating the existing content model so that the same pages could be rendered from Strapi.

05 / Migration engineering

Follow every component and its dependencies.

Before starting the Strapi migration, I built an automation to capture page screenshots. Those snapshots gave me a visual baseline to compare against the migrated pages, so I could check the rendered result as well as the transferred data.

I then wrote TypeScript scripts that recursively called the Contentful API and the Strapi API. The scripts followed nested components and their dependencies, transforming the content into the structure needed by the new CMS. A component could contain other components several levels deep, so the migration had to preserve those relationships throughout the page.

Even with AI helping me write the scripts, this work took more than a week. The difficult part was understanding and translating the content structure well enough for the pages to look as they should. The snapshot automation provided a way to compare that outcome visually.

06 / Team adoption

Make the new CMS usable beyond engineering.

Once the pages were working, the teams could start writing blog posts and adding content components in Strapi. I wrote documentation explaining how to use the CMS and create components, and held walkthrough meetings to demonstrate the process.

That handover was part of the implementation. The migration needed to leave people with a clear way to create and maintain content, as well as a working website.

07 / Rendering & SEO

Connect the CMS to the public website.

Carvago used Next.js with server-side rendering, and I used that approach for all blog posts. The content was rendered on the server and delivered as HTML, giving the blog a foundation for search-engine indexing.

I also handled sitemaps and the related SEO setup. Publishing in Strapi needed to result in a page that worked correctly on the Carvago website and could be discovered by search engines.

08 / AI-assisted publishing

From a prompt to a blog page.

Alongside the migration, I helped create a system that could generate blog pages from a prompt, using Strapi to bring that content onto Carvago’s website.

AI supported two different parts of the work: helping me develop the migration scripts, and helping the team create content through the new CMS. Both depended on the content structure and publishing integration being in place.

09 / Outcome

A sustainable CMS and a team ready to use it.

The work took Carvago from its first CMS implementation through an acquisition-driven consolidation and into a self-hosted Strapi setup. The pages were working, the teams could publish content, and the documentation and walkthroughs supported their day-to-day use.

My ownership spanned the platform decision, migration engineering, visual comparison tooling, website integration, and team adoption. The result was a CMS foundation with hosting at around $75 per month, instead of the projected €3,200 monthly Contentful cost.

Visit Carvago ↗