Digital Marketing in practice (final episode)

In our last episode of the series we have spoken of the holy grail of Digital Marketing landscape and how this is deeply connected to the identity of our customers. So let’s try to recap for a moment what we need :

  1. all our customer data (web logs, app logs, purchases, calls, surveys,etc…) marked with same identity Id in order to proper assign every event to the same customer and we need this data to be collected in real/near real time.
  2. to define what are our targets (sales, customer satisfaction, market penetration,etc..) and define a strategy to reach those goals.
  3. To define the strategy we use the data collected at point 1 to identify the patterns that are leading to : high revenues customers, abandoned carts, poor reviews, good surveys,etc….
  4. Once our overall strategy (sales, discounts, promos, coupons, social,etc.. ) is defined we need to put this strategy in practice defining our customers journeys, for example look at this or this , so literally we have to define on each touch point (where), what and when some “actions” will happen, who will be the target of those actions and what are the subsequent “sub actions” or steps that automatically have to happen at every step of the journey.
  5. To produce on all the touch points the respective UI associated to the actions.
  6. To go back to Point 1, evaluate the new data and check if the strategy is working and if necessary take the corrective actions.

Now in an hypothetical “perfect world” we should be finished,  but reality is much more complicated than that 🙂 .

rality check ahead sign

In fact , while we can define journeys and customer segments, profiles and target audiences , we need some “binding” to happen between our defined journeys and the real touch points.

An example? Let’s assume we define a coupon/loyalty initiative, this only means a quite large list of system configurations and actions :

  1. Define the new coupon initiative in the loyalty system
  2. Define the budget allocated for those coupons and the limits associated
  3. Integrate the new coupons with the e-commerce in order to have them to be applied and accepted at order time
  4. Integrate the journey builder actions into the e-commerce in order to have the e-commerce UI display the promotion new look & feel
  5. Integrate into e-commerce UI engine journey builder sub-steps if any
  6. Tag properly all the consumer journey steps in order to collect back the data points of the journey
  7. Etc..

Now repeat this for the marketing campaign system that handles email, sms and notifications, repeat this for the call center,etc….

simpsons_panic

As you can imagine we need a single unified collection of products (identity,e-commerce, apps, crm, marketing email/sms, etc…) all connected by the same vendor and the “unified data collector system” to be also the customer journey builder , in fact we can reasonably understand if our strategies are effective only if we can observe on the very same tool if the journeys we designed are working or not (what if we define a journey of 12 steps and almost nobody goes after step 3 ? ).

I guess that if you look now on preferred search engine and do so basic research you will find at least 20+ vendors that are saying that they have this kind of combined solution in place.

In reality , even if we assume that all the 20+ vendors have all fantastic and well connected platforms, all the enterprises have already a gargantuan amount of systems already in place and you cannot “turn off” everything and start from the scratch.

At the same time even if you start from zero, often the cost and the lock in risk associated with ALL IN ONE solutions are so high that you can anyway end up going to think about a Lego approach.

lego-1

So what is our recommendation here ?

buildorbuy-resized-600

The right approach can be perhaps neither build or buy , I call it smart integration.

Smart integration means the following:

  1. Define your own MML : marketing markup language
  2. From the central data repository define the personalized MML journey for each customer
  3. Write this MML journey on the identity of each customer
  4. Build/Configure on all the touch points the functionality needed to read the MML journey (leverage first the customer device/browser to perform the integration) from the identity itself ,translate that in meaningful actions on that specific touch point (email template on marketing automation, call center Next Best Action on the CRM, etc…)
  5. Collect all the data and evaluate , correct and start again 🙂

An example of MML?

You can start simply with something like this:

loyaltyblrule1

Now if you want to create a unified MML definition for the main strategies and touch points , I think it would be a fantastic idea and for sure a very successful start up!

success-loading-pic1-1024x768

Digital Marketing in practice (part 2)

In part one we defined our landscape and the first challenges encountered on managing the known customers .

We now want to investigate how to bring new customers to our e-commerce site and more importantly how to target , among potentially 7 billion customers, the ones that have the higher chances to buy our fantastic product.

Ideally we would like to place advertisement on :

  1. search engines (google, bing, etc..)
  2. social networks (facebook, twitter, snapchat, etc..)
  3. big content websites (msn.com, yahoo, news websites,etc..)
  4. inside famous apps that can host advertisement
  5. etc…

