Scenario:
We are developing a system in Marketo that checks website product pages that our customers visit (Can Marketo identify specific information (i.e. product sku) on a webpage ) to products that our customers have ordered, or been quoted, in a certain timeframe (Whats the best way to store order, quote and product information in Marketo . We actually went with custom activities in the end).
So now we have quotes/orders coming in as custom activities, with the product SKU as a field. We will soon be able to use the 'visits webpage' filter/trigger with the 'QueryString' constraint so we know what customers have looked at on the website.
I had thought (vaguely, I admit) that I could use a SMART campaign to compare products looked at on the website against products quoted/ordered, and if there was no match, then perform flow action (increase score, add to program, add to list etc). Maybe using tokens, because I don't want to set up a smart campaign for every product SKU (around 2500). However, when it actually came to, I can't see a way of doing it using standard smart campaign functionality.
I would appreciate any ideas on how to make 'compare' bit of this system work, or other approaches to achieve the end goal: "If a customer is looking at a product on our website that they haven't ordered or been quoted, then perform a flow action in Marketo"
Sanford Whiteman Jay Jiang you have both been very helpful on my questions in the past - do you have any suggestions here? Or is the question not clear enough?
I wouldn't have used Custom Activities, they are almost never the right fit and people tend not to think about wider needs such as this.
If you'd used JSON (Textarea) fields instead, you could do the comparison in a webhook.
If you'd used Custom Objects instead, you'd be in a slightly better situation because you could use an email processing endpoint, together with Velocity, to do the comparison. Still not a particularly comfortable place, but at least you'd have something to draw on.
With CAs there's no way can think of to make this comparison logic happen within (or originating from) Marketo.
Having custom activities set up isn't so bad. if you have a spare data scientist lying around, I'm sure they'd appreciate the amount of data you're collecting and might give you a nice model in return.
Barry Dupont To the problem at hand, regardless how you identify the the SKUs that a person hasn't purchased, what makes this a hard problem is the amount of SKUs you have. At every step of the way you need to be thinking about scale. So one thing you haven't mentioned, if you have data of a person who e.g. has visited pages but has not purchased products 123,546,2398... What do you plan to do specifically?
Without knowing what you plan to do with the data, the first question that comes to mind is, can you not use something a few levels up like a product family instead of individual SKUs?
Other than creating smart lists (e.g. visited webpage for product 123 AND NOT Purchased product 123), Marketo is horrible at comparisons between fields - and I get it you don't want to be creating 2500 smart lists. Basically, I agree with Sanford that you need to use webhooks, i.e. send fields to be compared, via webhook, to a service that can. In fact for most things that need scale, webhooks is the way to go (typing some lines of code beats creating multiple assets in Marketo)
So, to even get to the point where you can identify a set of products that individuals have not purchased but have viewed, I would set up 2 custom fields. One for storing the visited/quoted/purchased data, one purely for marketable SKUs. Because dates matter, the data in these should be json format. To actually populate these fields and keep them updated, use webhooks OR if you have a custom CRM integration, your middleware might be able to.
e.g. sku raw data
{
"visited":
[
{"sku":123,"date":"2019-04-23"},
{"sku":345,"date":"2019-05-28"},
{"sku":666,"date":"2019-09-11"},
{"sku":9001,"date":"2019-11-12"}
],
"quoted":
[
{"sku":345,"date":"2019-06-13"},
{"sku":666,"date":"2019-11-19"}
],
"purchased":
[
{"sku":666,"date":"2019-12-01"}
]
}
business rules: marketable within 6 months of visited or quoted (whichever latest)
marketable SKUs = [345,9001]
when an input changes, i,.e. however you're collecting visited, quoted, puchased sku data, you'd need to call a webhook to update the json data and spit out the marketable SKUs based on what ever date range business rules you've decided
Hello Jay, thanks for the detailed response.
What do you plan to do specifically?
We would want to run them through a smart list. There would be a few filters, and then the flow step would be to add them to a list. From the static list, they are picked up by our middleware and added to our CRM as leads for sales to follow up. This already happens with our 'new prospect' leads.
Without knowing what you plan to do with the data, the first question that comes to mind is, can you not use something a few levels up like a product family instead of individual SKUs?
We may well go down this route, however, the level of detail we require to make it valuable for sales still means we would need around 400 - 500 product families, so either way it needs to be a solution of scale.
I think the approach you then set out looks good. I think our middleware could do this, but would have to check. Otherwise, using web hooks, I assume is what Sanford is suggesting.
Webhooks is something I haven't used yet, so I would be glad if you could share more detail around how this would be structured. And I will read up on the docs at the same time, to make sure I can spec it to our developers correctly.
a webhook for your use case would work similarly to a smart campaign maintaining a history field.
I'd have 3 smart campaigns, one each for whenever new visited/quoted/purchased data is captured (however you're capturing these). Your flow would be to call the respective versions of the webhook (see below)
As for the webhook itself, you'd need to send the existing json data in the custom field to it as well as the data that was just generated e.g. webpage + query string containing the SKU that was visited or the SKU that was quoted or the SKU that was purchased. Use an extra parameter to determine which array to add the SKU to.
e.g. your endpoint (using GET for easier example) https://your.domain.com/endpoint.php?existingdata={{lead.JSON Data}}&SKU=1234&action=Visited
"&action=Visited/Quoted/Purchased" being the extra parameter I was talking about, all webhooks can use the same endpoint (up to your dev team to code it appropriately), one of each action is hardcoded into webhooks in Marketo to be used the respective smart campaign
lastly, map the responses to overwrite the json data custom field and Marketable SKUs custom field
Again, scalability might be an issue here, I'm not sure how busy your site is but if you're going to be triggering webhooks off page visits from users, obvious question but, can your server handle it? if not, you might have to just settle for "Quoted" and "Purchased" milestones
Thanks Jay, you've been very helpful. It will probably be the new year before we do this, but I'll be back here to update and mark complete when its sorted.
Thanks Sanford,
As we haven't finished development yet, we can still change how we do this, especially as we need the CA's for other things anyway.
Custom objects didn't look right to us from what I read, for 'purchases' or similar things, activities seemed to be a better fit.
Ignoring what we have already built, what would be your recommendation if we were to start again? Your suggestion of the textarea field and web hook? I would appreciate some more detail on this.