Tagged: CMS 12

Unlock AI-Ready Experiences with Optimizely

Over the past few months, almost every customer conversation has shifted from SEO to AI readiness.

The questions are no longer just:

“How do we rank higher on Google?”

They’re becoming:

“How do we make sure ChatGPT, Copilot, Gemini, or Claude can find and understand our content?”

If you’re running an Optimizely website, the good news is that you don’t need a complete redesign. A few small improvements can make your content much easier for AI systems to discover and consume.

In this post, I’ll walk through a few simple changes we’ve been discussing with customers, including:

  • Upgrading the Stott Security RobotHandler
  • Adding an llms.txt file
  • Structuring content for AI
  • Improving metadata
  • Preparing your Optimizely implementation for the next generation of search

Why AI Readiness Matters

Search engines return links.

LLMs return answers.

That means AI systems need to understand your content, not just crawl it.

If your website has:

  • messy content
  • outdated metadata
  • poor internal linking
  • no structured information

then AI assistants have a harder time understanding what your organization actually offers.

Fortunately, most of these improvements are things we should already be doing.

Step 1 – Upgrade Stott Security RobotHandler

We are currently using Stott.Security.Optimizely.RobotsHandler 3.x – CMS PaaS 12 

There isn’t necessarily anything wrong with version 3, but if you’re actively maintaining your solution, it’s worth upgrading to the latest release to benefit from ongoing fixes, compatibility improvements, and newer Optimizely support.

Updating is straightforward.

Remove the old package:

dotnet remove package Stott.Security.Optimizely.RobotsHandler

Install the latest version:

dotnet add package Stott.Security.Optimizely.RobotsHandler

After upgrading, verify that:

  • robots.txt is still generated correctly
  • your sitemap is referenced
  • custom rules still work
  • different environments behave as expected

It only takes a few minutes but keeps an important part of your site’s crawl configuration up to date.

Step 2 – Add an llms.txt File

You have probably heard about llms.txt recently.

Think of it as the AI equivalent of a sitemap.

While it isn’t an official web standard today, more organizations are publishing one to help AI systems discover their most important content.

A simple example looks like this:

# Contoso

Website:
https://contoso.com

Documentation:
https://contoso.com/docs

Products:
https://contoso.com/products

Support:
https://contoso.com/support
 

For smaller websites, a static file is perfectly fine.

For enterprise Optimizely implementations with thousands of pages, I’d recommend generating it dynamically so it always reflects your published content.

That’s something I’ll cover in a future post.

Step 3 – Structure Your Content

This is probably the biggest opportunity.

Many websites still publish pages that contain multiple unrelated topics, huge blocks of text, and headings like:

Learn More

AI models love structure.

Instead, organize pages with:

  • meaningful headings
  • summaries
  • FAQs
  • bullet lists
  • tables where appropriate

Good content structure helps humans and AI alike.

Step 4 – Don’t Ignore Metadata

Metadata is still important.

Make sure every page includes:

  • Page title
  • Meta description
  • Canonical URL
  • Open Graph tags
  • Schema.org structured data

Structured data gives AI additional context about your pages, products, articles, events, and organization.

Step 5 – Review Your Sitemap

Your XML sitemap should always be current.

Remove:

  • unpublished pages
  • redirects
  • expired content

Include:

  • important landing pages
  • articles
  • product pages
  • documentation

This benefits traditional search engines and AI crawlers alike.

Step 6 – Improve Internal Linking

One thing that’s often overlooked is internal linking.

If every page exists in isolation, AI has to work harder to understand the relationships between your content.

Instead, connect related pages naturally.

For example:

  • Blog → Product
  • Product → Documentation
  • Documentation → FAQ
  • FAQ → Support

These relationships help both users and AI navigate your website more effectively.

Step 7 – Expose Content Through APIs

If you’re building AI-powered experiences, don’t stop with web pages.

