Creating a Real-Time Decisions Project : Day 6

Yesterday we got going with a slightly revised Oracle Real-Time Decisions project that we are using to come up with customer cross-sell offers after recieving orders via the Oracle SOA Suite Order Bookings demo. Today, we'll look at generating cross-sell offers based on performance goals we define, such as maximizing revenue or minimizing costs.

The first thing I have to do is to create a cross-selling offer choice group, and then create some offers to present to the customer, like this:

Next, I need to create some performance goals, by which we'll later on measure the various offers. The first performance goal is "Cost", and I'll set our objective to be to minimize this value.

I then go through each of the cross-selling offers and assign a cost score to them, telling RTD that some offers cost our organization more to offer than others. These costings can be made conditional, so for example it might cost us less to offer an extended warranty to older customers, who claim less, than to others. Later on, I'll add Revenue in as another performance goal, and we'll score each option based on it's ability to contribute revenue.

I'm now at the point where I can create my first "decision". Decisions use one particular set of performance goal weightings and feed back to the calling application the decision made by RTD. I create a new decision and call it "Cross Selling Offer", I point it towards the cross-selling choice group, and place a 100% weighting on the cost reduction performance goal. Note how I can segment customers within this dialog - later on, I'll use this to apply different weightings to different groups, emphazing cost reduction more for silver and bronze customers.

I then create another decision, this time a control group where I check the "select at random" box, to allow us to compare random results with results from the predictive model.

Now that I've created the decisions, I need to create an "Advisor" to send the offer recommendation back to the client. I therefore create an Advisor called "Get Cross Sell Offer", select the predictive model decision and the control (random) decision, and then picked the extended warranty choice as the default offer.

Next, I add some logic to the decision to output the offer that was presented to the customer:

logInfo("Integration Point - Get Cross Sell Offer");
logInfo("  Customer status = " + session().getCustomer().getStatus() );// 'choices' is array returned by the 'Select Offer' decision
if (choices.size() > 0) {
  //Get the first offer from array
  Choice offer = choices.get(0);
  logInfo("  Offer presented: '" + offer.getSDOLabel() + "'");
}

Then I deploy the inline service and test it out.

I simulate a call coming in from a customer who is "silver" status, and who is calling regarding a business order:

Then, when I run the advisor, this lucky customer gets offered an extended warranty, which just happens to be the lowest cost offer, and is therefore picked by the decision which currently is aiming to minimize costs as much as possible.

Now, if I go back to the Decision Center web interface, I can see the revised Inline Service process flow:

Notice the step now where the cross-sell offer is generated, and that I've turned off the option to display the "Testing" informant that I created earlier, as it's not really needed.

So, where we are now is that our Inline Service is generating offers, based a current business priority of minimizing cost. Tomorrow, we'll add a feedback loop in to feed back customer acceptances, or rejections, of our offers into the model, so that future offers take into account the chance that the customer will take up, or not, the offer.