I was posed with a problem where I needed to enroll contacts that had already ended their interaction. For this I made a simple service that would enroll all contacts from a given Sitecore List Manager list into my Marketing Automation plan.
Making this was surprisingly easy by combining the enrolling a contact in a single plan and the list manager api guides from Sitecores' documentation.
The resulting code looks like this:
using Microsoft.Extensions.DependencyInjection;
using Sitecore.DependencyInjection;
using Sitecore.Diagnostics;
using Sitecore.ListManagement;
using Sitecore.ListManagement.XConnect;
using Sitecore.Xdb.MarketingAutomation.Core.Requests;
using Sitecore.Xdb.MarketingAutomation.Core.Results;
using Sitecore.Xdb.MarketingAutomation.OperationsClient;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
namespace WorldCup.Services
{
public class XConnectService
{
private IContactListProvider _contactListProvider;
private IContactProvider _contactProvider;
private IAutomationOperationsClient _automationOperationsClient;
private int _batchSize = 100;
public XConnectService()
{
_contactListProvider = ServiceLocator.ServiceProvider.GetService<IContactListProvider>();
_contactProvider = ServiceLocator.ServiceProvider.GetService<IContactProvider>();
_automationOperationsClient = ServiceLocator.ServiceProvider.GetService<IAutomationOperationsClient>();
}
public void EnrollListToMarketingAutomation(Guid contactListId, CultureInfo cultureInfo, Guid automationPlanId)
{
try
{
var contactList = _contactListProvider.Get(contactListId, cultureInfo);
var contactBatchEnumerator = _contactProvider.GetContactBatchEnumerator(
contactList,
_batchSize,
new string[0]);
var results = new List<Task<BatchEnrollmentRequestResult>>();
while (contactBatchEnumerator.MoveNext())
{
var contacts = contactBatchEnumerator.Current;
var enrollmentRequests = contacts.Where(c => c.Id.HasValue).Select(c => new EnrollmentRequest(c.Id.Value, automationPlanId)).ToArray();
results.Add(_automationOperationsClient.EnrollInPlanDirectAsync(enrollmentRequests));
}
Task.WaitAll(results.ToArray());
}
catch (Exception ex)
{
Log.Error($"Error while enrolling list: {contactListId} to plan: {automationPlanId}", ex, this);
throw;
}
}
}
}
See my WorldCup post for an example of usage of the API.
To finish this up nicely, we need a proper button in the Marketing Automation interface. I haven't gotten that far yet, but will update if/when I get the time for it.
Update:
After looking at creating the button I found that it wasn't as easy, as unfortunately the new Marketing Automation interface is a precompiled Angular plugin. That being said, I learned through slack that the new Sitecore 9.0 update 2 has something along these lines built in, and that Sitecore 9.1 will have this exact functionality. So I'll wrap it up for now.
If anyone really wants a button for this now, it could be made in either the Marketing Automation list overview or inside the List Manager application.