In EXM, email campaigns are dispatched to one or more lists. While that sounds like a feature, it is its biggest complication.
These lists can be static (Contact Lists) or a Segment of one of those lists (Segmented Lists). The segment can also be of the entire Contacts database. Either way, these segments are powered by the rules engine, which behind the scenes executes a search query against Solr or Azure Search.
The first issue I'll try and describe in this article is with unsubscribes. If an email is sent to two Contact Lists, and a Contact clicks “Unsubscribe”, then which list are they actually unsubscribing from? EXM solves this problem by removing the Contact from all of these lists. Ouch.
The Contact doesn't have any visibility of these lists. There is no concept of defining lists as “public” or “private” and the Contact does not have a way of identifying why they were sent an email out of the box. After all, these lists might be named something like "Qualified Leads", or "VIPs", or "Unreliable payers". That's not something you want to show to your customers. In any case, these lists don't necessarily map to Email Campaigns, so removing Contacts from these lists is, in my opinion, an invasive action.
The problem gets even worse when an email is dispatched to a Segmented List. The segment might be something simple like "Country is The Netherlands". If a Contact is unsubscribing, there is no static Contact List to unsubscribe from. EXM has to solve this problem by adding the Contact to the Global Opt-Out List, to ensure they never receive any emails from the brand ever again.
So to give an example, imagine:
That's all very well, but let's take this further:
Not so good. It's also one of the main reasons the "Sample Subscription Form" was removed from EXM in Sitecore 9, because the default behaviour was confusing and incomplete, and the responsibility was put on Sitecore customers and partners to solve the problem in the way they thought most appropriate for their organisation.
Luckily Sitecore has moved towards solving this in version 9.1. If you're not lucky enough to be on this version yet, and you want to provide a good experience for your customers which also satisfies GDPR / Double opt-in requirements, then you should just use a single static Contact List per email campaign.
The release of Sitecore 9.1 introduces the much-needed extra layer of preferences when determining who to send an email to. These preferences are designed to be visible to the customer, and Sitecore supplies a very simple UI out of the box, which is easy to skin to your own brand. (By the way, it makes use of a REST API, so you can easily move the example code to your own JSS / MVC component if you wish.)
Contacts can now choose easily which emails they prefer to receive, in a way which solves all of the problems I listed above. It's such a vast improvement on the existing Unsubscribe functionality that I feel the old functionality should be removed outright. For more information about the Preference Center, see the official documentation and Pete Navarra's write-up.
The second issue I want to describe in this article is the User Experience for marketers, specifically how many steps are necessary to set up a targeted email campaign.
Let's take an example. I want to send an email to all the people who have signed up to "Computers" emails, that live in The Netherlands. These are the steps from the Recipient Tab.
That is 33 steps to select my target audience, to those from The Netherlands! Luckily that Segmented List can be reused in the future if I want to use the exact same filter. But bear in mind I need to follow these steps for every single Email Type, for every single Manager Root.
This might be easier to bear if you can use Segmented Lists as the source of other Segmented Lists, but that's not the case, a source list must be a Contact List. That means you need to duplicate all those steps every time you want to Segment your Contacts in a slightly different way.
To hammer home my point, let's compare it to Mailchimp:
That's a difference of 23 steps.
That's a bit of a moan, I realise. Somebody once taught me that when you come with a problem you should also come with a suggested solution, so here's how I think the experience for marketers could be improved.
Don't make marketers use List Manager to filter by email type, especially when it's something they might forget to do! Add a required dropdown to the email UI which chooses one of the email types (i.e. Computers, <example>). It shows just the Email Types which have been assigned to this Manager Root. And then it automatically filters the Contacts to those who have opted in to receive emails of this type. Add a last extra option such as “Adhoc service message” to be able to email Contacts who have not necessarily opted in to a marketing email.
Instead of being forced to create a list every time, why not just expose the Rules Engine in the EXM UI? List Manager is only a wrapper around the Segmentation Engine after all. The “Include Lists” panel becomes redundant if the marketer is forced to choose an email type, so this area can be replaced with an interface that lets the marketer add segmentation rules directly. Such as the “Contacts in The Netherlands” example I gave above, which would save 23 steps. If the marketer still wants to use a list for a segment, this can still be done in the Rules Engine.
Setting emails as a Service Message bypasses all preferences of the Contact, and must only be used when it is in the interest of Contact to receive the email, and it must not be a marketing email. This gives a lot (too much?) responsibility to the marketers and I feel this setting belongs on the Email Type itself, which can be controlled by a user with more permissions (i.e., somebody in the EXM Advanced Users role). And again, it's something which is easily forgotten, and the consequences of getting this wrong can be severe under GDPR rules.
Custom data on Contacts is defined in configuration files which need to be deployed to Sitecore and xConnect, before they can be stored, indexed and therefore used in Segmentation. This means it is still a developer task to enable.
If this wasn't the case, marketers could upload new data using CSV files, or be able to use the data captured by Form submissions, without needing new development and deployments. Mailchimp can do this and it's free. This is probably an unrealistic request as the change is too big, but one can dream.
While I'm on the subject, there are several facets out of the box which aren't exposed in List Manager by default. I'd love some obvious ones to be added such as Phone, City, Country, and Preferred Language.
In List Manager it is possible to add a single Contact using the UI, or a batch of Contacts in a CSV file. This was useful in EXM if the primary way of sending emails is with Contact Lists. But if this should now be using Email Type preferences, then it's important to be able to manage this easily and quickly as well.
As well as being able to manage Email Type subscriptions from the Email Type itself, it'd be nice to be able to edit a single Contact's preferences as well when looking at their Experience Profile.
DoNotMarket
and ConsentRevoked
are not multi-siteThese two flags are exposed in Marketing Automation, and are respected by EXM. But bear in mind they are not multi-site, so if your Sitecore solution is for multiple brands where Contacts wouldn't expect these preferences to be shared, then this isn't so useful.
An alternative solution is to add contacts to the Global Opt-Out list of a particular Manager Root. But I'd like to see a solution to multi-tenant which is generic across the entire Sitecore / xConnect platform, instead of each component solving it in their own ways.
That's enough for now. Thanks for reading!