How do we contact all these different “information publishers” and how we can create a single “campaign” targeting all these “channels” ?

Here we have go into the DMP, DSP,SSP world, and see how these platforms can help us in reaching our objectives.

Let explain this with an example : go now to this yahoo page https://www.yahoo.com/news/ , you should see almost immediately on the top of the page an advertisement like this:

How and why this advertisement was placed there ?

The “publishers” like yahoo, have a so called “inventory” of places where ads can be positioned on each page , on different times of day or of the week typically. So they use a platform called SSP  to communicate to the entire world the following message : “I have these open slots/positions in my pages, who pays the highest amount to buy them and place their own ads?”

On the other side of the fence there is another platform called DSP where “marketers” can say the following : “I want to pay this amount of money to place my banner in yahoo pages “.

The process where “supply” and “demand” meet together is called RTB , real time bidding , and thanks to that, in real time it will be decided what is the advertisement appearing in yahoo website. If you want to understand this more in deep look at articles like this , but you understood that in this way we can have new customers that can reach our e-commerce site clicking on the banner.

But now another question comes up: is this banner the same for all the visitors? And if it has been displayed to 1 Million or 10 Million or 100 Million visitors what is the price that we have to pay?

This is the right time to explain the concept of audience: before going to the DSP and search for “open inventory” we first want to define who are the visitors or anonymous customers that we want to target in our campaign, in this way we can have an idea of how many of them in theory can see the banner.

But if these customers are “unknown” how do I target them? Here the final piece of the puzzle comes into play: the DMP . With DMP we can actually “purchase” (or better rent) from third parties anonymous customers profiles  that are based on browser cookies or smartphone device ids and pick only the ones that according to us are the best ones.

So for example we select them using simple filters in this way:

Once our audience is prepared, we can have an idea of how many of these potential customers we can reach and with this have an idea of the money we will spend if all of them will see our banner and hopefully click on it.

Now this is a pretty straightforward process, but it is not really super optimized…

In fact we already have customers in our e-commerce site (the so called first party data) and we already know who are the ones that are “our best customers”, it would make sense to find on the DMP platform the potential customers that are very similar to those ones, right?

This process exists and it is called look-alike modeling:

So now we know that we have somehow to integrate also the DMP world (that is already a world on his own with connections to DSPs and third party data providers) into our digital marketing landscape at least in two directions:

  1. unknown–>known campaigns integration
  2. known–>unknown look alike modeling and on-boarding process (bring our first party data into the DMP)

Be patient now 🙂 .

We will start designing our digital marketing landscape in part 3.

Digital Marketing in practice (Part 1)

Several times you hear these buzzwords: digital transformation, digital marketing, etc.., but what really is that from a technology point of view?

I will try to give you my point of view (mainly looking at architectures and components involved) but I hope this can be useful to a large audience.

In order to understand the digital marketing ecosystem imagine that we are the founder of one of the an innovative company that is launching a new incredible mini robot that is mainly focused for kids , let’s call our product TheToy:

Now that we have a product to sell we need to prepare the following:

  1. An e-commerce web site to sell this product
  2. A payment provider that help us to accept any credit card/bitcoin/bank transfer/paypal/etc..
  3. A delivery/supply chain provider that help us to bring the goods to our customers
  4. Speaking of customers we need a CRM system with integrated call center
  5. ……

This of course it’s just an over simplified view of the needs of an e-commerce initiative , but it’s already interesting to speak of this because in this way we can for example evaluate the following options:

  • Our IT related “stuff” (e-commerce, crm,etc..) needs servers, where do I buy, host and maintain these servers?
  • Do I build from scratch ,hiring some developers, the e-commerce website, the payment provider, the CRM,etc..?

Since our focus , should be, to create a fantastic product and having customers happy and not be an IT company we can do , for example, the following choices :

A) Pick a cloud provider that gives us all necessary “virtual hardware” and bandwidth, pick an e-commerce software package, install/configure a huge amount of stuff and hopefully end up in something (again high level) like this :

B) Pick a software as service e-commerce provider that already has all of this in place and where we have just to upload our product catalog and start our e-commerce site immediately:

