Workflow Unenrollment Not Working Properly

If a user enters multiple workflows at the same time, HubSpot's unenrollment feature cannot discern the unenrollment criteria properly. 


If a user enters multiple workflows, HubSpot will execution unenrollment rules based on miliseconds between enrollment events, which is a poor user experience and results in contacts receiving simultaneous workflow emails at the same time. 


Here's an example: 


To prevent confusion I'm going to refer to these workflows as A,B, and C.


At the time of a user's enrollment, the following settings were in place:

  • Workflow B removes the contact from Workflow A.
  • Workflow C removes the contact from Workflow A.

The next question I asked myself was, what was the order in which the user was enrolled in these three workflows? *time in milliseconds

  • Enrolled in Workflow B first (1510255740790*)
  • Enrolled in Workflow A second (1510255741489*)
  • Enrolled in Workflow C third (1510255741497*)

If you look at the timestamps of both enrollment events, you can see that the two enrollments happened within milliseconds of each other. The order of execution for workflow enrollment is (roughly) as follows:

  1. The enrollment request is received
  2. The server logs an enrollment log event
  3. The first step of the workflow is scheduled, and the enrollment status is updated to ENROLLED
  4. The server checks the database for any other enrollments with status ENROLLED that should be unenrolled based on the workflow's unenrollment list

I believe what happened here was that the server received the request to enroll in A slightly before the request to enroll in C (step 1), which explains why the log event for A is timestamped before C (step 2). However, the two events were actually so close to each other that Workflow C's first step got scheduled before Workflow A's (step 3), so when the server checked to see if the contact was enrolled in Workflow A (step 4) it had not yet updated A's enrollment status, and therefore did not unenroll the contact from A (since it didn't know that the contact was in fact enrolled in A).


Unfortunately, there's not much we can do about making the behavior more consistent - when a contact is enrolled in multiple workflow simultaneously it is impossible to predict which one will get its first step scheduled first.