Hacking Sitecore and Life one pipeline at a time!

Introducing Email Experience Manager for the Sitecore Experience Platform 9

exm new 901

Today, Sitecore has released the next big update for Sitecore 9, Sitecore Experience Platform v.9.0.1 rev. 171219.  This is a really big and highly anticipated release, solving a number of known issues around Sitecore Forms and other bug fixes.  But more importantly is the first version for Sitecore 9, let alone Sitecore in general, where the Email Experience Manager (also known as EXM and formerly known as ECM) is completely integrated into the native product as a singular platform.  This post hopes to open a window into the changes that have been made in the product and acclimate developers, clients, and product owners so that they understand what to expect when either upgrading or installing fresh.

Email Experience Manager At A Glance

Fully Connected Platform

One of the major accomplishments of this version of Sitecore is the roll-up of EXM completely within Sitecore’s Platform product. That means there is no longer a separate module which has to be installed to use EXM. Over the last year, one of the biggest issues with EXM was that fact that the module was so tightly coupled to the version of Sitecore, that each EXM release required the next available version of Sitecore.

With EXM now in the main product, changes to EXM will be rolled out and provided at the same time as the main product. This allows List Manager, Marketing Ops, and xConnect to be a seamless experience.

Additional Sitecore Role Added to Configuration

With Sitecore 9.0.1, a new Sitecore Role Server configuration has been added called DedicatedDispatch. This allows a Sitecore instance to be configured as an EXM Dedicated Dispatch Server.  Scaling Sitecore, and more importantly, scaling EXM is really as simple as scaling out the number of dispatch servers being used. This allows you to send more messages over shorter periods of time.

Introduction of Rebus


A big improvement in EXM, and more importantly to Sitecore 9 is the introduction of Rebus. Rebus is a slim and efficient service bus implementation, very similar to NServiceBus and Rhino ESB, specifically for the .NET platform.  The main goal of Rebus was to create a service bus that adhered to the “smart endpoints, dumb pipes” methodology.

For clarity, Rebus is not used to actually dispatch messages (so comments below about messages and messaging are not about dispatch). Instead, Rebus is being utilized to handle the communication needed from the Content Delivery servers back to the Content Management server and Automation Engine.

In previous versions of EXM, the Content Delivery servers needed a connection string that pointed back to the Primary CM, which caused issues for many IT departments and NETOPS that didn’t like edge delivery servers pointing back to servers behind the firewall.  By using a messaging service, like Rebus, this problem is solved.

Some features of Rebus include (pulled from their wiki):

  • common message exchange patterns like point-to-point, request/reply, and publish/subscribe made easy
  • advanced coordination of messages, i.e. process managers
  • timeout manager that allows message delivery to be deferred to the future
  • a message can be transferred using MSMQ, RabbitMQ, Azure Service Bus, SQL, and even the file system.
  • handler pipeline re-ordering
  • MSMQ queue inspector

While Rebus was only implemented for purposes by EXM, the fact that Rebus is now available on the platform could have some really neat future implementations. One off the top of my head is revamping the dreaded EventQueue table. Imagine not needing that table, and instead using a real Service Bus system to fire remote events on different servers. This is a huge improvement which could see additional usage later on in the product.

Seamless Marketing Automation Experience

One of the biggest improvements in Sitecore 9, the product itself, was the overhaul of the marketing engagement plans and funnels and the creation of the Marketing Automation application in Sitecore. This allows Marketers to create intuitive marketing workflows that can handle a variety of actions depending on the state of a contact in the workflow.

exm automation

Now, automating triggered emails are as simple as dragging the Send Email option into the Automation Workflow and specifying an Email Campaign.  You can do other fun stuff, like adding a contact to a List, validating that a user received and clicked on an email, and listening to events.  All within the same platform. This allows you to have handcrafted experiences for your site visitors.

Key Enhancements and Changes

