What is Content Modeling?
Content modeling is the practice of defining structured content types, fields, and relationships for a CMS.
What is Content Modeling?
Content modeling is the practice of designing the structure, types, fields, and relationships of content within a content management system before any code or editorial work begins. Think of it as the schema layer between your editorial team's mental model and your database. A content model defines discrete content types (e.g., blogPost, author, category), each with typed fields (string, rich text, image, reference) and validation rules. The concept predates headless CMS adoption but became critical around 2018–2020 as teams decoupled content from presentation. A well-designed content model means your frontend can query exactly the data it needs — no over-fetching, no awkward field-name hacks. We've shipped content models on 50+ projects, primarily in Sanity and Contentful, and the investment in modeling upfront consistently saves 20–40% of downstream frontend refactoring time.
How it works
Content modeling happens in three phases: discovery, schema definition, and validation.
1. Discovery
You audit every content surface — pages, cards, modals, emails — and extract the atomic content units. A product page might break into product, variant, priceTier, and review. The goal is to find the smallest reusable unit that makes editorial sense.
2. Schema definition
In a headless CMS like Sanity, you define schemas in code:
// sanity/schemas/blogPost.ts
export default {
name: 'blogPost',
title: 'Blog Post',
type: 'document',
fields: [
{ name: 'title', type: 'string', validation: (Rule) => Rule.required().max(120) },
{ name: 'slug', type: 'slug', options: { source: 'title' } },
{ name: 'author', type: 'reference', to: [{ type: 'author' }] },
{ name: 'body', type: 'blockContent' },
{ name: 'publishedAt', type: 'datetime' },
{ name: 'categories', type: 'array', of: [{ type: 'reference', to: [{ type: 'category' }] }] },
],
}
References create relationships between documents. This is where content modeling differs from page building — you're not nesting content inside a page layout, you're creating a relational graph that any frontend can consume.
3. Validation and iteration
You wire the schema into the CMS, have editors create sample content, and watch where they hit friction. Field names that confuse editors, missing validation rules, or overly rigid structures all surface here. We typically run two rounds of editorial testing before locking a model.
When to use it
Content modeling is non-negotiable for any project with more than a couple pages of managed content. Specifically:
Do content modeling when:
- You're adopting a headless CMS (Sanity, Contentful, Strapi, Payload)
- Multiple frontends consume the same content (web + app + email)
- You have more than one editor or content role
- Content needs to be reused across pages (e.g., a testimonial appearing in 5 places)
- You're migrating from WordPress or another monolithic CMS
Skip formal modeling when:
- You're building a static marketing one-pager with hardcoded copy
- The project is a prototype with a lifespan under 3 months
- There's literally one content type with fewer than 5 fields
Our preferred stack is Sanity v3 with TypeScript schemas because the model lives in your repo — version-controlled, reviewable, deployable.
Content Modeling vs alternatives
| Approach | Structure | Flexibility | Best for |
|---|---|---|---|
| Content modeling (typed schemas) | High — fields and types defined upfront | Medium — changes require schema updates | Multi-surface, team-edited content |
| Page builder (WYSIWYG blocks) | Low — layout-coupled content | High — editors drag and drop | Single-site, design-heavy landing pages |
| Flat files (MDX/Markdown) | Medium — frontmatter + body | Low — no relational queries | Developer blogs, docs sites |
| Database-first (raw SQL/Prisma) | High — full relational control | Low — no editorial UI out of the box | App data, not editorial content |
Content modeling and page builders aren't mutually exclusive. In many of our projects we model structured content types and give editors a block-based page builder for layout — but the blocks reference modeled content rather than containing raw text.
Real-world example
On a recent SaaS marketing site built with Astro 5 and Sanity v3, we modeled 11 content types: page, blogPost, author, caseStudy, testimonial, feature, pricingTier, faqItem, changelogEntry, legalDoc, and globalSettings. The testimonial type was referenced by caseStudy, page (via a testimonial block), and pricingTier. Without the content model, that testimonial would've been copy-pasted into three places and drifted within a week. The model took about 6 hours to build and test. Over 8 months of active content updates, the editorial team made zero "where does this go?" support requests — the schema guided them.