Optimizely already provides excellent options for exposing structured content, including:

  • Content Delivery API
  • Content Graph
  • Search & Navigation indexes

These services make it much easier to build Retrieval-Augmented Generation (RAG) applications and AI assistants that provide grounded responses based on your content.

Most of these are relatively small changes, but together they make your content significantly easier for AI systems to understand and surface.

As AI continues to change how people discover information, preparing your Optimizely website today will put you in a much stronger position tomorrow.

Happy Optimizing!

0

Optimizely: Upgrade Opti-ID and .NET 10 in CMS 12

Many Optimizely customers are planning their roadmap around a future migration to Optimizely CMS 13. As a result, upgrades such as Opti ID adoption and .NET modernization are often postponed until the CMS 13 project begins.

However, waiting for CMS 13 is not necessary.

Organizations running Optimizely CMS 12 can upgrade to Opti ID and move to .NET 10 today, gaining immediate security, performance, and operational benefits while reducing the complexity of a future CMS 13 migration.

Why Modernize on CMS 12?

Instead of combining multiple transformations into a single CMS 13 project, organizations can:

  • Improve security immediately
  • Standardize authentication
  • Modernize the application platform
  • Reduce future migration complexity
  • Enable newer Optimizely SaaS capabilities

A phased modernization approach is typically lower risk than a large-scale platform upgrade.

Part 1: Implementing Opti ID in CMS 12

What is Opti ID?

Opti ID is Optimizely’s centralized authentication platform that provides:

  • Single Sign-On (SSO)
  • Multi-Factor Authentication (MFA)
  • Centralized user administration
  • Unified access across Optimizely products
  • Improved security and compliance

Required NuGet Packages

Depending on your CMS 12 version, install or upgrade the following packages.

Core CMS Packages

Install-Package EPiServer.CMS
Install-Package EPiServer.CMS.AspNetCore
Install-Package EPiServer.CMS.UI

Identity Packages

Install-Package EPiServer.CMS.UI.AspNetIdentity
Install-Package Microsoft.AspNetCore.Authentication.OpenIdConnect
Install-Package Microsoft.Identity.Web

Always align package versions with the Optimizely-supported package matrix for your CMS version.

Step 1: Enable Opti ID in Optimizely

Within the Optimizely Admin Portal:

  1. Navigate to Administration
  2. Enable Opti ID
  3. Configure organization users
  4. Assign product access
  5. Configure MFA policies

Step 2: Configure Authentication

Update Program.cs.

Add Authentication Services

builder.Services
.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.Authority = configuration["Authentication:Authority"];
options.ClientId = configuration["Authentication:ClientId"];
options.ClientSecret = configuration["Authentication:ClientSecret"];

options.ResponseType = "code";

options.SaveTokens = true;
});
 

Step 3: Configure appsettings.json

{
"Authentication": {
"Authority": "https://login.optimizely.com",
"ClientId": "xxxxx",
"ClientSecret": "xxxxx"
}
}

Step 4: Configure Authorization

Map Opti ID users to CMS roles.

Example:

services.AddAuthorization(options =>
{
options.AddPolicy("CmsEditors",
policy => policy.RequireRole("WebEditors"));
});
Validate:
  • WebEditors
  • Administrators
  • ContentApprovers
  • MarketingUsers

Part 2: Upgrading CMS 12 to .NET 10

Why Upgrade?

Benefits include:

  • Improved performance
  • Better security
  • Long-term support alignment
  • Reduced technical debt
  • Better cloud-native capabilities

Step 1: Upgrade Development Environment

Install:

  • .NET 10 SDK
  • Visual Studio 2026 (or latest supported version)

Step 2: Update Project Files

Update:

<TargetFramework>net10.0</TargetFramework>

Step 3: Upgrade NuGet Packages

CMS Packages

<PackageReference Include="EPiServer.CMS.Core" Version="12.24.0" />
<PackageReference Include="EPiServer.CMS.UI" Version="12.34.4" />