Now choice is not simple as it seems because every time we pick a “the shortest route”, there is a price to pay , not only in terms of pricing of the solution, but also in terms of functionalities that we would like later to have.

As we said there are other pieces of the puzzle like our CRM and not only we have to pick the CRM that best serves our needs and budget but that also it has to be “somehow integrated” with our e-commerce site…

Before we dig also in this , let’s imagine for a moment that , magically, our e-commerce and CRM and Delivery/Supply Chain/etc.. are already in place and we are selling/delivering our products successfully , what if we have a new product/offer to sell and we want to notify our customers that we have a new product?

This process of contacting customers in order to sell/advertise a new product/offer is called “marketing campaign” and of course we need a tool for that 🙂 : we need a marketing campaign automation tool that help us to create targeted campaigns (we want to reach the right consumer for the right product….) and deliver those messages in multiple ways :

  • emails
  • sms
  • push notifications if we have also an e-commerce app
  • social accounts/pages (btw we need to setup also those accounts!)
  • personalized pages and messages on the e-commerce website advertising the new product only to the “right customers”
  • personalized CRM responses (when the target customers calls only to these customers the crm agent has to propose the new offer/product)
  • etc…

So now the things became to be a bit more complicated, we need in fact an e-commerce site integrated with CRM both integrated with a marketing campaign automation tool .

In order to have even more fun let’s also consider the following : we said that we want to produce “targeted campaigns” , this means that we want to leverage all our data on customers to target only the “right” ones ….

What is the data that we can leverage?

Some ideas:

  • The weblogs of the e-commerce site (google analytics logs for example)
  • The orders of the e-commerce site
  • The calls/cases of the CRM
  • The responses/interactions with our previous campaigns
  • The interactions on our social channels
  • etc…

This , even at small scale of our little e-commerce initiative , seems like a little data warehouse project and if we plan to find the right customers for the right offer , this is also a data science project involving machine learning…..

So we need an e-commerce site integrated with CRM integrated with a marketing campaign automation tool integrated with a big data engine with machine learning capabilities .

In the part 2 we will start to look also to another dimension of the digital marketing landscape: the unknown customers that are waiting to purchase our product but they don’t know that the product exists and we don’t how to reach them 🙂

Extract text from documents at scale in the Azure Data Lake

Hi across all the content posted on Build 2017 , I was really impressed by this presentation where you can learn how to lift and shift almost any runtime to Azure Data Lake Analytics for large scale processing.

Following those recommendations I built a custom Extractor and Processor for USQL leveraging tika.net extractor in order to extract in a text format all the content stored in files like pdf, docx, etc…

The idea is to solve the following business scenario: you have a large collection of docs (azure data lake store capacity is unlimited)  : pdfs, xls, ppts, etc.. and you want to quickly understand the information stored in all those documents without having to create/deploy your own cluster but in pure PaaS mode.

Here a sample of code built around the Visual Studio Project template for U-SQL Applications.

ADLA4As you can see in this demo we limited the max size of the extracted content to 128Kb in order to comply to this ADLA limit. This limit can be bypassed working on byte arrays.

Now I uploaded all the dll binaries to the data lake stored and registered them as assembly

adla3.jpg

Then I launched a U-SQL command to actually take text data stored in a collection of pdf documents specifying 22 AU .adla2

And in less than 2 min I have my collection of documents parsed inside one single csv file .adla.jpg

Now that the information is in text format we can use the Azure Data Lake topics and keywords extensions to understand quickly what kind of information is stored inside our document collection.

The final result that shows how keywords are linked to documents can be visualized in Power Bi with several nice visualizations

rev1

And clicking on one keyword we can see immediately which documents are linked to it

rev2

Another way to visualize this , it is with word cloud

rev4

where we see for a specific document this time what are the keywords most representative of the document.

If you are interested into the solution and you want to know more send me a message on my twitter handle.

Enterprise Ready Jupyter Hub on the Linux Data Science VM

Hi everyone, this time we want to try to improve the data science experience of the Azure Linux Data Science VM with a special focus on accounts and authentication.

Data Scientists , as all the employees in major Enterprises, have an active directory account, the one they use everyday to logon on their laptops and to access emails. When instead they have to use Data science exploration tools like Jupyter notebooks they have to remember specific local accounts created for this objective (using notebooks) and of course the IT managing these accounts it’s even loaded of procedures and checks to manage these additional accounts in addition to the usual ones on Active Directory.

