Check out this month's addition to Xperience by Kentico. We prepared a full plate delicious DXP goodness, including a preview of native digital commerce, improvements to customer journeys, and refinements for our Email Builder! But, of course that's not all, so dive in and learn about the updates we've just delivered in Xperience by Kentico.
Digital commerce
Commerce is a key part of many digital experiences and previous Kentico products were known for their "e-commerce" capabilities.
That's why for many customers, the most exciting announcement for this month's Refresh is our introduction of native digital commerce in Xperience by Kentico.
From now on you will see Kentico using the term digital commerce instead of e-commerce to signify that commerce is not an isolated, "electronic" capability like an impersonal digital cash register. Instead, it is part of a customer's entire digital experience and is supported by the core content and marketing digital experience management in Xperience by Kentico.
Commerce capabilities
Our Dancing Goat sample project has been updated with a simple digital commerce experience using the new preview features and APIs.
This includes a store, enhanced product pages, and checkout process with a shopping cart and price calculation.
We've also added some new commerce management applications - customers and orders - on the Xperience administration dashboard.
From the Xperience administration marketers can review order details, line items, and customer information.
From our long history enabling digital commerce management for our customers we've learned there's a rich variety of customer experiences and business processes surrounding commerce. We want to make sure we enable those by ensuring digital commerce in Xperience by Kentico is easily customizable.
For example, the order note field displayed in the order details screenshot above is a custom addition to the built-in order object type. Developers can then use our extensible APIs to access custom fields on those built-in commerce objects.
Microsoft will release C# 14 later this year along with .NET 10. C# 14 includes a new syntax for class extensions and a brand new extension member feature.
Developers will be able to use this new language feature to make their customizations of Xperience's built-in object types even better.
Plans for the preview
Because digital commerce is a preview feature we do not recommend customers begin using it for production Xperience projects today. However, we do encourage our customers and partners to begin exploring what we are building and give us feedback about it.
Our documentation explains it well.
What should you do with this feature?
- DO try out development of digital commerce and examine the sample in the Dancing Goat project template.
- DO feel free to share your feedback with the Kentico Product team.
- DO NOT use this feature in public facing and production applications, as the feature is currently incomplete.
Our plan is to continue iterating on digital commerce for several Refreshes while we receive feedback. We want to make sure we enable common use-cases and ensure commerce in Xperience is exposed seamlessly in other product features.
This might include commerce support in the Email Builder for order confirmation emails, administration notifications to let marketers know when an order is created, and customer journeys to provide clear insights for marketers on the effectiveness of their customer experiences.
Try out digital commerce and let us know what you think!
Email personalization
Personalized experiences convert better than generic ones, and this is true for both web and email channels.
Xperience's rich text editing experience for email content has included a dynamic text feature that enabled marketers to easily add an email recipient's first name, last name, or email values to the rich text without requiring any technical knowledge. Even this small amount of personalization can increase engagement and confidence in an email for customers.
Now, we've enabled dynamic text placeholders with a simple syntax modeled after our placeholder syntax for administration notifications.
These placeholders can be used in any text field, including plain text boxes, text areas, and rich text. This means you can now personalize subject lines and preview text.
Enhanced journeys
We recently released our much anticipated customer journeys feature, which helps marketers distill large amounts of customer data into a simple, touchpoint and rule based journey. These journeys are easy to create and enable marketers to see where there is friction in their digital experiences, which goals are converting effectively, and explore how customers are engaging.
We've improved the UX of the customer journeys application in Xperience so that marketers can quickly see which contacts have converted or dropped off at a given journey stage. Links are included for each contact so marketers can navigate to that specific contact's details to further explore their activities or contact information.
They can now preview the stage condition rule - in case the stage name isn't descriptive enough - without leaving the journey view, which means fewer clicks and more information where it's needed.
We also increased the placement and number of tooltips in this view and improved the calculation process and display of the journey stage chart.
Page Builder version history
In March's Refresh we added content version history management, enabling marketers to track changes to content items, preview those changes, and rollback to previous versions if needed.
Although rolling back web page changes include both web page field and Page Builder values, the preview of previous versions was limited to only the fields of the page.
We now provide the entire Page Builder content in the version preview interface using a nested structured format that gives marketers a clear, inline layout of content and component configuration.
This change means it's even easier to review and audit changes to web pages using the Page Builder.
Each page using the Page Builder for page templates, sections, and widgets will display the properties of each of those items in the page's version history and the preview will follow the hierarchy of the Page Builder configuration.
SaaS processes and configuration
Xperience by Kentico SaaS is built on Microsoft Azure's managed services, combining powerful and scalable cloud infrastructure with Kentico's infrastructure and deployment management and expertise.
With SaaS, we want to guide customers to adopt cloud application best practices and also allow them to flexibly support their business operations.
To that end, we consistently tune SaaS processes and operations to benefit our customers and this Refresh is no exception.
Cleaning the App Service file system
Xperience by Kentico SaaS applications run on Azure App Service instances. The App Service's file system is temporary and should not be relied on to store and persist data long term. This is why we include great 1st party support for Azure Storage out-of-the-box with Xperience.
With each SaaS deployment, we automatically swap deployment slots, which is Microsoft's recommended deployment process.
When monitoring customer deployments, we noticed that cache and temp files were bloating our customer's App Service filesystems and creating problems for some customer deployments.
This lead us to introduced a change in the deployment flow. We are now clearing the inactive slot’s filesystem prior to deploying the deployment package code to the inactive slot. We then swap the slots and the new deployment goes into production.
Most customers should be unaffected by this change, as our Azure Storage integration automatically regenerates local cached asset files if that cache is cleared after a deployment.
For SaaS customers that were storing important files or data on the file system, they should review our documentation and follow our guidance for file storage.
Custom domains for system emails
Although end-customer facing web, email, and headless experiences driven by Xperience by Kentico SaaS projects supported fully customizable domains, marketer "system" emails rely on our auto-generated xperience-sites domains.
For example, if a marketer receives a form submission notification email that email is sent from an xperience-sites domain.
Each of these domains is unique per-SaaS customer but the domains don't match their company brand or IT requirements and cannot be customized.
Now, a SaaS customer can follow the same custom domain flow they use to set up for an end-customer email channel experience, and apply custom email domains for Xperience's system emails.
Both system sending and service email domains can be customized from the Xperience Portal.
More media asset management
A theme of Xperience's Refreshes for the past several months has been media asset management in the Content hub.
- Auto asset metadata generation and tagging with AIRA
- Variants and focal point detection with AIRA
- ASP.NET Core image asset tag helpers for improved accessibility
- 1-click image optimizations with Content hub content item assets
We're continuing to build on this theme with two additional improvements.
Max image dimensions
Although Xperience by Kentico already supports developers and marketers managing image dimensions (width and height) with custom variants of uploaded image assets, the original non-variant version of the image could only be optimized and transformed to another image format, like webp.
If a content team wanted to ensure all images over 2000 pixels in width or height were scaled down to 2000 pixels while maintaining the correct aspect ratio, they would need to do this before uploading the image to Xperience's Content hub.
Now, each content item asset field that enables automatic image format conversion can optionally specify a max width or height for images uploaded to that field. Any images uploaded that are larger than the specified width or height will automatically be scaled down to the limiting dimension.
Transformation to a modern image format and optimization (compression) of the image will guarantee a good visitor experience most of the time, but this additional max width and height restriction prevents accidentally display images meant for print scenarios on your home page 😅.
Image asset URLs
Xperience does a great job of keeping the technical details out of the way for marketers just trying to author content and create digital experiences, especially when that content is being created and used in a single Xperience application.
For the times when a marketer needs to use an image outside of Xperience, there's a new copy URL button that will copy the asset's full content delivery URL (the same one used in a website channel) for the current language variant to the user's clipboard.
This copy button is available for any type of asset directly from the content item's form.
It's also available for each image variant in the "adjust image" image modal and it will copy the full path of that image variant.
Better CI/CD
Xperience by Kentico's CI/CD features are a key part of the development and deployment lifecycle of a project. CI lets developers branch their database changes along with their code, synchronizing those changes together with their team. CD enables propagating code and database changes from a local environment all the way to production.
CI/CD configuration v2
We received feedback about our CI/CD feature in Xperience - on one hand it's a key product capability used by every team for local development across multi-developer teams and for iterative deployments of new customizations, features, and Refreshes to production environments.
We also heard that the configuration syntax didn't give developers enough control over the specific changes included in each deployment. Additionally, in some situations the CI/CD restore process could take a long time to complete for large content repositories.
To help resolve both issues, we've updated the syntax of the CI/CD repository.config
files to version "2" and documented how teams can update their files to take advantage of the simpler configuration syntax and improved performance.
Our CI/CD configuration documentation has been completely updated to feature version 2 while still supporting the previous (now legacy) version.
New CI/CD configuration examples
So, what are some examples of these improvements?
- Developers no longer need to remember to include related content item data like
cms.contentitem
,cms.contentitemcommondata
,cms.contentitemlanguagemetadata
, andcms.contentitemreference
. This is now all handled automatically. - Content items can be filtered by code name and content type using the new
IncludedContentItemOfType
option, making it far easier to include all items of the same type when deploying a new feature and content type to QA or production. - No objects or content items are included by default, making all items opt-in for finer grained control.
- A new `` option can be used for initial deployments.
Additionally, the CreateUpdate
mode for CD restore (during deployments) has improved performance to help teams decrease deployment times.
Be sure to read over the simple syntax migration guide, review the updated documentation for CI/CD configuration, and check out our configuration templates for common scenarios.
Less code for content retrieval
By improving the efficiency of developers building solutions with Xperience by Kentico, we can increase the time to market for new digital experiences in Xperience projects and the ROI for marketers using the platform.
Xperience offers a powerful, low-level set of content retrieval APIs with the ContentItemQueryBuilder
and IContentQueryExecutor
along with an integrated cache system built on our CacheDependencyBuilder
and IProgressiveCache
. When developers need full control over content retrieval and caching, these APIs are perfect.
However, most content retrieval for website channel experiences follows standard patterns and use of these low-level APIs can require a lot of boilerplate code or custom abstractions to reduce code duplication.
This Refresh includes a new high-level content retrieval API - IContentRetriever
- built on those existing low-level primitives.
We've prepared a full section of our documentation with API details and examples, but let's look at an example here to show how much of an improvement developers can see in their code.
IContentRetriever example
What kinds of improvements can developers expect to see?
The following is an example of the code a developer might have to write to query for and retrieve a Home page in a website experience including all the necessary caching.
var webPage = contextRetriever.Retrieve().WebPage;
var query = new ContentItemQueryBuilder()
.ForContentType(
HomePage.CONTENT_TYPE_NAME,
config => config
.WithLinkedItems(4)
.ForWebsite(webPage.WebsiteChannelName)
.Where(w => w
.WhereEquals(
nameof(WebPageFields.WebPageItemID),
webPage.WebPageItemID))
.TopN(1))
.InLanguage(webPage.LanguageName);
var cacheSettings = new CacheSettings(5,
[
webPage.WebsiteChannelName,
nameof(HomePage),
webPage.LanguageName
]);
var queryOptions = new ContentQueryExecutionOptions
{
IncludeSecuredItems = channelContext.IsPreview,
ForPreview = channelContext.IsPreview
};
var page = await cache.LoadAsync(async (cacheSettings) =>
{
var homePages = await executor.GetMappedResult<HomePage>(query, queryOptions);
cacheSettings.Cached = !queryOptions.ForPreview
&& homePages is not null
&& homePages.Any();
var homePage = homePages.FirstOrDefault();
if (cacheSettings.Cached)
{
var keys = (await dependencyRetriever.Get(homePage.SystemFields.WebPageItemID, 4))
.Concat(homePage.HomePageArticlesSection
.Select(articlesSection => CacheHelper.BuildCacheItemName(new[]
{ "webpageitem", "byguid", articlesSection.WebPageGuid.ToString() }, false)))
.Append(CacheHelper.BuildCacheItemName(new[]
{ "webpageitem", "byid", homePage.SystemFields.WebPageItemID.ToString() }, false))
.ToHashSet(StringComparer.InvariantCultureIgnoreCase);
cacheSettings.CacheDependency = CacheHelper.GetCacheDependency(keys);
}
return homePage;
}, cacheSettings);
Although much of this might be repeated an abstracted into shared logic, it still needs to be written for this common use case.
It's worth noting we didn't include the 5 additional services that are used in the above code sample to reduce the length of the example.
With the new IContentRetriever
, the equivalent querying would be the following.
var page = await contentRetriever.RetrieveCurrentPage<HomePage>();
We've gone from over 50 lines of code to just 1! 🤩
Experimental API
The new IContentRetriever
is currently marked as experimental. The underlying automatic caching system (which uses our new CacheDependencyBuilder
) is not yet in place. This means developers using IContentRetriever
would still need to bring their own caching code.
We do want developers to explore this new content querying API and experiment with how they might adopt it in their projects and let us know if it meets their needs.
We are planning to release the full, production ready version of the IContentRetriever
in May's Refresh, including the built-in auto caching.
We have no plans to remove the existing, low-level content querying APIs. In fact the IContentRetriever
is built on top of them.
We created the low-level approach first because we wanted to optimize the core capability. We also wanted to see how Xperience development teams were writing their queries so we could identify common patterns as inspiration for this higher-level and easier to use API.
Teams might find that over time their projects use 90-95% IContentRetriever
and 5-10% ContentItemQueryBuilder
with IContentQueryExecutor
.
Developers can keep their existing content retrieval code, which does not need to change, and opt-in to the new API when writing new code or refactoring existing querying.
Other developer enhancements
Along with the updates to CI/CD and new IContentRetriever
, we have several other enhancements aimed at our developer community.
The CacheDependencyBuilder
and our underlying data caching system now supports defining cache dependencies on reusable field schemas and has several new context-aware extension methods. This means developers can see less of a need to access the IWebsiteChannelContext
or IPreferredLanguageRetriever
APIs in their code when defining cache dependencies.
Xperience added support for async global event handling, which lives side-by-side with the still-supported legacy event handling. The new event handling APIs support dependency injection and .NET dependency service registration which will be more intuitive to developers familiar with modern .NET.
We recommend developers adopt the new event handling for all new code and projects.
What's next?
As always, check out our documentation Changelog for the full Refresh feature and technical details.
We hope these new capabilities, features, and API improvements unlock solutions for you. Try them out, let us know 👋 what you think.
For the next Refresh we have several highly anticipated features!
- Content sync to let marketers synchronize their own pre-production content to production environments.
- Web page usage tracking which brings the same awesome reusable content item usage tracking to web pages, with UX updates.
- Production ready content retriever API to make Xperience by Kentico developers even more productive.
These updates will, as always, accompany a number of UX and developer-focused improvements.
Check back next month for another Xperience by Kentico Refresh review!
For the technical audience, this Refresh is represented by v30.4.0 of Xperience by Kentico.

Kentico Community
The Kentico Community