Microsoft Packages  

<PackageReference Include="Microsoft.Extensions.*" />
<PackageReference Include="Microsoft.AspNetCore.*" />
<PackageReference Include="Microsoft.Identity.Web" />

Hope this helps.

Happy Optimizing!
0

Optimizely CMS 13 Upgrade Overview

Wondering how to upgrade from Optimizely CMS 12 to 13? Not sure where to start – you are not alone. 

Here is a quick overview of the key architectural changes that need to be addressed.

Key Architecture Changes

  1. No Search and Navigation
  2. Opti-ID for Identity
  3. Graph for Search and Discovery
  4.  Embedded DAM
  5. OCP for Integrations
  6. OPAL for AI

Optimizely CMS 13

 

🟩Graph — Search & Discovery

  • Provides unified content search across structured and unstructured data.

  • Enables semantic relationships between content items.

  • Powers personalized discovery experiences through relevance scoring and taxonomy mapping.

  • Integrates with Optimizely’s indexing layer for fast retrieval and filtering.

🟦Opti‑ID — Identity & Access

  • Centralized identity provider for user authentication and authorization.

  • Supports SSO, OAuth 2.0, and enterprise federation (e.g., Azure AD, Okta).

  • Manages user roles, permissions, and attribute mapping across CMS modules.

  • Ensures secure access control for editors, marketers, and external systems.

🟪OPAL — AI Services

  • Provides AI‑driven content recommendations and predictive analytics.

  • Automates tagging, summarization, and personalization workflows.

  • Integrates with external AI APIs for language and vision tasks.

  • Enhances editorial efficiency through intelligent suggestions and insights.

🟩Embedded DAM — Asset Management

  • Manages digital assets (images, videos, documents) directly within CMS.

  • Supports versioning, metadata tagging, and rights management.

  • Enables seamless asset reuse across pages and campaigns.

  • Connects to external storage or CDN for optimized delivery.

⬛OCP — Integrations & Connectors

  • Provides an integration framework for third‑party systems (CRM, ERP, marketing tools).

  • Uses REST APIs and webhooks for data synchronization.

  • Supports modular connectors for commerce, analytics, and automation.

  • Ensures scalable interoperability across enterprise ecosystems.

Hope this helps.

Happy Optimizing!

 

0

Automating Cleanup Tasks with Optimizely Scheduled Jobs

Scheduled jobs in Optimizely CMS are a powerful way to automate any background tasks like content cleanup, indexing, or reporting.

I created a simple scheduled job to delete the expired content.

Let’s get started.

Step 1: Create the Job Class

  • Created a job called ExpiredPagesCleanupJob.cs that inherits the ScheduledJobBase class.
  • Implement logger as needed, currently commented out in code.
  • Rebuild and deploy the solution.

Step 2: Run the job

  • Wondering, don’t I need to register the job in Optimizely CMS? No need, it automatically registers the job using the [ScheduledPlugin] attribute.

Optimizely-CMS-Scheduled-Job-1.png

  • Let’s navigate to Settings -> Scheduled Jobs
  • Now you will see the job listed and ready to be started.

Optimizely-CMS-Scheduled-Job-2.png

  • Let’s start the job manually for now.

Optimizely-CMS-Scheduled-Job-3.png

  • History shows whether the job has succeeded or not.

Optimizely-CMS-Scheduled-Job-4.png

  • Before running the job, the Expired Page report showed that two content pages had expired.

Optimizely-CMS-Scheduled-Job-5.png

  • Now let’s check the reporting results again. yay! It’s successfully deleted!

  • You can schedule the job every 5 seconds, minutes, hourly, and so on.

If you prefer watching a video, my quick recording –

Hope this helps.

Happy Optimizing!

0

Optimizely SaaS CMS Developer Certification