We will try to improve this experience explaining how to set up a Linux Data Science VM joined to a managed domain and have also Jupyter Hub authentication working with the very same domain.

The things to set up are the following:

  1. An Azure Active Directory that usually mirrors automatically the on-premise active directory structure and content
  2. Azure Active Directory Domain Services with its own Classic VNET
  3. Another Resource Manager VNET where one or more Linux DS VMs will be deployed
  4. A peering between the two VNETs
  5. The packages needed for the Linux OS to join a managed domain
  6. The authentication module for Jupyter Hub that makes authentication happen against the managed domain

Why all these components and complexity?

Well Azure Active Directory works mainly with oauth protocol while OS authentication works with Kerberos tickets that requires an “old fashion” managed domain and Domain Services it’s a way to have this completely managed by Azure. In addition Domain Services gives us also LDAP protocol support that is exactly what we need for Jupyter Hub.

The two VNETs are needed because Domain Services still needs a “Classic VNET” while the modern Linux DS VMs are made with Resource Manager template. The peering between the two guarantees that they can see each other even if they are separate.

Peering

Now we will demonstrate step by step how to setup all the necessary components.

Step N. 1 Create an Azure Active Directory

Go to https://manage.windowsazure.com/ and here click on +New button on the left hand bottom corner, go and click on App Services > Active Directory > Directory, finally click on Custom Create , here choose name, domain name and Country .

Pay attention to country choice because it will decide on which datacenter your active directory will be.

Once done you should have something like mytestdomain.onmicrosoft.com .

Step N. 2 Create Azure Active Directory Domain Services with its own Classic VNET

Here simply follow this great Microsoft step by step tutorial   completing all the 5 tasks. Do not forget , if you do not import from on premise AD, to add at least one user , to change the password of this user and to add it to AAD DC Administrators group.

Step N.3 Create a Resource Manager based VNET

Here simply go to the new portal.azure.com and create a normal vnet paying attention to choose the addresses in way that are not overlapping with the ones of the previous VNET (so if you have choosen 10.1.0.24 for the classic VNET , pick 10.2.0.24 for the new one).

Step N.4 Define the peering between the two VNETs

Go to portal.azure.com, to the new VNET that you have just created and enable the peering :

peering

Step N.5 Deploy  and Configure Linux DS VM

Again from portal.azure.com , add a new Linux Data Science VM CentOS version and during the configuration pay attention to pick as VNET the latest one you created (the ARM based one).

Once the VM is up install the needed packages with this command:

yum install sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python -y

Go now to /etc/resolv.conf and setup the name resolution in the putting the domain name and the ipaddress of the azure domain services (one of the two).

Here an example:

search mytestdomain.onmicrosoft.com
nameserver 10.0.0.4

Now join the domain with this command (change the user to the admin defined at Step 2)

realm join –user=administrator mytestdomain.onmicrosoft.com

Check that everything is ok with the command realm list .

Now modify the /etc/sssd/sssd.conf changing these two lines in the following way:

use_fully_qualified_names = False
fallback_homedir = /home/%u

and restart the sssd demon with this command systemctl restart sssd .

Now try to login/ssh with simple domain username (without @mytestdomain.onmicrosoft.com) and password and everything should work.

Step 6 Configure Jupiter Hub

Add the ldap connector with pip:

pip install jupyterhub-ldapauthenticator

Configure the jupyter hub configuration file in the following way (change Ip Address and other parameters accordingly):

c.JupyterHub.authenticator_class = ‘ldapauthenticator.LDAPAuthenticator’
c.LDAPAuthenticator.server_address = ‘10.0.0.4’
c.LDAPAuthenticator.bind_dn_template = ‘CN={username},OU=AADDC Users,DC=mytestdomain,DC=onmicrosoft,DC=com’
c.LDAPAuthenticator.lookup_dn = True
c.LDAPAuthenticator.user_search_base = ‘DC=mytestdomain,DC=onmicrosoft,DC=com’
c.LDAPAuthenticator.user_attribute = ‘sAMAccountName’
c.LDAPAuthenticator.server_port = 389
c.LDAPAuthenticator.use_ssl = False
c.Spawner.cmd = [‘/anaconda/envs/py35/bin/jupyterhub-singleuser’]

