This post is part of the What’s new in Sitecore 9.1 series, Sitecore 9.1 has a lot of exciting innovation and value that will help our customers get to market faster, and ongoing refinements and enhancements to existing functionality.
In previous posted we focused on the What’s new in Sitecore 9.1 Content Management. In this post we will look at all the marketing innovations, features and enhancements within the Experience Platform. Before we dive in I want to provide context around Sitecore, this will help to understand the unique opportunity we have with Sitecore.
Starting with some history, as we all know Sitecore originally was a Content Management System. Being well known of the central hub for serving all the managed and integrated content. Over the years Sitecore evolved from web and to additional channels; including email, mobile and any other marketing channel.
The main driver was the introduction the Online Marketing Suite back in 2009. One of the first Experience Marketing solutions in the industry. Now Sitecore is a full Experience Marketing platform and the Sitecore Experience Cloud allows customers to personalize both online and offline experiences while capturing all the data; including all interactions, conversions, test results, patterns and basically any user information online and offline.
Now the great thing about Sitecore is that it’s all one native platform, both CMS and the Experience Platforms are closely tight together, it’s a truly unified platform.
Sitecore’s unified platform is one of the reasons why Sitecore is loved by developers and marketers.
The true power of Sitecore is in combining the analytics data with the content. The platform provides you with the opportunity to create relevant personalized experiences in real-time.
With this test we want to check what Sitecore DMS does with Wildcards. How are Wildcard URL’s and shown on the Analytics Reports?
Wildcard items in Sitecore are a convenient way to handle dynamic URLs. They let you pass data through the URL instead of relying on query string values that are appended to the URL. More information about the Wildcards and a introduction to the Wildcard Shared Source Module can be found in this article (written by Adam Conn).
Creating a testing environment
For this testing environment I’ve installed the shared source Wildcard module. After installing the module I opened the Content Editor and created a ‘products’ item, underneath the products item I created a wildcard item (*).
Configure the Wildcard Module
Go to /sitecore/system/Modules/Wildcards/. Create a new token called ‘Product Detail’ in the Tokens folder. And create the a new route called ‘Product Route’ within the Routes folder. In the Product Route item add the Wildcard item (*) to the Items field and define the rule in the Rules field.
The Wildcard module comes with two Sublayouts; DisplayDynamicUrls and DisplayTokenValues. For this test we are going to use the DisplayDynamicUrls sublayout. We need to alter the GetSampleData() method in DisplayDynamicUrls.ascx.cs. Open the DisplayDynamicUrls.ascx.cs and navigate to the GetSampleData() method and change the code so it will look like the following code:
[code language=”csharp”]
//The following constants must match tokens defined in Sitecore
const string TOKEN_PRODUCT_DETAIL = “%Product Detail%”;
private List GetSampleData()
{
var list = new List();
list.Add(new NameValueCollection { { TOKEN_PRODUCT_DETAIL, “product1” } });
list.Add(new NameValueCollection { { TOKEN_PRODUCT_DETAIL, “product2” } });
list.Add(new NameValueCollection { { TOKEN_PRODUCT_DETAIL, “product3” } });
return list;
}
[/code]
Now add the DisplayDynamicUrls sublayout to the Layout Details of the products item.
The test
Generate analytics data
Open a new browser, clear all cookies (I use Chrome Incognito Window) and visit the products item. You can see that the DisplayDynamicUrls sublayout generates Sample links based on the Sample data you configured in the GetSampleData() method.
Click the Sample links and close the browser.
View the Latest Visit Report
Open the Latest Visits report in the Engagement Analytics and select the latest visit. In the bottom of report you can find the visited pages. You can see that Sitecore has logged the wildcard page visits.
The verdict
At this point there is no indication that Wildcards are causing any problems with Sitecore DMS statistics. This is a straight forward simple test without any other complex systems involved, implementing wildcard in combination with DMS on complex systems needs thorough testing before deployment. Consider creating a Proof of Concept before starting to developt your sollution.
Please leave a comment if you have experience with Wildcards and DMS in a more complex scenario.
This article is part 3 of Sitecore How To: Track Exteral links with DMS series. Before starting with this step you need to be finished with Step 2. Otherwise you don’t have any report data.
Show the outgoing links in a report
The easiest way to generate a report is find a report that matches your needs, copy the report and change the datasource and layout. For this POC the Slow Pages report matches 80% of my requirements, so let’s use the Slow Pages report as a base for our new report.
Download the External Links per Page.mrt Report
You can download the External Links per Page report. Unpack the zip file and save .mrt the file in the folder /sitecore/shell/Applications/AnalyticsReports.
This report is a customized version of the slow pages report. For more information about report designing you can read the Report Designer Cookbook
Copy the Slow Pages Report SQL Query Item
Duplicate the slow pages Report SQL Query item (/sitecore/system/Settings/Analytics/Reports SQL Queries/Slow Pages) and name the Item External Links per Page.
Delete the SQL query in the SQL server field and add the following SQL query.
[code language=”sql”]
select top 100
Pages.Url,
PageEvents.Data as Link,
COUNT(*) as Clicks
from
Pages,
PageEvents,
Visits,
PageEventDefinitions
where
Pages.VisitId = Visits.VisitId
AND Pages.PageId = PageEvents.PageId
AND PageEventDefinitions.PageEventDefinitionId = PageEvents.PageEventDefinitionId
AND PageEventDefinitions.Name = ‘External Link’
AND Visits.StartDateTime BETWEEN @StartDate AND @EndDate
group by
Pages.Url, PageEvents.Data
order by
Clicks desc
[/code]
This query will return all outgoing clicks from every page.
Copy the Slow Pages Report Item
Open the content editor and duplicate the Slow Pages Report item located at: /sitecore/system/Settings/Analytics/Reports/Reports/Site Health/Slow Pages
Name the duplicated report External Links per Page.
In the External Links per Page item change the Filename to External Links per Page.mrt and change the Report Title field.
In the Queries section. For Failure select the External Links per Page Report SQL Query item.
Note: You might want to rename the datasource name Failure to something like Datasource. If you do this you need to do a search and replace within the .mrt file.
Test you report
Login to the Sitecore Desktop and open the Engagement Analytics. Underneath the Site Health node you will find the External Links per Page report.
In this report we can see that we generated three clicks from our products page to Google.nl and two clicks from our homepage to test.nl.
This report is only a example. You can create all kind of reports all based on the event table in the Analytics Database.
For this solution I want to measure all the outgoing link using the Analytics Database of Sitecore Digital Marketing System (DMS). Based on this data I want to create a report in the Sitecore Engagement Analytics that will show all outgoing clicks by page. I want to create a solution that rewrites all external links within rich-text fields and General Link fields. With this solution all external links on an existing website will be automatically rewritten and measured.
In this article I will create a solution for measuring outgoing links in the following steps:
Create a processor to rewrite all external links on the website.
Let get started!
Create the processor for rewriting external links
For the rewriting of the external links we are creating a Render Field Processor. This processor will fire for every field that is rendered. During this process we will rewrite the URL.
The easiest way to create a new processor is with the Visual Studio 2010 plugin Sitecore Rocks. One of the many things Sitecore Rocks does is creating Visual Studio Templates. These templates will help you extending Sitecore. Open your solution in VS2010 and add a new item. In the dialog window go to Sitecore –> Pipelines en selecteer Render Field Processor. Name the processor ExternalUrlReWriterProcessor.cs and click Add.
The Render Field Processor Template will generate two files for you; the ExternalUrlReWriterProcessor.cs and a ExternalUrlReWriterProcessor.config.
Modify the ExternalUrlReWriterProcessor class that all external URLs are rewritten to out /link.aspx page that we are going to create next. Below is my POC code. Please take notice of the comments and the TODO comments.
[code language=”csharp”]
public class ExternalUrlReWriterProcessor
{
public void Process([NotNull] RenderFieldArgs args)
{
// Do not modify output if the field is not a rich text field or general link
// or if the page is in page editor mode
if ((args.FieldTypeKey != “rich text” && args.FieldTypeKey != “general link”) ||
String.IsNullOrEmpty(args.FieldValue) ||
Sitecore.Context.PageMode.IsPageEditorEditing)
{
return;
}
//Check if URL is external link
if (args.FieldTypeKey == “general link”)
{
Sitecore.Data.Fields.LinkField linkField = args.GetField();
//Don’t change the link if it’s not a external link
if (linkField.LinkType != “external”)
return;
}
string fieldValue = args.Result.FirstPart;
string changedUrl = Regex.Replace(fieldValue, @”href=””(.*?)”””, delegate(Match match)
{
//Regex definition to check if URL contains HTTP or HTTPS (so it’s an external link)
Regex rgxExternal = new Regex(@”Regex rgxExternal = new Regex(@”(((http(s?))\://){1}\S+)”);”);
string orriginalUrl = match.Groups[1].Value.ToString();
if (rgxExternal.IsMatch(orriginalUrl))
{
//Rewrite the url to the redirect item
//TODO: Make the path configurable
return @”href=””/link.aspx?url=” + orriginalUrl + @””””;
}
return match.Value;
}, RegexOptions.Compiled);
args.Result.FirstPart = changedUrl;
}
}
[/code]
If you check your website all external links will be rewritten to /link.aspx?url=[EXTERNAL LINK]. Now let’s create the links.aspx and save the outgoing link information to the DMS Analytics database.
Test if it works
You can test if the solution is working on your website by testing the following functionalities
Action
Expected result
Create a internal link in a rich-text field
The link is not rewritten.
Create a external link in a rich-text field
The link is rewritten to /link.aspx?url=[THE LINK]
Create a internal link in a general link field
The link is not rewritten.
Create a external link in a general link field
The link is rewritten to /link.aspx?url=[THE LINK]
Click a external URL
The visitor is redirected to the external website.
This step is the first of the series: How to track External Links with Sitecore DMS. In this step we are going to create a page (link.aspx) that will register the outgoing traffic into the Sitecore Analytics database and redirects the visitor to the external website.
Save the outgoing click information to the Analytics database
Create the custom page event
Open the content editor, go to /sitecore/system/Settings/Analytics/Page Events and create a Page event called External Link.
Under the Options field section select the IsSystem checkbox
We refer to the name of this Page Event Item when saving the outgoing link to the Analytics database.
Create the sublayout
Create a sublayout called LogExternalLink. In the Page_Load event add the code.
[code language=”csharp”]
protected void Page_Load(object sender, EventArgs e)
{
if (Tracker.IsActive)
{
bool trackClick = true;
//Check if outgoing traffic is generated within a visit of the site
if (Tracker.CurrentVisit.PreviousPage == null)
{
//The visit is a direct visit or from another website, don’t add this link to the analytics db.
//OPTIONAL; Log these links based on referrer url.
trackClick = false;
}
//Get linkUrl from querystring
string externalUrl = Request.QueryString[“url”];
//Check if link is set
if (!string.IsNullOrEmpty(externalUrl))
{
if (trackClick)
{
//Create PageEvent, the name must match Page Event item in Sitecore
PageEventData data = new PageEventData(“External Link”);
//Set PageEvent data
data.Text = string.Format(“Outgoing traffic to: {0}”, externalUrl); ;
data.DataKey = externalUrl;
data.Data = externalUrl;
//Add the event to the previouspage; that’s where the link is clicked
Tracker.CurrentVisit.PreviousPage.Register(data);
Tracker.Submit();
}
//Redirect visitor
Response.Redirect(externalUrl);
}
}
//Something not right here, send them back to the homepage
//TODO: Log Error or Warning
Response.Redirect(“/”);
}
[/code]
Based on your businesscase you could choose to create a handler. A handler will have less overhead. If you create a Sublayout you could create a screen telling the visitor that there are leaving the website (for example like Facebook does).
Now create an item link underneath the website root and place the LogExternalLink sublayout that we just created on this item. This item will be the link.aspx page. All external links will be redirected and processed trough this page.
Test if it works
At this point we cannot test this part of the solution. Testing this solution is only possible if the tracking page (link.aspx) is referred from the website. We don’t want to track URLs that are triggered from a direct request.
In this How To I’ll show you how to extend Sitecore to track outgoing links trough the Sitecore Digital Marketing System (DMS).
First of we start with creating a sublayout that saves the outgoing link clicks to the Analytics database. Next step is creating a solution for tracking the outgoing link. There are multiple solutions of tracking external links but in this series we are creating the following two solutions; one that tracks all outgoing links automatically (step 2.1) and the other solution where it´s possible to enable tracking for-each outgoing link (step 2.2)And off-course we finish with report that will show you the most clicked outgoing links.