Create a custom processor for session end batching


How to create a custom processor to handle a batch of sessions that have expired.

From version 9.3, Sitecore processes expired sessions in batches instead of one at a time. If you extend the commitSession or submitSessionContext pipelines with additional processors, sessions are no longer necessarily submitted to xConnect the moment they expire. Therefore, we recommend that you change your custom processor to use the new service Sitecore.Analytics.XConnect.DataAccess.IXdbRuntimeContext, which provides access to a factory that creates a Sitecore.XConnect.IXdbContext, the interface of the xConnect Client API.


For information on how to set session expiration batch settings, see Configure session end batching.

To create a custom processor and then process session data in batches:

  1. Extend the commitSession or submitSessionContext pipeline using a custom processor:

        <processor type="AddCustomContactDataOnCommitSession, CustomAssembly" patch:before="processor[@type='Sitecore.Analytics.Pipelines.CommitSession.SubmitSession, Sitecore.Analytics']" resolve="true" />
  2. Add code to handle the session data. The following is an example of how you can change the first name of the contact in the session using IXdbRuntimeContext:

    using System.Linq;
    using Sitecore.XConnect.Client;
    using Sitecore.XConnect.Collection.Model;
    public class AddCustomContactDataOnCommitSession : Sitecore.Analytics.Pipelines.CommitSession.CommitSessionProcessor
        private readonly Sitecore.Analytics.XConnect.DataAccess.IXdbRuntimeContext _context;
        // Injects IXdbRuntimeContext
        public AddCustomContactDataOnCommitSession(Sitecore.Analytics.XConnect.DataAccess.IXdbRuntimeContext context)
            _context = context;
        public override void Process(Sitecore.Analytics.Pipelines.CommitSession.CommitSessionPipelineArgs args)
            // This provides access to the instance of the IXdbContext that is used for batching
            var xdbContext = _context.Factory.Create();
            // Check whether contact exists
            var identifiedContactReference = new Sitecore.XConnect.IdentifiedContactReference("<IdentifierSource>", "<identifier>");
            var xConnectContact = xdbContext.Get(identifiedContactReference, new Sitecore.XConnect.ExpandOptions
                FacetKeys =
            if (xConnectContact == null)
            var personalInfo = xConnectContact.GetFacet<Sitecore.XConnect.Collection.Model.PersonalInformation>() ?? new Sitecore.XConnect.Collection.Model.PersonalInformation();
            personalInfo.FirstName = "<FirstName>";
            // Check that there facet is not modified twice
            if (xdbContext.DirectOperations.OfType<Sitecore.XConnect.Operations.SetFacetOperation<Sitecore.XConnect.Collection.Model.PersonalInformation>>().All(o => o.Target.Entity.Id != xConnectContact.Id))
                xdbContext.SetPersonal(xConnectContact, personalInfo);
            // Do not call xdbContext.Submit() as it is called by batching logic afterward


You can also use IXdbContext events to react on successful and failed saves of session batches.