Model Before Platform
We work out your content types and relationships first. The platform decision follows from that, not the reverse.
A content management system is only as good as its content model. Get that right and editors publish without a developer; get it wrong and every new page is a support ticket. We do custom CMS development by starting from how your team actually works, then choosing the platform — traditional, headless or bespoke — that fits it.
Most CMS frustration is a modeling problem wearing a platform costume. Changing tools rarely fixes it.
We work out your content types and relationships first. The platform decision follows from that, not the reverse.
Meaningful fields with guardrails, not a blank canvas that breaks the design on the first edit.
Content stored as data rather than as HTML soup, so it can be reused across channels later.
Existing content mapped and moved deliberately, with URLs and redirects handled during the build.
Written for the people who will publish, covering the specific quirks of your build.
A CMS is judged by the people who use it every day, not by the people who chose it. These checks reflect that.
These are system checks. Publishing volume and traffic outcomes come from your own analytics; we do not publish figures for other clients' content operations.
Four decisions, made in this order. Choosing a platform before modeling the content is how projects go wrong.
Discuss a Project →Types, fields and how they relate.
What editors can change, and what they cannot break.
Traditional, headless or hybrid delivery.
Roles, workflow, review and publishing rules.
Model, build, migrate and hand over.
What content exists, how it relates, and who edits it — turned into content types, fields and relationships. This is the decision the whole build inherits.
Traditional CMS, headless, or a custom system, chosen against your publishing volume, team skills and channel requirements rather than a house preference.
Fields, validation and preview built so publishing is a matter of filling in meaningful inputs rather than rebuilding layouts each time.
The components your content genuinely needs, with constraints that keep pages on-brand without policing.
Permissions, draft and review states, and scheduled publishing configured for how your team actually approves work.
Existing content mapped and moved, with URL structure and redirects planned during the build rather than at launch.
Where content feeds other systems or channels, delivery is built as an interface — see API development for that side of the work.
Written for editors, covering your specific model rather than generic platform help.
If WordPress is already the answer, [WordPress development](/services/web-development/wordpress/) covers that path directly. This page is for cases where the content model is the hard part.
The right content system depends almost entirely on the shape of the team using it and the rhythm they work to.
Several items a day, multiple contributors, and a review stage that has to be enforced rather than remembered.
Translations that need their own workflow and their own state, rather than being a field copied at the end.
Versioned content where the previous state still matters, and where search inside the site does more work than navigation.
Campaign pages built and retired quickly, from components, without a developer being on the critical path.
Structured specifications feeding comparison tables and filters — closer to a database than to an article.
One system, several front ends, shared components and content that belongs to a specific brand rather than all of them.
Content structure first, platform second, editing experience treated as a design problem.
What exists, what is duplicated, what nobody has touched in three years. Migration scope and modeling both come out of this.
Content types, fields and relationships defined against how the content is actually used — not mirrored from the current page structure.
Traditional, headless or custom, argued from the model and your team rather than assumed at kickoff.
Fields, validation, preview and workflow, tested with the people who will actually use them.
Content moved, redirects verified on staging, documentation written for editors, and support through the first publishing cycle.
Most organizations are well served by an existing CMS configured properly. These are the cases where more is genuinely justified.
Publishing takes longer than writing. That is a modeling problem rather than a training problem, and training will not fix it.
A website, an app, a newsletter and a partner feed that all need the same content and currently get three copies of it.
Legal review, regional approval or scheduled embargoes that currently live in email and get missed.
A headless setup makes sense when the presentation layer is expected to be replaced while the content outlives it.
If WordPress modeled properly covers it, that is the cheaper and better-supported answer, and we will say so.
Teams usually blame the platform. The cause is almost always upstream of it.
A traditional CMS manages content and renders the website. A headless CMS manages content and serves it through an API, leaving presentation entirely to whatever consumes it.
Headless is genuinely better when the same content feeds multiple channels — website, app, kiosk, partner feed — or when the front end needs a framework the CMS does not natively support. It gives content teams one place to publish and developers freedom on delivery.
It costs you the built-in things. Preview, page-level layout control and "what will this look like" all have to be built rather than assumed. For a team whose only channel is one website, that is usually a poor trade, and a well-modelled traditional CMS serves them better.
Nearly always because the content model does not match how they think about content. If editors have to disassemble what they want to publish in order to fit the fields available, every publish is friction.
The other frequent cause is the opposite extreme: a single rich-text field where everything goes. That feels flexible on day one and produces inconsistent pages, unreusable content and a design that degrades with every edit.
Good modeling sits between those. Enough structure that content is data rather than a blob, enough flexibility that editors are not blocked by a field nobody anticipated. Getting there requires talking to editors before building, which is the step that most often gets skipped.
Rarely, and less often than agencies propose it. Existing platforms cover most requirements, and a custom system is expensive to build and expensive forever after, because you own every line of it.
It becomes reasonable when the content model is genuinely unusual — complex relationships, domain-specific workflow, or integration so deep that a general-purpose CMS would be fought at every turn. It also makes sense where content management is itself part of the product rather than support for it.
For most businesses the honest recommendation is a well-configured existing platform with custom fields and components. That is not a lesser answer; it is the same outcome at a fraction of the lifetime cost.
Mostly through what it lets editors control and how it renders. A CMS that hides title tags, meta descriptions, headings or URL structure from editors makes routine SEO work a developer ticket, which means it does not happen.
Rendering matters more with headless. Content delivered by API and assembled client-side can be invisible to crawlers unless the front end is server-rendered or prerendered. That is an architecture decision made early, and expensive to reverse — the same technical SEO problem that catches JavaScript-heavy sites generally.
The other lever is publishing velocity. A model that lets a content team publish consistently without developer involvement compounds over years, and that is worth more than most individual technical optimizations.
More than the comparison articles suggest, and it buys things that are genuinely valuable to some organizations and irrelevant to others.
The gains are real: content becomes reusable across several front ends, the presentation layer can be rebuilt without touching the content, and the editing interface is independent of the site. For an organization publishing to a website, an app and a partner feed, that is transformative.
The costs are also real. Preview becomes something you have to build rather than something you have. Two systems have to be deployed and maintained instead of one. And the simple act of adding a page can require work in both.
The question we ask is whether content genuinely serves more than one destination today, or whether it might one day. "Might one day" is usually not enough to justify the ongoing cost, and traditional systems can be moved later with far less pain than the architecture diagrams imply.
By writing down what actually happens now, including the informal steps, before deciding what the system should enforce. The workflow on the org chart and the workflow in practice are rarely the same document.
Most content passes through fewer real states than people assume — usually draft, review and published, with an occasional scheduled state. Systems that model eleven states end up with everything sitting in one of them because the rest are too much effort.
Permissions follow states. Who can move something from review to published is the decision that matters; everything else is detail. Getting it wrong in either direction is costly: too loose and unreviewed content goes live, too tight and one person becomes a bottleneck for the whole team.
Notifications are the part most often skipped and most often missed once it is working. A review state nobody is told about is just a place work goes to wait.
With a reconciliation count, not a spot check. The question is not whether the import ran, it is whether every item that existed before exists afterwards, with its relationships intact.
Migrations expose how the old content was really structured, which is almost never how anyone believed it was structured. Fields used for two different purposes, categories applied inconsistently, and a decade of formatting decisions embedded in the body text are normal findings.
That is why the mapping happens before the import rather than during it. Every field in the old system gets a decision: mapped, transformed, split, or deliberately dropped. The dropped list is reviewed by someone who owns the content, because that is where the arguments live.
URLs come last and matter most. A content migration that changes paths without a complete, tested redirect map is the most reliable way to lose accumulated search visibility — which is why we treat it as technical SEO work rather than a development detail.
Fields that match the way they think about the content, and constraints that prevent mistakes rather than rules that ask them not to make any.
A good sign is that the editing screen looks like the thing being edited. An event has a date field, a location field and a capacity field, not a rich-text box with a convention about where to put the date. The convention is always broken eventually, usually by whoever joined most recently.
The second sign is that impossible states are impossible. If an item cannot be published without an image, the system should say so at the point of publishing, not produce a broken layout for visitors to find.
The third is that the interface does not offer options that do not apply. Every field an editor has to skip is a small tax paid on every item forever, and the total across a year is larger than anyone estimates.
By storing it once and referencing it, rather than copying it and hoping the copies stay in step. They do not.
The pattern that works is a reference field. A case study exists as one item; a service page points at it. Change the case study and every page showing it updates, because they are all reading the same source rather than holding their own version.
The complication is context. The same item may need a short summary on a listing page, a longer one on a related-content block and its full form on its own page. That is solved by storing all three as fields on the item, not by writing three copies in three places.
What to avoid is embedding content inside other content. Once a testimonial exists as pasted text inside five different pages, there is no way to update it, no way to count where it appears, and no way to remove it reliably when the client asks you to.
Preview should show exactly what a visitor will get, including the surrounding page. Anything less and editors publish to check, which turns the live site into the staging environment.
This is the single most common complaint about headless setups, and it is a solvable problem rather than an inherent one — but it is work that has to be planned and budgeted rather than assumed to come with the system.
Scheduling needs to cover unpublishing as well as publishing. Campaign pages, seasonal offers and time-limited content all need an end date, and without one they stay live until somebody notices, which can be a long time.
The related case is content that should stop being promoted without disappearing. An expired offer that returns a 404 loses whatever links it accumulated; one that stays reachable with a clear notice and a route onward keeps them, and treats the visitor better.







