Experience Sitecore ! | All posts by martin

Experience Sitecore !

More than 300 articles about the best DXP by Martin Miles

Blog content

So, don't miss out! Subscribe to this blog/twitter from the buttons above!

Reviewing my 2025 Sitecore MVP contributions

Sitecore Technology MVP 2025

Sitecore Technology MVP 2024 Sitecore Technology MVP 2023 Sitecore Technology MVP 2022 Sitecore Technology MVP 2021

Sitecore Technology MVP 2020 Sitecore Technology MVP 2019 Sitecore Technology MVP 2018 Sitecore Technology MVP 2017


The Sitecore MVP program recognizes individuals who have demonstrated advanced knowledge of the Sitecore platform and a commitment to sharing knowledge and technical expertise with community partners, customers, and prospects over the past year. The program is open to anyone passionate about Sitecore and eager to contribute to the community.

Over the past application year, starting from December 1st, 2024, I have been actively involved in the Sitecore community, contributing in a number of ways.


Sitecore Symposium 2025 Presentation

Together with Vasiliy Fomichev, we led a very insightful 50-minute workshop on building agentic copilots for Sitecore, during which Vasiliy provided the full theoretical foundation for the topic. I took it from there with a practical, hands-on demo of what it takes to make one from zero to the actual work, essentially giving the step-by-step instructions one could reproduce to get this done in under an hour. 

My demo showcased the effort and key decisions required to build a Microsoft Teams copilot, enabling marketers to perform specific operations (mass rebranding in our case, but could be anything) in the fastest, safest way. 

The whole chain looks as follows:

    Ms Teams ==> Teams Bot ==> LLM ==> Custom MCP Server ==> PowerShell ==> SPE (and the same reverse way back)

Recordings are available:

Agentic AI Challenge

Thrilled to be recognized as a Top 2nd Finalist in the Sitecore AI Challenge out of 150 submissions globally!

The AI Visibility app I've built will help SitecoreAI XM Cloud clients optimize their websites for AI within minutes. Like Michelle Boockoff-Bajdek mentioned, it's sometimes surprising to learn the fundamental questions people ask about your brand. Our app takes the guesswork out of AI optimization and helps Sitecore users gain a competitive advantage in digital. 

The app is now being reworked (implementing all the recent changes released after Sym) for review to join the public SitecoreAI Marketplace.

Awarding ceremony recording.

Sitecore Blogs 

This year, I have written 24 blog posts on various topics related to Sitecore, top-notch findings about XM Cloud and other composable products, best practices, tips and tricks, and case studies:

YouTube Videos

I occasionally create video recordings/walkthroughs and upload them to my YouTube channel. Some of them are very valuable, while some others are not much. I don't treat YouTube as a primary channel; instead, I see it as a supporting medium for sharing knowledge. For example, I upload all my user group recordings, public presentations, and other significant footage.