Now to troubleshoot and verify that everything works kill the jupyterhub processes running by default on the linux DS VM and try the following command (sudo is needed to launch jupyter hub in multiuser mode):

sudo /anaconda/envs/py35/bin/jupyterhub -f /path/toconfigfile/jupyterhub_config.py –no-ssl –log-level=DEBUG

Now try to authenticate going to localhost:8000 with domain username (without @mytestdomain.onmicrosoft.com) and password and you should be able to log on on juypter with your AAD credentials.

 

 

Image recognition for everyone

Warning : I’m NOT a data scientist, but I huge fan of cool technology !

Today I want to write of a new functionality that amazes me and that can help you to literally do “magic” things that you can think can be exclusive of super data scientists expert of deep learning and frameworks like TensorFlow, CNTK, Caffe,etc…

Imagine the following: someone  trains huge neural networks (imagine like mini brains) for weeks/months using a lot of GPUs on thousands and thousands of images.

These mini brains are then used to classify images and say something like: a car is present, a human is present, a cat etc… . Now one of “bad things” of neural networks is that usually you cannot understand how they really work internally and what is the “thinking process” of a neural network.

featurization

However latest studies on neural networks have found a way to “extract” this knowledge and Microsoft has delivered right now in April this knowledge or better these models.

Now I want to show you an example on how to do this.

Let’s grab some images of the Simpsons :

59381

and some other images of the Flintstones:

2BF47AA000000578-3221746-image-a-102_1441327664251

For example 13 images of Simpson cartoon and 11 of Flintstones. And let’s build a program that can predict given a new image that is not part of the two image sets if it is a Simpson or Flintstone image. I’ve chosen cartoons but you can apply this to any image that you want to process (watches? consoles? vacation places? etc…).

The idea is the following: I take the images I have and give these images to the “model” that has been trained . Now the result of this process will be , for each image, a collection of “numbers” that are the representation of that image according to the neural network. An example to understand that: our DNA is a small fraction of ourselves but it can “represent” us, so these “numbers” are the DNA of the image.

Now that we have the image represented by a simple array of numbers, we can use a “normal” machine learning technique like linear regression to leverage this simplified representation of the image and learn how to classify them.

Applying the sample R code described in the article to only a small sample of images (13 and 11 respectively) using 80% for training and 20% for scoring we obtained the following result:

Score

A good 75% on a very small amount of images !

 

 

E2E Product Info Bot Demo

Hi this time I wanted to investigate in the possibilities of using a chat bot to help any e-commerce website to answer product related questions (if possible even more complicated questions) and also from a back end perspective have a tracking of what is happening and how our bot is performing, what are the most requested products, how consumers feels about the products and of course all of this in real time !

So let’s start from the basics, what is the product that we want to sell ?

Since I’m a huge fallout fan and I’m playing Fallout 4 right now, I want to introduce you to the fantastic world of … Nuka Cola!

Yeah you will love it! The smell, the flavor and the radiations will make it the next most wanted beverage in the world!

We can have different types of Nuka Cola (Wild, Orange,etc..) and we want to explain the characteristics of each variant to the users of our bot.

I will leverage several technologies mainly Microsoft based but can achieve the same with many other bot/analytics technologies (check here ).

Let’s start with the bot itself that we will build with Microsoft Bot Framework.

You need at least : 1 Hotmail, Live, Outlook.com account, 1 azure subscription linked to it and some dev account into the channels you want to use for your bot (Facebook developer account for example).

I reused a VM already with Visual Studio 2015 and after upgrading it to the latest patch level, I installed the bot framework visual studio project template and I also installed the bot emulator to test the bot locally.

The procedure is well explained here.

Now that we have a bot running locally we want to add “some intelligence” right?

The intelligent service that will help us to make a bot that is able to understand human language is LUIS , where will introduce what actually our bot is able to understand and what are the concepts that he is able to distill from a message.

First we need to create a new LUIS application (that will became later a simple api endpoint that we have to call) and we need to define at least three things: intents , action parameters and entities, but these concepts can be easily explained with our example:

Intent: I want to understand which type of Nuka Cola (Action Parameter) the consumer is interested .

Action Parameter: the parameter NukaColaType has to match an Entity.

