Skip to content

Edit Multi-Channel Content

⏱ 15 minutes intermediate

Your audience consumes content across websites, mobile apps, kiosks, and third-party platforms. A single CMS instance can serve all these channels if you decouple content creation from content presentation. Multi-channel content lets authors write once and deliver everywhere, while developers choose the right rendering approach for each channel.

Headless-only content exists in the CMS but has no traditional page rendering. Instead, it is delivered through the Content Delivery API or Optimizely Graph to external applications that handle their own presentation.

Common use cases for headless-only content include:

  • Mobile app content (banners, notifications, feature descriptions)
  • Digital signage or kiosk displays
  • Third-party website integrations
  • Single-page applications built with React, Vue, or Angular

How headless-only differs from traditional content

Section titled “How headless-only differs from traditional content”
AspectTraditional contentHeadless-only content
RenderingCMS generates HTML via controllers and viewsExternal application renders the content
PreviewOn-page preview in the CMS editorPreview requires a configured preview URL
URLHas a routable URL on the siteMay or may not have a public URL
DeliveryServer-side rendered by the CMSDelivered via REST API or GraphQL

Editing headless-only content feels the same as editing traditional content. The CMS editor displays the same property fields regardless of delivery channel.

  1. Navigate to the headless content item in the content tree. Headless-only content types typically appear under a dedicated folder such as “API Content” or “App Content.”
  2. Click the content item to open it in the editor.
  3. Fill in or update the property fields. These fields are defined by the content type, just like traditional pages.
  4. Click Save to store your draft.
  5. Use the Preview button to see how the content appears. If a preview URL is configured, the CMS opens the external application with your draft content.
  6. Click Publish when the content is ready. Published headless content becomes available through the API immediately.

The multi-channel content gadget gives authors visibility into which channels consume each content item. It shows delivery status across all configured channels.

  1. Open any content item in the CMS editor.
  2. Click the Multi-Channel gadget in the right-side panel. If you do not see it, click the Gadgets menu and enable Multi-Channel Content.
  3. Review the channel list. Each channel shows:
    • Channel name (for example, “Website,” “Mobile App,” “Kiosk”)
    • Delivery status (Published, Draft, Not Published)
    • Last delivered timestamp
  4. Click a channel name to see the API endpoint or GraphQL query that serves this content to that channel.
  5. Use the Publish to Channel option if your workflow requires per-channel publishing control.

Administrators configure which channels appear in the gadget.

  1. Navigate to Admin > Settings > Multi-Channel Configuration.
  2. Click Add Channel.
  3. Enter the channel name and description.
  4. Select the delivery method (Content Delivery API, Optimizely Graph, or custom endpoint).
  5. Enter the preview URL template for this channel. Use {contentId} as a placeholder.
  6. Click Save.
  7. Verify by opening a content item. The new channel should appear in the Multi-Channel gadget.

Set up hybrid traditional and headless delivery

Section titled “Set up hybrid traditional and headless delivery”

Hybrid mode lets you serve the same content through both traditional server-side rendering and headless APIs. A product page, for example, can render on your website through a controller while simultaneously being available to your mobile app through the Content Delivery API.

Enable Content Delivery API for an existing content type
csharp
// In Startup.cs or equivalent
services.AddContentDeliveryApi(options =>
{
    options.SiteDefinitionApiEnabled = true;
});

// On your content type — no changes needed.
// All published content types are available via the API by default.
// To exclude a type, use the [ExcludeFromContentDeliveryApi] attribute.
[ContentType(
    DisplayName = "Product Page",
    GUID = "a1b2c3d4-e5f6-7890-abcd-ef1234567890")]
public class ProductPage : PageData
{
    [Display(Name = "Product Name", Order = 10)]
    public virtual string ProductName { get; set; }

    [Display(Name = "Description", Order = 20)]
    [UIHint(UIHint.Textarea)]
    public virtual string Description { get; set; }
}
  1. Install the Content Delivery API NuGet package if not already present.
  2. Register the Content Delivery API in your startup configuration.
  3. Build and deploy your project.
  4. Verify by calling the API endpoint for a published content item. You should receive a JSON response with the content properties.

If certain content types should only render traditionally and never appear in the API, mark them with the exclusion attribute.

Exclude a content type from the API
csharp
[ExcludeFromContentDeliveryApi]
[ContentType(DisplayName = "Internal Memo")]
public class InternalMemoPage : PageData
{
    // This content type is only available through traditional rendering
}

When creating content that serves multiple channels, keep these guidelines in mind:

  • Write channel-agnostic text. Avoid phrases like “click the button below” that assume a specific interface. Instead, write “select the option” or “choose the action.”
  • Use structured fields instead of rich text. Individual fields (title, summary, body) are easier for external applications to parse than a single rich text blob.
  • Provide multiple image sizes. Upload images in different aspect ratios if different channels need different layouts.
  • Test in every channel. Preview content in each consuming application, not just the website.
IssueCauseFix
Content not appearing in APIContent not publishedPublish the content item
Preview shows blank pagePreview URL not configuredAsk a developer to set up the preview URL for this content type
API returns fewer fields than expectedProperty not mapped or marked internalCheck that properties have [Display] attributes and are virtual
Multi-Channel gadget not visibleGadget not enabledEnable it from the Gadgets menu in the editor
Changes not reflected in mobile appCaching on the API or clientClear the API cache or wait for the cache TTL to expire