Sitecore User Groups

  1. Last fall, I established and organized the most wanted user group of the year – Sitecore Headless Development UserGroup, educating its ~500 members. This one is very special, since headless development has become the new normal for delivering sites with Sitecore. At the same time, so many professionals feel left behind, unable to keep up with the fast-emerging tech. I put it as my personal goal to run it monthly, helping the community learn and grow “headlessly,” and that is one of my commitments to it. It became the most run and most attended/reviewed event among Sitecore user groups, with eight events organized this year (#11, #12, #13, #14#15#16#17, and #18). All sessions are recorded and publicly available on YouTube, and they are also referenced on the individual event pages.
  2. Organized two Los Angeles Sitecore User Groups (#22 and #23). This user group also has ~500 members.
  3. Presented at several user groups.

GitHub

  • There are plenty of repositories among my contributions that are still meaningful and helpful.
  • Not just repositories I share on GitHub, but also plenty of useful gists.
  • I keep the Awesome Sitecore project up-to-date. This repository has plenty of stars on GitHub and is an integral part of the big Awesome Lists family. If you haven’t heard of Awesome Lists and its significance, I highly recommend reading these articles - first and second.

Support Tickets

  • CS543626, which relates to a broken search in XM Cloud.

MVP Program

  • I participate in most (if not all) of the webinars and MVP Lunches (often in both time zones per event).
  • I think MVP Summit is the best perk of the MVP Program, so never miss it. This year, I’ve learned a lot and also provided feedback to the product teams, as I usually do.
  • I participate in several streams of the Early Access Program, sharing insights with the product team ahead of GA dates.
  • In the past, I have participated in a very honorable activity: reviewing first-time applicants for the MVP Program, which is the first line of evaluation, and carefully matching each first-time applicant against high Sitecore MVP standards. This year, I am also taking part in reviewing.

Sitecore Learning

I have collaborated with the Sitecore Learning team for the past 3-4 years, and this year was no exception: they invited me to work on the XM Cloud Certification Exam version 2025. Unfortunately, I cannot publicly disclose this activity due to the NDA signed. This piece of work was successfully completed in the assigned timeframes.

Sitecore Telegram

  • I am making Telegram a premium-level channel for delivering Sitecore news and materials. Telegram offers a unique set of features that no other software can, and I am leveraging these advantages to provide greater convenience to my subscribers.
  • Started in 2017 as a single channel, it has expanded rapidly and reached 1,100 subscribers!
  • Growth did not stop; it escalated further beyond Sitecore, becoming composable with a dedicated channel for almost any composable product.

    Here they all are:

XM Cloud Daily series

With my dedication to Sitecore's new flagship product, XM Cloud, it was no surprise that I just launched a new XM Cloud Daily series of tips and tricks on social media, which has since evolved into SitecoreAI Daily.

Every day, I post useful tips and tricks about new Sitecore cloud offerings on Twitter/X and LinkedIn. This is what it looks like (a few recent postings):

In general, I am very active on LinkedIn (with ~10K+ followers) and Twitter/X (with almost ~1.3K subscribers), posting multiple times per week, often a few a day. 

Out of curiosity, I used the AI-powered browser Comet to count my posts, and it found 330 LinkedIn Sitecore-related posts since 1 December 2024.

Popularizing AI with Sitecore

In January 2025, I joined Zont Digital - an AI-first Sitecore partner, where all our thinking and operations are driven by this philosophy. Thus, I invented and developed Shift AI, which automates ~80% of the migration from legacy Sitecore XP to the new Sitecore AI XM Cloud.

That wasn't the only effort to make Sitecore an AI-first organization. I can name numerous activities, such as developing (non-official) Sitecore MCP server, Symposium Demo, and multiple PoCs.


... and ironically, AI pays my love back:


Hope that is not a hallucination, haha!

Sitecore PowerShell as a SitecoreAI Marketplace app

I have reverse-engineered the Sitecore PowerShell Extension and reassembled it into a SitecoreAI Marketplace app!

This PoC is essentially a blueprint app. On its own, it is a universally working example. Still, its real benefit comes from this app providing a ready-to-use boilerplate that can be reused to build a variety of specialized SitecoreAI Marketplace apps on top of the SPE approach.

The most awesome feature is that all of your Marketplace context values could be easily passed into a remotely executed PowerShell script as a script parameter: there is a convenient Script Parameters mapping with maramater token preview (so that you never miss the right value!)

Here's what it looks like:

To enable SPE with Remoting:

  1. From SitecoreAI Deploy, add SPE_REMOTING_SECRET environmental CM secret, then re-deploy.
  2. Install a package, which will enable SPE with Remoting: SPE_with_Remoting.zip (3.93 kb)
  3. This package also adds a disabled sitecore\speremoting user with admin rights, which you must enable manually from User Manager

Once this setup is complete, the environment is fully prepared to use the app. The Marketplace app supports multitenancy; however, SPE Remoting must be enabled individually for every environment you intend to work with.


Case Study: Search Solutions Comparison for Sitecore XM Cloud Migration

1. Introduction

This case study presents a high-level comparison of four leading search solutions - CoveoSitecore Search, Algolia, and SearchStax - for a Benelux-based financial organization considering a migration to Sitecore AI. The analysis focuses on licensing costs, implementation effort, potential hidden fees, technical limitations, and the availability of React-based frontend SDKs for each platform. The goal is to provide the necessary information to enable an informed decision on whether to migrate from Sitecore XP and to determine which solution best suits the organization's needs and budget.

The website has the following traffic characteristics, taken into consideration:

  • Annual Traffic: ~700K sessions in 2024 and ~850K sessions in 2023.
  • Components: ~160 unique components.
  • Budget Expectations: under to €10K for a “composable” (external) search provider

Section 4 of this document contains the conclusion and the considered recommendation based on the balance of individual organizations’ parameters.

2. Executive Summary

The following table provides a high-level comparison of the four search solutions:

Feature

Coveo

Sitecore Search

Algolia

SearchStax

Licensing Cost

High (Enterprise-focused)

Medium (Bundled with Sitecore)

Low (Pay-as-you-go)

Medium-High

Implementation Effort   

High

Low to Medium

Medium-High (Custom Integration)

Medium

Ideal Use Case

Complex, personalized search

Native Sitecore experiences + AI

Fast, real-time search

Managed Solr for Sitecore

React SDK

Yes (Atomic React)

Yes (Native SDK)

Yes (InstantSearch)

Yes (UI Kits)

Financial Services Fit

Excellent (Strong security & compliance)

Good (Native integration benefits)

Good (Flexible and secure)

Good (Managed Solr security)

3. Detailed Analysis

3.1. Coveo

Coveo is a powerful, AI-driven enterprise search platform that offers advanced personalization and relevance tuning capabilities. It is a mature product with a strong presence in the Sitecore ecosystem, well-suited for large organizations with complex search requirements.

Licensing and Cost

Coveo's pricing is geared towards enterprise clients and is generally the highest of the four options. The pricing model is based on a combination of query volume and the number of indexed items, with subscriptions typically sold on an annual or multi-year basis.

  • Coveo for Sitecore Plans: The Pro+ plan starts at 200,000 queries per month, while the Enterprise+ plan starts at 300,000 queries per month and offers volume-based pricing. Given the client's traffic, they would likely fall into the lower tiers of these plans.
  • Implementation Cost: A typical enterprise-level deployment, including licensing and professional services, can range from $50,000 to over $100,000 USD. This does not include ongoing maintenance or support costs.
  • Hidden Fees: Additional costs can arise from add-on features such as Generative AI, advanced security, and dedicated technical support. Overages on query limits are handled through a discussion with a customer manager rather than automatic charges, providing some flexibility but also potential for unexpected cost increases.

Implementation Effort

Coveo's integration with Sitecore is well-documented and mature, but it is not a simple plug-and-play solution. The platform's power and flexibility come at the cost of increased complexity.

  • Complexity: Coveo has a steep learning curve and often requires dedicated developer time to configure even moderately complex use cases.
  • Expertise: Successful implementation typically requires specialized knowledge of the Coveo platform, and many organizations opt for professional services from Coveo or a certified partner.
  • Time to Value: The complexity of configuration and optimization can lead to a longer implementation timeline compared to other solutions.

React SDK and Frontend Components

Coveo provides a comprehensive set of tools for building modern search UIs with React.

  • Coveo Atomic React (@coveo/atomic-react): A React wrapper around the core atomic web component library, providing a rich set of components for building search interfaces.
  • Plasma Design System: A React-based design system used in the Coveo Cloud Administration Console, which can be leveraged for a consistent look and feel.

Technical Limitations

While powerful, Coveo does have its limitations.

  • File Size: The maximum size for a single indexed item is approximately 256 MB, which includes metadata and permissions.
  • Configuration Complexity: The platform's extensive features can be difficult to manage, and the documentation is sometimes considered vague or incomplete.
  • Cost at Scale: Although the client's current traffic is low, a significant increase in search queries or indexed content could result in substantial cost increases.

3.2. Sitecore Search

Sitecore Search is the native search solution for the Sitecore ecosystem, designed to provide a seamless and integrated experience. It is an AI-powered, headless platform that focuses on delivering personalized and predictive search results.

Licensing and Cost

Detailed pricing for Sitecore Search is not publicly available and requires a direct quote from Sitecore. However, it is often bundled as part of the unified SitecoreAI (ex. XM Cloud) offering, which can make it a cost-effective option for organizations already invested in the Sitecore ecosystem.

  • Pricing Model: The cost is likely tied to the overall Sitecore contract and may not be broken down as a separate line item. This can simplify budgeting, but also makes it difficult to compare directly with other solutions.
  • Implementation Cost: As a native solution, the initial setup is generally more straightforward than third-party integrations. However, customization and optimization will still require development effort.
  • Hidden Fees: Potential hidden costs could arise if the bundled search capacity is exceeded.

Implementation Effort

Sitecore Search is designed for seamless integration with XM Cloud, which should reduce the initial implementation effort compared to third-party solutions.

  • Native Integration: The platform is designed to seamlessly integrate with Sitecore's content models and personalization features, streamlining the integration process.
  • Developer Expertise: Implementation can typically be handled by developers with standard Sitecore expertise, without requiring specialized third-party knowledge.
  • Time to Value: Native integration and a familiar development environment can lead to a faster time to value for most projects.

React SDK and Frontend Components

Sitecore provides a native and well-supported React SDK for building search experiences.

  • Sitecore Search JS SDK for React: A dedicated SDK that allows developers to quickly integrate search experiences into React applications. It includes a full set of UI components and a starter kit to accelerate development.

Technical Limitations

As a relatively new product, Sitecore Search has some limitations and operational challenges that need to be considered.

  • Indexing Delays: Crawling content from multiple sites with a single source can lead to prolonged indexing times, sometimes exceeding an hour. This can be a significant issue for time-sensitive content.
  • Scalability: For large, multi-site implementations, it is recommended to create separate sources for each site to improve indexing efficiency. This adds a layer of management complexity.
  • Real-Time Updates: The platform currently relies on full crawls for index updates, and there is a lack of a "Push API" for immediate, incremental updates. This can result in a delay of several minutes for new content to appear in search results.

3.3. Algolia

Algolia is a developer-focused search-as-a-service platform known for its speed and real-time capabilities. It provides a flexible and powerful set of APIs that enable the creation of fast and responsive search experiences.

Licensing and Cost

Algolia's pricing is transparent and based on a pay-as-you-go model, making it very cost-effective for organizations with low to moderate search traffic. For the client's current traffic levels, the costs would be minimal.

  • Pricing Model: The Grow and Grow Plus plans offer a free tier of 10,000 search requests per month, with additional requests billed at a low rate of $1,000 per 1,000 requests. The number of records (~350 pages) is well within the free tier of 100,000 records.
  • Cost Estimate: Based on the client's average annual traffic of ~775,000 sessions, the estimated annual licensing cost for Algolia would be between $17 and $197 USD, depending on the plan and the actual search rate.
  • Hidden Fees: The primary "hidden" cost with Algolia is the implementation effort, as there is no native Sitecore connector. While the licensing is inexpensive at this scale, a significant increase in traffic or a move to the enterprise Elevate plan could result in substantial cost increases, with average enterprise plans costing around $350,000 annually.

Implementation Effort

While Algolia is known for its developer-friendly APIs, the lack of a native Sitecore connector means that integration requires custom development.

  • Custom Integration: Implementing Algolia with Sitecore requires building a custom integration to index content and create the search interface. This can be a time-consuming and expensive process.
  • Third-Party Connectors: Third-party connectors are available, such as the "Algolia Index Builder for Sitecore" by Brimit, which can simplify the integration process. However, these connectors may come with their own licensing costs and support limitations.
  • Developer Expertise: The implementation requires developers with experience in both Sitecore and API-based integrations.

React SDK and Frontend Components

Algolia offers an actively maintained open-source React library.

  • React InstantSearch (react-instantsearch): A comprehensive library that lets developers create an instant search result experience with a rich set of pre-built widgets. It is highly performant and customizable.

Technical Limitations

Algolia's focus on speed and simplicity comes with some trade-offs.

  • Manual Tuning: Achieving high search relevance often requires manual tuning and configuration of the search algorithm.
  • eCommerce Features: While it can be used for e-commerce, it has limited specialized features compared to platforms like Coveo.
  • Indexation Time: Some users have reported that indexation time can be a factor that impacts user experience, particularly for large and complex datasets.

3.4. SearchStax

SearchStax offers both a fully managed site search solution (Site Search) and a managed Apache Solr hosting service (Managed Search). For a Sitecore XM Cloud implementation, the Site Search product is the most relevant, as it is designed to integrate directly with modern, headless architectures.

Licensing and Cost

SearchStax Site Search pricing is based on a tiered subscription model, with the entry-level Essential plan starting at $799 per month (billed annually).

  • Pricing Model: The plans scale based on the number of indexed items, monthly searches, and advanced features. The Advanced and Premium plans require a custom quote.
  • Implementation Cost: The cost of implementation is moderate, as SearchStax provides a dedicated Sitecore module and UI kits to accelerate development.
  • Hidden Fees: Additional costs could arise from overages on search requests or indexed items, or from the need for advanced security and support add-ons available with the Managed Search product.

Implementation Effort

SearchStax has invested in creating a smooth integration experience for Sitecore users, including those on XM Cloud.

  • Sitecore Integration: SearchStax offers a dedicated module for Sitecore, which connects directly to the Site Search solution, as well as connectors for their Managed Search product.
  • Developer Expertise: The availability of UI kits and pre-built components reduces the required level of specialized expertise, allowing developers with standard React and Sitecore knowledge to implement the solution effectively.
  • Time to Value: The combination of a dedicated Sitecore module and React UI kits can significantly accelerate the development process and reduce the time to value.

React SDK and Frontend Components

SearchStax provides a comprehensive set of tools for building search interfaces with React.

  • Search UI Kits: SearchStax offers UI kits for JavaScript, Vue, Angular, and React/Next.js, which include pre-built components to streamline the development of the search UI.

Technical Limitations

SearchStax has some service limits in place to ensure stability and performance.

  • API and Document Limits: There are limits on API requests per second (20+), document size (100KB), and payload size (10MB).
  • Feature Limits: There are also limits on the number of facet values (50), promoted items (10), and other features.
  • User-Reported Issues: Some users have reported that the platform can be expensive and that there are limitations on the number of search results that can be displayed per category.

4. Conclusion and Recommendations

Each of the four search solutions offers a viable path for a Sitecore XM Cloud migration, but they cater to different priorities and budgets. The availability of React-based SDKs and component libraries from all four vendors is a significant advantage, as it simplifies the development of the front-end search experience.

  1. Coveo remains the top-tier enterprise solution, offering the most advanced AI and personalization features. Its high cost is justified by its power and its proven track record in the financial services industry.
  2. Sitecore Search provides the tightest integration with the SitecoreAI ecosystem, which can lead to a more streamlined implementation and a unified user experience.
  3. Algolia is the most budget-friendly option for the client's current traffic, but the lack of a native Sitecore connector and some basic features introduces significant implementation risk and long-term maintenance overhead.
  4. SearchStax presents a compelling middle ground. It offers a robust, AI-powered search solution with a clear integration path for Sitecore XM Cloud and a more accessible price point than Coveo. Its managed Solr foundation provides a high degree of security and reliability.

Recommendations

  1. Primary Recommendation: Sitecore Search.It should be considered a seamless, all-in-one solution from a single vendor, thus natively fits in the product space. A thorough proof of concept is essential to validate that its performance and scalability meet the client's needs. Native integration and the presence of the best-breed front-end components make this choice the best balance among these platforms. It totally fits the aligned budget. Additionally, it features AI personalization capabilities and operates within the newly created Unified Data, alongside XM Cloud (for tracking, analytics, personalization, and more).
  2. For a financial institution that prioritizes a premium, secure, and highly personalized user experience, Coveo could be a recommended solution. Its enterprise-grade features and strong compliance posture are well-suited to the needs of the financial services industry. However, due to budget concerns, Coveo is not a suitable option. Coveo's minimal tier times exceed the organization’s desired budget range.
  3. Strong Alternative: SearchStax.If the cost of Coveo is a significant barrier, SearchStax is a strong alternative. It provides a powerful, AI-driven search experience with a supported integration path for Sitecore XM Cloud. Its balance of features, cost, and ease of implementation makes it a very attractive option. However, despite being a budget option, the total cost of ownership can often be higher compared with Sitecore Search and Algolia.
  4. Budget-Constrained Option: Algolia.Algolia should only be considered if the budget is the primary driver, and the organization has a strong in-house development team to manage custom integration. The long-term total cost of ownership may be higher than the initial licensing fees suggest.

The choice between Sitecore Search and SearchStax will likely come down to a trade-off between the advanced, integrated features of the native Sitecore product and yet still powerful solution offered by SearchStax.

5. References

The new and shiny Sitecore Marketplace

For years, the Sitecore community has been the platform's secret weapon. We've built countless modules, shared our knowledge at SUGCONs, and pushed the boundaries of what's possible with this DXP. Today, I'm thrilled to share my experience with the Sitecore Marketplace, which officially launched in 2025 and represents a fundamental shift in how we extend and customize Sitecore in the composable era.

I've had the privilege of participating in the Early Access Program and recently submitted a proposal for the Sitecore AI Challenge that made it to the finals. Today, I'm completing the final submission, and I can tell you firsthand: this is not just another feature release. The Marketplace is a strategic bet on the community, a multiplication of our collective effort, and a recognition that Sitecore's greatest strength has always been its people.

In this comprehensive guide, I'll walk you through everything you need to know to build production-ready Marketplace apps, from arch.


Why the Marketplace Matters: The Strategic Context

Let's be honest: the shift to SaaS has been challenging for many of us who built our careers on the extensibility of Sitecore XP. We could customize anything, extend everything, and build solutions that were uniquely tailored to our clients' needs. When XM Cloud launched, there was a legitimate concern: how do we maintain that level of customization in a managed SaaS environment?

The Marketplace is Sitecore's answer to that question. It's a way to preserve the extensibility we love while embracing the benefits of SaaS. More importantly, it's a recognition that the community is the engine of innovation. By providing us with the tools to build and share apps, Sitecore is effectively multiplying their own development capacity by the size of the community. That's brilliant.

The Developer Studio: Your Starting Point

Your journey begins in the Developer Studio, a new section in the Sitecore Cloud Portal. This is where you'll create and configure your apps. The interface is clean and intuitive, but there are some important decisions to make:

Creating Your App

When you create a new app, you'll need to provide:
  • App Name: This appears in the Marketplace and to end users.
  • Description: Make it clear and compelling.
  • Logo URL: This is mandatory. Your logo needs to be hosted somewhere accessible.
  • Extension Points: Where your app will appear in the Sitecore UI.
  • API Access: Which Sitecore APIs your app needs to call.
  • Deployment URL: Where your app is hosted.
It's important to note that you host your own apps. Sitecore provides the SDK and the integration points, but the hosting is entirely up to you. This gives you complete control over your technology stack, deployment pipeline, and scaling strategy. I'm hosting my AI Challenge app on Vercel, which has been seamless.

App Types: Custom vs. Public

Currently, you can build Custom Apps, which are available to your organization and any other organizations you explicitly authorize. Public Apps, which will be available to all Sitecore customers through the Marketplace, are coming in a later release. Public apps will undergo a quality review process, which is a good thing for the ecosystem.

Architecture: Making the Right Choice

The architecture you choose for your Marketplace app has significant implications for what you can build and how complex your development will be. There are two main patterns:

1. Client-Side Architecture

In a client-side architecture, your app runs entirely in the user's browser. All API requests to Sitecore APIs are proxied through the browser using the SDK. This is the simplest option and is ideal for:
  • UI extensions and custom fields
  • Dashboard widgets
  • Simple data visualization
  • Apps that don't require server-side processing
The key advantage is simplicity. You can build a client-side app with just React or Vue, deploy it as a static site, and you're done. The SDK handles all the authentication and communication with Sitecore automatically.

2. Full-Stack Architecture

A full-stack architecture includes both client-side and server-side components. This is necessary when you need to:
  • Make direct server-to-server API calls to Sitecore
  • Integrate with AI services (like OpenAI, Anthropic, etc.)
  • Perform heavy processing or data transformations
  • Implement agentic workflows
  • Store and manage your own data
For full-stack apps, you'll need to use custom authorization with Auth0. This is more complex to set up, but it gives you the flexibility to build sophisticated applications. My AI Challenge submission is a full-stack app because it integrates with multiple AI services and requires server-side orchestration.

3. Authorization: Built-in vs. Custom

The Marketplace SDK supports two authorization patterns:
  • Built-in Authorization: The SDK automatically manages authentication. This is the default and recommended option for client-side apps.
  • Custom Authorization (Auth0): Required for server-side API calls. You'll need to configure Auth0 credentials in the Developer Studio and handle session invalidation when your app is available in multiple organizations.
For your first app, I strongly recommend starting with client-side architecture and built-in authorization. Get something working, understand the SDK, and then move to full-stack if you need to.

Extension Points: Where Your App Lives

Extension points are the designated areas in the Sitecore UI where your app can be displayed. Understanding them is crucial to designing a great user experience.

1. Standalone (Cloud Portal)

Your app appears on the Cloud Portal home page in the "Marketplace apps" section. It opens in a new tab under the navigation header. This is ideal for apps that are used independently of XM Cloud, like reporting dashboards or administrative tools.
Image source: cloud portal app configuration screen

2. XM Cloud Full Screen

Your app is listed in the "Apps" dropdown in the XM Cloud navigation header and appears full screen. This is perfect for apps that need a lot of screen real estate, like content migration tools or complex configuration interfaces.
Image source: cloud portal app configuration screen

3. XM Cloud Page Builder Context Panel

This is one of my favorite extension points. Your app appears in the context panel to the left of the Page Builder canvas. This is ideal for page-level extensions, like:
  • Real-time analytics insights
  • SEO analysis tools
  • Content quality checkers
  • HTML validators
The context panel is always visible while editing a page, so your app is right there when users need it.

4. XM Cloud Page Builder Custom Field

Your app appears in a modal when a user clicks "Open app" on a custom field. This is perfect for:
  • Icon pickers
  • Color pickers
  • External data selectors
  • Media libraries
I've seen some brilliant implementations of this extension point, including a Material UI icon picker with over 10,000 icons.
Image source: cloud portal app configuration screen

5. XM Cloud Dashboard Widget

Your app can be added as a draggable widget to the XM Cloud site dashboard. This is ideal for displaying site-wide metrics, like bounce rates, popular pages, or performance data from third-party analytics tools.

The Marketplace SDK: A Deep Dive

The Sitecore Marketplace SDK is the foundation of all Marketplace development. It's open-source, well-documented, and a pleasure to work with. Let's dive into the details.

1. Package Structure

The SDK is divided into distinct packages:
  • @sitecore-marketplace-sdk/client: Required for all apps. Handles secure communication between your app and Sitecore.
  • @sitecore-marketplace-sdk/xmc: Optional. Provides type-safe interfaces for XM Cloud APIs, including queries, mutations, and subscriptions.

2. Getting Started: The 5-Minute Quickstart

Here's how you can get a basic Marketplace app running in about 5 minutes:

1. Create a new Next.js or Vite app:
npx create-next-app@latest my-marketplace-app
cd my-marketplace-app
2. Install the SDK packages:
npm install @sitecore-marketplace-sdk/client @sitecore-marketplace-sdk/xmc
3. Create a custom hook for the Marketplace client:
// hooks/useMarketplaceClient.ts
import { useEffect, useState } from 'react';
import { ClientSDK } from '@sitecore-marketplace-sdk/client';

export const useMarketplaceClient = () => {
    const [client, setClient] = useState<ClientSDK | null>(null);
    const [isInitialized, setIsInitialized] = useState(false);
    const [error, setError] = useState<Error | null>(null);

    useEffect(() => {
        const initClient = async () => {
            try {
                const sdkClient = new ClientSDK({
                    onError: (err) => {
                        console.error('SDK Error:', err);
                        setError(err);
                    }
                });

                await sdkClient.initialize();
                setClient(sdkClient);
                setIsInitialized(true);
            } catch (err) {
                setError(err as Error);
            }
        };

        initClient();
    }, []);

    return { client, isInitialized, error };
};
4. Use the client in your component:
// app/page.tsx
"use client"
import { useMarketplaceClient } from '@/hooks/useMarketplaceClient';
import { ApplicationContext } from '@sitecore-marketplace-sdk/client';
import { useState, useEffect } from 'react';

export default function Home() {
    const { client, error, isInitialized } = useMarketplaceClient();
    const [appContext, setAppContext] = useState<ApplicationContext | null>(null);

    useEffect(() => {
        if (isInitialized && client) {
            client.query('application.context')
                .then((res) => {
                    if (res.data) {
                        console.log('Application context:', res.data);
                        setAppContext(res.data);
                    }
                })
                .catch((err) => console.error('Query failed:', err));
        }
    }, [isInitialized, client]);

    if (error) {
        return <div>Error initializing SDK: {error.message}</div>;
    }

    if (!isInitialized) {
        return <div>Initializing Marketplace SDK...</div>;
    }

    return (
        <div>
            <h1>My Marketplace App</h1>
            {appContext && (
                <div>
                    <p>Organization: {appContext.organization.name}</p>
                    <p>User: {appContext.user.email}</p>
                </div>
            )}
        </div>
    );
}
That's it. You now have a working Marketplace app that can communicate with Sitecore.

3. Queries, Mutations, and Subscriptions

The SDK provides three main ways to interact with Sitecore APIs

 

1. Queries: Reading Data

Queries are used to retrieve data from Sitecore. Here are some common examples:
// Get application context
const contextResult = await client.query('application.context');

// Get list of sites
const sitesResult = await client.query('sites.list', {
    contextId: appContext.tenant.id
});

// Get a specific page
const pageResult = await client.query('pages.get', {
    contextId: appContext.tenant.id,
    pageId: 'your-page-id'
});


2. Mutations: Writing Data

Mutations are used to create, update, or delete data in Sitecore:
// Create a new template
const templateResult = await client.mutate('templates.create', {
    contextId: appContext.tenant.id,
    name: 'My Custom Template',
    baseTemplates: ['{1930BBEB-7805-471A-A3BE-4858AC7CF696}']
});

// Create a new item
const itemResult = await client.mutate('items.create', {
    contextId: appContext.tenant.id,
    parentId: 'parent-item-id',
    templateId: 'template-id',
    name: 'My New Item',
    fields: {
        Title: 'My Item Title',
        Text: 'My item content'
    }
});

// Delete an item
await client.mutate('items.delete', {
    contextId: appContext.tenant.id,
    itemId: 'item-to-delete'
});


3. Subscriptions: Real-Time Updates

Subscriptions allow your app to receive real-time updates when data changes in Sitecore. This is particularly useful for Page Builder extensions:
// Subscribe to page changes
const unsubscribe = client.subscribe('pages.changed', (data) => {
    console.log('Page changed:', data);
    // Update your UI accordingly
});

// Don't forget to unsubscribe when your component unmounts
useEffect(() => {
    return () => {
        if (unsubscribe) {
            unsubscribe();
        }
    };
}, []);

4. Context Management: Application vs. Pages

The SDK provides two types of context:
Application Context is available in all extension points and includes:
  • Tenant and resource IDs
  • Environment details
  • User information and permissions
  • Organization data
Pages Context is only available in Page Builder extension points and includes:
  • Current page information
  • Site details and configuration
  • Real-time updates via subscriptions
Understanding which context is available in your extension point is crucial for building the right user experience.
Example of both contexts as they feed the Page Content Panel Extension point

Server-Side Logic with Next.js

For full-stack apps, you'll need to make server-side API calls to Sitecore. The SDK provides an experimental server-side client for this purpose:
// app/api/items/route.ts
import { experimental_createXMCClient } from '@sitecore-marketplace-sdk/xmc';
import { NextRequest, NextResponse } from 'next/server';

export async function POST(request: NextRequest) {
    try {
        // Get the access token from the Authorization header
        const authHeader = request.headers.get('Authorization');
        if (!authHeader) {
            return NextResponse.json(
                { error: 'Missing authorization' },
                { status: 401 }
            );
        }

        const accessToken = authHeader.replace('Bearer ', '');

        // Get the context ID from the request body
        const { contextId, itemData } = await request.json();

        // Create the XMC client
        const xmcClient = experimental_createXMCClient({
            accessToken,
            contextId
        });

        // Make the API call
        const result = await xmcClient.items.create({
            parentId: itemData.parentId,
            templateId: itemData.templateId,
            name: itemData.name,
            fields: itemData.fields
        });

        return NextResponse.json(result);
    } catch (error) {
        console.error('Server-side API call failed:', error);
        return NextResponse.json(
            { error: 'Failed to create item' },
            { status: 500 }
        );
    }
}
The key pattern here is:
  1. Get the access token from the Authorization header
  2. Get the context ID from the request
  3. Create the XMC client with both
  4. Make your API calls
  5. Handle errors appropriately

Styling: Blok vs. shadcn/ui

Sitecore recommends using Blok, their official design system, for Marketplace apps. Blok ensures your app looks and feels like a native part of Sitecore, and it includes built-in accessibility compliance.

However, many developers (myself included) prefer shadcn/ui for its flexibility and modern design. There's even a project called blok-shadcn that combines the best of both worlds, providing shadcn/ui components styled to match Sitecore's design language.
For my AI Challenge app, I used shadcn/ui with custom Sitecore-inspired theming, and the results have been excellent.

Development Best Practices

After building several Marketplace apps, here are some best practices I've learned:

1. Local Development with Hot Reload

During development, set your deployment URL to https://localhost:3000 (or whatever port you're using). This allows you to test your app in the actual Sitecore UI while developing locally. You'll need to use HTTPS, even locally. For Vite apps, use vite-plugin-mkcert. For Next.js, use mkcert to generate self-signed certificates.

2. Start Simple, Add Complexity Gradually

Don't try to build a full-stack app with AI integration on your first attempt. Start with a simple client-side app that displays some data. Get comfortable with the SDK, understand the extension points, and then add complexity.

3. Leverage TypeScript

The SDK is built with TypeScript, and the type definitions are excellent. Use them. They'll save you hours of debugging and make your code more maintainable.

4. Handle Errors Gracefully

The Marketplace SDK can throw errors for various reasons: network issues, authentication problems, invalid queries, etc. Always handle errors gracefully and provide meaningful feedback to users.

5. Test in Multiple Environments

Make sure your app works in all the environments where it will be used: local, dev, staging, and production. Pay special attention to CORS issues and authentication edge cases.

Hosting and Deployment

Since you host your own apps, you have complete control over your deployment strategy. Here are some popular options:
  • Vercel: Excellent for Next.js apps. Automatic deployments from Git, great performance, generous free tier.
  • Netlify: Great for static sites and Vite apps. Easy to set up, good CI/CD integration.
  • Azure Static Web Apps: Good choice if you're already in the Azure ecosystem.
  • AWS Amplify: Another solid option with good integration with other AWS services.
For my AI Challenge app, I'm using Vercel, and the deployment workflow is seamless: push to Git, and Vercel automatically builds and deploys.

Learning Resources: A New Developer Course

To further support the community, the Sitecore Learning team is releasing a new developer course for the Marketplace. While the course isn't available yet, you can see the announcement from Learning Team on LinkedIn. This is a fantastic initiative that will help onboard even more developers to the Marketplace ecosystem.

My AI Challenge Experience: Lessons Learned

Participating in the AI Challenge has been an incredible learning experience. Our proposal made us to the finals, and today I'm completing the final submission. 

Here are some key lessons I've learned:

  • The Marketplace enables rapid innovation. I was able to go from idea to working prototype in a matter of days, not weeks or months.
  • The SDK is that good.
  • Full-stack architecture is essential for AI apps. If you're building anything that involves AI services, you'll need server-side logic.
  • The experimental XMC client makes this straightforward.
My team and I ended up creting an AI marketplace extension that optimizes any of your page-under-edit for the agentic engines, by creating brand-aware content that will be consumed by agents parsing the site and therefore - affecting its LLM's output. IT also suggests how this page could get optimized according to schema.org markup for the better LLM parsers consumption:

Throughout the challenge, I've been in contact with other developers, sharing ideas and solving problems together. This is what makes Sitecore and its community very special.

What's Next?

The Sitecore Marketplace is more than just a new feature; it's a fundamental shift in how Sitecore approaches product development. By empowering the community to build and share apps, Sitecore is effectively multiplying their own development capacity. This is brilliant strategy.

The community has always been Sitecore's greatest strength. We've built modules, shared knowledge, and pushed the platform forward for years. The Marketplace is Sitecore's way of saying: 

"We trust you. We value you. Let's build the future together."

If you're a Sitecore developer or architect, I encourage you to start exploring the Marketplace today. Build something small, get comfortable with the SDK, and then tackle something more ambitious. The barrier to entry is low, and the potential is enormous.
What will you build? A custom field? A dashboard widget? An AI-powered content assistant? 

The possibilities are endless. I'd love to hear your thoughts.

Top 10 Mistakes Organizations Make on Sitecore XM Cloud Implementations

Sitecore XM Cloud represents a monumental shift in how we build and deliver digital experiences. The promise of a fully managed, composable DXP is incredibly compelling, and for good reason. However, after seeing numerous projects in the wild and talking with fellow developers and architects, I've noticed a pattern of common, time-consuming, and often costly mistakes. These aren't the simple "RTFM" errors; they are the insidious problems that stem from underestimating the fundamental paradigm shift from traditional Sitecore XP to a headless, SaaS world.

I've spent the last couple of years deep in the trenches of XM Cloud, and I've seen what works and what causes projects to grind to a halt. In this post, I’m going to walk you through the top 10 mistakes I see organizations making time and time again. My goal is to save you the headaches, the late nights, and the budget overruns. Let's take a look at them.

1. Migrating Information Architecture Without Restructuring First

This is, without a doubt, the single biggest mistake I see teams make, and it poisons the well for the entire project. It seems logical to start by moving your content, but on XM Cloud, that's a recipe for disaster. Failing to address Information Architecture first is the source of all the further downstream chaos.

In the world of Sitecore XP, we had a lot of flexibility. You could have mixed templates in content folders, no clear separation between page structure and data items, and site definitions buried deep in the content tree. XM Cloud, on the other hand, is ruthless in its demand for a clean, predictable structure. It expects a strict hierarchy: Tenant → Site → Content.

Why It Becomes a Nightmare

When you try to push a legacy XP content tree into XM Cloud, the entire system starts to break in subtle and frustrating ways:

  • Serialization Fails: The dotnet sitecore ser push command will throw errors about non-unique paths or other inconsistencies that were perfectly valid in your old instance.
  • Component Bindings Break: Pages might render, but components won't bind to their datasources correctly because the expected folder structures don't exist.
  • Pages Editor is Unusable: Content authors will complain about missing fields, broken placeholders, and a generally unusable editing experience.
I cannot stress this enough: before you migrate a single piece of content, you must first migrate your IA. This means creating a clean, XM Cloud-native IA in your new project, and then mapping your old content to that new structure. It feels like extra work upfront, but it will save you weeks of painful debugging down the line.

2. Ignoring Experience Edge Rate Limits and Caching Architecture

Once you get past the initial IA migration, the next major pitfall I see is a fundamental misunderstanding of Experience Edge. We get so excited about the idea of a globally replicated, high-performance content delivery network that we forget it operates under specific rules and limitations. As I covered in one of my own posts, you absolutely must know these limitations before you start building.

Experience Edge is not a magic black box. It has hard limits that can and will break your application in production if you don't design for them from day one. Here are the critical ones:

Limit Type

Constraint
Impact of Ignoring
API Rate Limit
80 requests/second
HTTP 429 errors, service unavailability
GraphQL Query Results
1,000 items per query
Incomplete data requires pagination
GraphQL Query Complexity
~250 (undocumented)
Queries fail with complexity errors
Default Cache TTL
4 hours
Stale content for up to 4 hours

The Architectural Imperative: Cache Everything

The 80 requests/second limit seems generous, but it's a cap on uncached requests. A single user visiting a server-side rendered (SSR) page with multiple components could generate a dozen or more GraphQL queries. In a high-traffic scenario, you will hit that limit almost instantly. This is why Sitecore's guidance, and my own experience, dictate that you must architect your solution with a cache-first mindset. This means leveraging Static Site Generation (SSG) and Incremental Static Regeneration (ISR) wherever possible.

Trying to retrofit a caching strategy onto a chatty, SSR-heavy application after it's already built is a nightmare. You must plan your component rendering strategies from the beginning. Ask yourself for every component: - "Can this be statically rendered? Does it need to be server-side rendered? Can we use client-side fetching for dynamic elements?". Ignoring these questions is a direct path to production performance issues and emergency redesigns.

3. Underestimating Non-SXA to Headless SXA Migration Complexity

This is a big one, and it often comes as a nasty surprise to teams migrating from older, non-SXA Sitecore XP instances. The assumption is that you can just lift your existing components and content structure and somehow make them work in a headless fashion. The reality is that XM Cloud expects Headless SXA as its baseline. If your legacy solution isn't built on SXA, you are not performing a simple migration; you are performing a complete architectural rebuild.
I've seen teams budget for a straightforward content migration only to discover that their entire presentation layer is fundamentally incompatible. Migrating from a non-SXA site can add an extra month or two to a project easily, depending on the complexity.

Why It's a Rebuild, Not a Migration

Headless SXA enforces a strict, convention-based approach to site structure and presentation that simply doesn't exist in non-SXA builds. Here’s what you’re actually signing up for:

  • Rebuilding Structure: You must manually recreate your site architecture using SXA conventions (Tenant → Site → Page Branches → Data).
  • Rebuilding Layouts: All of your existing layouts must be rebuilt as Page Designs.
  • Rebuilding Shared Components: Headers, footers, and other shared elements must be recreated as Partial Designs.
  • Converting All Renderings: Every single one of your renderings must be converted into a Headless SXA-compatible JSS component.
  • Remapping Placeholders: Your old custom placeholders won't work as-is. The placeholder mapping in XM Cloud is far more rigid and requires a complete overhaul.
Failing to account for this massive effort is one of the fastest ways to blow your budget and timeline. If you are coming from a non-SXA background, you must treat the project as a replatforming exercise, not a simple upgrade.

4. Assuming MVC Backend Customizations Can Be Migrated Directly

For years, the power of Sitecore development lay in its extensible backend. We built custom renderField pipelines, hooked into countless processors, and used dependency injection to create powerful, server-side logic. In XM Cloud, that world is gone. I’ve seen teams spend weeks trying to figure out how to migrate their complex backend code, only to realize that it’s a futile effort. If your old solution contains backend customization, you must find a way to implement it in the head application.

This is a fundamental paradigm shift that many seasoned Sitecore developers struggle with. XM Cloud is a headless-first platform, which means your .NET code is running in a black box, completely decoupled from the rendering host. There is no way to directly influence the rendered output from the backend.

The Headless Mindset Shift

Here’s what this means in practice:

  • renderField Pipelines are Obsolete: Any logic that modifies field rendering at request time must be moved to your Next.js components.
  • Controller Logic Must Be Refactored: Your MVC controller actions that process data or modify component output must be re-implemented as stateless services or APIs that your Next.js application can call.
  • Dependency Injection is Different: Your custom services and logic can't be injected into rendering pipelines anymore. A great alternative I've seen work well is using PageProps factory plugins in the Next.js application to fetch and inject data into your components.
Trying to shoehorn your old MVC patterns into XM Cloud will lead to nothing but frustration. You have to embrace the headless mindset and move your logic to where it now belongs: the head application.

5. Not Understanding Next.js Routing and Configuration Fragility

One of the most common cries for help I see on community channels is, - "I just set up my project, and every page is a 404!". This is almost always the result of underestimating the sheer fragility of the Next.js routing and configuration setup in an XM Cloud project. There is a big number of moving parts that all have to work correctly to get pages to display.

This isn't a single point of failure; it's a dozen small, interconnected dependencies that can break the entire application. It’s a classic “needle in a haystack” problem that can burn hours, if not days, of a developer's time.

The House of Cards: Common Failure Points

If you're hitting routing issues, here’s a checklist of the most likely culprits I've seen:

  • The [[...path]].tsx file: This is the heart of Sitecore's catch-all routing. If this file is accidentally renamed, if a merge conflict corrupts it, or if the special bracket characters are wrong, all your Sitecore-managed routes will fail.
  • Site Name Mismatches: The siteName in your .env files must perfectly match the site name configured in Sitecore under /sitecore/content/MyTenant/MySite/Settings/Site Grouping/MySite. A tiny typo will break everything.
  • Environment Variable Loading: Remember that Next.js loads environment files in a specific order (scjssconfig.json.env.env.local). A misconfigured variable in one file can silently override the correct value in another.
  • Layout Service Failures: The [[...path]].tsx file relies on a successful response from the Layout Service. If your API key is wrong, your JSS Editing Secret doesn't match, or the rendering host items at /sitecore/system/Settings/Services/Rendering Hosts are misconfigured, the Layout Service will fail, and your app will render a 404.
  • Special Folder Names: Next.js has special folder names like pages and app. If a git merge accidentally creates an empty folder with one of these names in your rendering host's file system, it can confuse the Next.js router into thinking no routes exist.
Troubleshooting this requires a methodical approach. You have to check every single one of these connection points, from your local environment files all the way to your CM instance configuration. There are no shortcuts.

6. Overlooking Serialization Duplicate Item Issues

Serialization is the backbone of modern Sitecore development, but it has its own set of quirks that can bring a project to a standstill. One of the most frustrating issues I’ve seen is the "Non-unique paths cannot be serialized" error. This problem, as detailed by Brad Fettes, is both familiar and maddeningly tedious to resolve.

This error typically occurs when you have two items with the same name under the same parent item. While Sitecore’s database is perfectly happy with this (since it uses GUIDs for identity), the file system is not. When the serialization process tries to create two YAML files with the exact same name in the same directory, it fails. The most common culprit? Duplicate __Standard Values items.

How the Trap is Set

This usually happens when developers are working in parallel on different environments. Here’s a typical scenario:

  1. Developer A creates a new template and its standard values on their local machine and serializes them.
  2. Before Developer A commits and pushes their changes, Developer B creates the same template and standard values on a shared development environment.
  3. Developer A pushes their code. Now, the serialized YAML for the standard values exists in the repository.
  4. When you try to pull these changes and push them to the shared environment, the serialization engine sees a conflict: the GUID from the YAML file is different from the GUID of the item that already exists in the Sitecore database, even though the path is identical. The result: Non-unique paths cannot be serialized.

The Painful Manual Fix

The error message suggests renaming the item, but that’s not an option for __Standard Values. The only way to fix this is a manual, repetitive process:

  1. Copy the second GUID from the error message.
  2. Paste it into the search bar in the Content Editor of the target environment to find the offending item.
  3. Manually delete the duplicate item.
  4. Re-run the dotnet sitecore ser push command.
  5. Repeat the process if you get another error for a different item.
This is a huge time sink, and it highlights the fragility of a file-based serialization strategy when multiple developers are making content changes. It’s a stark reminder that in the XM Cloud world, a disciplined Git workflow and clear communication about who is creating which items are more critical than ever.

7. Trusting Undocumented Platform Behavior

One of the hardest lessons to learn when moving to a SaaS platform like XM Cloud is that you are no longer in control of the underlying infrastructure. Things can and will change without notice. A painful example of this surfaced in mid-2024, when deployments across numerous projects began failing due to mysterious compilation errors: an unannounced, breaking change in how the XM Cloud build process consumed the xmcloud.build.json file.

For months, the build process had seemingly ignored the buildTargets property, defaulting to using the solution (.sln) file. Then, one day, Sitecore deployed a change that strictly enforced this property. Teams that had (logically) pointed this to their specific project (.csproj) file suddenly found their deployments failing because the new build process couldn't restore NuGet packages correctly. The error messages about missing assemblies were completely misleading, sending developers on a wild goose chase for a problem that wasn't in their code.

The Sobering Reality of SaaS

This incident is a perfect illustration of a new class of problems we face with XM Cloud:

  • Undocumented Breaking Changes: The platform is constantly evolving, and not every change is going to be announced in advance. What worked yesterday might be broken today for reasons entirely outside your control.
  • Misleading Error Messages: The errors you see are often symptoms of a deeper platform issue, not a problem with your own code, which makes troubleshooting incredibly difficult.
  • Reliance on Support: The only way this issue was diagnosed was through a Sitecore support ticket. You must be prepared to engage with support and provide detailed logs to resolve these kinds of problems.
My advice: when a previously working process suddenly breaks for no apparent reason, and your local builds are fine, your first suspect should be an unannounced platform change. Document your troubleshooting steps meticulously and open a support ticket sooner rather than later. Don't waste days debugging your own code when the platform itself may have shifted under your feet.

8. Neglecting Local Development Environment Complexity

One of the great promises of XM Cloud was a simplified local development setup. While it has improved in many ways, I’ve found that many teams underestimate the complexity and fragility of the Docker-based environment. It is far from a "plug and play" experience and is a significant source of friction, especially for developers new to the project or to Docker itself.

The official Sitecore documentation provides a good starting point for troubleshooting, but it also reveals just how many things can go wrong. These aren't edge cases; they are common, everyday problems that can cost your team hours of productivity.

The Daily Hurdles of Local Development

Here are some of the recurring issues that turn local setup into a constant battle:

  • The down.ps1 Ritual: If you shut down your machine without running the down.ps1 script, your containers are left in an exited state. The next time you run up.ps1, it will fail. You have to remember to run the cleanup script every single time. It’s a small thing, but it’s a constant papercut.
  • Corporate Network and Firewall Policies: This is a huge one. I’ve seen countless hours lost because a company's security policies block communication between containers or prevent access to the Docker DNS. The solutions often involve switching to hyperv isolation or getting firewall rules changed, which can be a bureaucratic nightmare.
  • DNS Configuration: Sometimes the CM container will fail to authorize on startup due to invalid DNS settings. The fix is to manually set the DNS in your Docker Desktop settings to a public one like 8.8.8.8, but this is not documented in the standard setup guides and is something you only discover after hours of frustration.
  • The "Unhealthy" Container: Seeing your cm container in an "unhealthy" state is a rite of passage for XM Cloud developers. Debugging it requires you to manually check the Docker logs, exec into the container, and curl the health check endpoint to figure out what went wrong. It’s a tedious and opaque process.
Don't treat the local development environment as a given. You need to budget time for setup, troubleshooting, and creating internal documentation for your specific network environment. A smooth local setup is not a luxury; it's a prerequisite for a productive team.

The good news is that since the introduction of Metadata Editing Mode in 2025, developers can progress with an FE-first approach, which allows scaffolding a front-end app and developing it against the remote XM Cloud environment, avoiding all the hassles of dealing with local Windows-based containers.

9. Missing SXA Feature Parity Gaps

For teams that have been using SXA on-premise for years, there’s a natural assumption that the features they rely on will be available in XM Cloud. This assumption is often wrong and can lead to significant unplanned development work. I’ve seen this myself on projects where clients were extensive users of features like Snippets, Scriban, Content Tokens, or Overlays, only to discover during migration that these features simply don’t exist in the current version of Headless SXA.

This leaves development teams with a difficult choice: either abandon the functionality or rebuild it from scratch in a headless world.

Rebuilding What Was Once Out-of-the-Box

This isn’t a trivial task. Take Content Tokens, for example. To replicate this functionality, you can’t just write a simple helper function. A proper implementation requires:

  1. A Custom GraphQL Query: You need to create a GraphQL query to fetch the token data, similar to how the Dictionary Service works.
  2. A Custom Service: You need a service that fetches this data and, crucially, caches it in memory to avoid hammering the Experience Edge API on every page load, especially during a static build.
  3. Integration with PageProps: This service must be integrated into the PageProps factory plugin to make the token data available to all your components.
This is a significant amount of work to replicate a feature that was once a standard part of SXA. It’s a classic example of the “rebuild, don’t migrate” reality of XM Cloud. You must perform a thorough audit of all SXA features your existing solution uses and verify their availability in XM Cloud before committing to a migration plan. Don’t assume feature parity.

10. Failing to Plan for Workflow and Multilingual Migration Complexity

Finally, I want to touch on two areas that are often treated as afterthoughts but are fraught with hidden complexity: workflows and multilingual content. These are the silent killers of a migration project. The issues don’t show up as significant, loud deployment errors; they manifest as confusing problems for content authors long after the initial migration is supposedly “done.”

Because you no longer have direct database access, you can’t just run a SQL script to fix things when they go wrong. You are entirely at the mercy of your serialization and import tools.

The Silent Failures

Here’s what often goes wrong:

  • Workflows Break Silently: During content import, items can be created without their original workflow state, or XM Cloud might reject an invalid workflow ID from your old instance. The result is that editors can’t publish migrated content, and nobody knows why until they try. Auto-trigger actions also frequently fail due to missing commands. The only solution is to manually map and reassign workflows to thousands of items after the import, a tedious and error-prone task.
  • Multilingual Content Gets Corrupted: Migrating multilingual sites is exponentially more complex. I’ve seen shared fields get overwritten by an import from a different language, layout variations between languages get lost, and media items have inconsistent versioning. These are incredibly difficult problems to untangle without direct database access.
These issues highlight the need for meticulous planning and, most importantly, rigorous verification. A migration isn’t successful when the import script finishes. It’s successful when you have clean verification reports, and your content authors have confirmed that they can edit, publish, and see their content correctly in all languages.

Conclusion

The move to Sitecore XM Cloud is an exciting and necessary evolution for the platform. However, it is not a simple upgrade. It is a fundamental paradigm shift that requires a new way of thinking about architecture, development, and deployment. The biggest mistakes I’ve seen are not the result of bad code, but of bad assumptions - assuming that what worked in the on-premise world will work in a composable, SaaS world.

My advice is to approach your first XM Cloud project with a healthy dose of humility. Assume nothing. Question everything. Budget time for learning, for troubleshooting, and for the inevitable “unknown unknowns.” The platform is powerful, but it demands respect for its complexity.

I hope this list helps you avoid some of the pitfalls I’ve seen. If you’re struggling with your XM Cloud implementation or planning a migration, I’m always happy to share my experiences. Feel free to drop me a message!

Merry Christmas and happy New Year!

Every year I create a special Christmas postcard to congratulate my readers on a new oncoming year, full of changes and opportunities. Wish you all the best in 2025!

My artwork for the past years (click the label to expand)
2024


2023


2022


2021


2020


2019


2018


2017


2016


Reviewing my 2023 Sitecore MVP contributions

The Sitecore MVP program is designed to recognize individuals who have demonstrated advanced knowledge of the Sitecore platform and a commitment to sharing knowledge and technical expertise with community partners, customers, and prospects over the past year. The program is open to anyone who is passionate about Sitecore and has a desire to contribute to the community.

Over the past application year starting from December 1st, 2022, I have been actively involved in the Sitecore community, contributing in a number of ways.

Sitecore Blogs

  1. This year I have written 45(!) blog posts and that’s at the Perficient site only on the various topics related to Sitecore, including my top-notch findings about XM Cloud and other composable products, best practices, tips and tricks, and case studies. Listing them all by the bullets would make this post too excessive, therefore instead I leave the link to the entire list of them.
  2. I’ve been also posting on my very own blog platform, which already contains more than 200 posts about Sitecore accumulated over the past years.

Sitecore User Groups

  1. Organized four Los Angeles Sitecore User Groups  (#15, #16, #17 and #18)
  2. Established a organized the most wanted user group of a year – Sitecore Headless Development UserGroup. This one is very special since headless development has become the new normal of delivering sites with Sitecore, while so many professionals feel left behind unable to catch up with the fast emerging tech. I put it as my personal mission to help the community learn and grow “headlessly” and that is one of my commitments to it. There were two events so far (#1 and #2) with a #3 scheduled for December 12th.
  3. Facilitated and co-organized Sitecore Southeast Europe User Group (Balkans / Serbia), I am sponsoring it from my own pocket (Meetup + Zoom).
  4. Presented my new topic “Mastery of XM Cloud” on 17 Jan  at the Jaipur user group, India

SUGCON Conferences 2023

  1. Everyone knows how I love these conferences, especially SUGCON Europe. This year I submitted my speech papers again and got chosen again with the topic Accelerate Headless SXA Builds with XM Cloud. Last year I hit the same stage with The Ultimate Sitecore Upgrade session.
  2. I was very eager attending to SUGCON India and submitted a joint speech with my genius mentee Tiffany Laster – this proposal got chosen (yay!). Unfortunately, at the very last minute, my company changed the priorities, and we were not allowed to travel. Since the remote presentation was not an option there, I have the warmest hopes to present there the following year. Two of my other mentees (Neha Pasi and Mahima Patel) however found their way to that stage and presented a meaningful session on Sitecore Discover. Tiffany was also chosen as a speaker for the following SUGCON NA however with a different topic – DAM Maturity Model.
  3. I was a proud member of the SUGCON NA 2023 Organization Committee, which we thought over the past 15 months. We collectively were responsible for a wide range of tasks, but my primary personal responsibilities were organizing the session recording, building the event website, choosing the speakers from the speech proposals for building the agenda, and several more. I served as Room Captain for each and every session timeslot on Thursday and the majority on Friday.

GitHub

Sifon project keeps going not just maintained but also receiving new features. Sifon gets support for each version of XM/XP releases almost the next day. I am also PoC a composable version of Sifon Cloud, if proven that would be a big thing for XM Cloud. Every time I am involved in a Sitecore platform upgrade or any other development or PoCs working outside of containers – Sifon saves me a lot of time and effort.

I keep Awesome Sitecore up and actual. This repository has plenty of stars on GitHub and is an integral part of a big Awesome Lists family, if you haven’t heard of Awesome Lists and its significance I  highly recommend reading these articles – first and the second.

At the beginning of the year made guidance and a demo on how one can pair .NET Headless SDK with XM Cloud in the same containers working nicely together, along with releasing the source code to it.

There are also a few less significant repositories among my contributions that are still meaningful and helpful.

Sitecore Mentor Program

  • With lessons learned from the previous year of mentorship, this time I got 5 mentees, all young, ambitious, and genius and I cannot stress out enough how I am proud of them all and their achievements!
  • 3 of them found their way to SUGCON conferences as speakers (see above)
  • the others still deliver valuable contributions to the community.

MVP Program

  • I participate in all the webinars and MVP Lunches (often in both timezones per event) I can only reach out.
  • Every past year, I have participated in a very honorable activity helping to review the first-time applicants for the MVP Program. This is the first line of the evaluation and we carefully match every first-time applicant against high Sitecore MVP standards.
  • I think MVP Summit is the best perk of the MVP Program, so never miss it out. This year I’ve learned so much and provided feedback to the product teams, as usual.

Sitecore Learning

I collaborated with the Sitecore Learning team for the past 2-3 years but this year my contributions exceeded the previous ones. Here are some:

  • I volunteered to become a beta tester for a new Instructor-led XM Cloud training and provided valuable feedback upon the completion
  • Collaborated with the team on XM Cloud certification exam (sorry cannot be more explicit here due to the NDA)
  • I was proud to be chosen as an expert for opening a new Sitecore Tips & Tricks series organized by Sitecore Learning team. In 60 minutes I demonstrated Sitecore Components Builder with an external feed integration from zero to hero actually running it deployed to Vertical, all that with writing zero lines of code (part 1 and part 2). Impressive!

Sitecore Telegram

  • Contributed to it even more than in any of the previous years, I am making Telegram a premium-level channel for delivering Sitecore news and materials. Telegram has a unique set of features that no other software can offer, and I am leveraging these advantages for more convenience to my subscribers.
  • Started in 2017 as a single channel, it was expanding rapidly and now reached a milestone of 1,000 subscribers!
  • Growth did not stop but escalated further beyond Sitecore going composable with having a dedicated channel for almost any composable product. Here all they are:

Other Contributions

  • Three times over this year I was an invited guest and expert to Sitecore Fireside at Apple Podcasts (one, two, and three)
  • I am very active on my LinkedIn (with 4K followers) and Twitter aka X (with almost ~1.2K subscribers), multiple posts per week, sometimes a few a day.
  • With my dedication to the new flagship product of Sitecore – XM Cloud there was no wonder I managed to get certified with it among the first. It is a great product and I wish it to become even better!

The above is what I memorized from a year of contributions so far. I think it could serve as a good example of the annual applicant’s contribution and what Sitecore MVP standards stand for. Wish you all join this elite club for the coming year.



Challenges of an international travelling in 2023 or how things can go unexpectedly wrong

I am the kind of person who tries to predict and avoid potential problems way before they even can occur. Risk Management presents in every single cell circulating in my blood – partly because of some sort of professional deformation as well as a natural curiosity and lessons learned from others’ mistakes. But sometimes things can go very unpredictably and you’re left on your own.

That is a triple miracle that I made it back to the US from the conference, but in fact that is a set of three independent miracles.

First, getting to and from Spain. It was a lucky coincidence of me buying both onward and return tickets on those rare lucky days right in between a series of air traffic control strikes across European airports.

I made my flight back early on Saturday and some of those who left for a weekend could not make it because of air control strikes in France and Germany. Even if you’re not French or German, there is a big change of making layout/change at one of their airports, as there are no direct flights to the USA from the medium Spanish airports. Likewise, when flying in, I changed the LAX plane in Frankfurt, for Malaga. After Spain itself joined the strikes from that weekend, it would be even fewer chances to fly away, so I feel exceptionally lucky from departing early and departing through the UK which joins the airport strikes slightly later giving me enough time to leave Europe.

Going next. Early Monday morning I showed up at Heathrow airport as normal and then got denied boarding for an “expired” barcode on my COVID certificate. I used one for flying all the time including in the UK and it has never been a problem. That could be a minor problem, at least I am vaccinated there in the UK and the records should be available. I memorize all my passwords so can easily log in to the app or the website…. Incorrect! Whoever did the app made it with mandatory 2-factor authentication by sending a text to your number. But I don’t have my old UK number, after moved back to the states. Now you see, how one minor problem turns into a much bigger one.

Trying to escalate it with all levels of management did not help at all, this type of person is just simply sitting their paid hours and do not want to step the extra mile. “Computer says no” – is an accurate description of dealing with them. So, I was denied boarding for a stupid reason, and the clock’s ticking…

In a critical situation, your mind works differently, brainstorming any possible outcomes under stress. I remembered that did switching that original number (I did not even remember the actual digits) to a pre-paid plan and put it somewhere in storage along with some old phone. Or had to call someone who could access it there, but it was 3AM there in California. Chances to: 1) wake up the right person in order to ..2) understand your uncertain instructions and... 3) manage to follow them up correctly - that multiplied together are so low! But I made all that happen in a permitted window of 30 minutes - such a miracle! Unbelievable!

After receiving the code, I was able to pass through a line of unwanted difficult questions and eventually generate my certificates in the mobile app. And guess what? That check-in lady neither did not scan the updated barcode nor entered it somewhere. At all! Just said “now ok” and that was it. So she potentially could let me board with an "expired" "barcode" since everything she “checked” was the date label above it. The impact of losing a flight and being stuck in an airport limbo with heavy bags on you (not to say $1-2K to pay for a replacement flight) is a huge penalty when things go wrong mainly because of inadequate and non-transparent procedures and human robots who follow them. This system is definitely broken. The humans behind it are also “broken” in a similar way.

That’s not all. By the time I passed the above line of traps for showing robots-people the right label they wanted to see, they had put my ticket into a STANBY status, which means I was not guaranteed a seat for BOTH legs of my flight, not just trans-Atlantic segment. They boarded me to Phoenix without giving me a following ticked, which I need to get there.

The first segment of my trip was delayed for 2 hours so I only had something less than 40 minutes to clear the customs and immigration, re-check the bags to a final destination (praying it reaches the plane in time) and run myself long way to the departure gate. Long story short, I was the fastest person to get off the plane and pass all the procedures, rechecking the bags, running through additional security, etc. but reached the “gate closed” door, and boarding assistance are just moving away. I had to run as fast as possible, waive my arm and shout "do not close" to pay their attention, then ask them to let me on the plane. Emotions burst and the timing was so precise - an extra 20 seconds would leave me staying overnight at Phoenix and possibly paying for a final segment, but this type of luck followed me the whole day so both I and my bags magically arrived at Orange County airport in time.

What a crazy day it was!

Tunneling out Sitecore 10.3 from a local machine containers for the full global access

I am experiencing an urgent request to prepare a Sitecore instance for the test of some external tools our prospect partners making demos for us. In good times, I'd, of course, spin up a proper PaaS / Kubernetes environment, however, I am occasionally out of control of any cloud subscription, and what is much more important - time! The deadline for such tasks is usually "yesterday", so I started thinking of potential "poor man's deployment" options.

Like many developers do, I also have a "server in a wardrobe", however, that is not a retired laptop but a proper high-speck machine that currently serves me as a hypervisor server plugged by a gigabit Google Fiber connection. My cat loves spending time there, and I am generally OK with that given she does not block the heat sink vents output:

This server runs on ltsc2022 kernel, which provides me additional performance benefits, as I wrote about in a previous post of running 10.3 in Process Isolation mode. So why not re-use the codebase from that same containerized Next.js starter kit for the sake of PoC?

Please note: you should not utilize this approach for hosting real-life projects or going for something bigger than a quick PoC of a demo showcase. The stability of a tunneled channel remains at the courtesy of a service provider, and it also may violate one's particular license, so please use it with care.

The next question comes of how do I make it accessible from the outer global internet so that people making demos can login from where they are and work with Sitecore as they would normally do. Typically, to make that happen I need to undertake three steps:

  1. Define a hostname and configure Sitecore to install with its subdomains.
  2. Generate a wildcard certificate for a domain name of the above hostname.
  3. Make required DNC changes to change A-record and subdomains to point public IP of that machine.

But wait a bit, do I have a public IP? Sadly, I don't, therefore, start looking for a variety of DynDNS options which still required more effort than I initially was going to commit into. Eventually, I remembered a specific class of tunneling software that serves exactly that purpose. From a wide range, LocalTunnel appeared to be the most promising free-to-use solution that some folks use to proxy out their basic sites for demos. 

Looking at its features it looks very much attractive:

  • it is totally free of charge
  • does not require any registration/tokens
  • ultrasimple installation with npm
  • because of the above, it potentially can tunnel directly into containers
  • gives you an option of a temporal claiming subdomain, if one is available
  • allows mapping invalid SSL certificates

The typical installation and execution are ultra-simple:

npm install -g localtunnel
lt --port 8080

After the second command, LocalTunnel responds with a URL navigating which will tunnel your request to port 8080 of the host machine it was run at.

But how do I apply that knowledge to a complicated Sitecore installation, given that most of the Sitecore services in containers are behind Traefik, which also serves SSL offload point? In addition, the Identity Server requires a publically accessible URL to return the successfully authenticated request.

The more advanced call syntax looks as below:

lt --local-host HOST_ON_LOCAL_MACHINE --local-https --allow-invalid-cert --port 443 --subdomain SUBDOMAIN_TO_REQUEST

Basically, for Sitecore to operate from outside I must set it up in a way that external URLs match those URLs run locally at the host where LocalTunnel runs. With the above command, if a subdomain request is satisfied, it will be served by the URL https://SUBDOMAIN_TO_REQUEST.loca.lt which leads to HOST_ON_LOCAL_MACHINE on port 443.

So, in a headless Sitecore we have four typical parts running on subdomains of a hostname served by a wildcard certificate:

  • Content Management (aka Sitecore itself)
  • Content Delivery
  • Identity Server
  • Rendering Host

OOB they are served by default with something like cm.YourProject.localhost, cd.YourProject.localhost, id.YourProject.localhost and www.YourProject.localhost correspondingly. In order to match HOST_ON_LOCAL_MACHINE to SUBDOMAIN_TO_REQUEST for the sake of this exercise, I choose the following hostnames for installation:

The scripts that create Next.js StarteKit Template and Init.ps1 script don't modify all the required hostname changes, so just in case you'll do it manually (recommended), I will name the locations to change

1. Init.ps1 - a block that makes and installs certificates (search by & $mkcert -install)

2. Init.ps1 - a block that adds host file entries (search by Add-HostsEntry)

3. Init.ps1 - a block that sets the environment variables (search Set-EnvFileVariable "CM_HOST")

4. Up.ps1 - authentication using Sitecore CLI (search by dotnet sitecore login)

5. Up.ps1 - final execution in the browser (search by Start-Process at the bottom of the file)

6. .env file - replace CM_HOST, ID_HOST, RENDERING_HOST and CD_HOST variables

7. Make sure Traefik config (docker\traefik\config\dynamic\certs_config.yaml) references the correct certificate and key files

8. Create-jss-project.ps1 - features --layoutServiceHost and --deployUrl parameters of jss setup command

9. src\rendering\scjssconfig.json

10. src\rendering\src\temp\config.js

After the whole installation completes successfully and you see Sitecore CM and Rendering Host in the browser with alternated domain URLs.

Now you can start LocalTunnel:

lt --local-host identity.loca.lt --local-https --allow-invalid-cert --port 443 --subdomain identity
lt --local-host sitecore.loca.lt --local-https --allow-invalid-cert --port 443 --subdomain sitecore
lt --local-host rendering.loca.lt --local-https --allow-invalid-cert --port 443 --subdomain rendering
lt --local-host delivery.loca.lt --local-https --allow-invalid-cert --port 443 --subdomain delivery

On the first run from outside it may show you a notification screen that LocalTunnel serves given URL, and with relatively great piing, that's it.

I briefly tested it and it works well: no SSL issues, Experience Editor runs and allows to bring changes, then publishes them correctly so that they get reflected while browsing Rendering Host. All seems to work well and as expected!