I have recently passed the Optimizely SaaS CMS Developer Certification. Sharing my experience, hope this helps.

https://academy.optimizely.com/student/activity/2181428-saas-cms-developer-certification?sid=b1c2cf21-e438-4a16-8832-c165d1724844&sid_i=2

Let’s get started.

  • To prepare for the exam, I started with Optimizely Academy’s SaaS CMS Fundamentals and went through all the modules.

 https://academy.optimizely.com/student/collection/1405874/path/4062729

 

  • The developer documentation helps to revise the concepts.

Optimizely Developer Documentation

Optimizely-SaaS-CMS-Developer-Exam-4.png

  • The complete SaaS CMS Developer Certification reference material

https://academy.optimizely.com/student/activity/2408711-saas-cms-developer-core-competency-certification-reference-material

  • When you’re ready for the exam, you can purchase the exam voucher code for $300. Alternatively, if your company is an Optimizely partner and you have competitor certification, fill out the Opt-up program to receive a free voucher code.

https://www.optimizely.com/support/education/opt-up-training-certification-program/

  • After submission, they confirm the eligibility within 7 business days in email.

Optimizely-SaaS-CMS-Developer-Exam.png

  • Once the voucher code is redeemed, you need to take the exam within 14 days. No scheduling the exam is needed, you can take exam anytime.

Exam Questions: 50 multiple-choice questions

Duration: 60 minutes

Pass Score: 85% (43 questions need to be correct)

Note: In case of exam failure, you can retake the exam after 24 hours!

After passing, Credly will send an email notification, and the certification is valid for 2 good years.

If you prefer watching a video, my quick recording –

Happy Optimizing!

2

Optimizely : Fast Installation on Local Machine

I have been exploring Optimizely and installed CMS 12 on my local machine pretty quickly using the NuGet package manager.

Assuming all prerequisites are installed on the local machine. Check out to make sure everything is installed.

https://docs.developers.optimizely.com/content-management-system/docs/system-requirements-for-optimizely

Let’s get started.

  • Add EpiServer Templates in PowerShell 

dotnet new -i EPiServer.Templates

Optimizely-installation-episerver-cms12-local-machine-10.png

  •  Let’s install Optimizely CLI Tool globally

dotnet tool install EPiServer.Net.Cli –global –add-source https://nuget.optimizely.com/feed/packages.svc/

Optimizely-installation-episerver-cms12-local-machine-11.png

  • In Visual Studio, let’s verify that the Optimizely NuGet source is added via the NuGet Package Manager Solution.

https://api.nuget.optimizely.com/v3/index.json

  • Let’s also verify the EpiServer.CMS NuGet package is installed.


Optimizely-installation-episerver-cms12-local-machine-1.png

  • Now, let’s create a new project in Visual Studio, which will give three Optimizely base projects to choose from 
    • Optimizely Alloy MVC 
    • Optimizely CMS empty
    • Optimizely Commerce empty

Optimizely-installation-episerver-cms12-local-machine-2.png

  • I chose Optimizely Alloy MVC, which is a starter kit for new developers to explore.
  • Named it – AlloyDemo1 project.

Optimizely-installation-episerver-cms12-local-machine-3-1.png

  • Provide the SQL admin SA account password since it creates the databases as part of the project in MDF and LDF files.

Optimizely-installation-episerver-cms12-local-machine-4.png

  • The new Optimizely solution is ready to explore!

Optimizely-installation-episerver-cms12-local-machine-5.png

  • To run the localhost, we just need to start the IISExpress AlloyDemo1 project, which runs cmd prompt to initialize commands.

Optimizely-installation-episerver-cms12-local-machine-6.png

Optimizely-installation-episerver-cms12-local-machine-7.png

  • Register the admin account with credentials and explore the new local instance of Optimizely.

NOTE: There is no license required for running on localhost or domainname.local. Yay!

If you prefer watching a video, my quick recording –

Happy Optimizing!

0