Skip to content

Content Modeling in Optimizely

intermediate
📜Corecms

A content model defines how your content is structured — what types of content exist, what fields each type has, and how types relate to each other. Get this right and your content is reusable across channels, easy for authors to manage, and ready for personalization and experimentation. Get it wrong and you end up with rigid page layouts, duplicated content, and expensive rework.

In Optimizely CMS, the content model is the foundation that everything else builds on: the editing experience, content delivery via Graph, personalization rules, and search indexing all depend on how you structure your content types and properties.

A content type is a blueprint that defines a kind of content. Think of it as a class definition — it specifies what fields (properties) are available when an author creates an instance of that type.

Optimizely CMS has three fundamental content types:

TypePurposeExample
Page typeRepresents a page with a URL in the content treeProduct page, Article page, Landing page
Block typeA reusable content component embedded within pagesHero banner, Call-to-action, Testimonial card
Media typeFiles and images stored in the asset systemImage, Video, PDF document

Developers define content types in code. Authors create instances of those types in the CMS editor.

Properties are the fields within a content type. Each property has a name, a data type, and editing metadata that controls how it appears in the editor.

Common property types include:

Property typeStoresEditor experience
StringShort text (up to 255 chars)Single-line text input
XhtmlStringRich text with formattingRich text editor (TinyMCE)
ContentReferenceLink to another content itemContent picker
ContentAreaOrdered list of content itemsDrag-and-drop area for blocks
UrlExternal or internal linkURL picker
BooleanTrue/false valueCheckbox
Int / DoubleNumeric valuesNumber input
DateTimeDate and timeDate picker
SelectOne / SelectManyPredefined choicesDropdown or checkbox list
Defining a content type with properties
csharp
[ContentType(
  DisplayName = "Article Page",
  GUID = "...",
  Description = "A long-form article with author and publish date")]
public class ArticlePage : PageData
{
    [Display(Name = "Headline", Order = 10)]
    [Required]
    public virtual string Headline { get; set; }

    [Display(Name = "Body", Order = 20)]
    public virtual XhtmlString Body { get; set; }

    [Display(Name = "Author", Order = 30)]
    public virtual string Author { get; set; }

    [Display(Name = "Published Date", Order = 40)]
    public virtual DateTime PublishedDate { get; set; }

    [Display(Name = "Related Content", Order = 50)]
    public virtual ContentArea RelatedContent { get; set; }
}
graphql
query GetArticles {
  ArticlePage(
    orderBy: { PublishedDate: DESC }
    limit: 10
  ) {
    items {
      Headline
      Author
      PublishedDate
      Body
      RelatedContent {
        ... on ArticlePage {
          Headline
          Url
        }
      }
    }
  }
}

Blocks are reusable content components that authors place inside ContentArea properties. They are the key to composable pages — instead of building monolithic page types with dozens of properties, you create small, focused block types and let authors compose pages by combining them.

Why blocks matter:

  • Reuse — The same testimonial block can appear on multiple pages
  • Flexibility — Authors build pages without developer involvement
  • Consistency — Blocks enforce a structure, so content always looks right
  • Headless ready — Blocks translate cleanly to component-based frontend frameworks

All content lives in a tree structure, similar to a file system. The tree determines:

  • URL structure — A page’s position in the tree defines its URL path
  • Navigation — Menus are often generated from the tree hierarchy
  • Permissions — Access rights can be set at any level and inherited downward
  • Organization — Authors find and manage content by browsing the tree

Design principles for effective content models

Section titled “Design principles for effective content models”

Define what the content is, not how it looks. An “Article” type should have properties like Headline, Body, Author — not properties like HeaderBackgroundColor or ColumnLayout. Presentation decisions belong in templates and CSS.

This separation lets the same content render differently on a website, mobile app, email, and digital signage.

Build pages from small, reusable blocks rather than creating large page types with many properties. A “Landing Page” with a single ContentArea and a library of block types is more flexible than a “Landing Page” with 30 fixed properties.

Name content types after business concepts (Article, Product, Event), not visual layouts (TwoColumnPage, HeroBannerPage). Designs change; business concepts endure.

If your content might be delivered through Graph to a headless frontend, structure it as discrete fields rather than a single rich text blob. Headless consumers can work with structured data; they cannot parse formatting out of HTML.

Group related properties together. Use display names and descriptions that make sense to non-technical authors. Hide advanced properties in separate tabs. The content model directly shapes the editing experience — a well-designed model makes authoring intuitive.

AspectSaaSPaaS
Content type definitionCode + Visual BuilderCode only
Block compositionVisual drag-and-drop canvasContentArea property (form-based)
Deployment of model changesPush to cloudDeploy application
Property types available26 (content editing & authoring)14 (CMS 13) / 25 (CMS 12)

Content models are not set-and-forget. Revisit your model when:

  • New channels emerge — Adding a mobile app or headless frontend may require more granular properties
  • Authors report friction — If authors routinely work around the model (e.g., putting structured data in rich text fields), the model needs refinement
  • Personalization requirements grow — Personalization works best with structured properties that can be targeted and varied
  • Performance degrades — Overly deep content trees or excessively complex types can impact editing and delivery speed