Entity: List of all possible Nuka Cola variants

So what we will do on LUIS is the following:

  1. Create an Entity called NukaColaVariants
  2. Create an Intent called ProductInfoRequest
  3. Define inside ProductInfoRequest a mandatory Action Parameter called NukaColaType that matches the Entity NukaColaVariants

Here an screenshot:

luisAnd now? Well now the magic happens! Click on new utterances and start typing possible requests that your nukacola customers probably will do like:

“Tell me more about nuka cola dark” or

“What about nuka cola orange?”

After you record an utterance you will define the intent for it and then highlight the part of the phrase where the action parameter is defined and the matching entity.

In this way , utterance after utterance, LUIS will automatically be able to answer, but more importantly he will be smart enough to understand some like “how does nuka cola quartz taste like?” even if we never typed this utterance inside LUIS.

You can also look at LUIS errors and help him to understand some phrases that he was not able to classify properly.

Once we think that our LUIS model is kind of ok (I inserted 3-4 different utterances to start), you can publish the LUIS app and this action will give you a full api URL with inside your application id and subscription key.

Now bringing all this “Intelligence” to our bot program will be super complicated right? Api calls, object mappings, parameters in, parameters out, try catch…..

Instead it will be actually super super easy using the LuisDialog Class , check here or here for the details!

Now our bot using the emulator is answering amazingly in the emulator, but we want to use it live,right?

So from VS2015 we publish the bot to our Azure Subscription , register the bot on the bot developer portal and add/configure the channels that you want (I opted for telegram and facebook).

All the steps are described here.

fbbottelegram

Do you want to try ?

Go to the nukabot page on facebook to chat with my bot or try the telegram bot.

Ok now we have our bot answering to facebook and telegram like a champion but if this was really a bot answering hundreds of requests per hour we cannot watch all the chats and have an idea of what is happening.

We need some analytics that in real time processes the information and gives us an idea of what is happening.

I created this PowerBI Dashboard:

dashThanks to this dashboard in real time I can see what is going on and what is the feeling of my customers about my nuka cola products!

Let’s see how to do that.

First step Logic Apps :

logicWhat we do here is to create an endpoint listening that will accept calls from our bot, call the Text Analytics Api on Azure to understand the sentiment from the text typed by the customer and finally send all the information to an event hub.

In order to send from Logic Apps info to an event hub you have to deploy the EventHubApi App published here using the magic “Deploy to azure” button and then discover the API with the “Show APIs for App Services in the same region” option when you add an action.

You can use the start a free ride of Text Analytics Api really simply clicking this link (provided you are logged in your azure subscription).

Since it is essentially a simple http endpoint processing json inputs and outputs you can use a simple Http connector.

A stream analytics job will in real time process the info coming from the event hub and populate the data on Power BI.

simplifiedStream analytics jobs just take one input (In this case event hub), transform it using a query and puts the results in an output (in this case a powerbi dataset).

The query we used is the following:

SELECT
NukaColaType,
Channel,
System.Timestamp as time,
COUNT(*) AS [Count],
AVG(score) AS [Score]
INTO
OutputBI
FROM
InputFromHub TIMESTAMP BY [timestamp]
GROUP BY
NukaColaType,
Channel,
TumblingWindow(second, 5)

So every 5 sec we take all the messages , we group them by nukacola type and channel and we compute the count of events and the average of the score.

That’s what we will see in real time on the dashboard.

Why we added Logic Apps into this? Can we call directly the event hub from the bot?  Why use the score only for analytics while it can and should be used to provide better feedback to the consumer in real time?

All of these and many other are great questions, some answers:

  1. I like Logic Apps because it exposed one end point and behind the scenes with 0 code I can create “monster” workflows that can do as many things as I want
  2. Using the score in real time it’s a great idea , but still I’m not able to think a way to have Luis and sentiment playing together nicely (I have to study more probably)

Now some clarifications related to data, data retention:

  1. I do not store any user identifier (my scope is only to understand if the bot is responding well I do not care who is the person actually writing)
  2. All the data is stored in powerbi at aggregated level (as you have seen with the query)
  3. The detailed data into the event hub is cleared automatically every day without any backup policy.

So at the end of the day I only observe stats about bot responses and I can look into LUIS errors and improve the responses of the bot.