The problem Graph solves
Section titled “The problem Graph solves”Traditional content management renders HTML on the server — the CMS controls both the content and the presentation. This works well for a single website, but modern organizations need to deliver content to websites, mobile apps, single-page applications, digital signage, voice assistants, and partner systems. Each channel has its own frontend technology and rendering requirements.
Optimizely Graph solves this by decoupling content storage from content delivery. It provides a GraphQL API that any frontend can query, regardless of framework or platform. Your content lives in Optimizely CMS; Graph makes it available everywhere.
How Graph works
Section titled “How Graph works”Content indexing
Section titled “Content indexing”When content is published in CMS, Graph automatically indexes it into a search-optimized data store. This happens in near real-time — typically within seconds of publishing.
The indexing process:
- Author publishes or updates content in CMS
- CMS sends a sync event to Graph
- Graph indexes the content, including all properties, metadata, and relationships
- The content becomes queryable via the GraphQL API
GraphQL API
Section titled “GraphQL API”Graph exposes a fully typed GraphQL API generated from your content model. Every content type in CMS becomes a queryable type in Graph, and every property becomes a field.
query GetArticles {
ArticlePage(
where: {
Status: { eq: "Published" }
}
orderBy: { PublishedDate: DESC }
limit: 10
) {
items {
Headline
Author
PublishedDate
Body
_fulltext
}
cursor
total
}
} const response = await fetch(
'https://cg.optimizely.com/content/v2',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${GRAPH_TOKEN}`,
},
body: JSON.stringify({
query: `query { ArticlePage(limit: 10) {
items { Headline Author PublishedDate }
}}`
})
}
);
const { data } = await response.json(); var client = new GraphClient(
new Uri("https://cg.optimizely.com/content/v2"),
graphToken
);
var result = await client
.ForType<ArticlePage>()
.Where(x => x.Status.Eq("Published"))
.OrderBy(x => x.PublishedDate, OrderBy.DESC)
.Limit(10)
.GetResultAsync();
foreach (var article in result.Items)
{
Console.WriteLine(article.Headline);
} Full-text search
Section titled “Full-text search”Graph includes full-text search capabilities built into the API. You can search across all content or scope searches to specific types. Search results include relevance scoring and highlighting.
Faceted filtering
Section titled “Faceted filtering”Query parameters support filtering, sorting, and pagination. You can filter by any property in your content model — including custom properties, dates, and content references.
Delivery models: when to use what
Section titled “Delivery models: when to use what”Optimizely CMS supports two content delivery models. You can use one or both depending on your architecture.
Traditional (server-rendered)
Section titled “Traditional (server-rendered)”CMS renders HTML using server-side templates. The CMS application handles both content management and content delivery.
Best for:
- Single-site deployments where the CMS controls the frontend
- Teams with .NET development experience
- Scenarios where server-side rendering (SSR) is preferred for SEO
Headless (via Graph)
Section titled “Headless (via Graph)”CMS manages content; Graph delivers it via API. A separate frontend application (React, Next.js, Vue, Angular, or any technology) fetches content from Graph and handles rendering.
Best for:
- Multi-channel delivery (website + mobile app + kiosk)
- Frontend teams using modern JavaScript frameworks
- Architectures that separate content management from content presentation
- High-traffic sites benefiting from CDN-cached static generation
Hybrid
Section titled “Hybrid”Many organizations use both. CMS renders the primary website using server-side templates, while Graph feeds content to a mobile app and partner integrations. This is a pragmatic approach that avoids rewriting an existing site while enabling new channels.
| Aspect | Traditional | Headless (Graph) | Hybrid |
|---|---|---|---|
| Frontend technology | .NET templates | Any (React, Next.js, etc.) | Both |
| Content delivery | CMS renders HTML | Graph API → frontend renders | Mixed |
| Development team | .NET developers | Frontend + .NET developers | Both |
| Time to new channel | High (new templates) | Low (new API consumer) | Medium |
| SEO approach | Server-rendered HTML | SSG/SSR in frontend framework | Mixed |
Graph and the Optimizely One ecosystem
Section titled “Graph and the Optimizely One ecosystem”Graph is not just a CMS delivery mechanism. It serves as the content API layer for multiple Optimizely products:
- CMS → Publishes structured content to Graph
- Commerce → Product catalogs queryable through Graph
- CMP → Marketing content available via Graph after publishing
- Opal → AI agents use Graph to find and analyze content
This makes Graph the central content delivery hub for Optimizely One. Any system that needs Optimizely content — whether internal or external — connects through Graph.
Key decisions for architects
Section titled “Key decisions for architects”Schema design
Section titled “Schema design”Your CMS content model directly becomes your Graph schema. Well-structured content types with granular properties produce a clean, useful API. Monolithic page types with large rich text fields produce an API that is hard for frontends to consume.
Recommendation: Design your content model with Graph consumers in mind from day one. See Content Modeling for principles.
Authentication
Section titled “Authentication”Graph supports two authentication modes:
| Mode | Use case | Security model |
|---|---|---|
| Single key | Public website, static site generation | API key in environment variable |
| HMAC | Server-to-server integrations, secure environments | Signed requests with secret key |
Caching and performance
Section titled “Caching and performance”Graph responses can be cached at the CDN layer. For static site generation (SSG), you query Graph at build time and generate static HTML pages — resulting in the fastest possible delivery with zero runtime API calls.
1. Your company manages a website, a mobile app, and an in-store kiosk. The marketing team publishes content in Optimizely CMS and wants all three channels updated simultaneously. Which delivery model should the architect recommend?
Headless delivery via Graph provides a single GraphQL API that any frontend — web, mobile, or kiosk — can query independently, enabling multi-channel delivery from one content source.
Headless delivery via Graph provides a single GraphQL API that any frontend — web, mobile, or kiosk — can query independently, enabling multi-channel delivery from one content source.
Review this topic →2. A developer notices that content updates published in CMS are not appearing in Graph queries. The content was published 30 seconds ago. What is the most likely explanation?
Graph indexes content in near real-time, typically within seconds. A 30-second delay could mean the indexing cycle has not yet completed. CDN caching is also possible but the indexing pipeline is the more immediate concern.
Graph indexes content in near real-time, typically within seconds. A 30-second delay could mean the indexing cycle has not yet completed. CDN caching is also possible but the indexing pipeline is the more immediate concern.
Review this topic →3. An organization has an existing .NET-rendered CMS website but wants to launch a React Native mobile app that displays the same content. They cannot afford to rewrite the website. Which approach fits best?
The hybrid model lets the existing .NET website continue using traditional server-side rendering while Graph feeds content to the new mobile app. This avoids rewriting the existing site.
The hybrid model lets the existing .NET website continue using traditional server-side rendering while Graph feeds content to the new mobile app. This avoids rewriting the existing site.
Review this topic →