← Back to Studio Notes

Headless CMS vs Custom Django Admin: Which Gives You More Control?

Compare third-party Headless CMS platforms (Strapi, Sanity, Contentful) against a tailored Django Admin backend for managing business content and data.

KEHEM / Studio Notes
  KEHEM

Managing content, articles, and product catalogs requires a clean administrative interface.

Marketing teams often gravitate toward commercial Headless CMS services like Contentful or Sanity. Meanwhile, engineering teams often advocate for a custom Django Admin backend.

Which approach delivers greater control and lower total cost of ownership?

It is a genuine architectural decision, not a matter of taste — and the wrong answer shows up as either a six-figure SaaS bill nobody questioned, or a marketing team filing engineering tickets to change a headline. Here is how to decide properly.

When to Choose a Headless CMS (Sanity / Contentful)

  • Pure Marketing Content: Best when non-technical marketing teams need visual block page builders without engineer involvement.
  • Multi-Channel Publishing: Pushing content simultaneously to mobile apps, smart displays, and websites.

The Drawbacks:

  • High recurring SaaS pricing as API request volume and user seats grow.
  • Disconnected data models: Your blog content lives in Contentful, but your user accounts and customer orders live in your PostgreSQL database.

What the Pricing Actually Looks Like Over Three Years

Vendors change their tiers often, so treat these as indicative of the shape rather than the exact numbers — but the pattern is consistent:

PlatformEntry levelMid tierEnterprise
ContentfulFree (limits on spaces, locales, users)~$300/monthCustom, typically $40,000+/year
SanityFree tier with usage caps~$15/user/month + API usageCustom
StrapiSelf-hosted, free (you run it)Cloud from ~$99/monthCustom
Prismic / Storyblok~$0–$100/month~$300–$900/monthCustom

The line items that escalate are rarely the base subscription. Watch for seat costs as the content team grows, API request overages as traffic rises, locales (each language multiplies your content model work and sometimes your billing tier), environments (a staging space is often a paid one), and implementation time — a serious custom content model plus frontend integration typically runs 3–6 weeks of engineering.

Where the Disconnected Model Actually Hurts

The structural problem is not cost; it is the seam between systems. Concretely, you end up solving these repeatedly:

  • Cross-system search. A user searches your site for a term that appears both in an article (CMS) and in a product name (your database). You now need a search index that pulls from two sources, kept in sync.
  • Joining content to data. "Show related case studies for this customer's industry" requires fetching CMS entries and matching them against your relational data in application code, usually with an N+1 problem attached.
  • Preview and editorial workflow across both worlds. Editors can preview a CMS page, but not the page as it renders with live account data from your database.
  • Two permission systems. A CMS role model plus your own. Offboarding someone means remembering both.
  • Two backups, two vendors, two retention policies. When a client's contract requires data deletion, the CMS is one more place to check.

Content Modelling Lock-In

One more consideration that rarely appears in comparison articles: leaving a headless CMS is not free. Rich text is stored in a vendor-specific format — Contentful's rich text JSON, Sanity's Portable Text — and neither maps cleanly to plain HTML or Markdown without losing embedded components. References between entries, locales, and scheduled publishing all need reimplementing. Budget a few weeks for any migration away, and design your content types with that exit in mind.

When to Choose Custom Django Admin (The Unified Approach)

  • Unified Database: Your articles, authors, user profiles, invoices, and analytics live in the exact same relational database.
  • Zero Subscription Fees: No monthly API limits or per-seat licensing penalties.
  • Custom Business Logic: Triggering automated emails, webhooks, or PDF generation on save is trivial with Django model signals.

What "Unified" Buys You, Concretely

  • Real joins. "Articles written by authors whose organisations are on the Enterprise plan" is one query, not two API calls and a merge.
  • One permission and audit story. The same RBAC and audit logging that protect customer data protect content. One offboarding checklist.
  • Content drives product behaviour directly. Publishing a changelog entry can trigger an in-app notification; adding a resource can unlock it for specific plan tiers — without webhooks between systems.
  • Transactional consistency. Content and the business data it references change together, or not at all.
  • No API quota anxiety. A traffic spike costs you bandwidth, not overage fees.

The Honest Downsides

Django admin is a database-shaped interface, and marketing teams will notice:

  • It is not a page builder. There is no drag-and-drop block editor out of the box. Editors work with fields and forms.
  • No visual preview by default. You must build it (see below) or editors publish blind.
  • WYSIWYG limitations. Rich text is usually a third-party editor (TinyMCE, CKEditor, TipTap) plus your own sanitisation and image handling.
  • Editorial workflow needs work. Draft/publish states, scheduled publishing, revision history and multi-stage approval are not defaults.

None of these are blockers, and all of them are solvable — but each is real work, typically 2–5 weeks for a comfortable editorial experience.

