Conversion Guide: Effortlessly Downgrade Your Sitecore XP Infrastructure to Sitecore XM
A guide to transition your Sitecore XP instance to Sitecore XM
Start typing to search...
Over the years, Fishtank has partnered with variety of clients, helping them navigate their Sitecore journeys with precision and success. Our team has worked with the full spectrum of Sitecore products, from XP and XM to XM Cloud — you name it, we’ve done it. As Sitecore continues pushing toward XM Cloud as the future of digital experience management, many businesses with Sitecore XP, XM, or other products are exploring their options to stay ahead of the curve. If you're looking to future-proof your platform and maximize performance, converting Sitecore XP to XM could be your next step. In this blog, we’ll share the ins and outs of making that transition smoothly.
Its natural to wonder why spend the time and effort to convert the XP instances to XM instead of migrating to XM Cloud directly.
Below is a list of feature comparison that needs to be kept in mind before you decide whether to convert XP to XM or migrate to XP to XM Cloud.
| Feature | XP | XM | XM Cloud |
|---|---|---|---|
| Headless | Optional | Optional | Yes |
| Front-end | Built-in | Built-in | Requires Vercel or Netlify |
| PaaS (Platform as a Service) | Yes | Yes | No |
| SaaS (Software as a Service) | No | No | Yes |
| Hosting Environments | Azure, AWS, etc | Azure, AWS, etc | SaaS |
| Content Delivery | Sitecore, Included | Sitecore, Included | Requires Vercel or Netlify, Not included |
| Personalization | Multi-Session | In-Session | In-Session |
| Campaigns | Multi-Session | In-Session | By Referrer |
| Profile / Personas | Multi-Session | In-Session | Limited |
| Marketing Automation | Yes | No | No |
| Email Marketing | Yes | No | No |
| Forms | Yes | No | No |
| Analytics | Yes | No | Yes |
To do a smooth conversion below is a general approach that can be used a blue print for the discovery session:
Note: Conversion from XP to XM is a challenging task so analyzing current solution will be crucial step. This will solely decide how smooth the conversion will happen.
Use the following powershell code to find out what content items have personalization applied to it. Analyze them to understand whether its in-session personalization. If not, then find a way if it can behave the same way if its converted to in-session personalization. If that is also not possible, then understand the importance of the personalization and see if it can be removed entirely.
$query = "fast:/sitecore/content//*[@__renderings='%<conditions%' or @#__Final Renderings#='%<conditions%']"
$items = Get-Item -Path "master:" -Query $query
$items | Show-ListView -Property `
@{ Name="Item Name"; Expression={$_.DisplayName}},
@{ Name="Item path"; Expression={$_.FullPath}}
Open up forms and EXM, look for any performance tracking, send actions that may use EXM. Check for any automated campaigns being active and see if it can be replaced by other service or discarded.
To disable xDB and Tracking, use the following config only after references have been removed and content has in-session personalization applied.
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/" xmlns:security="http://www.sitecore.net/xmlconfig/security/">
<sitecore>
<settings>
<!-- XDB ENABLED
Determines whether xDB is enabled or not.
Default value: true
-->
<setting name="Xdb.Enabled">
<patch:attribute name="value" value="false" />
</setting>
<!-- XDB TRACKING ENABLED
Determines whether tracking is enabled or not.
Default value: true
-->
<setting name="Xdb.Tracking.Enabled">
<patch:attribute name="value" value="false" />
</setting>
</settings>
</sitecore>
</configuration>
To disable EXM, use the following setting inside Web.config.
<add key="exmEnabled:define" value="no"/>
If you receive the following error, then disable the sessionEnd:batch:starting and sessionEnd:batch:ending event handlers as it depends on tracking.
One or more exceptions occurred while processing the subscribers to the 'sessionEnd:batch:starting' event.
Exception[1]: System.Reflection.TargetInvocationException
Message[1]: Exception has been thrown by the target of an invocation.
Source[1]: mscorlib
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Sitecore.Reflection.ReflectionUtil.CreateObject(Type type, Object[] parameters)
at Sitecore.Configuration.DefaultFactory.CreateFromTypeName(XmlNode configNode, String[] parameters, Boolean assert)
at Sitecore.Configuration.DefaultFactory.CreateObject(XmlNode configNode, String[] parameters, Boolean assert, IFactoryHelper helper)
at Sitecore.Configuration.DefaultFactory.CreateObject(XmlNode configNode, String[] parameters, Boolean assert)
at Sitecore.Configuration.DefaultFactory.CreateObject(String configPath, String[] parameters, Boolean assert)
at Sitecore.XConnect.Client.Configuration.SitecoreXConnectClientConfiguration.GetClient(String clientConfigPath)
at Sitecore.Analytics.XConnect.DataAccess.BatchEnabledXdbRuntimeContext..ctor(IXdbContextFactory factory)
at Sitecore.Analytics.Events.BatchEventHandler.OnBatchStarting(Object sender, EventArgs args)
at Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters, EventResult result)
<events>
<event name="sessionEnd:batch:starting">
<handler type="Sitecore.Analytics.Events.BatchEventHandler, Sitecore.Analytics">
<patch:delete />
</handler>
</event>
<event name="sessionEnd:batch:ended">
<handler type="Sitecore.Analytics.Events.BatchEventHandler, Sitecore.Analytics">
<patch:delete />
</handler>
</event>
</events>
Following is a list of resources that are used when the Sitecore instances are in XP mode. Either you can take backups and delete them or group the app services to share a single app service plan. Databases are always recommended to be a part of elastic pool so they would be already sharing resources.
Shutting down the app services will still incur cost. However, before deleting them we recommend stopping it and testing the website for any problems. When you stop the app service, you may end up getting the following error. This error is due to the background jobs still being active even after the app services are stopped. We have a blog that goes into detail on how to fully shut down the Azure app service.
MessageType: Error Picking Processing Task, Message: Login failed for user 'processingengineuser'.
-----OR-----
Login failed for user 'xcsmmuser'.. The error occurred while attempting to perform the underlying storage operation during 'Microsoft.Azure.SqlDatabase.ElasticScale.ShardManagement.StoreException: Error occurred while performing store operation. See the inner SqlException for details. ---> System.Data.SqlClient.SqlException: Login failed for user 'xcsmmuser'.
That’s it folks! We discussed the approach and some tips for analyzing and implementation on how to convert your instance from XP to XM. Keep in mind, the better the analysis will be, the easier it’ll be implement it as you’ll have less unknowns to worry about it. If you’re interested in a discussion about your infrastructure, feel free to contact us and our experts will help you. At any stage during the analysis if it gets tricky, then remember you can still backout. However, the least thing you can do is optimize Azure infrastructure and to reduce the cost of the spend.