Content management integration
Headless CMS Integration
Contentful, Sanity, Strapi, Payload or WordPress as a headless source - wired into the App Router with typed content, caching that matches how editors work, and preview that keeps the cache.
A headless CMS integration goes wrong in the same three places every time, and none of them is the CMS. The content is untyped, so a field rename becomes a runtime error in production. The caching is wrong, so editors publish and wait. And preview either does not work or works by making every route dynamic.
What we build
Typed content, end to end. The CMS schema generates TypeScript types, and
the fetch layer parses what comes back rather than asserting it. A renamed
field then fails at the build or at the edge with a message that names it -
not three components later as undefined is not a function.
Caching that matches how editors work. Content is tagged, not
time-revalidated. A webhook from the CMS clears the tag for what changed, and
the page updates in seconds without making the route dynamic. The alternative -
revalidate: 60 everywhere - means editors wait a minute and your origin
takes traffic it did not need to.
Preview that does not cost you the cache. Draft mode on the preview route only, scoped to the editor's session, so the published route stays static for everyone else. Editors see unpublished content; visitors get the CDN.
A block model that survives. Most projects model content as pages with fixed fields, and then marketing asks for a layout the model cannot express. We model composable blocks from the start, with the renderer typed against the block union so an unhandled block is a compile error rather than a blank space.
Which CMS
We are not tied to one, and we will tell you when the one you picked is wrong for what you are doing - but this is rarely the interesting question. The integration is most of the work and it is largely the same shape whichever you choose.
If you are migrating off WordPress and keeping it as the editing surface, that works: WordPress as a headless source with Next.js rendering is a legitimate architecture and often the cheapest path, because the editors keep the tool they know.
What we need from you
Access to the CMS and someone who can answer "what is this field for". The second is more important than the first - a content model that mirrors an old template rather than the actual content is the thing that makes the rebuild expensive, and it is worth an hour of conversation before any code.
How it is scoped
Give us read access to the CMS and half an hour with the person who can say what each field is for. That conversation sizes the project more accurately than the page count.
The scope comes back with the content model, either confirmed or redrawn, plus the template list, the preview and revalidation approach, and a price. It is signed before the build starts. Where the model needs reshaping, that is its own phase with its own number, because it is the part that quietly doubles a project when it is left implicit.
Then the build, deployed per phase, with editors using preview before the front end is finished.
What you receive
The front end, the typed content layer between it and the CMS, the preview path working for editors, and revalidation wired to the CMS webhooks so a publish appears without anybody redeploying.
The part people underestimate is the content model. Where it needed reshaping you get the new one documented, with the migration that moved the existing entries into it, because a model nobody wrote down drifts back within a year.
When content is fetched and how long it is held decides whether the integration feels fast or fragile, and it is a content-model decision as much as a caching one. A CMS-driven site also generates its own URLs, so canonicals and the sitemap have to be produced and not maintained. Where the site already ranks and cannot move, technical SEO runs alongside.
