I think it might be useful to have a general "enrollment" event with actions "create, change, activate, deactivate" that could appear in combination. We could add convenience items like "enroll" as well, though that might be ambiguous. For instance, in the paid certificate flow, we create an enrollment for someone, but we don't activate it until we get a postback indicating that they've paid for that enrollment. With the code here, I don't think we would ever emit an event if a user created an enrollment but never purchased -- which is probably useful to know. It's also unclear to me in that scenario when the "enroll" actually happened.

I'd also suggest explicit before and after states. It makes things a little more verbose, but it offers a hedge against interruptions in the stream and it could simplify querying by not requiring that people doing analysis keep track of the states of every enrollment when all they're looking for is upsells (when a mode changes from "honor" or "audit" to "verified").

</bikeshedding>