Sitecore: Programmatically adding contacts to a list

From Sitecore 8 the EXM module now uses lists to manage mailing lists rather than roles against a user. The built in Subscription form control that comes with EXM has also been updated to add contacts to this list. However the subscription control remains WebForms only, so if you implementing an MVC solution you’re going to need to write your own. There’s also many other scenarios where you may want to programmatically create and add a contact to a list.

Under the hood, contact lists aren’t even a list at all. Rather they are actually just a Facet on the Contact record that contains the list id’s for all the lists the contact is a part of. You can see this by looking in the contacts collection in the analytics mongo db.

List Tag on Contact

Or in the Contacts table in the Reporting SQL db.

List Tag on Contact SQL

If you wanted to add a contact to a list you could in theory just add the relevant tag to the contact record like this:

public void AddContactToList(Contact contact, Item list)
{
   using (new SecurityDisabler())
   {
      contact.Tags.Set("ContactLists", list.ID.ToString());
   }
}

But I wouldn’t. The problem with this approach is your going to miss out any logic that will handle updating the counts of contacts in contact lists. Best to use one of the provided list api’s instead.

Adding a contact to a list

Sitecore has a ContactListManager object that has a method to associate contacts with lists. All you need to do is create an instance of it and pass it a list of contacts.

public void AddContactToList(ContactData contact, ContactList list)
{
    ContactListManager listManager = Sitecore.Configuration.Factory.CreateObject("contactListManager", false) as ContactListManager;

    List<ContactData> contactList = new List<ContactData>();
    contactList.Add(contact);

    listManager.AssociateContacts(list, contactList);
}

Removing  a contact from a list

Just like adding a contact, there’s also a handy method for removing one too.

public void RemoveContactFromList(ContactData contact, ContactList list)
{
    ContactListManager listManager = Sitecore.Configuration.Factory.CreateObject("contactListManager", false) as ContactListManager;

    List<ContactData> contactList = new List<ContactData>();
    contactList.Add(contact);

    listManager.RemoveContactAssociations(list, contactList);
}

What’s that ContactData object?

Chances are you don’t have a ContactData object (Sitecore.ListManagement.ContentSearch.Model.ContactData) and instead probably have a tracking contact (Sitecore.Analytics.Tracking.Contact). For the purposes of adding and removing a contact from a list, all your ContactData object really needs is its identifier, which you can do with the following:

public ContactData ConvertContactToContactData(Sitecore.Analytics.Tracking.Contact contact)
{
    return new ContactData()
    {
        Identifier = contact.Identifiers.Identifier
    };
}
Advertisements

4 thoughts on “Sitecore: Programmatically adding contacts to a list

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s