CMS Solution
CMS solutions from One Stop Software give your team control of your own content without calling a developer for every change – and give your business a website or portal that integrates with the systems behind it. We build on WordPress and headless CMS platforms, chosen to fit the job.
The Right CMS Depends on the Job
A marketing site, a customer portal, and a multi-brand content operation want different things. We match the platform to the need: a traditional CMS when editors want to see the page they are editing, a headless CMS when content feeds apps and multiple front ends. We are not tied to one answer.
- CMS implementation and customization on WordPress or headless platforms
- Editor experiences your non-technical team can actually use
- Integration with your CRM, marketing tools, and business systems
- Migration from an outdated or overgrown site without losing content or SEO
- Performance, security, and maintenance so the site stays fast and safe
Need something more like an application than a website? See web portals. Tell us what you are managing and who edits it – we will recommend the right platform.
Does Your Site Need a Headless CMS?
Headless makes sense when content has to reach more than a website: an app, a kiosk, a partner feed, several brand front ends drawing from one library. It also suits teams that already employ front-end developers and want full control of the presentation layer.
It is a harder fit when the people writing content want to see the page as they write it, when the team is small, or when marketing expects to change a layout without booking developer time. A traditional CMS keeps editing and rendering together, which suits a marketing site where one team writes and publishes. The question to answer first is who edits, how often, and how many places the content has to appear.
The URL Map Decides Whether Traffic Survives
The visible part of a replatform is the design. The part that decides whether your traffic survives is the URL map. Every page carrying links or rankings needs a destination, and pages that no longer deserve to exist should be retired deliberately with a redirect to the closest sensible replacement.
An established site carries pages nobody has opened in a long time, duplicates from an old campaign, and PDFs linked from nowhere. Moving all of it relocates the mess and enlarges the redirect table for nothing. Settle what deserves to survive before the mapping starts, because that decision is what separates a new site from the old site in a new skin.
Editing Roles Come Before Templates
Decide who can publish without review, who needs approval, and what a contributor is allowed to change on a page. If every edit needs a developer, the site goes stale. If anyone can restructure a template, it will drift.
The workable version is a small set of reusable blocks that behave predictably, roles that match how your team is organized, and a preview step. Budget for training while you are at it. A good editing experience nobody was shown how to use looks identical to a bad one.
Plugin Sprawl Is the Long-Term Cost
On WordPress especially, the site you launch is not the site you maintain. Every plugin is a dependency with its own update cadence, its own author and its own security history. Sites accumulate them because each one solved a real problem on a Tuesday and nobody removed it afterward.
Agree at the start who applies updates, whether there is a staging environment to test them in, what the backup arrangement is, and who gets called when something breaks. That conversation is far easier before launch.
When It Is an Application Wearing a Website
If users log in, see their own data, submit something that starts a workflow, or read live information from your ERP or CRM, you are describing an application. A CMS can be pushed into that shape. It is not what the tool is for.
Our Web Portals work exists for that case, and the two can ship together: a public site for marketing, a portal behind a login for customers and partners, sharing a design system and a content source. If the site or portal needs product, pricing or account data from a business system, scope that connection with the build, not after it.
Content Modeling Decides What You Can Reuse
The content model is the list of types and the fields on each one. On WordPress that means posts, pages, custom post types, taxonomies and custom fields; on a headless platform it means document schemas with typed fields and references between them. The distinction that matters is between a field and a paragraph of formatted text: a date field can be sorted, a reference to an author can be followed, a price or location field can be filtered, while the same information typed into the body of an editor is only characters.
That is what decides reuse. A value can appear in a listing, a filter, a feed or an API response only if it exists as a field, so a launch that puts everything in the body forces a second pass through every item later to pull the values back out. The cost of that pass scales with the number of items, which is why the model is worth arguing about while there are ten records rather than four thousand.
Taxonomies are the decision people postpone. A taxonomy term is shared vocabulary: several items point at the same term, which is what makes archive pages, filters and related-content queries possible at all. Free text on each item cannot do that, and near-misses in spelling quietly become separate values. The opposite mistake is inventing a taxonomy for everything, which generates archive pages holding one item each that then get crawled and indexed as thin content. Settle the following before anyone builds a template:
- Which things are content types of their own and which are ordinary pages
- Which fields are required, which are optional, and what a listing renders when an optional one is empty
- Which values are shared taxonomy terms and which are free text belonging to a single item
- What an editor may change per item, and what the template fixes for every item
- Which fields an API or feed exposes, since that set is the hardest to change once something else consumes it
Wiring the CMS to the Systems Behind It
Integrations with a CRM, an ERP or a marketing platform arrive in three shapes, and the shape decides the failure behavior. At request time the site calls the other system while a page is loading, so that system's latency and uptime become yours. At write time the site accepts something locally and pushes it outward afterward, usually through a webhook or a queued job. On a schedule the site copies a subset of the data in and serves it from its own database, which is fast and can be stale.
Form handoff is where the first shape hurts most: a slow or unreachable CRM becomes a hung or failed submission for the visitor, and the inquiry is lost with it. Write the submission to the site's own storage first, return the confirmation from that, then hand off through a queued job with retries and a failure list somebody actually reads. Log the outbound payload and the response code for every attempt, because a handoff that failed silently and a handoff that never fired look identical from the CRM side.
Credentials and limits are the recurring maintenance item. Keep API keys in environment variables or in wp-config rather than in the database, where a plugin export or a routine database dump carries them off-site, and know in advance which tokens expire and who rotates them. When an integration that worked for months stops, the response separates the cases: 401 or 403 is usually a rotated or expired credential, 429 is the rate limit, and a connection that hangs with no response at all points at egress filtering or an IP allowlist on the far end rather than anything in the CMS.
Cached and Uncached Are Different Numbers
A page speed figure means little unless it says whether the page was served warm or cold. A cached response returns stored HTML and skips PHP, the database and any API call sitting behind the page; the first request after a purge runs the entire path. The uncached number is the honest one, because it is what a crawler gets on a rarely requested URL, what the next visitor gets after any publish that purges site-wide, and what the site falls back to under a traffic spike that outruns the cache.
Caching is also not one mechanism but several, each holding its own copy and each invalidated separately, which is why a page that will not update is really a question of which layer to look at first:
- Page cache: stored HTML, held either by a plugin inside the application or by nginx or Varnish in front of it. Purged per item on publish, or site-wide, which is what makes the next request cold.
- Object cache: query and API results kept in Redis or Memcached, cutting repeated database work on the requests a page cache misses, including logged-in and admin traffic that is normally excluded from page caching.
- CDN edge cache: copies held at the edge, where the origin never sees the request, so an edit stays invisible until the edge is purged or the TTL expires.
- Browser cache: governed by the Cache-Control header. Long max-age values are safe on fingerprinted asset filenames and dangerous on HTML, because a copy already sitting in a visitor's browser cannot be purged from your side.
Caching Does Not Fix Layout Shift or Input Delay
The three Core Web Vitals measure different things and respond to different work. LCP is when the largest visible element finishes rendering, and it does move with caching, image weight and server response time. CLS measures how much the layout jumps after paint. INP measures the delay between an interaction and the next visual response. Neither of the last two improves because the HTML arrived sooner.
Layout shift is nearly always attributable to something specific: images, iframes and ad slots without width and height so the browser cannot reserve space, a web font swapping in at different metrics, a consent banner or promo bar injected above existing content after paint. The fixes are at the element level rather than the platform level, meaning dimensions or an aspect ratio on every media element, font-display plus metric overrides on the fallback face, and a reserved box for anything that arrives late.
Interaction latency is main-thread JavaScript: plugin scripts, a tag manager loading vendors nobody remembers adding, chat widgets, consent tooling. It is also where a headless front end can lose the advantage it was chosen for, since it arrives with a JavaScript payload of its own and hydration on a mostly static content page can cost more than the server rendering it replaced. One caution before judging any of these numbers: Chrome's field data is a rolling 28-day 75th percentile, so a genuine fix does not surface there for weeks, while a Lighthouse run reports one synthetic load on one device profile and can improve while the field figures stay flat.
When a Replatform Is Not the Answer
Several common complaints sound like the CMS and are not. If editors cannot find anything, that is information architecture, admin search and naming, and a new platform will reproduce it faithfully. If content is out of date, the constraint is usually ownership, because nobody was accountable for reviewing it and a different editing screen will not create that accountability. If one page is a mess, that is one page.
If the complaint is speed, measure before rebuilding. Server response time on an uncached request, the transferred weight of images and fonts, and the list of third-party scripts loading on the page will usually locate the problem between them, and frequently none of the three point at the CMS. A page carrying a video hero, three tracking vendors and a chat widget is slow on any platform.
The reasons that do justify moving are structural: a platform version that no longer receives security fixes, a page builder or theme whose author has stopped shipping updates, a hosting stack pinned to a PHP version that current plugins refuse to run on, where a site that still loads is no evidence that anything is patched, or a content model that cannot express what you now publish without a manual workaround on every item. Those do not improve with maintenance, and they are the cases where the platform itself is the thing being bought.
Frequently Asked Questions
What is included in a CMS solution, and what is not?
The parts most often assumed and not included are writing your content, producing a brand identity from scratch, running paid media or SEO campaigns, and hosting itself, which is a separate arrangement the work assumes either exists or is being provisioned. The boundary worth drawing is that a CMS engagement ends where pages stop being the same for everyone. Once what a visitor sees depends on who they signed in as and what a record says about them, the requirements become permissions, audit trails and per-account testing, which is application work no matter which tool renders the markup.
What has to exist before the work starts?
A domain with DNS you can change, somewhere to build that is not the live site, and access to the current content, whether that is an admin login, a database dump or an export. Analytics and Search Console access for the existing site matter just as much, because the redirect map should be checked against URLs that actually receive traffic and are actually indexed, not only against the sitemap. If any content lives outside the current CMS, in a spreadsheet, a product system or a file share, somebody has to decide whether it is migrated or re-entered before the model is finalized.
What does a headless setup actually require to run?
Two deployables instead of one: the CMS with its content API, and a separate front-end application, each with its own hosting, build pipeline, environment variables and deploy process. The front end needs a Node build step and somewhere to run or serve the output, and preview requires the CMS to be configured to call a preview route on the front end, which is setup work rather than something present by default. Exposing content over an API also turns CORS rules, API tokens and rate limits into operational concerns. A traditional WordPress install needs PHP, a MySQL or MariaDB database and a web server, which is one stack to patch and one deploy to get right rather than two.
Can we keep the current design?
Usually yes, though a pixel-for-pixel port is often more work than rebuilding the design system on new templates. Established sites tend to contain one-off pages assembled by hand in a page builder with no reusable structure behind them, and reproducing each one exactly means recreating decisions nobody remembers making. Carrying over the type scale, spacing, color and component styles, then rebuilding templates against the new content model, keeps the site recognizable without importing the old structure's constraints. If the visual identity is itself under review, settle that before templates rather than during them.
Which requirements have to be stated before templates are built?
The accessibility level you have to meet, and any regulatory constraint on what the site collects or displays. A stated target such as WCAG 2.2 AA affects contrast, focus order, form labeling and how components like carousels, modals and menus are constructed, and adding it afterward means revisiting every component rather than installing something. A consent or privacy requirement decides whether third-party scripts may load before consent is given, which changes analytics coverage and how the tag manager is configured. Brand assets belong in the same conversation, since web font licensing is separate from desktop licensing and a face installed on your designers' machines is not necessarily one you may serve from the site.
How does a migration actually proceed?
Content is exported, transformed into the new model and imported by a script that can be run more than once rather than copied by hand, so the same run can be repeated for anything edited after the first pass. The build and content review happen on a staging environment that is password protected or blocked from indexing, because a crawlable staging copy competes with the live site. Cutover is its own sequence: lower the DNS TTL a day or two ahead, launch with the redirect rules already in place, spot check a sample of old URLs to confirm each resolves in one hop to a page returning 200, then submit the new sitemap. Keep the old site reachable at a private hostname afterward, since that is the only reliable way to compare what a page used to say.
What protects search rankings at cutover?
Redirects are permanent infrastructure rather than a launch-week task to tidy up later. External links and bookmarks keep arriving for years, so a rule leaves the table when the server log shows its source URL has stopped being requested, not when the project calendar ends. Avoid chains, where a retired URL redirects to another retired URL that redirects again, because each hop costs crawl efficiency and only the final destination is what gets kept. Try not to change URLs and rewrite the content of the same pages in one release, since when rankings move you will have no way to tell which change caused it. Some movement is normal after any large URL change even when the mapping is correct, so watch Search Console coverage and server-log 404s instead of waiting for traffic to report the problem.