Program Intent & Engagement (PIE) Service Coming

Currently the platform has no idea who is actually engaged with a program. We have program enrollment only for Masters programs, and we sometimes connect learners with programs as soon as they touch a single course in the program which is wildly inaccurate.

To get a handle on learner engagement with programs we’re going to create a new IDA handling a new concept: program intent. Program intents will record our guess that a user intends to complete a program. Program intents are not modified, we write them when we have a guess and accumulate them.

Program enrollments are a transaction between a learner and the program provider. By using the term program intent we can record less certain states or learner only decisions. We expect multiple intents per user per program.

A program intent will have:

  • user ID
  • program identifier, probably program UUID
  • intent reason
  • intent certainty
  • effective datetime

And of course standard django bookkeeping fields.

The interesting fields here are the last three. Intent reason is “why do we think this learner is engaged with this program”. Some example reasons: program bundle purchase, enrollment in all or most program courses, or directly asking the user. We expect to add many new program intent reasons and have no idea what they all are right now.

Intent certainty is a broad bucketing of reasons with only three values: CERTAIN_YES, CERTAIN_NO, and MAYBE. In the above example, program bundle purchase is a CERTAIN_YES. Asking the user will generate a CERTAIN_YES or CERTAIN_NO. The others are probably MAYBE. We have this field separated from intent reason to provide a quick summary for our initial uses without having to understand all of the reasons.

Effective datetime is the time of the event that gave us the reason. That’s not the same as when we figure it out. If a learner purchases a program today, effective datetime is today, even if we don’t figure it out until a batch job runs tomorrow.

We will put all these events in a separate IDA, the Program Intent Engagement service (PIE service, so now you understand why we added “engagement” to the name). The MVP of the service will have a write endpoint, a batch write management command for adding intents generated by reports from a data warehouse or other analytics report, and a “latest and best” read endpoint, more about that below.

The latest and best read is intended to drive UIs like a program dashboard and is called as the learner. It will return only some of the program intents. For each program:

  1. return the most recent CERTAIN_YES or CERTAIN_NO intent
  2. if there is no such intent, return the latest MAYBE intent

We expect to add more write paths and more read paths in future iterations, this MVP is meant to give us a starting point to figure out how program intents can be useful in the platform.

Once we have the PIE repo up this content will end up in an ADR there as well.

1 Like

Hi @ashultz

This sounds like a really cutting-edge IDA. :genie:

Is it hard to ask the users when they’re signing up for courses if they intend to join the program? What’s preventing us from asking the user about this instead of guessing?

We may want to do that and stash it in program intent. But that sort of interjection in course signup might not really be desirable, or they might change their mind, or the program might not have existed at the time. This is meant as a place to write down multiple sources of intent so that we can start working with it cheaply to understand what is useful.

Makes sense, and it seems like it should be easy to connect with enrollement signals in a modular way so that it’s an optional plugin?

1 Like

Definitely!

The initial MVP is trying to be very and drive most intents via the bulk load, so pull a report of all program purchases to fill out the store.

But if it is found useful I think a later phase is to have event bus listeners which read enrollments or purchases or whatever to write intents based on those immediately. The purchase code still doesn’t have to know about the intents but we get back immediate responsiveness if we want it.