Designing and building the system your team publishes through — content modeling, editor experience, custom fields and components, workflow and permissions, migration and integration. It is distinct from installing a CMS and configuring a theme.
Headless when the same content feeds several channels or the front end needs a specific framework. Traditional when there is one website and preview and layout control matter. Headless costs you built-in preview and page-level control, which is a poor trade for single-channel teams.
Yes. Content is audited, mapped to the new model and moved, with URL structure and redirects planned during the build. Migration scope depends heavily on how structured the existing content is.
A short handover, yes — but the goal is a system that does not need much. If editors need extensive training to publish a standard page, the model is wrong and training is compensating for it.
Occasionally, when the content model is genuinely unusual or content management is part of the product. For most businesses a well-configured existing platform with custom fields is the same outcome at far lower lifetime cost, and we will say so.
WordPress development is this work on a specific platform. This page covers cases where the platform is still open — headless, enterprise or custom — and the content model is the hard part.
Yes, through an API layer. Where that is a significant part of the requirement, API development covers the integration side in more depth.
Content modeling is quicker than most expect; migration is usually what sets the timeline, and it depends on how much content exists and how structured it currently is. We scope after the audit.
Still deciding if cms development is right for you?
Talk to UsPlatforms get replaced. Designs get refreshed every few years. Front-end frameworks come and go with some regularity. The content model tends to outlast all of it, because migrating structured content is straightforward and restructuring badly-modelled content is not.
That is an odd thing about CMS projects: the decision with the longest consequences is made earliest, usually fastest, and often by whoever is available rather than by whoever knows how the content is used.
A model that reflects how content actually works — its types, its relationships, the pieces that get reused — will survive a platform change, feed a new channel without a rebuild, and let a content team work without asking a developer. A model that mirrors whatever the old site's page structure happened to be will need unpicking at every one of those moments.
So we spend the time there first, before the platform conversation. It is the least visible part of the project and the part you will still be living with in five years.
Describe what you publish, who edits it and where it needs to go. We will tell you what the content model should look like — and which platform actually fits it.
