We have a v7.5 instance that we are going to upgrade to v8.1-3. Current we have ECM 2.2 installed and we have used it a bit. We have a large number of users that have been imported in to the system through ECM. We have made the decision to remove ECM 2.2 from our instance (because the ECM to EXM upgrade is a nightmare), upgrade to v8.1-3 then install EXM 3.3 and sort of start over. However we don't want to lose the users that have already been imported.

It is my understanding that as part of the ECM to EXM upgrade there is a utility called ConvertUsersToContacts.aspx that is run. Should I run this utility as part of my upgrade from v7.5 to v8.0 even though we will have removed ECM 2.2? I just finished my upgrade from v7.5 to v8.0 (haven't gone all the way to 8.1-3 yet) and I have tried running it. However the page doesn't seem to do anything. It just sits there and refreshes every 4 seconds saying "Task is waiting for processing". I don't get the sense that it is doing anything.

Any guidance or direction here would be a great help.

Thanks, Corey

1 Answer 1


Upgrade Script: ConvertUsersToContact.aspx

This script utilizes the standard Task Manager in Sitecore in order to process contacts. If for some reason, you have the processing\taskManager disabled, stopped, or otherwise not activated, the ConvertUsersToContact.aspx will hang on Task is waiting for processing.

private string GetStatusString(ProcessingTaskStatus status)
  switch (status)
    case ProcessingTaskStatus.New:
      return "Task is waiting for processing";
    case ProcessingTaskStatus.Processing:
      return "Processing...";
    case ProcessingTaskStatus.Processed:
      return "Completed";
    case ProcessingTaskStatus.Failed:
      return "Failure. See log file for details";
      return string.Empty;

Contextual Information:

With the advent of xDB in Sitecore 8, there are now two repositories that contain user/contact/visitor information.

In Sitecore, one is the User profiles

  • These are the actual user accounts that Sitecore uses stored via the Membership provider mechanism.
  • These are identified via a domain/ and can have custom profile information stored with them.
  • And they have an email address.

In xDB, they are called Contacts.

  • Contacts are identified by usually an email address and monitor and track interactions and page visits.
  • Contacts contain a unique ID (GUID) that are key associated to the Interactions. (Note: this means that you could have multiple contacts with the same Email Address, but different Contact ID's. Out of scope of this answer)
  • xDB can have custom facets for storing additional information.

Enter ECM/EXM:

  • In Legacy ECM, there was no such thing as xDB, so the only user profile was from the membership provider.
    • When ECM would create the user (say if you imported through CSV file), the User Name was in the manner of domain/emailaddress_at_somedomain_dot_com
  • In EXM, EXM now uses xDB Contacts as the main contact record. Generally (OOTB) the email address is considered the primary identifier, especially when using the List Manager CSV upload (it can be changed though).


When using the conversion tool above, notice the create user logic below:

namespace Sitecore.Analytics.Conversion.UserToContact.ConversionLogic
  public class UserToContactConvertor
    public ProcessingResult Convert(Guid itemId)
      User user = this.GetUser(itemId);
      if ((Account) user == (Account) null)
        return ProcessingResult.Processed;
      ContactRepositoryBase contactRepositoryBase = Factory.CreateObject("tracking/contactRepository", true) as ContactRepositoryBase;
      Assert.IsNotNull((object) contactRepositoryBase, "tracking/contactRepository");
      LeaseOwner owner = new LeaseOwner("UserToContactConvertor", LeaseOwnerType.OutOfRequestWorker);
      LockAttemptResult<Contact> lockAttemptResult = contactRepositoryBase.TryLoadContact(user.Name, owner, TimeSpan.FromMinutes(1.0));
      Contact contact;
      switch (lockAttemptResult.Status)
        case LockAttemptStatus.Success:
          contact = lockAttemptResult.Object;
        case LockAttemptStatus.NotFound:
          contact = contactRepositoryBase.CreateContact(itemId);
          return ProcessingResult.Postpone;

Notice here that, if the contact is not found LockAttemptStatus.NotFound, the creates a Contact and sets the identifier as the User.Name.

I bring this up, because if at any point in time in the future, you load up a List from List Manager's CSV upload using the email address as the identifier, or you utilize the Tracker.Current.Session.Identify(string identifier) from the website using email address as the identifier, you will effectively have two distinct contacts with different identifiers.

  • Pete - can you explain in a little more detail what you mean by "if for some reason you have the processing\taskManager disabled, stopped or otherwise not activated"? I'm not sure I understand what you are talking about there. Commented Oct 7, 2016 at 16:49
  • I've engaged in a Slack conversation with you. See if I can assist specifically. Commented Oct 7, 2016 at 17:03
  • I have re-installed everything including the most recent version of EXM and the most recent version of the ConvertUsersToContacts tool. However when I go to run it I am still getting the Task Is Waiting For Processing message continually. Commented Oct 11, 2016 at 21:25
  • @PeteNavarra what do you mean by "processing\taskManager disabled" ? you mean the configuration file task timestamps ?? Commented May 29, 2018 at 15:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.