Below is a summary of the stated changes that come along with the update of Sitecore 9.0.1.

  • Exm.web database has been removed and is no longer needed.
    • The purpose of this database was:
      • to help with some of the communication between the CD servers and the Primary CM server
      • to keep a cache of opens and clicks to determine which are unique.
        • This is now done during processing.
    • This has been replaced with the Rebus messaging service.
  • A couple of sub-layouts have been removed.
    • Process Personalization Tokens
      • This sub-layout was included in a lot of messages. The removal of this rendering causes a rendering to be missing from the presentation properties of existing emails.
    • Subscription Form
      • This was removed. Instead, subscriptions can be implemented using the xConnect API and/or the EXM client api.
  • The existing Email Campaign folder has been moved to just Email and has been moved out of /sitecore/system/Modules to /sitecore/system/Settings/Email.
  • The Email Preview and Spam Check functionalities have been completely removed.
    • Sitecore released n article on this a while back. Litmus has changed some of their terms which prevented Sitecore from using the service.
  • Target language can now be specified when sending automated messages through the client API.
  • EXM.DispatchBatchSize setting has been added that allows you to specify the number of contacts that are processed at a time.
  • EXM.IncludePIIinLogFiles setting has been added that specifies whether EXM should log PII-sensitive data.
  • New web.config setting (<eds:define>) allows for the specification of using Custom SMTP or Sitecore’s Cloud Email Delivery Service.
  • Automated message has a new Import HTML option
  • Over 600 public methods have changed.
  • Over 400 types removed.
  • Around 50 changes to public fields
  • About 20 interface changes
  • Big Change in Factories
    • Removal of Major Factories in the Sitecore.Modules.EmailCampaign namespace:
      • BusinessLogicFactory
      • EcmFactory
      • IoFactory
      • GateWayFactory
      • Factory
    • These have all been replaced with much smaller and more numerous factories responsible for creating a single type.
      • Most of the new factories can be found in the following namespaces:
        • Sitecore.Modules.EmailCampaign.Factories
        • Sitecore.EmailCampaign.Cm.Factories
    • All factories are registered with the IoC container and can be customized like any other Sitecore provider using config patching.
    • RecipientManagerFactory removes the RecipientManager from the message item and now allows RecipientManager to be created from the factory.
  • The getXdbContactRecipient pipeline has been removed, as well as the related contact abstractions in the Sitecore.Modules.EmailCampaign.Recipients namespace.
    • Loading custom facets during a dispatch now require a custom dispatch task and an override of the GetContacts method.
    • This task is configured in the Sitecore.EmailExperience.ContentManagement.config in the /sitecore/exm/dispatchTask config node.
  • Email Links query strings have changed (again).
    • The ec_contact_id query string has been replaced with ex_id_s and ex_id_i.
      • This is because xConnect Contact Identification now requires both a tracking identifier and an identifier string.
  • Two new Services provided
    • ContactService
      • Utilized to load contacts or retrieve contact identifiers, and is referenced in all old code paths where contacts are loaded.
    • EXMCampaignService
      • Utilized to retrieve the message item and related campaign activity.
  • Personalizing Custom Tokens is easier with a refactor of the DefaultRecipientPropertyTokenMap and the removal of the getXdbContactRecipient pipeline.

Upgrade and Migration Experiences

It is important to note that for lack of a better way of saying it, there is no upgrade path for prior versions of EXM with Sitecore 9.0.1.  The best advice is to install Sitecore 9.0.1 new (or upgrade from Sitecore 9) and use the xDB Data Migration Tool to upgrade your xDB data to your newly installed Sitecore 9.0.1.  Sitecore will be providing a detailed migration document for migrating from EXM 3.5 to Sitecore 9.0.1 in the near future.

For emails that have been sent with previous versions of EXM, the <redirectUrl> pipeline has been adjusted to ensure that the original ec_contact_id query string parameter is still found and utilized correctly.  However, my advice is to test thoroughly with older messages to ensure that the URL query parameters are being read appropriately. If any change is needed, you will want to evaluate the internalCarryoverFields processor node in the <redirectUrl> pipeline.






Tagged as: ,

Categorised in: EXM, Sitecore, Uncategorized

5 Responses »

  1. This is great Pete, thanks for sharing! 🙂

    Liked by 1 person

  2. Thanks for great insights

    Liked by 1 person

  3. Hi Pete, thanks for writing this great blog in depth for changes related to Sitecore 9 EXM.
    One question: On Sitecore site, it has mentioned that there’s is double-opt in process provided by EXM out-of-the-box but I don’t find it anywhere in Sitecore 9 EXM. Is it still available? I’m assuming this is a separate module provided by sitecore to send a confirmation email message with a subscription confirmation link?



    • It’s not a separate module. Everything you need to do a double-opt in is available in 9.0.1 It’s just… nothing that shows the example of it. For example, all of the fields for the double opt-in process are contained on the Manager Root item under the “Subscription Control” section. From there, the work is really in using the Client API (https://doc.sitecore.net/email_experience_manager/subscription_management/the_exm_client_api). From there, the Service Control messages, which are out of the box, include the subscription confirmation email and subscription notification email, as well as all of the other service notification emails. The Client API knows you want to send a subscription confirmation if the “Email Sent Confirmation Page” field is filled out and links to a page.

      What isn’t provided to you, are examples of those landing-page items. You have to build those out manually.


  4. Thank you Pete for the confirmation. Yes I tried looking for the examples but no luck. I’ll give it a try and currently planning to create landing page using this built-in subscription control (MVC version). Will share my findings/questions here. Hope it’s fine with you. Thank you!


Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Enter your email address to follow this blog and receive notifications of new posts by email.

Join 1,238 other subscribers

Blog Stats

  • 132,847 hits
Follow Sitecore Hacker on WordPress.com
Sitecore® and Own the Experience® are registered trademarks of Sitecore Corporation A/S in the U.S. and other countries.  This website is independent of Sitecore Corporation, and is not affiliated with or sponsored by Sitecore Corporation.
%d bloggers like this: