At dotCMS, we chose to build the spine, and keep it small.
Hybrid headless at enterprise scale. Model once, deliver anywhere. Sites, apps, kiosks, partner APIs. All without channel-specific forks. When channels evolve (a new storefront or app shell), your model stays and your migration surface shrinks.
Evergreen by design. Upgrades recede into the platform. Extensions target stable SDKs and contracts. Less freeze time, fewer big-bang windows, more continuous delivery. And fewer “upgrade tax” sprints.
SDK-first extensibility. Modern SDKs (Java, TypeJavaScript, Python; REST/GraphQL) and opinionated integration patterns. The goal isn’t “anything integrates”. It’s “everything integrates the same way.” So complexity doesn’t explode.
Governance you can trust. Editorial workflow, approvals, audit trails, consent, access control, and prompt governance are versionable artifacts. Compliance moves with the release train, not after it.
Observability and outcomes. Experimentation and decision logging are wired into the spine so teams measure lift without building a parallel data project. “What did we learn?” becomes a simple routine.
Performance budgets at the edge. Cacheability, streaming, predictable latency. Budgets are explicit and testable. Integrations that exceed them must run async or prove their worth.
Built-in analytics & experimentation. First-party analytics and A/B testing ship as part of the spine. It enables consent-aware capture, a shared event schema, and experiment hooks baked into content types. Run server- or client-side tests, target off the same events the rest of your stack uses, and log every exposure/decision to a single audit stream. Prefer a specialist tool later? Keep our schema and swap the decision engine, the contract doesn’t change. We include analytics to prove outcomes, not to box out partners.
Bias: own the spine, rent the rest. If a tool lifts outcomes today, plug it in. If it stops, unplug it. Your model, events, and policies keep working.
A 12-month playbook to escape platform theater
Map capabilities to outcomes. For each tool, name the KPI and hypothesis (“Experimentation will +3% checkout completion in 60 days”). Put this in a one-page experience charter owned by product, marketing, and engineering. Revisit monthly; retire tools that can’t defend a KPI.
Rationalize the stack. Inventory by function and overlap; deprecate redundancies; consolidate on the spine (content model, events, governance, orchestration). For each removal, script the exit path (exports, event replays, cache invalidation) and rehearse it, so reversibility becomes routine.
Set performance budgets. Define TTFB/CLS/render targets per route and device; make them contractual for anything on the edge path. Add canaries and deploy gates so regressions can’t slip through. Exceptions require a time-boxed business case and a rollback plan.
Instrument the loop. Bake variants/exposure rules into content types; route all decisions through the same logging surface. Run a weekly learning review to kill losers and scale winners. Optimize for cycle time: idea → experiment → decision in days.
Codify governance. Express permissions, approvals, consent, retention, and prompt governance as code. Version and test policies; ship with the release. Prove compliance with logs, not PDFs.
Pilot AI where it pays. Start with model-aware authoring and in-session decisioning tied to your event stream. Measure net lift vs. baseline (including latency costs). Kill what can’t earn its keep; scale what does, under governance.
Evergreen your delivery. Push customizations behind SDKs/extensions; ban “reach into internals.” Automate upgrade tests and run them weekly so major releases are a non-event. Track quarters saved once spent on upgrades.
The small core that wins big
The market will keep renaming itself - suite, platform, composable, experience cloud. You don’t need the label; you need the lift. Lay a spine you can trust, instrument it so it learns, and keep the core small enough to survive the next hype cycle. That’s the dotCMS DXP philosophy: be the spine, then let everything else compete to plug in.