Giving Editors What They Actually Need

The gap between "admin panel" and "CMS marketers like" closes with a handful of well-known Django building blocks:

NeedCommon solution
Draft / review / published statesA status field plus django-fsm for transitions
Revision history and rollbackdjango-reversion
Scheduled publishingA Celery beat task promoting scheduled items
Visual previewDraft preview routes rendering the real template with a signed token
Block-based page sectionsA streamfield-style JSON field with per-block serialisers
Rich text with embedsTipTap or CKEditor 5, with HTML sanitised on save
SEO fields per pagemeta_title, meta_description, canonical, OG image, noindex toggle
Multi-languagedjango-modeltranslation or django-parler

For teams that want the page-builder experience while staying inside a Django database, Wagtail deserves a serious look. It is an open-source CMS built on Django: streamfield block editing, page previews, moderation workflows, image renditions, and a polished editor UI — with your content in your own PostgreSQL database, no per-seat fees, and full access to your own models. For a large share of business sites, Wagtail is the answer that neither camp in this debate tends to mention.

The Hybrid Option, Honestly Considered

There is a middle path: a headless CMS for purely marketing pages (landing pages, campaigns, event microsites) and Django admin for everything connected to customers and product data.

It works, and we have shipped it. But be clear-eyed about the cost:

  • Two systems, one frontend. The Nuxt or Next layer must fetch from both, and someone must own the integration.
  • Two content models. Editors need to understand which system holds what, and the boundary always drifts.
  • Two budgets. The CMS subscription does not disappear because you added a unified admin.

Choose the hybrid when marketing genuinely needs rapid, engineer-free page creation and the product data has strong reasons to stay in your database. Do not choose it because you cannot decide.

Three-Year Total Cost of Ownership

Indicative figures for a mid-sized business site with about 1,500 pages or articles, five content editors, and 200,000 monthly visitors:

Cost lineHeadless CMSCustom Django adminWagtail (self-hosted)
Platform subscription (3 yrs)$11,000–$110,000$0$0
Build / integration$8,000–$25,000$18,000–$45,000$15,000–$35,000
Editing UX build-outIncluded$6,000–$20,000Mostly included
Hosting (3 yrs)$1,500–$4,000$1,800–$5,000$1,800–$5,000
Ongoing maintenanceVendor-managed$6,000–$15,000/yr$6,000–$15,000/yr
Indicative 3-year total$36,500–$250,000$50,000–$110,000$35,000–$85,000

The comparison flips depending on scale. At the low end, a headless CMS is cheaper and faster — you are buying a solved problem. At the high end, per-seat and per-request costs grow faster than your own maintenance costs ever will.

A Decision Table

SituationRecommendation
Content is purely marketing, team is non-technical, launch in 4 weeksHeadless CMS
Content is connected to customers, orders, or product stateDjango admin (or Wagtail)
Editors need polished block editing, engineering is strongWagtail
Publishing to mobile apps, kiosks and multiple frontendsHeadless CMS (or Django + REST/GraphQL API)
Compliance requires data residency and deletion controlCustom Django
Five languages, ten editors, thousands of pagesHeadless CMS with strong localisation, or Wagtail with i18n
You already have Django engineersDjango admin or Wagtail — usually not worth a second vendor

Questions to Ask Before Deciding

  1. Who edits content day to day, and what do they expect the interface to feel like? If the answer involves "like Notion", budget for the editing experience either way.
  2. Does content need to join to business data? This is the strongest technical argument for the unified approach.
  3. What is the three-year seat and request volume projection? Model the growth, not the starting tier.
  4. Can we export everything, including rich text, if we leave? Ask before signing.
  5. Who owns content infrastructure at 2am? A vendor will; a custom admin means you will.

Answer those honestly and the decision usually makes itself. In practice our split is roughly: marketing-only sites go headless; anything where content interacts with customers, plans, or product data stays in a Django database — frequently with Wagtail on top.

One last consideration that tips more decisions than any feature list: a second system is a second thing to maintain, secure, back up and eventually migrate. If the content team's needs are genuinely simple — a handful of articles, a few landing pages, predictable publishing — the unified approach wins almost by default, because the operational cost of a parallel content platform is paid every month, in every process, forever.

Related reading: Internal tools and admin systems covers the case for the Django admin route; the tech stack comparison covers the wider decision; and why we chose DRF and Nuxt 3 shows how the frontend consumes either choice. Need a bespoke CMS and back-office management console tailored to your exact workflow? Talk to KEHEM IT.

Stuck choosing between a CMS and a custom admin? Describe who edits what and we will tell you which wins.

Have a project in mind?

KEHEM designs and builds thoughtful websites, SaaS products, and business systems.

Talk to KEHEMExplore Services