Personalisation Groups + Pipeline CRM
Working at agencies developing solutions on Umbraco, Theo and Andy have been finding personalisation of content an oft requested feature. Although Umbraco doesn't currently offer an out of the box solution in this area, with the help of some community packages we are able to deliver personalised solutions to site visitors that are general purpose, extensible and under day to day control of the website editors.
In this session we'll discuss how personalised features can be delivered on Umbraco, using the Personalisation Groups and Pipeline CRM community packages.
View transcript
You expect your employees to very least mistake. Yeah, exactly, I mean, your flights and everything. Where have you gone? I got one, I suppose. It's fine, I suppose he knows about that. Where did he go? Yeah, I don't know. It's possible, but, you know, he could use his motor very long ago, but he decided not to. He wants to know the reason. At least we don't. Do you want to go in? Andy, first couple of slides. Do you want to go in? Um, yeah, exactly, yes. Yeah, I'm not sure. Hello? Is this working? Hello? Hi, there's no clock in here, but judging by the fact that everyone's come and sat down, I think it must be quarter past, so... Yeah, sounds good. We'll get started. So, yeah, we're here on a mission from God. So, the... I had to do that. To talk about Umbraco personalisation. Yeah. What you can do today. So, we've got two main packages to talk about. We've kind of got two talks in one. We'll try and obviously link it up as best we can, but... What value? Two for one. ...Personalisation groups is a package that I've worked on, and Pipeline is a package that Theo's company provides. So, just to introduce myself first, my name's Andy Butland. I've worked with Umbraco for a number of years now. I put up there a link to my blog. There's not... I've put a huge amount of content on there, but what there will be come the weekend will be copies of the slides and the various resources that we're going to talk about today. So, if there's anything you want to, you know, you want to follow up on, hopefully you'll be able to find it up there. And I work for Zone. We're a digital agency based mostly in the UK and also in Germany now. We have an office there. Quite strangely, though, I live in Italy, but that's kind of not really too relevant. It just means I spend... In Cologne in Germany, we have an office. And I live near Venice, so I just spend a fair bit of my time on Ryanair, coming back and forth. But we're Umbraco Gold Partners and obviously been working with Umbraco for a number of years. And I'm Theo. I'm a technical director at GrowCreate, also a digital agency. We're just outside Oxford in the UK. We have been Umbraco Gold Partners for four years, and I have personally been using Umbraco for, I think, between six or seven. Back to the good old days. A couple of packages that we have made. One was Documento that I demonstrated last year, but mostly more comprehensive on pipeline, which I'm going to talk about today, and also the session at 1 o'clock when we're talking about products and stuff. Some links for you up there. There's links at the end on GitHub where there is some documentation and sample code. You can follow me on Twitter. And there is also the URLs where you can also see the blogs and updates and what's going on. Thank you. There's a few more seats around the front. Sneaking in. That's fine. So personalization. I mean, it's actually been a pretty hot topic, I think. We've seen, obviously, in the keynote some things that are coming out in the core. I expect some of you were in Janice's talk just before. You know, it's something you see everywhere on the web and something we're finding we're getting asked for a lot of times by our clients when we're putting together requirements for websites. So some examples here. Obviously, showing the weather, where you are. I've got some examples I've picked directly off my Amazon account. So I'm the only person in the world that requires a fire blanket, a book about quantum physics, and the second season of The Wire. But it sums me up fairly well, I guess. And obviously, I've picked some reasonably credible musical things to put in the screenshot, too. These examples also point back to what Janice was talking at the personalization talk elsewhere. So the last session, we talked about implicit and explicit. So implicit with things like the weather where it picks up your location. It is what you already know about the user for sure. You can personalize that bit just giving them relevant information. More behavioral stuff is on this slide where it's making an assumption based on your history of what it is that you might want next. Yeah, that's quite an important distinction. So some really fine targeting. You can't get away from the fact you need to log in. You need to know who this person is. But there's actually a lot of factors that you can know about the person or you can infer about the person based on just things you can pick up from an anonymous user. So their location. The time of day. Where they've been to before. And that's more the type of thing we're going to be talking about in terms of the personalization groups package. So, yeah, as I say, as an agency building sites for, you know, on Umbraco and other CMS platforms as well, we're finding that the personalization question just comes up a lot. I'm sure you've all been in the situation where you get a kind of list of requirements for a CMS. And it's got a number of things that are just always there. It's got to have preview. It's got to have audit trails. It's got to have workflows. You know, all these things you kind of just have to tick a box and say, yes, it does that. It does that. It does that. And we're finding that personalization is kind of becoming one of those things. It's something that clients are asking for. It's something that when we're in discussions about, you know, fleshing out requirements, the question comes up, you know, would you like to be able to personalize the content on your website? And, you know, if you're asked, you're going to say yes because it's, you know, something that people oftentimes will think they need and oftentimes, you know, will need as well. So, we then find we've got to interrogate that request a bit because it's a pretty broad term, personalization. And oftentimes, when you come to interrogate it, it does come to be something quite specific that's always going to need, you know, some custom development to do. And the other thing that often comes up as well, it's something that people kind of think they want but maybe they haven't got a very good idea yet about how they're going to use it. I mean, workflow in Unbrack is the classic example of that. It's always people think they need it. And then when you actually come to launch the site, you know, usually they just have a much simpler version than what they probably need. They thought they would need it at the start of requirements. But that said, I think it is something that's needed and it's something that is coming up, you know, more and more. People just need a kind of general purpose means of personalizing content on their site. Yeah. Just one thing to add to that was from personal experience is in B2B websites, this comes up a lot. And this was probably the first type of website that for us, we got really explicit and strong requests for personalization. This is where the one single high value lead. Yeah. Basically matters a lot. So you might have a thousand visitors but the one person, the one decision maker that's a visitor to your site, you really want to target that person. You want to kind of convert that. That one conversion matters a lot. And the other thing is that there is a certain expectation from a client's point of view that personalization should be there. They, you know, the amount of times you had to explain to people that the web is anonymous and even Google Analytics is anonymous. It's... We have to do that a lot. And people just expect to be able to do certain things. And we just have to overcome them. And different tools will help us with that. Yeah. But for me, that was my journey into personalization, I suppose, was perhaps a couple of years ago I came across a company called HubSpot, which some of you might have to do with digital marketing, might know. Their approach was really interesting. They basically go digital marketing first and then the website. They will talk all about... SEO inbound. They'll talk about calls to action, landing pages. And then when you have got all that sorted out, then they'll try to kind of also get you the blogs and the websites. It's a very, very interesting approach, which does resonate with clients quite a lot. See, a lot of the more advanced use cases for HubSpot is things like automation and personalization and things like that. And they seem to go in with that approach. What made a particular impression to me was... at the bottom of everything of this entire apparatus is a CRM. And they give that away for free so that basically people will go and buy the marketing and sales tool. Now for me, for pipeline, personalization is the first major use case, which is what I'm talking about today. But there is many other reasons why you would want a CRM embedded into your CMS. Okay. So, yeah. So I'm just going to demonstrate a little bit more about this personalization groups package that I've put together. This first will just kind of illustrate what I'm trying to do here. I mean, if you go back far enough, developers used to build websites and they used to put the content on them as well. You know, they'd be sent a Word document and be told to mark it up in HTML and put that up on the site. You know, fortunately, thanks to things like Embraco, those days are long gone. Developers build websites and it's up to the editors to keep them up to date with the content. You aren't expected to kind of decide what the content is at the point in time you're specifying your website. But at the moment, personalization often becomes a domain. So, you know, the developer feature, you know, if a client wants to make some changes based on something about their users, they're going to have to come to the developers and ask them to do that. And I guess what I've been trying to do with this package, and I think other ones we'll talk about a bit are also doing the same thing, is to kind of try and put that in the hands of the editors. So the developer will still need to get involved, possibly to create certain criteria that the editors can pick from. But once they've done that, the editor should be in charge of saying, okay, what criteria am I going to use where and what content am I going to associate those criteria with? So it's very much a thing. And you're not having to specify all that upfront and putting it into the hands of the editors. So, and there's a question about whether personalization becomes a core feature. I mean, we've been talking about it a little bit already. And as you've seen in the keynote yesterday, there's plans to basically bring this type of thing into the core for version 8. And as I say, I do think it becomes an issue sometimes when we're comparing CMSs that Mbrak at the moment doesn't come with a sort of out-of-the-box solution. But kind of what we're really showing today is that even if this is coming in version 8, and, you know, maybe, you know, the API then will be obsoleted, that's still a kind of six months or a year away. And there are things you can do today to bring these features to the site. Personally, for pipeline, I'm very excited to see segments and variants. How I can tie that up to a CRM when you have really granular control and knowledge of the user and combine them with segments, that's very exciting. So I'm really waiting for version 8. Yeah. So just a quick thought just to say there are other options out there. I think Janice talked a bit about Spindoc. I won't mention that too much anymore, but that's, you know, still certainly available. I was looking for Adam. I saw him walk in this time last year. I think Adam was presenting a package called Footprint, which does similar types of things and has some nice analytics engines built in, so you can kind of, as well as define your criteria, work out which, you know, how many people that's going to affect. So, well, he's at the back, so you can ask him about it, but it's out. And I think it came out just after CodeGarden last year, so it's worth checking out as well. And then the two we're talking about today. So Personalization Groups is a free package, open source. It comes with various criteria out of the box, kind of all the things I could think of that, you know, were general and useful. So the day of week, time of day, what location you're in, kind of hooks into Umbraco membership, so you can personalize based on member group and member type and that type of thing. But the important point is it's extensible, so you can develop your own criteria. So, and that's partly because, you know, I'd like other people to contribute to it, but partly because sometimes your criteria are very specific. So if you're going to contribute to your own solution, it wouldn't make sense to be part of a general package. You might, you know, link it to some custom data tables you've got that, you know, you would need to kind of build yourself. But it can be all hooked in and extended and... Leo, sorry. We've only just met. Leo is going to show later on how he's built an extension for this for Pipeline. And then it comes with some property editors for allowing you to define your groups and associate them with content. And an API to use in your templates to kind of say, should this piece of content be shown to this visitor or not? There's a couple of links there to the package on our and the source code on GitHub, which again I'll put up on my blog after the talk. So this is just a few screenshots of how it works. When you're defining a criteria, you have the option to say, to create one or more criteria, and you can then choose whether the user should be matching all of them or any of them. So in this case, I'm creating a criteria for basically weekday morning visitors. So it's obviously matching on the day and it's matching on the time of day as well. It's kind of nicely, well, I think quite nicely integrated with Umbraco. So it looks very much like an Umbraco property editor. You have a dialogue here that you kind of click on to pick the days or the times or whatever it might be for the criteria you've chosen. And then you have a picker that you create on your content. So in this case, I've got a picker to say, okay, for this piece of content, I'm going to target this only to the weekday morning visitor group that I just created. And then following that, you then get a, an extra extension method called show to visitor, which is associated with the iPublish content. So anytime you do model.content or model.content.children, you can basically hook in and use this extra method. And this will basically just say, should I show this or should I not, based on the current user. So behind the scenes, what it will do is it will look at the piece of content, look at the groups associated with that content, and then go through those groups and see does this user match any one of these ones. And if it does, it will show it, and if it doesn't, it won't. As I said, I think I was going to go into this a bit more later on, but you can extend the package quite easily. Basically the way it works is on startup, the application just scans for any classes that implement this interface called iPersonalizationGroupCriteria, which is very simple. It just really has one method called does it match or not. It matches visitor. And that just takes, basically works out based on whatever the thing you're measuring, so whether it's the time of day or the user's location or the user agent, and then works out should this user match based on the criteria I've defined. And then it returns true or false. And there's a couple of Angular files you have to provide as well, basically the interface for doing the editing in the back office. But with those in place, it just on startup scans and pulls them in, and you should work with it exactly the same as you would the built-in criteria. So I'm just going to show a quick demo. Three things really. One is just sort of showing how you personalize the content in list. So this might be a list of calls to actions or a list of related items or something like that. And be able to say, okay, I want to show this one and not this one, or I want to put this one to the top and personalize it that way. And then the second thing is probably like personalizing a single page. So I land on a page and I want to change the headline or the image based on some criteria for the users. And I've got that working two ways. One way they're using kind of subnodes, which works quite nicely. It's a little bit messy in Umbraco. And one which works really nicely is using the nested content package, which I'm sure a lot of you have seen and used. And again, you've probably heard it's going to be pulled into the call in a version coming out fairly soon. So it should work quite nicely. The reason that works is because nested content effectively works with iPublish content. So the extension methods that I've got just work on that as well. So let me just, give me two seconds while I switch to browser. Let's check that's still going. Okay, it's coming up okay. Yeah. So as I mentioned, you get a couple of document types and a couple of data types to create your groups and then to attach them to content. So this is the one I was just showing in the slide. So this is the kind of weekday morning visitor. And I can choose to match all or any. I can pick from the various criteria that come out of the box. As I've mentioned a number of these already, there's probably just a couple worth mentioning. There's kind of a low level one, which I call it based on the cookie or the session. You know, clearly your editors don't really want to know about cookies and sessions. But this is a way you can almost provide any kind of information. You can almost provide any kind of personalization by having your developers set a session value or a cookie value when something happens. So if a user's gone through a particular user journey and they've completed that, you can set a cookie and then the editor can then personalize based on that. As long as you give them what the information is. There's the one on pages viewed. So if I click on that, I can say, okay, has the user viewed any of these pages or all of these pages? And pick the pages that they want to, we want to target. So you start them in like that. And that works by just setting a little cookie based tracking where the user's been. And you can pick them, you know, associate them based on that. There's one other to mention is the country one. This basically matches IP address to country. It requires that you should get hold of a free database provided by a company called MaxMind, which matches IP to country. And obviously, these are updating every now and then. But that can target quite nicely as well. And yeah. Otherwise, as I say, it's very sensible to build your own. So I've created a couple more examples. So I've got a CodeGarden visitor here. I'm kind of thinking when we're aware at CodeGarden, people coming to our websites are wondering why, you know, they're not getting any support requests through and that sort of thing. So it might be worth to kind of personalize and put a message up. So I've made sure from 9 until, well, as far as I could go late, this would be targeted. And I've got another one just to show based on a cookie value as well. So this is going to look at for cookie. So this is going to look at for the key of cookie name of campaign and a value of CG16. And if it finds that, it will kind of match that user. So let me just then show you how it's kind of hooked in. So for example, on this content item here, just got a simple text page with the content and the personalization. You just pick from the groups and associate them in there. So to understand how this is working, this is the kind of list I'm showing here. Three items. And at the moment, I've got obviously one of them is being highlighted. And that's because it's matching one of the personalization groups. You can see I've got this one associated with CodeGuard and Visitor. And these two actually don't have any groups associated at all. So if I just flick to the template for the home page, you'll see pretty straightforward. You just can then use this show to Visitor method within your code. It passes through this parameter here, which is just to say what to do if there are no groups associated. Because it could be you want to make a positive match, so I know this user is definitely targeted or definitely not. Or it could be you want to say if there's no groups, then we'll just show it anyway or we'll just hide it anyway. So that's what this parameter does. So because I'm passing through true on this one, it's actually optional. The default is true. It will show if there's no groups associated and if there's a positive match. And it will only omit it if there's a kind of negative match on the groups. So in that case, you can see if I was to say that change that to false, and save that template, you should find that we only get the top one, because I've only got a positive match for that. But in this case, I'm going to leave it to the default as true. And I'm going to use it in other ways. So I can use it for ordering. So I'm going to say where I've definitely got a positive match, move that to the top. Or in this case, I'm doing it for kind of highlighting. So I'm saying, okay, where I've got a match on the user, then let's highlight this one. And that's why it comes out in that horrible shade of green. Okay, so that's the list matching. And then on the page itself, I've got this one here, which is coming out at the moment with a special message for Kogan visitors. That's coming up because if you look at my content tree under here, I've got these variation nodes. So the page itself has a heading, subheading, stand first, and the body text. And the variation has a subset of those fields plus a picker. So I'm basically saying, okay, this is the subheading, this is the stand first I want to show when I know the user is a Kogan visitor. And again, just looking back at the template, you'll see how that works. So if I go to the text page. I've got this the wrong way around, actually. I just started running through my demo last night. This bit commented out, so I wanted to show you. Let me just do that quickly. So that should probably do the same thing, but it will be updated. There we go. So you can see it's pretty simple what it's doing. It's just taking the subheading and the stand first from the page. And then it's having a look at finding all the children and seeing the first one that matches this particular user. If it finds one, it then switches and uses the subheading and the stand first from that variation node and uses that instead. So that's why, because it's matching the CodeGarden group, it's coming through with a special message there. As I say, that's kind of okay. But this is a... I don't know if Mark mentioned it. I think we mentioned Mark's Ambraco anti-patterns talk yesterday. I didn't, but if this wasn't mentioned, this probably should be one. Using the subnodes for things that aren't real nodes. The classic one I think, certainly I've done in the past, is a sort of homepage carousel, and you have carousel nodes under it. The reason why it's not very nice is that, first of all, these things have got URLs, and they shouldn't have. And the second thing is that if I did have subpages under my About Us page, it would be pretty messy for the editor to have to fiddle around with these variation nodes that sit in between. So what's much nicer, is if we can put it on the node itself, and with the help of nested content we can. So this is exactly the same. It's using exactly the same document type, because nested content, the definition of nested content, is based on document types. And if I expand these, you can see I can set the subheading and the stand first, and again, there's a picker to choose what group they're associated with. And so then if I switch back to the template one last time... What was it? Text page, wasn't it? That was the bit that was commented out. So I don't really need to show you, but you can see what's going on there. It's doing exactly the same thing, but it's looking at the property called variations that's on my content. Because it's iPublish content, it can do exactly the same logic to kind of show the subheading and show the stand first. And just one last quick thing. If I was to go into my... What was it? My text page again. Let's just go... Let's turn off the CodeGarden one. So I go to my CodeGarden visitor. What's today? Thursday, isn't it? So I take that one off. Save that. The CodeGarden visitors will no longer be matching. And if I go to my campaign one, this is the one that's kind of based on the cookie. So if I go to... So imagine the users come to the homepage from a link on a banner ad or something like that. That query string, there's a bit of code here just to set a cookie, which I've just put on my homepage template. Sorry, I'm flicking around a bit here, but it can't really be avoided. Which is then setting the cookie. And then that will mean that that campaign one will now match. And so if I go to the... Sorry, text page. Just make sure I switch to the nested content version. Which is this one. Okay. Then we should find now, if I go to my back page, that we get the campaign one. So that's matching instead. So just to show you, you can kind of mix and match these things. You can write whatever logic you want to pull out the content you need. And as I said, my hope is that it can kind of fill this personalization gap, at least till such time as version 8 kind of brings this type of thing into the core. Okay. Okay, yeah, sounds good. Yeah. Very good. I'll stand aside now. Thanks. So... Let's pick up from... God, user of keynote cannot find the start presentation. But I do remember the keywords for it. F5 starts everything. It's okay. Oh. Okay. Sorry. Okay. So let's see what... How pipeline can be used to handle personalization. First of all, if you haven't seen or heard about it, pipeline is a CRM. It stands for Customer Relationship Management System. You may have heard of other big ones like Salesforce, Dynamics for Microsoft. It's basically software that lets you track things like opportunities, first of all, tasks, contacts, organizations, things like that. So it's very much about getting personal, about tracking the individual. Pipeline itself is embedded, so it's a package for the back office of Microsoft. The back office of Umbraco. So it lives within your installations. It's a new section. It's completely standalone. And I have got a number of ways that you can both extend it, integrate it. And one of them I'll show you today, or a couple of them I'll show you today, where, for example, is I created a new criterion for personalization groups. Now, the type of personalization that... Thanks. That pipeline does is very different as opposed to the vanilla one, the one offered by personalization groups. Without a CRM, your basis for personalizing the page or a piece of content is very much a... It's generic. It's based on the context or on the history. It's things that you can either know about the user in the very general or things that you can assume. So your reaction is very much like, you know, if you have visited that page or if it is this time of the day, then you might be... You probably are interested in that content, With the CRM, you actually are talking about an individual. So an example with this room, I know about all of you here that you are probably interested in personalization. You are definitely interested in Umbraco, and, you know, it's Thursday, it's 9 o'clock, and I can deduce a number of things from here and perhaps make this conversation, this presentation. That box over here is, at the end of this talk, one of you is going to come, hopefully, and ask me a few specific things. My name is so-and-so, and we're planning to use it in that way. So then, this is about actual personalization, putting the person in personalization, if you like, talking to the individual. And that's what the CRM enables you to do. It's about tracking the individual. Now, I'll go through a couple of use cases on the demo. I'll look at some code as well. Three different use cases. The first one is a simple one. Let's have a calls-to-action that includes a user's name. We can get a lot more sophisticated on that in terms of a strategy, but that's about as simple as it gets. Second one is to, closer to what you'd recognize as segmentation, is to show a message for B2B users, which we're going to start getting into, kind of automating things a little bit. And then the third one, about showing a personal message to the user, is about showing some of the capabilities of pipeline CRM and, you know, extending it a little bit and showing personal content. So not just... So in personalization groups, you have got content segments, and then you apply that based on the rules to a group of users. This is about personal content, like a message. So let's look at the first use case. How we make that work is that when the user submits a form, that gets stored. We create a pipeline contact. So we create a contact in pipeline CRM. We also track that contact ID with a cookie. Then on our view, we retrieve the content, and then we can display the name. We can display anything else, but in this case, we're going to keep it simple. Um... Okay. So let's go over to here. So we have got this starter kit, completely unpersonalized at the moment. All we want to do is just put the user's name here. This is not about the login. This is when they have converted. So the moment of revealing themselves is when, in our case, when they complete a form. It's a point where we have actually convinced them to take a particular course of action, and they fill in a form. So at the... bottom here, I don't know. User... James? It's not on my keyboard. Um... Ooh. Yeah. And then... It also doesn't scroll on the Mac users on Windows. Terrible. Okay. So the user has submitted this form. Behind the scenes, as I said, the contact has been created in Pipeline. We know who they are, and we've installed the cookie. Next time they come in, you know, we'll put in a message in there. You know, we add basically that message. Just go ahead, James. So we change the message. Very simple. It can be potent. It can be scary. How does that site know me? But, you know... It's a very simple use case for you. Now here's what's happening behind the scenes in Pipeline. So this is Pipeline. Over here, these are all my tests. As you saw, it's a new section in Umbraco. You have got, first of all, opportunities, tasks, which are associated with the user in Umbraco. Then it tracks contacts and groups. You can call that... They can be companies or organizations. You can also have settings. It's all that kind of stuff. It's a complete entry-level CRM, if you like. However, the extensibility and the integration into Umbraco make it powerful beyond its age, I would probably say. Now in this case, we are looking at all the opportunities that have been created. As you can see, the opportunities are stored in a little Trello-like port. This workflow here of unassigned and prospect is all customizable. Your sales team can move things about, and they can track a user and leave messages. If you want to see more on Pipeline in general, it's at 1 o'clock. For the time being, I will focus on personalization. This is here the opportunity that was created. The user that was there, that just contacted us. And they're here. This is the user that got created. We know their name. The cookie has tracked them, who they are. The good news from this point on is that we are now tracking them. Anything that they do from now on is actually associated to a named user. That can be very, very valuable information. In later versions of Pipeline, one of the things I want to do is redesign the screen to actually give you that very useful single customer view. So that's one of the things that I know that I want to do to kind of make it more relevant to personalization. So we got our user. And we have personalized the message. The next use case over here is how do we show a message to B2B users only? So we want to personalize our homepage to show a specific message for B2B users. We're going to get into system code now. So the first thing that we need to do, our strategy to implement it, is to automate a contact to actually be part of a B2B segment. So we're going to create a very simple rule that says, if the user has provided an organization name, then we can assume that they're a B2B. You can make this a lot more advanced, check whether it can be manual. The sales team can do it. The data center can do that. But we assume that. We add them to a B2B group in Pipeline. Then we use, I called it Pipeline Bridge, but it's going to include other things. Pipeline Bridge is a custom language. It's a custom little name for, because I can't stop making product names, for a criterion for personalization groups. And then we select that, and then we display the content on the page in exactly the same way that Andy showed us. Now the demo for that is we have a different person coming in. This time it's John. He works for a company. So that's our... Yeah. Now, same thing. When the page reloads, it's going to be, go ahead, John. We have got our user. But behind these things, what has happened, our user, John here, has been associated with the company that he has provided. So we have created in Pipeline, an organization or a company called, in this case, John Incorporated, but also with a segment called B2B Customers. And that was our logic. If they have provided an organization, they go into that group. Let me show you very quickly how that code works. Sorry, I want to kind of bring up GitHub. That's the documentation for Pipeline, by the way. But I wanted to go here. So the entire demo that I'm showing you now, including all the code, is on GitHub. So it's all open source. But that code, for the time being, I've just put in a class over here. And it is a little event. This is the first way that you can see how Pipeline can be extended. You hook up to an event. All we're saying is that, add to the application event handler, on after save of a contact, therefore after a contact is created. Very, very simple logic over here. If they have provided an organization, then add them to that organization. Obviously, I have completely done the anti-pattern of hard-coding the organization. B2B group ID, do not do that under any circumstances. But there you go. I happen to know what that is. So that's what happens. So this is why the user all of a sudden belongs to the organization. It belongs to B2B users. So back into personalization groups now. So my site is set up like that. And what I have done here, I have created a group called B2B users. And I have created an extension here called Pipeline group. This is an extension for this package. You select that, and then you just say, personalize or show a message to the user if they belong to the group B2B users. So I have created two rules here. One is on personalization group to say, show different content to B2B users. And another one in Pipeline that says, that automates the adding of a user into a particular segment or a group. Now, save and publish that. What it will do, and it's the same code that Andy showed earlier, is it will basically show this alternative title at the top. Now, so our user, John, has come back. We recognize who he is. We know that he is a B2B user. And then he will receive that message. Obviously, this is about as simple as it gets. You can personalize the text, select different banners. You saw how we can use it with content, change images, change the entire flow, if you like. The point is that the logic is there. And it's still all triggered by the show to user. Yeah, show to visitor. The Boolean on the I publish content. Very quickly to show you how the group criteria works. What Andy mentioned earlier about how simple it is to create a custom extension. I will be creating more of these. This is just to create and just to pick from a pipeline group. Essentially, the heart of this is this. It's basically this. I believe it's a Boolean over here. It's that Boolean of matches visitor. So you go through it, and everything that you really need happens here. If you do get a contact ID from a cookie, use the service. The documentation is on GitHub, as I said. Then go and match it. If you do find that it matches the organization that you have selected from the site, then that returns true. And the criterion is the personalization engine picks up. The last use case, which is simple, simpler than the one that I just showed you, is showing a personal message. This all has to do with the capability in Umbraco to create custom. Properties. Sorry, not Umbraco. In pipeline to create custom properties. What you can do is you can use the document type editor in Umbraco. These things are configurable. But if you create a content type called pipeline content, and you can set the name of that in the config properties, you can start adding tabs and properties. Not all of them are supported yet, but most of them are content pickers, text areas, things like that are supported. In this case, I have created a message on a tab called personalization. I'm going to go over to pipeline and I find my user. You see what has a personalization with a message. And this is you. You can leave them a personal message over here. Just hello John in this case. Save that. That gets stored as a custom property against this contact. And then I have got a little piece of code on the view. That basically personalizes this banner over here. And I can show you how that works. You essentially use the cookie. And then instead of taking the name of the contact, you actually look onto the custom properties. And then you render that value. And all this is happening, as you can see, without a login. This is kind of all based on the cookie. Just to wrap up on the demo. What I showed you today, Pipeline CRM, Pipeline CRM Core UK. So there will be some more updates over here. There will be an announcement and more things at 1 o'clock in the panel session with the other groups, with the other packages. This is where you can download it from our. Using Pipeline CRM, there's a documentation for services and helpers. So you can use the events, go into the services, help us if you want to create simple integrations. And the entire demo I just showed you, it is on GitHub, Theotron Pipeline Bridge. And all the code is there, including how to create a custom criterion for personalization groups. So, yeah. So that was it with the demo. So it will be good to wrap up. I think Andy started by saying that personalization is a hot topic and also a big subject. I mean, we just focused on implementation here. And two ways to do it with Umbraco. Janus earlier on this morning, he went into the conceptual side of things, the pitfalls, the strategy. And if you follow between the two talks, you can probably see how big a subject it is. It is not that hard really to do it with Umbraco. All the tools are there in our disposal. Today was about personalization groups. I think it's fair to say that the focus is on personalization. And the focus is to give the power to the editor here. Yeah, exactly. And I think as I said and I think as we saw in the keynote, it's not just us coming up with this. It's come up in lots of conversations I've had with people not just this week but before that, I think for the last year or so. So, yeah, it's great to see that it's coming in the core. But in the meantime, there's a few things to help us on our way. Absolutely. So, yeah, and pipeline will give you that individual dimension to it. And as I said earlier, once we do get segments and variants in the core, marrying them up with that individual angle that the pipeline will give you is very, very exciting stuff. So, that's it for much. Go and make wonderful things and thank you very much. Thank you. So, we finished a bit early. So, if anyone's got any questions, we've got a microphone here actually. Do you need this? No. I think for the camera, we do, yeah? Yeah, yeah, of course. Is it on? Hello. Hi. I was just thinking about do you have any experiences you can share or tips and tricks about how you enable the editors to check if the personalization they set up is actually working because to see it working, you need to sort of switch between different maybe times and all the things. And I imagine that it can be a bit difficult for the editors to sort of get an overview of what is actually happening on their website. Yeah, well, there's nothing in the personalization package itself for that certainly. I mean, I think, I don't know if you saw Janice's talk earlier on here, a few other examples about how that, I think it was much more towards targeting people and then measuring the outcome and the, I've forgotten the word, when the percentage goes up. Conversion rate? Conversion rate, sorry. I went blank for a minute. Yeah. So basically tracking that type of thing. I mean, for that, you would, you know, there's nothing in what I've shown that would do that. You would need to sort of go to Google Analytics and, you know, run these things over time and, you know, see the comparisons like that. Yeah, so nothing in here, but, you know, again, there are other tools out there that can help with that. But you must have had customers working with this saying, how do I check that the rule I set up is actually working? Yeah. I think he means previewing. Yeah, actually, something like that. You mean previewing what, given this particular user, what should I see? Yeah. I see what you mean. Yeah. Well, that's not there now. And it is actually an issue with personalization is the, you know, the factor as a developer that says, well, it works on my machine. That gets a lot worse with personalization because all of a sudden something might not work on a little micro instance that you cannot pick. It's slightly easier with pipeline in the sense that you can always spoof. A user. So you can, you know, create a little impersonate user engine. So you give them a URL, check if they're coming from a particular IP or they're logged into Umbrako and then impersonate coming in as that user. Slightly more difficult with personalization. I mean, there might be ways to do it, but I think that's one of the things where when it becomes into core that, you know, preview is obviously very much a core function. So to hook into that would be quite difficult, I should imagine. But if it's based on the core and you're previewing a certain variation, that should be a lot easier. So, yeah, I think you're right. There's gaps, certainly. And that's probably one of them. Yeah. Hey. There you go. With personalization groups, if you have a lot of groups, did you do some performance testing? No. No. I mean, actually, there's a serious point in this in that this is something I kind of put together because I could see a gap. You know, it was something I could see that we needed. And as I said before, we had a lot of conversations about clients asking for this kind of thing. And it seemed to me there was a gap in Umbraco that could be filled. So I have put this together. But to be honest with you, I haven't really used it in anger too much on production projects, which is why I still call it a beta up on the GitHub site. So I'm actually really keen if anyone is using it. It's always strange. You put an Umbraco package out and you don't get too much response. It's had a lot of downloads, but I haven't had too much response on it. So either it's working absolutely perfectly for everybody or no one's really using it. And I don't know which it is. So I guess the thing is, if anyone's using it, it's a good thing. If someone is using it, I would like to kind of hear how it's going and things like that. But yeah, to be honest, at the moment, it's more something that I've kind of built. You know, it works. But yeah, I've only really tried it on kind of demo sites at the moment. Did you use it yourself on the live? Use what, sorry? Did you use it yourself on the live? No, just on sample sites at the moment, yeah. But it has been used. I mean, Theo's been using it, as you see here. And it happens. Some people come and obviously get in touch and find a few issues. It's had quite a few downloads. So I think it's being used, but I'm not sure. I think we've performed well. So, Thomas, having looked at the code, having used the code to create an extension, I think it probably is which criteria you use. So if you create a custom criteria and it goes to the database a lot and does a live check on the database, for example, that can probably have a hit on performance or something. So it's something. Any of the out-of-the-box ones aren't doing anything like that. They're just looking at cookies and things. But you're right. You could extend it and build your own criteria. And then it's kind of up to you then to, if you did do that type of thing, to implement appropriate caching. Yeah. So if you're checking for a day of the week, it's not expensive at all. So that should be fine. Okay. Andy, great package. We are using it in production right now. That's . Just wanted to ask you if you have any best practices or feedback on the most editor-friendly way to handle date time so that it matches the client. So right now, we're just doing time of day, day of week. But we're based in Chicago. So the morning for us is not the same for the morning here in Denmark. So we're looking at a server-side, GOIP lookup. Obviously, there's a little bit of cost there. Or doing it through a client-side JavaScript library. But then we have to set a cookie. And that's not quite editor-friendly. So just wanted to get your thoughts on that. Yeah. I mean, not anymore than you've said. You've obviously thought about it a fair bit and come up with a few solutions that should work to do that. Yeah. I mean, as I say, all I can really say is that it's extensible. So certainly, the date-picking stuff out of the box is fairly basic. I mean, at best, it's a text box. So because Angular is so extensible, because the Umbraco back-office is so extensible, and because you can hook into these external services, yeah, it's quite likely you can produce something quite nice for your editors. But specifically, I think you're probably way ahead on nothing. Maybe I'll send you a pull request. Yeah. Well, yeah, absolutely. In terms of extending this package, if there are kind of general-purpose criteria that are useful for others, then that would be great to have those in the core package. As I say, there may be some cases where you want to do something that's just very specific for your use case. Thanks. Thank you. Hey. Yeah. So I kind of just missed Umbraco forms in there. Do you have any plans to integrate pipeline with Umbraco forms? You can do it now. Yeah. On the GitHub documentation, there is actual code where you do that. Essentially, you create a custom workflow, and then you use the helper to create an opportunity. So you can do that just now. But it's not in any core. It's just something that you can... It's like 10 lines of code that you use for that. Yeah. I guess it's not difficult. But you should really provide a kind of built-in workflow for Umbraco forms, I guess. Yeah. I haven't packaged it or anything. I have the code as is on GitHub. But it's a good idea. And to be honest, I'm looking to do more of these things for all the e-commerce packages, like I do with personalization groups. And yeah, I mean, if people do not feel inclined to write their own code, like, they can just use the pre-built bridges. Yeah. Perfect fit. Cool. It's probably something you'll answer this afternoon with the pipeline session. I can do it again. Yeah. But how does pipeline fit in the... How does pipeline fit in with, like, standard Umbraco membership or any other membership for that case? Like, is it like a replacement for...? No. No? Oh, no, no, no, no. So I... There is a flag in the configuration section of pipeline that basically true or false whether you want to create a member, an Umbraco member, when you create a new contact. Okay. What if you've got, like, a not-Umbraco membership provider in there? Ah. Like a custom membership provider? No. I did not think of using a custom membership provider, mostly because I did not want pipeline to do any logging in. I did not want to mess in with security or anything like that. It's... It does... It's not a... It's not an extranet packet or a, you know, members area packet, if you like. It's a... It's a CRM. So I suppose that the easiest thing to do for that was... You know how the events API that I used to just basically write some logic if a user has provided a new client? Yeah. into a group called B2B users. Use the same logic to create a member in an alternative members area. So you just hook onto that and fire your code over there. Yeah. I guess when you... You know, if you did have membership on the same website, what would likely happen is your pipeline members are a kind of superset of your actual members, aren't they? And as they go through the workflow at some point, they may become members. So even a way to tie them together would be nice, even if it's not like... It is with an email address. Yeah. So at the moment it's... So at 1 o'clock I have a demo with... Which actually uses a login area and it uses the Umbraco membership. And when it needs to go over to pipeline and grab, say, custom properties to... Or opportunities or tasks to show to put on the member screen, it matches the user either by email or by contact ID, something like that. I did not want to make my own membership area though because I didn't think anybody would want me to. Anyone else? Yeah. Okay. Well, thanks. Obviously we're still here for another couple of days. Yeah. So grab us if there's anything else you'd like to talk about. That'd be great. But thanks very much. Thank you.