Understanding the Google Analytics Cohort Report

A very common data analysis technique is called Cohort Analysis. A Cohort is simply a segment of users which is based on a date. For example, a cohort could be all users based on their Acquisition Date (in Google Analytics this is really the Date of First Session). Another cohort might be all users that […]

Understanding the Google Analytics Cohort Report is a post from: Analytics Talk by Justin Cutroni

The post Understanding the Google Analytics Cohort Report appeared first on Analytics Talk.

Google Analytics Cohort Report

A very common data analysis technique is called Cohort Analysis.

A Cohort is simply a segment of users which is based on a date. For example, a cohort could be all users based on their Acquisition Date (in Google Analytics this is really the Date of First Session).

Another cohort might be all users that completed their first transaction during a specific time period. This is a very common cohort used in ecommerce businesses. You’ll commonly hear ecommerce companies talk about the performance of new customers acquired during the holiday shopping season. This is simply a cohort. It’s all customers whose first transaction occurred between thanksgiving and Christmas (or some day before Christmas).

I’ve written about cohorts before. But to be honest, a lot of other analytics tools have been hard on Google Analytics for it’s lack Cohort functionality – and that was well deserved! For a long time the only way to do cohort analysis in Google Analytics was via segmentation – but that was really a hack.

Now Google Analytics has a real Cohort report that makes it much easier to perform cohort analysis.

Explaining the Cohort report

Let’s look at the various parts of the Cohort report. There are three main sections of the report: the report settings, the data over time graph and the tabular data.

There are three parts to the Cohort report.

[Click to enlarge] There are three parts to the Cohort report.

Now let’s talk about how to configure a Cohort report.

There are four main choices that you need to make when creating a Cohort report.

Cohort Type: Again, a cohort is segment based on a date. The Cohort Type is where you specify which date you want Google Analytics to use to create the cohort. Right now you probably noticed there is just one option here – Acquisition Date. This dimension is the date that the user first visited your site or used your app. It’s basically the Date of First Session.

I know – you’re probably all groaning that there is only one option. Me too! But stay tuned :)

Cohort Size: The cohort size is the time window that you want to use when looking at the Cohort type. So, choosing a day would mean “I want to see all users that have the same acquisition day.”

If you choose a Cohort Size of a week then it means “I want to see users whose acquisition date was within the same seven day period.”

Metric: This is the actual data that you will see in the report. There are aggregated metrics, like pageviews, and there are a number of per-user metrics, like sessions and revenue.

Remember, the analysis technique is to look at a specific metric for a cohort (a segment!) and see how that metric performs over time. The idea is to see if there are any dramatic changes to the metric between the different cohorts.

Date Range: This is the date range used to construct the cohort. When Google Analytics builds a cohort it uses the Date Range to evaluate the date specified in the cohort type – in this case Acquisition Date.

If I choose a Cohort Date Range of Last 7 days, and today is February 6, Google Analytics will look from Jan 30 to Feb 6 and align the data based on each user’s Acquisition Date. Here’s how Google Analytics would create the various ‘Days’ of data based on a user Acquisition date of January 30.

Day 0 = Jan 30
Day 1 = Jan 31
Day 2 = Feb 01
Day 3 = Feb 02
Day 4 = Feb 03
Day 5 = Feb 04
Day 6 = Feb 05
Day 7 = Feb 06

How Google Analytics creates Cohorts based on date.

How Google Analytics creates Cohorts based on date.

And here’s how the ‘day’ data would break down for each cohort in the data table. Notice how each cell of data is for a different group of users on a different day?:

Daily data by cohort

[Click to enlarge] Daily data by cohort

Remember, we’re talking about days here because we chose the Cohort Size to be Day. If we had chosen Week we would have seen Weeks in the graph; in that case, a week would be a 7 day period starting from yesterday backwards.

You’ll also notice that this time range is also represented in the tabular data.

NOTE: You will ALWAYS see 12 columns of data in this data table. It does not matter if you choose a cohort size of day, week or month. There will always be 12 columns. Why?

Most people will assume that if you choose a daily cohort for a 30 day time period you would see 30 columns and 30 rows, one for each cohort. But we found that most people don’t look at every single combination. For example, there are very little insights to be gained for the 17th day cohort 22 days from their initial visit.

However, if you do need to do that type of analysis it is possible to switch to a larger cohort size, like week, to observe what happened.

The amount of data in the cohort report depends on the cohort size and the date range that you choose.

When you choose a daily cohort (cohort size = by day) then you are limited to a 30 day lookback window.

When you choose a weekly cohort (cohort size = by week) then you are limited to a 12-week lookback window.

When you choose a monthly cohort (cohort size = by month) then you are limited to a 3-month lookback window.

Cohort Analysis Workflow

Ok, now that we’ve talked about the parts of a Cohort report, let’s look at a common workflow. Let’s say I’m a blogger (or publisher) and I want to understand the behavior of my weekly active users.

From a business perspective, I want people to come back to my site (or app!) very often. Knowing how many people are active within a week is really useful.

First I choose my Cohort Type – Acquisition Date because I can’t do anything else right now :)

Next, because I publish a lot of content, I want to set Cohort Size to daily. Now, for the metric, I am going to choose User Retention. This is the percentage of users that returned to my site (or app!) on a given day.

Finally, I’m going to set the date range to Last 7 days.

Now I have a report to look at!

To analyze this data I’m going to skip to the tabular data under the time trend.

Each row of data represents a different Cohort. I chose a daily Cohort, so each row represents a day. There will be 8 rows of data because my date range was 7 days and the EIGHTH row is the All Sessions data.

The tabular data shows the retention rate for each cohort for the past 7 days. To analyze the data I’m looking for any cells in the table that are a dark color. Or you can just look at the actual numbers to identify numbers that are abnormally high. But I’m lazy, so I’m just going to look at the color.

Here, in this report, I can see that users who first visited the site on Jan 27 returned at a much higher rate one day after their initial visit – much higher than all the other cohorts.

Analyzing the data in a Google Analytics Cohort report.

[Click to enlarge] Analyzing the data in a Google Analytics Cohort report.

What happened to these users? Why is their behavior different? Great question!

You need to add some of your own business context to this data as you scan the table. Think about your marketing activities. Were you running any specific campaigns that might have impacted the date?

It may be that you have no idea why this happened. Have no fear – Segmentation to the rescue!

Segmenting the Cohort Report

One thing that I really like about the new Cohort report is the ability to segment the data. You can apply up to four segments to this report. Each segment will create a new table of data below the “All Sessions” table.

Remember, a cohort is just a segment based on a date. So when you apply a standard GA segment you’re introducing another layer of segmentation. Here’s what the data would look like if I segment by Mobile and Tablet Traffic.

Applying a segment to the Google Analytics Cohort report.

[Click to enlarge] Applying a segment to the Google Analytics Cohort report.

To analyze the data I like to compare the data from each segment to the All Sessions data. I’m looking for any segmented cohorts that perform differently than all of the sessions.

I also recommend segmenting by traffic source or specific campaign. This is especially important given that the only Cohort Type is currently Acquisition Date.

Which Cohorts should you choose?

Hopefully by now you have a good idea of how this report works and how you can use it. You’ve probably noticed that this is not something that you will need to use every day. Let’s look at a few common cohorts based on different business models, that you can create.

Remember, we’re a bit limited right now due to a singular cohort type – acquisition based cohorts.

Ecommerce

There are some really cool ecommerce-specific metrics that we can analyze with the Cohorts report. Things like Revenue per User, Transactions per User and total Revenue.

The key here is to remember that the cohort will be based on the date the customer first visited the site or app.

Also remember the granularity of the cohort and your customer buying cycle.

Analyzing customers who purchase expensive items, that are purchased less frequently, over a 7 day date range, will not yield many insights. Try switching to a weekly cohort over 10+ weeks.

Weekly Cohort, User revenue, last 12 weeks
Weekly Cohort, Transactions per User, last 12 weeks

If your customers purchase less expensive items, then they might purchase more frequently. Try switching to a daily cohort over 30 days.

Daily Cohort, User revenue, last 30 days
Daily Cohort, Transactions per User, last 30 days

Try adding some product segmentation. Here I added a segment based on a specific product and found that the revenue per users spiked 5 days after the first visit.

Looking at a single segment in the Google Analytics Cohort report.

[Click to enlarge] Looking at a single segment in the Google Analytics Cohort report.

Also, try applying a segment for user-based revenue. Look at high-value customers and lower-value customer. How does their behavior, over time, change based on the acquisition date?

In App Purchases

This is one area where the cohorts report will really shine. This is a FANTASTIC way to understand user behavior after they initially launch your app for the first time.

The in app purchase model is very different than traditional ecommerce – In app purchases are MUCH smaller and usually very frequent. I would look at cohorts like:

Daily Cohort, User revenue, last 7/14/30 days
Daily Cohort, Transactions per User, last 7/14/30 days

I would also look at user-engagement cohorts for those that do NOT purchase. It will help me understand if users are actually using the app. Create the following cohorts:

Daily Cohort, Sessions per Users, last 7/14/30 days
Daily Cohort, Session Duration per User, last 7/14/30 days

Then apply a segment of Revenue per User = 0:

Publishers (Desktop & Mobile)

For publishing I want to better understand user engagement over time. Luckily there are a number of metrics that we can use when building cohorts. Try the following:

Daily Cohort, Sessions per User, last 7/14/30 days
Daily Cohort, User Retention, last 7/14/30 days
Daily Cohort, Pageviews per User, last 7/14/30 days
Daily Cohort, Sessions Duration per User, last 7/14/30 days

If you have revenue data in Google Analytics, from AdSense or some other calculation, I would suggest looking at cohorts similar to in-app purchase.

Also keep in mind your publishing schedule. If you’re the New York Times or Wall Street Journal you publish a lot of content every day. A 7-day date range is very helpful. But if you’re a blogger that only publishes twice a month, you might want to look at a 21 or 30 day date range.

Lead Gen

Similar to the previous items, your lead gen cohorts will really depend on how long it normally takes to get a lead. If you’re selling something expensive, look at a weekly cohort over a long time period. If you’re selling something less-expensive, look at daily cohort over a shorter time period.

One of the challenges here is that there is no metric for a single goal conversion. You could use the metric Goal Completions, but that looks at ALL your configured goals, and I’m assuming that most of you have more than one goal configured.

So your best bet for lead gen is to look at some engagement metrics. Look for cohorts that are showing lots of engagement based on time and sessions per user. This may indicate
A Final Tip

Hopefully this clears up why you should do Cohort analysis and how to do it with Google Analytics.

Here’s one more tip.

Use Shortcuts to save your specific cohort reports. This is a HUGE timesaver! You probably noticed that you need to configure the Cohorts report. If you look at a cohorts report often take the time to save your version using a shortcut. Then you can access it with one click in Google Analytics.

Create a shortcut to make it easier to access your Cohort reports.

[Click to enlarge] Create a shortcut to make it easier to access your Cohort reports.

Cohort analysis is a useful way to understand how groups of users perform based on a common date attribute. I hope you will try cohort analysis and found this post useful.

Understanding the Google Analytics Cohort Report is a post from: Analytics Talk by Justin Cutroni

The post Understanding the Google Analytics Cohort Report appeared first on Analytics Talk.

Learn From The Best and Worst Websites In Super Bowl 2015 Ads

If you are like me, just as important as watching the Super Bowl game are the Super Bowl ads! Ridiculous amounts of money are spent (and often wasted) in a matter of seconds, so I…

superbowl websites

If you are like me, just as important as watching the Super Bowl game are the Super Bowl ads! Ridiculous amounts of money are spent (and often wasted) in a matter of seconds, so I love to see ads being smart and making great use of websites or landing pages.

And this year (and what a great game it was!) the trend of ads using #hashtags in them stays high at 50%. But only 25% of ads mentioned URLs to visit – this seems like a huge waste of opportunity to further engage and convert 114 million viewers (highest audience ever!) into website sales.

I decided to check out and review 5 of the ads smart enough to use website URLs, and see how well they engaged and converted their visitors into sales or leads. And many of them could have much better!

In particular, I focused the website reviews on the message continuation from the ad, their headlines and call-to-actions, and their usage of social proof and unique value proposition.

Here’s the short video of me reviewing 5 Super Bowl ad websites, with my ratings and comments below.

1: WeighWatchers.com (Rating: 5/10)

This ad was one of my favorites, trying to empathize with people getting bombarded with ads for food and huge portion sizes. However, when you arrive on their website to take action (and join up) they certainly could have used some help to convert many ore of their of visitors into sales! Very poor indeed.

Highlights from my WatchWatchers.com review:

  • Message continuation from ad: Underachieved, which was unfortunate because it was such a strong engaging ad message. No imagery from the ad is used, and they hid the video of ad at the bottom of the site, like an afterthought.
  • Headlines and call-to-actions: A pretty vague headline – just repeating the slogan from the ad – “Take control back”. At least they use a subheadline to try and emphasize benefits. The call-to-action button could have been improved too – instead of ‘start today’ it could have implied more value, like ‘Lose 10 pounds for free’.
  • Social proof: Very lacking – the homepage really needs to show reviews or testimonials from people who have lost weight. An expert review from a doctor would have worked well too. To optimize this and convert more visitors, I would have also mentioned how many people have lost weight, and how much combined weight they have lost.
  • Unique value proposition: They do a very poor job with this considering there are 1000’s of different diets that declare they are the best. They don’t mention why their solution is better, and seem to just rely on the brand. They should mention if it gets the best results, and what they do different (they implied this with their 24/7 coaching).
  • What else should be improved: The navigation is really bland, with uninspiring choices. ‘Products & Services’ – really? Could that be anymore non-visitor enticing and business-centric? Better to mention items like ‘Why Choose WeightWatchers’ to help explain unique value proposition and benefits, and add a ‘Happy Members’ link so people can quickly see results from real people. There are also no images of people dieting on this website – a real simple powerful fix.

2: Wix.com (Rating: 8/10)

This was the best website that I noticed from a Super Bowl ad this year, with great message continuation and many best practices being used. Great job Wix! They probably had a good percentage of your visitors converting into sales, hopefully meaning a bigger return on investment from the ad.

Highlights from my Wix.com review:

  • Message continuation from ad: Very good, with matching imagery and messaging clearly above the page fold, in addition to a video thumbnail to watch the ad again.
  • Headlines and call-to-actions: Strong headline with positive wording like ‘stunning’ and ‘free’. The call-to-action button at the top is pretty generic though (start now) and they are lacking a more prominent strong call-to-action at the end of the homepage.
  • Social proof: This aspect could definitely be improved – while they added a good usage numbers to imply popularity (59 million users is really strong) adding testimonials from happy users or third party ratings would increase signups even further.
  • Unique value proposition: While they do a great job of explaining the benefits of their service, they don’t mention how they are better than their many competitors like SquareSpace.com. For example, they should mention if they have more templates, better support or exclusive features. Adding a ‘why us’ competitor comparison page would help to justify reasons to choose them in this crowded marketplace and increase signups.
  • What else should be improved: An explainer/intro video could be added that highlights the benefits and how easy it is to use their tool. They also could show clearer options for visitors to browse by template type, like photographer, restaurant owner, etc – add a drop down filter to sort templates shown, and add template category links in drop down navigation menu.

3: WeatherTech.com (Rating: 4/10)

A pretty generic ad, but was smart enough to add a prominent mention of their website URL. The website looks cool, but unfortunately it’s just too different than a conventional ecommerce website, with few best practices that no doubt confused and frustrated many visitors, likely resulting in many 1000’s of lost sales. Like no site search, really?

Highlights from my WeatherTech.com review:

  • Message continuation from ad: Very poor, with barely any mention of the ad, imagery or its messaging – just a tiny squashed promo box towards the bottom.
  • Headlines and call-to-actions: Not great either – no headlines – just standard product names shown, and the most obvious call-to-action button saying ‘more products’. Really? That’s a sure fire way to bore visitors into bouncing.
  • Social proof: None at all! No ratings, testimonials, or strong business usage numbers. Nothing. Looks like more like a brochure than a website. Among other things, they really need to mention how many customers they’ve had, how many parts they’ve sold and their ratings from third parties.
  • Unique value proposition: This is also very lacking – it doesn’t mention unique value proposition things like free shipping or returns, lowest prices, biggest selection, or best service – essential for trying to compete with sites like Amazon.com.
  • What else should be improved: Instead of their ‘cool’ design, test using a more traditional ecommerce design, with conversion best practices built-in. Test changing background from black to a more standard white might help too, as would having a live web chat option. AutoAnything.com is a much better, higher converting auto accessories site for inspiration.

4: NoMore.Org (Rating: 6/10)

What a shame. A really compelling ad that strikes at the heart and reality of domestic abuse, but their website could have done a much better job of converting visitors into pledging. While their sign-up form was prominent and short and sweet, they didn’t add anything else to help convince visitors to act, like stats on domestic abuse or compelling stories, and empathizing more with visitors.

NOTE: Since I wrote this, the URL now takes you to the homepage, and not the pledge signup page anymore (see the video review for what they were using).

Highlights from my NoMore.org review:

  • Message continuation from ad: Similar wording from the ad, but unfortunately no matching imagery or option to watch the ad again – a big missed opportunity to help drive home the compelling message in the ad (which might not have been obvious at first watch).
  • Headlines and call-to-actions: Pretty good headlines, but they could better, for example using headlines that ask a question, are controversial/shocking, or emphasize empathy better. The call-to-action button is large and simple, but could also be improved to mention urgency or helping make a difference.
  • Social proof: This is definitely lacking – they should mention how many people have pledged already, and messages from supporters (particularly from famous people). This would significantly increase pledges. They should also state how common this issue is (12.7 million cases a year is a really compelling number, like they mention on their full site).
  • Unique value proposition: Not really applicable – they aren’t really selling anything, so it’s not as important to emphasize unique value proposition.
  • What else should be improved: Add imagery of women suffering from domestic violence (the shock/empathy angle) would help make women relate, mention that visitor’s wont be spammed if they pledge, and mention what will happen next after pledging.

5: DreamingWithJeff.com (Rating: 7/10)

Hats off to SquareSpace for coming up with an ingenious mini-site featuring Jeff Bridges, highly relating to their intriguing ad. But they could have done more to sell the album, and to explain benefits of using SquareSpace’s website creation tool.

Highlights from my DreamingWithJeff.com review:

  • Message continuation from ad: Very good, with similar style used from the ad – few words were used in the ad, so not as applicable as the other websites.
  • Headlines and call-to-actions: Stylish headline but a bit too ‘functional’, only stating what the product is called. A better more playful headlines like ‘sleep better with Jeff’ would be more benefits orientated, and eye-catching. Good usage of ‘dual’ call-to-actions above the page fold, but average wording, with no mention of building websites (many visitors won’t know what SquareSpace actually is).
  • Social proof: Apart from the ‘coolness’ factor that Jeff Bridges brings, there is little other social proof mentioned for either the album or SquareSpace. Some kind of third-party rating for the album is essential (from Amazon.com in particular), as would be a few ‘cool’ reviews from happy listeners of the album. They also need to mention awards, ratings and number of users for SquareSpace (like Wix.com showed).
  • Unique value proposition: They don’t really explain why this sleep music works better than other methods – like sleeping pills, and don’t mention why SquareSpace is better than the other web creation tools. Adding this would certainly increase sales/signups.
  • What else should be improved: Simplify the options for getting the album – there are too many confusing options. At least explain the benefits of each type, and who its best for (music collector etc). Also make it more obvious that charity gets all the revenue (its strangely hidden away in fine print) – this would definitely encourage sales.

What was your favorite? Maybe your site needs help too?

Hopefully you learned something from my review of those 5 Super Bowl ad websites. Which was your favorite website from the Super Bowl ads?

And if you are looking for some expert sales-boosting help for your website, give me a shout – I’d love to help review and improve your website. Thanks!

12 Blog Mistakes Killing Your Leads and Email List Growth (and how to fix ’em)

Helping create or market a blog for your business? I’m sure you realize that having one is essential for getting much higher rankings and traffic from Google. But how well are you converting your great…

blog mistakes

Helping create or market a blog for your business? I’m sure you realize that having one is essential for getting much higher rankings and traffic from Google.

But how well are you converting your great blog traffic into something of high value – huge amounts of leads to follow-up with or to quickly building your email list?

Unfortunately, many blogs do a poor job of converting a good percentage their visitors – I’ve seen it after reviewing hundreds of blogs over the last 5 years (like the Backlinko.com blog before I helped optimize it).

To help you grow your email list and leads much quicker, here are the 12 biggest, most common blog mistakes, and how to fix and optimize them.  How many of them is your blog making? Let’s get started…

The 12 Most Common Blog Conversion Mistakes to Avoid

1. Showing annoying ads. Nothing kills a good blog user experience quite like showing annoying ads in your side bar, or worst still, in your actual blog article – particularly animated ones. Sure, they might make you a few bucks, but they cheapen the look of your blog, and worst still, distract and tempt your visitors to click away from your great content.

So unless your websites main goal is to generate ad revenue, you really should remove all your ads – this will often reduce bounce rates and focus your site better on your major goals.  Check out how many ads are on this blog below, particularly at the top – not exactly a great visitor experience, right?

ad in article

Don’t believe me or not sure what ads to remove? Test it – using an A/B testing tool try removing your most annoying or prominent ads for a week and see the impact on bounce rate and converting more visitors into subscribers or leads. You will be pleasantly surprised…

2. No value proposition clearly mentioned. So many blog creators expect visitors to know what their blog is about and the benefits of it, but neglect to actually clearly mention it. Why make your visitor have to work to understand? This is particularly problematic when visitors will often judge a website within just 10 seconds, and is a major cause of high-bounce rates on blog articles.

To make it easier for them to understand the benefits of your blog and increase the chances of them sticking around, add a few essential things to it – firstly add a tagline under your logo that helps visitors understand what the blog is all about. Secondly, add a small module towards the top of your side bar showing key benefits of your blog. You can see good examples of this on my blog, and on the Rebootedbody.com blog:

blog value prop

3. Dead-end articles with no good call-to-action. The end of articles is one of the most critical places on blogs – this is where your visitor’s eye flow ends up after reading your article. Unfortunately, many blogs don’t take full advantage of this space, and simply put related links at the end of their article – hoping that something will be of interest to their visitors. But this often just delays them inevitably leaving without subscribing or converting.

To capture hundreds more emails and boost your list growth, you need to use this space to show your visitors something of value for free (known as a lead magnet). This can be something like a related free ebook, a free trial to what you sell, or a free consultation. Make sure it stands out too, and include some imagery, otherwise your visitors won’t really notice it. Testing this is key for maximizing opt-ins, particularly the wording and call-to-action. See below for a good example of this on the Sparkline.com blog:

blog lead magnet

4: A non-mobile optimized blog. The percentage of visitors arriving on blogs via their mobile phone is growing at a crazy rate (it’s now over 20% on my blog) – and unfortunately many blogs don’t make it easy for these visitors to read their content. This is because reading blog articles is hard on small screens – unless you have a mobile optimized blog, visitors have to zoom and scroll to read your content. They will often get annoyed by this and leave your blog to find a related one that is mobile optimized.

To fix this, the best solution is to have a responsive website design that changes font sizes, images, layout and widths dynamically depending on the size of the visitors screen – this ensures your blog reads and looks great on any mobile device, including tablets. For a cheaper quicker option, consider using a tool that automatically mobile optimizes your blog like WP Touch. Below you can see a few fantastic examples of responsive blogs – the IWillTeachYoutoBeRich.com blog and the SmartPassiveIncome.com blog.

responsive blogs

5. Short articles with no images or subheaders. This is a real visitor engagement killer – arriving at a blog that has no images and has just several long blocks of text. Unfortunately its still much too common, particularly for corporate website blogs. These types of articles make your visitors leave even quicker – probably unlikely to return.

To make sure your blog isn’t guilty of this, always try to write more in-depth content with images and subheaders – this not only makes your content seem much more appealing, but also makes it much more ‘scanable’. This will reduce your blog article bounce rates and increase the chances of your visitors finding your content valuable and subscribing/converting. As a bonus, longer content often results in higher rankings in Google.

6: A cluttered side bar. Now this happens all the time – bloggers just making their side bar a dumping ground for all kinds of promos, ads and widgets and hoping visitors will like at least one thing. Often continually adding new promos, without removing older ones. But in reality, the more content you have in your side bar, the greater chance your visitors won’t see any of your really good content there. And worst still, having ads there cause ‘banner blindness’ so your visitors will often just ignore the whole side bar.

To fix this, remove less useful content from your side bar – for example, in addition to ads, blog categories are not really that helpful and take up a lot of room, as do latest Tweets or Facebook widgets. Instead focus it on promos for your most useful content and value proposition. If you aren’t sure what to remove, really think what is most useful, and test removing different content using an A/B testing tool and check then impact on conversions and bounce rate.

Free Bonus Blog Conversion Optimization Checklist!
Maximize your leads or email list by downloading this free content upgrade – my 20-point blog conversion optimization checklist. Grab my blog optimization checklist (PDF)

7: Few signs of social proof. Unfortunately many blogs look like a ghost-town with little signs of good social proof, even ones with good traffic – with few comments or shares, no mentions of popularity or how many subscribers or followers they have. Just like people prefer restaurants with good reviews and many diners in it, blog visitors are much more likely to think positively and subscribe to blog content that they know other people love and often use.

There are many ways to increase social proof on your blog. First, if you have a good amount of readers or followers (ideally over 1,000), then clearly state that in your side bar. Second, if you have great reviews, place a testimonial there too. Showing well-known media mentions will also help boost social proof – like you can see on the SmartBusinessRevolution.com blog:

review and media mentions

Don’t forget to also add social media icons that include share numbers (but to avoid negative social proof, only show numbers when they are higher than 20) – add this at the end of your articles, or make them sticky to the left side. This is a simple way to increase signs of popular and social proof.

8: Bland, non-engaging article headlines. It doesn’t matter how good your blog articles are if your headlines are dull and not captivating – few visitors will stick around to read it, let alone convert into a subscriber or a lead. Sadly, many blogs make this mistake and are in need of some good copy-writing love. Many blogs also use small headline fonts, which makes them even less attention-grabbing.

To fix this, always use compelling copy-writing principles for your article headlines and make them stand out. Using steps or numbers, asking questions and mentioning common visitor pain points are some good ways to make your headlines more engaging – here is a great guide for creating captivating blog headlines. You should also check out this great headline testing tool to find highest-clicked variations of your headlines.

9: No good incentive for visitors to subscribe. So many blogs just mention ‘subscribe to our blog’ or ‘get updates’ in their side bar and hope thats good enough to convince visitors to do so. Bad news folks – if you do that, you won’t be getting many subscribers – it’s not very compelling or even eye-catching, and offers little value proposition to your visitors. When was the last time you actually subscribed to a blog that way? Your visitors rarely will either.

To increase subscribers and build your email list quicker, give your subscriber box an upgrade – create a compelling free incentive to subscribe and mention it in your sidebar with visuals to help draw your visitor’s eye. For example, create a free short mini-course or a giveaway a short ebook relating to your blog. Again, A/B testing is key here to ensure highest conversion rates. Here is a great example of an ‘upgraded’ subscribe in the side bar on BloggingWizard.com (with excellent enticing copy):

better blog subscribe

You could also try using a ‘content upgrade’ call-to-action in your article, like I use to giveaway my conversion rate optimization blog checklist earlier and at the end of this article.

10: Outdated or ugly blog design. Visitors will judge your blog very quickly – particularly by how good it looks. A well-styled modern blog can really help engage your visitors and increase the chances of them subscribing/converting. If your blog looks like it was created with a free theme with little customization, your visitors will probably notice and not be impressed. Same applies if it looks outdated.

To fix this, consider a style face lift for your blog, and make sure its using latest popular widgets like a good comment system and social share options. To get some great inspiration use a service like 99designs.com to get designers to come up with a new modern look. Ultimately, it’s key to make sure your blog looks better than your competitor’s blogs, otherwise visitors will often prefer going there instead.

11: No use of exit popups to capture emails. One of the newest most effective ways to capture emails on your blog is to use a well-designed popup offering a free incentive, just before your visitors go to leave. This is known as an exit-intent popup. Interestingly, many blog owners think that popups increase bounce rates and annoy visitors – but studies have shown if used well using exit-intent, they don’t impact it negatively. And when I used the exit-intent popup functionality in Opt-in Monster to promote my free toolbox, I increased my email capture rate to 42%. Pretty impressive right?

There are plenty of options for creating customizable exit-intent popups – you can use SumoMe, Opt-in Monster or Popup Domination to name but a few. Remember to optimize what you are offering in your popup – don’t just just say subscribe, give them a great incentive like mentioned earlier. And test the wording, imagery and call-to-action button too! Make sure they can easily close it aswell. Here is a great example of a good eye catching popup on the MarieForleo.com blog:

exit popup

12: No ‘start here’ page to help guide visitors. You have probably created some great articles on your blog – but unfortunately on many blogs it’s hard for visitors to know and find the best content. Most blog readers will only read your article they arrived on – and rarely take time to go through your old content to find other great articles – that may convert visitors better into a lead or subscriber.

To increase the chances of visitors finding your best content and converting, create a ‘start here’ page and put a link to it in your main navigation menu (like on my blog). On this page include links to your most useful and popular content. Here you should also explain more about you, and why you created the blog – a good engaging story will really help! You can see a best-practice example of a ‘start here’ page on the popular EntrepreneurOnFire.com blog:

blog start here

Wrapping up

To grow your email list and leads, it’s essential you give your blog some conversion rate optimization love mentioned in this article – in particular do some A/B testing on key elements like your headlines, call-to-actions and what you show in your side bar. Which of these techniques discussed are you using, or planning on using on your blog?

Content upgrade: grab my free blog conversion optimization checklist!
Quickly boost your blog leads or email list by grabbing my bonus free blog conversion optimization checklist. Download my blog conversion checklist (PDF)

And if you are looking for some personal help, I can quickly help optimize your blog to increase leads and grow your email list. I’m actually just about to help SEMrush.com with my conversion review service. Thanks!

Why Your Website Redesign Will Fail to Lift Sales Much (And What To Do Instead)

Planning on a website redesign soon? Hoping it will finally get the sales or leads you’ve been hoping for? I’ve got some disappointing news for you. Unfortunately, most website redesigns don’t work as well as…

website redesign 2

Planning on a website redesign soon? Hoping it will finally get the sales or leads you’ve been hoping for?

I’ve got some disappointing news for you. Unfortunately, most website redesigns don’t work as well as planned and have barely any impact on sales or leads, and some even have negative effects.

In fact, a recent HubSpot.com study found 68% of marketers did a site redesign in the last 12 months – but 1/3 were unhappy with the results.

And you really don’t want to waste an average of $55,000 dollars on a failed website redesign do you? (as the same study also determined the average redesign cost to be).

So how can you ensure much better results from your next website redesign?

I have created this article to show you the most common reasons why website redesigns fail, and what to do instead to ensure greatest success for improving sales or leads. So let’s get started!

Why your new site redesign will fail to lift sales or leads much

Regardless of the potential lost traffic impact from effect on search engine optimization (which can often be a nightmare when redesigning a website), the are many other reasons why your proposed redesign will fail to increase sales or leads very much.

1: The major reason is that too much is changed at once. Some of your redesign changes will be positive, but unfortunately some will be negative. So the impact of the better changes will be outweighed by your poor changes. And without A/B testing, you won’t know easily the exact things that caused a positive or negative impact on sales or leads generated. For example, your  new signup flow might be much better, but your new homepage headline or call-to-action button might not be converting as well as before.

website redesign conversion impact

2: Too little feedback gathered from visitors. This is one of the major reasons for redesign failure. Your most influential and important audience are your visitors, and if you haven’t got considerable feedback from them on your existing website and proposed design mockups, this will alienate and frustrate many of them when you launch. This is what happened with a recent poor redesign of MarksAndSpencer.com – while the website looked fantastic, it was too modern and many visitors didn’t understand how to use it properly, causing an 8% drop in online sales.

Ideally you need to spend several weeks getting in-depth feedback from your visitors and usability sessions (UserTesting.com is excellent for this), and then involve them at every stage of the redesign process. A key part of this determining the most important visitor tasks and making sure your proposed redesign can easily solve those main visitor needs.

3: Poor use of web analytics to gain insights, reliant on best guess. Many redesigns aren’t powered by insights from web analytics, and instead are often reliant on hoping that ideas will be successful based on best guesses or demands from HiPPOs (highest paid person’s opinion). Without web analytics insights, marketers are essentially blinded by not knowing what pages or elements are performing badly, or their current website performance.

To prevent this, ensure you do a complete analysis of your current website performance, including overall website conversion rate (amount of sales or leads divided by visitors, times by 100), shopping cart (or sign-up flow) abandonment rate, and then bounce rates and conversion rates for your key pages. This benchmark is essential for determining the success of any content you are launching or redesigning, and for future post-redesign launch improvements.

4: Website designers aren’t experts in conversion.  Website and UX designers are visual experts can create great looking websites, with gorgeous color schemes and sizzling imagery. But unfortunately very few of them also know how to design a website that ensures highest conversion rates (and why should they? its very hard for them to be trained and experts in web analytics, marketing and conversion rate optimization best practices).

While its really important to get a good designer to create a compelling and stylish website, you really need to also involve some conversion rate optimization experts – either internally if you are lucky enough to have them, or from experts in the industry (look no further than experts like myself, Brian Massey, Peep Laja, Chris Goward, Bryan Eisenberg and Tim Ash).

5: Redesign processes often take much too long. Many website redesign projects don’t launch on time or never even get finished – the same report from HubSpot.com found that this was the case with 49% of website redesigns. And many take so long that by the time they are launched, it quickly will get out of date again. Using an incremental approach to evolve and improve your website over time is much better (as we will discuss shortly) – and remember your website is never truly finished!

6: Too many chefs in the redesign kitchen. Its really frustrating being in many redesign meetings, with too many people thinking they know what’s best for the redesign. Marketers often clash with designers, who often both clash with senior management (the HiPPOs), with often little being resolved/decided. Ultimately though, its only your visitors who know what will best convert them into sales or leads! That’s why it’s vital to involve them as early and often as possible.

7:  You won’t be able to easily roll back to your old site if the new one performs badly. Sometimes website redesign will work so poorly, that sales or leads will actually DECREASE, even with the same amount of traffic. You may be tempted to quickly flip the switch and restore your old version – but this often much harder to do that it seems. And it will also confuse your visitors, making your business look a bit foolish. An incremental, A/B testing approach will make this much easier to manage and roll-back poor performing new pages or features.

Free Bonus Redesign Conversion Checklist!
Ensure your next website redesign maximizes your sales or leads by downloading this free bonus redesign conversion checklist. Download my redesign checklist (PDF)

Go for incremental, CRO-based website improvements instead!

So those are the main reasons why your new website redesign won’t work that well. But what’s the solution? I have alluded to it above, but essentially you need to use an incremental, CRO (conversion rate optimization) based website improvements instead of full website redesigns. Here are the main components of this, and why it works so well:

  • Instead of launching major website redesigns once every 2-3 years, go for more frequent but smaller highly-performing changes instead (2-5 changes per month). This allows for continual website improvement, rather than hedging your bets on the success of a full major redesign.
  • For these smaller incremental changes, using A/B testing is essential to find out which versions of your proposed redesign convert more of your visitors into sales or leads. Avoid launching a new page or feature on your website without A/B testing it first to find the best variation. You can then use the learnings from your test results and apply them to future improvement tests. And if you don’t have enough traffic, read this low traffic guide for improving websites.
  • By using your web analytics tool, figure out which pages/elements of your website need optimizing or redesigning first – rather than just trying to improve everything at once. For example, your product pages may already be converting well, but your homepage or your navigation menu may not be. Checking the bounce rates and conversion rates for your top entry pages is one of the best ways to find the highest potential pages to improve.
  • Use visual analysis tools to help understand which pages elements need optimizing first. To gain these important visual insights you should use a tool like Hotjar.com to run visitor clickmaps and visitor recording sessions on your key pages. Doing this will help you discover and form A/B test ideas for elements that are most/least engaging to your visitors. For example, you may find that one of your most important CTA buttons isn’t being clicked much, or a particular field on your sign-up form is confusing visitors.
  • Involve your website visitors and target audience feedback early on and continually while making these smaller improvements. For every proposed change you want to make, get visitor feedback from a service like UserTesting.com or UserTest.io, or run your own usability studies. Make sure they can easily complete common tasks and your major use visitor taskes for all proposed new webpage changes, and ask for feedback on what needs improving or seems confusing.
  • Running surveys are highly recommended to get feedback too, including onsite surveys and customer surveys by email. Single question surveys work very well for gathering page specific feedback on key pages (e.g. using Hotjar.com), and is one of the quickest feedback wins to take advantage of. For example, asking a pricing related question on a pricing page.
  • Get some other great insights for the small incremental changes by frequently checking what your competitor websites have recently launched. Not just design-wise, but also new content, and promotions and they have added, and how their overall unique value proposition. Don’t just copy though and presume they know what they are doing – they often won’t – always try to improve on their ideas and what they are doing.
  • Always try to get some feedback on proposed changes from CRO experts like myself. This is because while it’s essential to get your website visitor’s feedback, unfortunately they often don’t know best or which versions of web pages would convert them more often.  This also works well because it provides fresh outside perspective on the current website experience.

Also, don’t forget about the potential big negative impact of search engine ranking changes for your redesign too (a whole other discussion) and this is a great guide on SEO redesign considerations. You obviously want to ensure that you keep your same traffic SEO traffic levels, as well as increase conversions!

Download my free redesign conversion checklist to maximize success!
Ensure your next website redesign maximizes your sales or leads by downloading this free bonus redesign conversion checklist. Download my redesign checklist (PDF)

Now over to you… which of these techniques will you try first?

Do you have a website resign coming up? Which of these techniques are you interested in trying? What challenges are you facing? Perhaps you have already had some success? Please comment below.

My Google Tag Manager Tag Library

In programming, compiled collections of code that add functionality are typically called ‘Libraries’. They’re often offered up for free to the community to use, build upon, and improve. I’d like to do the same for the web analytics world; so I’ve colle…

In programming, compiled collections of code that add functionality are typically called 'Libraries'. They're often offered up for free to the community to use, build upon, and improve. I'd like to do the same for the web analytics world; so I've collected a few of my favorite Google Tag Manager tags here.

I've tried to pick tags that are great functional additions to any Google Tag Manager configuration. I'd also like for you to contribute your favorites (or offer suggestions on where I can improve mine); I'll periodically add them to the list, or I might even make a follow-up post collecting your suggestions. To contribute, hit me up on Twitter at @notdanwilkerson or email me at notdanwilkerson@gmail.com.

1. Store Cookie

A straightforward tag; this takes values you pass into the Data Layer and creates a cookie on the users browser with them. I've configured mine to fire when {{event}} equals 'setCookie'.

<script>
  var cookieName    = {{cookieName}};
  var cookieValue   = encodeURI({{cookieValue}});
  var cookieExpires = parseInt({{cookieExpires}}) ? new Date(new Date().getTime() + 1000 * 60 * 60 * 24 * {{cookieExpires}}) : 0;
  var cookieDomain  = {{cookieDomain}};
  var cookiePath    = {{cookiePath}};

  document.cookie   = cookieName + '=' + cookieValue + '; Expires=' + cookieExpires + '; Domain=' + cookieDomain + '; Path=' + cookiePath;
</script>

You'll need to configure Data Layer macros for each of the macros above, like below:
Example dataLayer macro that captures the value of the dataLayer variable 'cookieExpires'

I like to set default values for each; here's how I might configure mine for this website:

cookieName: __dfc // Default Cookie Name
cookieValue: 1 // Can evaluate to True
cookieExpires: 0 // Makes the cookie a session cookie
cookieDomain: danwilkerson.com
cookiePath: /

Now, storing something in a cookie will be as easy as pushing some data into the Data Layer.

<script>
var dataLayer = dataLayer || [];
dataLayer.push({
  'event': 'setCookie',
  'cookieName': '__nomnom',
  'cookieValue: 'yum',
  'cookieExpires: 365,
  'cookieDomain': '.danwilkerson.com',
  'cookiePath': '/articles/'
});
</script>

Then you can create a first party cookie macro to access this cookies value.

Example first party cookie macro that gets the value of our example cookie, __nomnom

2. Fire A Google Analytics Event

This has been a huge time saver for me; I mentioned it in my first post about tracking errors using Google Analytics. The format is pretty similar to the above; we're just using the built-in Google Analytics Event tag, in this case.
Screenshot of example Event tag, with each event input filled in with corresponding Data Layer values I use the firing rule {{event}} equals 'eventFired' to trigger this tag. This makes sending events to Google Analytics simple; just push something like this into the Data Layer:

<script>
  dataLayer.push({
    'event': 'eventFired',
    'eventCategory': 'My Event',
    'eventAction': 'My Event Action',
    'eventLabel': 'My Event Label',
    'eventValue': 15,
    'eventNonInteraction': true
  });
</script>

3. Optionally Fire Custom Dimensions And Metrics With Events

Something I've been experimenting with recently has been to add Custom Dimension and Metric macros to my generic events so that I can add that data in if need be. I do this by adding the following values to the Custom Dimensions and Custom Metrics:

An example of using macros for custom dimensions and metrics to allow for piggybacking with normal events

This makes adding custom data to an event as simple as adding 'customDimIndexA': 1, 'customDimValueA': 'Data'. I use letters rather than numbers to prevent mixing up dimension keys with the keys being used for the event.

One example of how to use this would be to capture and store user milestones, grouped by the week milestone achievement (using the {{Week Of The Year}} macro from my last post).

<script>
  var dataLayer = dataLayer || [];
  dataLayer.push({
    'event': 'eventFired',
    'eventCategory': 'Customer Milestone',
    'eventAction': 'Submitted Lead Form',
    'eventLabel': weekAndYear,
    'eventValue': 100,
    'eventNonInteraction': true,
    'customDimIndexA': 1,
    'customDimValueA': {{Week Of The Year}}-{{Year}}
  });
</script>

One Small Problem Feature

I've discovered that Tag Manager will reference the most recent value for a Data Layer variable, even with a default value set, so if you leave a field blank and you've pushed another event with a set value for that variable, you'll wind up copying it's value instead of leaving the field blank. E.g.:

<script>
/**
 * Event looks like:
 * Category: Page Load
 * Action: DOM Ready
 * Label: /this-page
 * Value: 100
 * Non-Interaction: True
 * Custom Dimension 1: 4.38 Seconds
**/
  var dataLayer = dataLayer || [];
  dataLayer.push({
    'event': 'eventFiredWithCustomData',
    'eventCategory': 'Page Load',
    'eventAction': 'DOM Ready',
    'eventLabel': {{page path}},
    'eventValue': 100,
    'eventNonInteraction': true,
    'customDimIndexA': 1,
    'customDimValueA': {{Page Load Time}}
  });
</script>
// Later ...
<script>
/**
 * Event looks like:
 * Category: Customer Milestone
 * Action: Submitted Lead Form
 * Label: /this-page
 * Value: 100
 * Non-Interaction: True
 * Custom Dimension 1: 4.38 Seconds
**/
  var dataLayer = dataLayer || [];
  dataLayer.push({
    'event': 'eventFiredWithCustomData',
    'eventCategory': 'Customer Milestone',
    'eventAction': 'Submitted Lead Form'
  });
</script>

This means you have to fill out every one of the values for this tag each time you fire it, even if they're simply '0' or ''. I'm curious if anyone else has had this problem, and what solutions they've used to tackle it. I'd like to write a post at some point on how best to deal with this.

Update: The very helpful Simo Ahava let me know this was both intended and useful behavior. He also wrote a very detailed post on how Tag Manager and the Data Layer interact. In order to avoid duplicate values for tags that fire twice, be sure to fill out every value in the object you push into the Data Layer.

4. Fire Analytics After Test Variation Is Set

If you're running a test using Content Experiments, you need to bucket your user into an experiment group before the first pageview is sent to Google Analytics. Putting the experiment code above your Tag Manager snippet will avoid this issue.

But, if you're running your experiment in Google Tag Manager using the Content Experiment API, you'll need to delay your default pageview from firing until after this happens.

Note: You probably shouldn't run your test in Google Tag Manager; ideally, test bucketing and changes occur before anything is rendered on the page, and if your snippet is after the opening <body> tag, page elements might load before you can handle this appropriately. Make sure that this is a good solution for your needs, but defer to putting the snippet as high in the <head> as possible.

I handle this by creating blocking rules that match the conditions users might be bucketed into the test, then adding the following after calling the cxApi.chooseVariation() method:

<script>
  var dataLayer = dataLayer || [];
  dataLayer.push({
    'event': 'variationChosen'
  });
</script>

Then I copy my Google Analytics tag and set its firing rule to {{event}} equals 'variationChosen'. If you're using the copy and paste tag from the configuration menu, this shouldn't be an issue.

Have a tag you'd like to contribute, or notice something I could tweak and improve? Tweet it to me at @notdanwilkerson or email it to me at notdanwilkerson@gmail.com.

8 Indispensable Google Tag Manager Variables

Variables are dynamic bits of information that can be used within Google Tag Manager Tags, Rules, and even between Variables. They look something like this: {{Variable Name}}. These can get the value of 1st Party Cookies, JavaScript Variables, Data Layer Variables, and the ‘Custom JavaScript’ macro lets you extend the functionality of Variables nearly limitlessly. For a great overview of everything on offer, check out Simo Ahava’s complete guide to all of the default Variables. Here’s a list of some of my personal favorites.

1. User Agent

The User Agent is a string of text that identifies the “software (a software agent) that is acting on behalf of a user”. In our case, this is the browser and device used to access our website. For example, here’s yours:

You can test the User Agent to detect what browser a user is accessing your site with. This can be helpful if you want to track certain browser-based information (outside of what GA already collects) or change or exclude portions of your tag for users on particular browsers.

Since the User Agent is stored in the navigator.userAgent property, all you have to do is create a JavaScript Variable Variable (yes, ‘Variable Variable’) like below:

Select the variable type 'JavaScript Variable' and enter 'navigator.userAgent' into the input

For example, if you wanted to run a test and exclude any users of Internet Explorer 8 or below, you could do the following:

var isIeEightOrBelow = {{User Agent}}.match(/MSIE [2-8]/i) > -1 ? true : false;
if (isIeEightOrBelow) {
  // some code
} else {
  // some other code, or nothing.
}

You could also block an entire tag by using the same match as a blocking rule:
Blocking IE8 with Tag ManagerWARNING: User agent tests are often unreliable. Never hinge site-critical functionality on a user agent test; use feature detection instead.

2. Week of the Year

Having the week of the year handy is more useful than you might first expect; one thing I like to do is store the week and year with a converting user, so that I can perform acquisition cohort analysis within Google Analytics. This snippet (courtesy of RobG on Stack Overflow) extends the built-in Date object to allow you to get the current week of the year.

function() {
  Date.prototype.getWeekNumber = function(){
    var d = new Date(+this);
    d.setHours(0,0,0);
    d.setDate(d.getDate()+4-(d.getDay()||7));
    return Math.ceil((((d-new Date(d.getFullYear(),0,1))/8.64e7)+1)/7);
  };
  return new Date().getWeekNumber();
}

This is a great way to segment data and learn how user behavior changes over time. This can also be helpful for analyzing the impact new products or features has on your business.

Update: With the new Cohort Analysis Report, you can do some of this style of reporting natively. That said, you can only look at a limited set of cohorts in the data, so this is still a good back-up.

3. Mobile User

This is a snippet courtesy of Michael Zaporozhets on Stack Overflow; it’s a function that will return True if the user is on a mobile device, according to their user agent.

function() {
  window.mobilecheck = function() {
  var check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
  return check; }
  return window.mobilecheck();
}

This can be a useful piece of information if you’d like to prevent certain tags from firing on mobile devices, or if you’d like to exclude mobile users from a Content Experiment. The above warning about using the User Agent still applies.

4. The Page Title

This is a simple set of Macros that can come in handy for a number of reasons; say, for example, your site returns content on the same path, but with a huge variety in what content it returns based on some byzantine query string structure. In that case, the Page Title might expose some useful information. Fortunately, this is easily accessible through the document.title property. Just configure the Macro like you see below:
Select 'JavaScript Variable' for your Macro type, then enter 'document.title' in the input

Of course, Google Analytics will already capture the Page Title for you, but should you need to combine that data with another data point for deeper context, this is handy to have.

5. The Meta Description

The meta description can also be a useful piece of information to have, either to pull data from or to push into Google Analytics. One example of how this can be used is to fire an event on every pageview that stores the meta description and the URL it was fired on; this can be helpful for tracking down duplicate or blank meta descriptions. Of course, you can also see this data inside the HTML Suggestions section of Google Webmaster Tools.

function() {
  var metas = document.getElementsByTagName('meta');
  for (var i = 0; i 

Update: Jim Gianoglio of LunaMetrics fame pointed out that this could be accomplished JavaScript-free by using the below JavaScript Variable macro:
Example JavaScript Macro with document.head.children.description.content entered as the value

The value entered above is document.head.children.description.content, which will return the Meta Description or Undefined. Google Tag Manager helpfully catches errors for missing properties.

6. The Environment

If your site is developed and runs in several different environments, such as a development environment, a staging environment, and a production environment, it can be useful to modify tag behavior based on which enviroment the tag is operating in. For example, I wouldn't want my Google Analytics tag sending data to my production Google Analytics account from activity taking place in my development area. This could dirty my data with extra transactions, events, and other site metrics. Even a few extra test transactions run for Quality Assurance can skew the data.

There are a few ways to handle this.

A.) Have your developers populate the environment in the Data Layer

You can have your development team add a Data Layer variable that specifies what environment the site is currently being loaded in, like this:

var dataLayer = window.dataLayer|| (window.dataLayer = []);
dataLayer.push({'environment':'staging'});

B.) Detect the environment based on the hostname

If your development and staging environments live at different hostnames, like 'mysitestaging.com', you can create a Custom JavaScript Macro that returns the environment based on what it sees in the hostname, like this:

function() {
  var hostname = {{Page Hostname}};
  if (hostname === 'mysite.com') return 'Production';
  if (hostname === 'mysitestaging.com') return 'Staging';
}

Update: Pavel Jašek pointed out to me on Twitter that lookup tables could be used in place of custom JavaScript; this is a much better way to go about it. Something like below would suffice:
An example lookup table with a list of potential hostnames and their corresponding environment strings

C.) Detect the environment by testing something else

If, for some reason, your testing enviroment is operating at the same hostname that your production environment is in, you'll have to be creative and determine another authoritative test to run in order to figure out which environment you're running in. Here's a handful of ideas:

  • Try and access a service available only in one environment, like an outside API
  • Check the hostname of resources loaded on the page, like images, CSS, or JavaScript
  • Search external stylesheets or JavaScript for comments – typically these will be minified out in Production

7. The Google Analytics UA Number

The UA number is the number associated with the Google Analytics property that a hit is being sent off to. Having this handy can be useful for either configuring things on the fly or testing data before takng certain actions. If your site only operates in one environment, this is a snap:

function() {
  return 'UA-XXXXX-XX';  // Enter in your UA number here
}

Update: The above is a valid, but more roundabout way to accomplish this – I’ve left it there for posterity, but I would recommend instead using a Constant macro for a single UA number, like below:
Example Constant macro with a Google Analytics UA number stored as the value
However, if you’d like to use a different property for each environment (you should), then you might do something like this:

function() {
  var environment = {{environment}};
  if ( environment === 'Production' ) {
    return 'UA-XXXXX-XX';
  }
  if ( environment === 'Staging' ) {
    return 'UA-YYYYY-YY'; 
  }
}

Update: Per the above update, a lookup table would be a better option here. Here’s what it might look like:
An example lookup table for a Google Analytics UA Number, keyed by environment
Pavel also recommended this article on lookup tables by Simo Ahava.

8. Google Analytics User ID

Whenever a user visits your site, Google Analytics assigns them a unique, random identifier. This value is stored inside the cookie that Google Analytics sets on the browser. I like to capture it and store it inside Google Analytics as a Custom Dimension or Custom Variable; it can come in handy when trying to track down specific user behavior across visits or transactions.

There are two ways to get to this data – either by extracting it from the Google Analytics cookies directly, or, with the Universal Analytics library, asking for it politely.

Option 1: Cookie Sniffing

FOR CLASSIC ANALYTICS:
// Only works if __utma cookie has been set
function() {
  var __utmaCookie = document.cookie.match(/__utma=(.*?)(?:;|$)/);
  if(__utmaCookie && __utmaCookie[1]) {
    var utmaVals = __utmaCookie[1].split('.');
    if(utmaVals[2]) {
      return utmaVals[1] + '.' + utmaVals[2];
    }
  }
}
FOR UNIVERSAL ANALYTICS:
// Only works if _ga cookie has been set
function () {
  var _gaCookie = document.cookie.match(/_ga=(.*?)(?:;|$)/);
  if(_gaCookie && _gaCookie[1]) {
    return  _gaCookie[1].match(/\d+\.\d+$/)[0];
  }
}

Option 2: Asking Politely (Tracker Properties; Universal Only)

FOR UNIVERSAL ANALYTICS WITHOUT A NAMED TRACKER (TYPICAL):
function() {

  // Fetch the GA Library
  var gaLib = window[ window.GoogleAnalyticsObject ];
  var trackers = gaLib.getAll();
  var uaNumber = {{UA Number}};

  for ( var i = 0; i 

FOR UNIVERSAL ANALYTICS WITH A NAMED TRACKER (UNUSUAL):

function() {

  var gaLib = window[window.GoogleAnalyticsObject];
  var tracker = gaLib.getByName({{Tracker Name}});

  if(tracker) {

    return tracker.get('clientId');

  }

}

Those are some of my favorite Custom Variables; what are yours? Share with me on Twitter at @notdanwilkerson.

Variables are dynamic bits of information that can be used within Google Tag Manager Tags, Rules, and even between Variables. They look something like this: {{Variable Name}}. These can get the value of 1st Party Cookies, JavaScript Variables, Data Layer Variables, and the 'Custom JavaScript' macro lets you extend the functionality of Variables nearly limitlessly. For a great overview of everything on offer, check out Simo Ahava's complete guide to all of the default Variables. Here's a list of some of my personal favorites.

1. User Agent

The User Agent is a string of text that identifies the "software (a software agent) that is acting on behalf of a user". In our case, this is the browser and device used to access our website. For example, here's yours:

You can test the User Agent to detect what browser a user is accessing your site with. This can be helpful if you want to track certain browser-based information (outside of what GA already collects) or change or exclude portions of your tag for users on particular browsers.

Since the User Agent is stored in the navigator.userAgent property, all you have to do is create a JavaScript Variable Variable (yes, 'Variable Variable') like below:

Select the variable type 'JavaScript Variable' and enter 'navigator.userAgent' into the input

For example, if you wanted to run a test and exclude any users of Internet Explorer 8 or below, you could do the following:

var isIeEightOrBelow = {{User Agent}}.match(/MSIE [2-8]/i) > -1 ? true : false;
if (isIeEightOrBelow) {
  // some code
} else {
  // some other code, or nothing.
}

You could also block an entire tag by using the same match as a blocking rule:
Blocking IE8 with Tag Manager WARNING: User agent tests are often unreliable. Never hinge site-critical functionality on a user agent test; use feature detection instead.

2. Week of the Year

Having the week of the year handy is more useful than you might first expect; one thing I like to do is store the week and year with a converting user, so that I can perform acquisition cohort analysis within Google Analytics. This snippet (courtesy of RobG on Stack Overflow) extends the built-in Date object to allow you to get the current week of the year.

function() {
  Date.prototype.getWeekNumber = function(){
    var d = new Date(+this);
    d.setHours(0,0,0);
    d.setDate(d.getDate()+4-(d.getDay()||7));
    return Math.ceil((((d-new Date(d.getFullYear(),0,1))/8.64e7)+1)/7);
  };
  return new Date().getWeekNumber();
}

This is a great way to segment data and learn how user behavior changes over time. This can also be helpful for analyzing the impact new products or features has on your business.

Update: With the new Cohort Analysis Report, you can do some of this style of reporting natively. That said, you can only look at a limited set of cohorts in the data, so this is still a good back-up.

3. Mobile User

This is a snippet courtesy of Michael Zaporozhets on Stack Overflow; it's a function that will return True if the user is on a mobile device, according to their user agent.

function() {
  window.mobilecheck = function() {
  var check = false;
  (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
  return check; }
  return window.mobilecheck();
}

This can be a useful piece of information if you'd like to prevent certain tags from firing on mobile devices, or if you'd like to exclude mobile users from a Content Experiment. The above warning about using the User Agent still applies.

4. The Page Title

This is a simple set of Macros that can come in handy for a number of reasons; say, for example, your site returns content on the same path, but with a huge variety in what content it returns based on some byzantine query string structure. In that case, the Page Title might expose some useful information. Fortunately, this is easily accessible through the document.title property. Just configure the Macro like you see below:
Select 'JavaScript Variable' for your Macro type, then enter 'document.title' in the input

Of course, Google Analytics will already capture the Page Title for you, but should you need to combine that data with another data point for deeper context, this is handy to have.

5. The Meta Description

The meta description can also be a useful piece of information to have, either to pull data from or to push into Google Analytics. One example of how this can be used is to fire an event on every pageview that stores the meta description and the URL it was fired on; this can be helpful for tracking down duplicate or blank meta descriptions. Of course, you can also see this data inside the HTML Suggestions section of Google Webmaster Tools.

function() {
  var metas = document.getElementsByTagName('meta');
  for (var i = 0; i < metas.length; i++) {
    if (metas[i].name === 'description') {
      return metas[i].content;
    }
  }
  return 'None found';
}

Update: Jim Gianoglio of LunaMetrics fame pointed out that this could be accomplished JavaScript-free by using the below JavaScript Variable macro:
Example JavaScript Macro with document.head.children.description.content entered as the value

The value entered above is document.head.children.description.content, which will return the Meta Description or Undefined. Google Tag Manager helpfully catches errors for missing properties.

6. The Environment

If your site is developed and runs in several different environments, such as a development environment, a staging environment, and a production environment, it can be useful to modify tag behavior based on which enviroment the tag is operating in. For example, I wouldn't want my Google Analytics tag sending data to my production Google Analytics account from activity taking place in my development area. This could dirty my data with extra transactions, events, and other site metrics. Even a few extra test transactions run for Quality Assurance can skew the data.

There are a few ways to handle this.

A.) Have your developers populate the environment in the Data Layer

You can have your development team add a Data Layer variable that specifies what environment the site is currently being loaded in, like this:

var dataLayer = window.dataLayer|| (window.dataLayer = []);
dataLayer.push({'environment':'staging'});

B.) Detect the environment based on the hostname

If your development and staging environments live at different hostnames, like 'mysitestaging.com', you can create a Custom JavaScript Macro that returns the environment based on what it sees in the hostname, like this:

function() {
  var hostname = {{Page Hostname}};
  if (hostname === 'mysite.com') return 'Production';
  if (hostname === 'mysitestaging.com') return 'Staging';
}

Update: Pavel Jašek pointed out to me on Twitter that lookup tables could be used in place of custom JavaScript; this is a much better way to go about it. Something like below would suffice:
An example lookup table with a list of potential hostnames and their corresponding environment strings

C.) Detect the environment by testing something else

If, for some reason, your testing enviroment is operating at the same hostname that your production environment is in, you'll have to be creative and determine another authoritative test to run in order to figure out which environment you're running in. Here's a handful of ideas:

  • Try and access a service available only in one environment, like an outside API
  • Check the hostname of resources loaded on the page, like images, CSS, or JavaScript
  • Search external stylesheets or JavaScript for comments - typically these will be minified out in Production

7. The Google Analytics UA Number

The UA number is the number associated with the Google Analytics property that a hit is being sent off to. Having this handy can be useful for either configuring things on the fly or testing data before takng certain actions. If your site only operates in one environment, this is a snap:

function() {
  return 'UA-XXXXX-XX';  // Enter in your UA number here
}

Update: The above is a valid, but more roundabout way to accomplish this - I've left it there for posterity, but I would recommend instead using a Constant macro for a single UA number, like below:
Example Constant macro with a Google Analytics UA number stored as the value However, if you'd like to use a different property for each environment (you should), then you might do something like this:

function() {
  var environment = {{environment}};
  if ( environment === 'Production' ) {
    return 'UA-XXXXX-XX';
  }
  if ( environment === 'Staging' ) {
    return 'UA-YYYYY-YY'; 
  }
}

Update: Per the above update, a lookup table would be a better option here. Here's what it might look like:
An example lookup table for a Google Analytics UA Number, keyed by environment Pavel also recommended this article on lookup tables by Simo Ahava.

8. Google Analytics User ID

Whenever a user visits your site, Google Analytics assigns them a unique, random identifier. This value is stored inside the cookie that Google Analytics sets on the browser. I like to capture it and store it inside Google Analytics as a Custom Dimension or Custom Variable; it can come in handy when trying to track down specific user behavior across visits or transactions.

There are two ways to get to this data - either by extracting it from the Google Analytics cookies directly, or, with the Universal Analytics library, asking for it politely.

Option 1: Cookie Sniffing

FOR CLASSIC ANALYTICS:
// Only works if __utma cookie has been set
function() {
  var __utmaCookie = document.cookie.match(/__utma=(.*?)(?:;|$)/);
  if(__utmaCookie && __utmaCookie[1]) {
    var utmaVals = __utmaCookie[1].split('.');
    if(utmaVals[2]) {
      return utmaVals[1] + '.' + utmaVals[2];
    }
  }
}
FOR UNIVERSAL ANALYTICS:
// Only works if _ga cookie has been set
function () {
  var _gaCookie = document.cookie.match(/_ga=(.*?)(?:;|$)/);
  if(_gaCookie && _gaCookie[1]) {
    return  _gaCookie[1].match(/\d+\.\d+$/)[0];
  }
}

Option 2: Asking Politely (Tracker Properties; Universal Only)

FOR UNIVERSAL ANALYTICS WITHOUT A NAMED TRACKER (TYPICAL):
function() {

  // Fetch the GA Library
  var gaLib = window[ window.GoogleAnalyticsObject ];
  var trackers = gaLib.getAll();
  var uaNumber = {{UA Number}};

  for ( var i = 0; i < trackers.length; i++ ) {
    if ( trackers[i].get('trackingId') === uaNumber ) {
      return trackers[i].get('clientId');
    }
  }
}

FOR UNIVERSAL ANALYTICS WITH A NAMED TRACKER (UNUSUAL):

function() {

  var gaLib = window[window.GoogleAnalyticsObject];
  var tracker = gaLib.getByName({{Tracker Name}});

  if(tracker) {

    return tracker.get('clientId');

  }

}

Those are some of my favorite Custom Variables; what are yours? Share with me on Twitter at @notdanwilkerson.

Webinar: Turn Your Website Visitors to Buying Customers Using Email

With the dawn of the new school year, it must be about time for the annual death toll of email marketing. Between social media and mobile marketing, some people will tell you that email no longer gets a look in. … Continue reading

With the dawn of the new school year, it must be about time for the annual death toll of email marketing. Between social media and mobile marketing, some people will tell you that email no longer gets a look in. The average inbox gets hundreds more emails every month than it did just a few years ago, making it more and more difficult to get heard over all that noise.

Rubbish!

Not only is the ROI on email marketing still excellent, for the savvy internet marketer, the increased noise actually makes it easier to rise to the surface with relevant, valuable content.

But have you thought about how you’re going to get that wonderful content of yours in front of your ideal customer’s eyes? With the increase in noise, it has become even more vital to carefully target your website visitors so that your opt-in offer is presented at just the right time. Regular Padiact users will know that when it comes to highly targeted offers, we love to help!

PadiAct & INinbox Webinar

padiact-ininbox-webinarAnd today it gets one step better… we’ve teamed up with email provider, INInbox.com, to bring you an exclusive webinar. We’ll share with you exactly how Padiact and INinbox can work together to supercharge your website traffic from ‘meh’ to ‘magic’.

If you’ve been wondering what it really takes to build a successful business with email marketing this is one webinar you won’t want to miss. We’ll also be digging into our best lessons from collecting over 5 million leads for our customers, as well as giving you specific steps you can take to achieve maximum success from the integration between Padiact and your email provider.

The date and time to add to your calendar is Tuesday September 9th at 11am EST.

There are limited spaces available for this webinar so click here to register instantly.

register-for-free

Using Offline and Online data to drive Google Analytics Remarketing

The Google Analytics platform has been changing from a web analytics tool to a user-centric digital measurement tool (we’ve been calling it Universal Analytics). This evolution includes a number of changes to the system and completely new features. But what can you do when you put all of these pieces together? I wanted to write […]

Using Offline and Online data to drive Google Analytics Remarketing is a post from: Analytics Talk by Justin Cutroni

The post Using Offline and Online data to drive Google Analytics Remarketing appeared first on Analytics Talk.

The Google Analytics platform has been changing from a web analytics tool to a user-centric digital measurement tool (we’ve been calling it Universal Analytics). This evolution includes a number of changes to the system and completely new features. But what can you do when you put all of these pieces together?

I wanted to write a quick post about how a business could use the entire platform to better market to users on the web based on non-website activities. We’ll explore how to use offline and online data to create remarketing lists in Google Analytics.

Before I start a hat-tip to my buddy Dan Stone – a product manager at Google Analytics who often talks about this type of usage.

Influencing Display Advertising using Email Behavior

Businesses interact with users via many different channels – search, display, social, email, etc. And they’re always looking to better understand how one channel impacts another channel. That’s why we have attribution modeling.

But sometime we want to take direct action, or even automated action, in a channel based on user behavior in a separate channel.

For example, I may want to change my search or display strategy for users on my email list. Perhaps I want them to see different display ads because I have a better relationship with them.

Here’s an example.

With Analytics we can collect data from email marketing tools, send it to Google Analytics and then use that information to change display campaigns.

We can send data from email marketing tools, to Google Analytics, then use the data to drive Remarketing.

We can send data from email marketing tools, to Google Analytics, then use the data to drive Remarketing.

The Implementation

With some of the new features in Google Analytics it is very possible to change a user’s display advertising experience based on behavior in other digital environments.

The first thing we need to do is bind the data in Google Analytics to the data in our own systems. This might be the data in a CRM or some other customer system. We’re going to use an old-school method that I describe in the post integrating Google Analytics with a CRM.

Here’s a summary…

When a user visits your site (or your app) Google Analytics sets a unique, anonymous identifier. This identifier is called the Client ID or cid for short.

What we need to do is extract the client ID value from the Google Analytics cookies and pass it to your CRM system. Once it’s in your systems you should be able to join your internal customer IDs with the GA ID. I should note – this is not some task you finish in an afternoon. You need some nerd help and it could take a while.

You can extract the GA identifier from the tracking cookie and send it to your own system.

You can extract the GA identifier from the tracking cookie and send it to your own system.

Make sure you check out these two posts for more information:
Integrating Google Analytics with a CRM
Understanding Cross Device Measurement and the User-ID

Now that we have the two data sets joined we can do something really cool – we can send user-specific data to Google Analytics from other systems. This means that when we send out an email, or some other user-specific actions happens in our system, we can send that behavioral data to Google Analytics. How?

To send data to GA from other systems we use the measurement protocol. This technology let’s us send data to Google Analytics from any system that can connect to the internet. It defines how to send data to GA. We’ll use the measurement protocol to send data about email activities.

When we send an email to a user we will also send a measurement protocol hit to Google Analytics.

When an email is sent from your system, you can send a hit to Google Analytics using the measurement protocol.

When an email is sent from your system, you can send a hit to Google Analytics using the measurement protocol.

Specifically, we’ll send an event piece of data. The event will indicate that an email was sent to this user and the type of email:

www.google-analytics.com/collect?v=1&tid=UA-XX-Y&cid [UniqueID]&t=event&ec=Email&ea=Send&el=BackToSchool2014

If we want to be really fancy then we can also send a second hit to Google Analytics when the user receives the email and another hit when the user opens the email. For example, if the user opens the email then we can trigger a pixel within the email that sends a hit to Google Analytics.

www.google-analytics.com/collect?v=1&tid=UA-XX-Y&cid=[UniqueID]&t=event&ec=Email&ea=Open&el=BackToSchool2014

I need to stress, you need to write a bunch of code that generates these hits. The implementation will really depend on your systems.

The data in the above hits indicates that this email was part of the BackToSchool2014 campaign (look for the event data ec for Event Category, el for Event Label, ea for Event Actions. If we looked in Google Analytics the data would look something like this:

Offline email actions can be captured with the measurement protocol as events.

Offline email actions can be captured with the measurement protocol as events.

All of these hits include a specific parameter named cid. This is the Client ID for the particular recipient of the email that I discussed earlier. When Google Analytics processes these hits they will be merged with the dame user data from the website – because they have the same cid value.

OK, now we have user data coming from two separate systems and Goole Analytics is merging it together.

Here’s where the fun comes in.

Because all of this data is in one place, we can segment users in Analytics based on behavior, then use that list of users for remarketing.

You can join the Google Analytics ID, called CID, with your own ID. But then you can collect off-site actions in GA and tie them to other GA data.

after all of our work, we’re using the GA data measuring sent emails to create a remarketing list.

For those that have not use Remarketing, this is one of my favorite features in Google Analytics. Remarketing let’s you segment user on your website then send that list of users to Google AdWords (or DoubleClick if you use Analytics Premium) for use as a remarketing list.

The remarketing segment would look like this:

Segmenting users that received and opened an email.

Segmenting users that received and opened an email.

This segment is all users that opened the back-to-school email. I could also add a condition that the user received the email, but that’s not really necessary.

Now we can use this list of users in AdWords. How? I may want to use the same creative for their ads. Or perhaps I offer them the same deal that was in the email.

This technique is not just for email – you can use the measurement protocol to send data from any system. That means behavioral information from other digital experiences can be used to drive remarketing lists.

Hopefully this example gives you some idea of how multiple Google Analytics features can be used together to drive real business results.

Using Offline and Online data to drive Google Analytics Remarketing is a post from: Analytics Talk by Justin Cutroni

The post Using Offline and Online data to drive Google Analytics Remarketing appeared first on Analytics Talk.

The Essential Guide To Error Tracking Using Google Analytics

Oft overlooked, error tracking is one of the most valuable ways to use Google Analytics. This essential guide covers how to use Google Analytics to track:

(click a link to jump ahead)

Using:

  • Google Tag Manager
  • Universal Analytics
  • Classic Google Analytics

404 Errors

Tracking 404s is great for:

  • Finding broken links (internal and external)
  • Proactively catching broken functionality
  • Tidying up older site architecture

Use Events to capture the previous page of the visit and the complete location of where the 404 occured. These are available at document.referrer and document.location.href, respectively. These two pieces of information can let you track down exactly where the offending link happens to be; capture these instead of relying on the ‘Page’ or ‘Full Referrer’ dimension in Google Analytics. Those values can easily be altered by filters, campaign parameters, or by other features built into Google Analytics.

FOR GOOGLE TAG MANAGER:

If you’re using Google Tag Manager, checking the title element for the default ‘404’ text is a sturdy test to fire a tracking event. Something like {{title}} equals '404 Page' or {{title}} contains '404 Page', as recommended by Samantha Barnes in her excellent guide to capturing 404 metrics with Google Tag Manager. You can also reference other tags that are on the page – be creative and find a standard value to watch for.

If that’s not possible, you’ll need to get your developers to populate the dataLayer with an event that you can watch for in Tag Manager, like:

var dataLayer = dataLayer||[];
dataLayer.push({'event':'404 Error'});

Then, you add a rule that watches for the 404 Error event, like so:

Then you create a Google Analytics Event tag and populate the Event Action and Event Label with the full URL of the page and the referrer.

As a best practice, I recommend that you try and decouple the mechanism that fires the event into Google Analytics from the actual event. Doing this means you can use a single ‘generic event’ tag to handle the processing of all of your events, and instead just push data into the dataLayer for the event tag to reference. For example:

In the above, each macro simply returns a corresponding dataLayer variable for an event value. It watches for ‘event’:’eventFired’ in the dataLayer. To generate a 404 event, all that needs to happen is the following be pushed into the dataLayer:

var referrer = document.referrer;
if (referrer === '') {
  referrer = 'No Referrer';
}
dataLayer.push({
  'event': 'eventFired',
  'eventCategory': '404 Error',
  'eventAction': document.location.href,
  'eventLabel': referrer,
  'eventValue': 0,
  'eventNonInteraction': true
});

This pattern makes adding future events a snap – all you have to do is push the ‘eventFired’ event into the dataLayer with the corresponding data; no need to create a whole new Google Analytics event tag.

If you’re not using Google Tag Manager, you’ll have to manually fire these events into Google Analytics. You can either include the following code as part of the 404 page template, or add it wrapped in a test into the header of each page on your site, e.g.:

if (document.title === 'Oops! You've found a 404 Page') {
  // Appropriate event tracking code from below goes here
}

FOR UNIVERSAL ANALYTICS:

var referrer = document.referrer;
if (referrer === '') {
  referrer = 'No Referrer';
}
ga('send', 'event', '404 Error', document.location.href, referrer, 0, {'nonInteraction': true});

FOR CLASSIC GOOGLE ANALYTICS:

var referrer = document.referrer;
if (referrer === '') {
  referrer = 'No Referrer';
}
_gaq.push(['_trackEvent','404 Pages', document.location.href, referrer, 0, true]);

JavaScript Errors

JavaScript errors are errors that the browser throws while executing the code that you’ve delivered to it. There are many common causes for JavaScript errors – browser compatibility, coding mistakes, and namespace collisions, to name a few. Tracking JavaScript errors can help you ensure a consistent user experience across browsers, catch bugs that were missed during development, and gauge the impact an error is truly having on users so that a fix can be appropriately prioritized.

FOR GOOGLE TAG MANAGER:

It’s your lucky day. Google Tag Manager offers a JavaScript Error Listener right out of the box. Just select ‘JavaScript Error Listener’ from the ‘Event Listeners’; I recommend you add this to every page.

Then, you’ll need to add another tag that listens for ‘gtm.pageError’ and uses the associated values to populate an Event for Analytics. I recommend reusing the pattern above for events, like this:

dataLayer.push({
  'event':'eventFired',
  'eventCategory': 'JS Errors',
  'eventAction': {{gtm.errorMessage}},
  'eventLabel': URL: {{href}} | File: {{gtm.errorUrl}} | Line: {{gtm.errorLineNumber}},
  'eventValue': 0,
  'eventNonInteraction': true
});

Otherwise, you’ll have to create another tag specifically for turning errors into events, like this:

I make the Event Action the gtm.errorMessage value and the Event Label URL: {{href}} | File: {{gtm.errorUrl}} | Line: {{gtm.errorLineNumber}}. This makes an for an easy-to-read format that can be drilled into for deeper context.

FOR UNIVERSAL ANALYTICS & CLASSIC ANALYTICS:

To track errors in the browser, you’ll need to bind an event listener to the window.onerror event that will generate a hit to send to Google Analytics. Doing this in a 100% backwards-compatible, error-free way can be super tricky, but here’s a copy-and-paste-friendly snippet you could utilize that should work with most browsers and Google Analytics configurations. Feel free to copy and modify to your tastes:

if (typeof window.onerror === 'object' && window.onerror === null) {  // Checks if this seat is taken/exists
  window.onerror = function(message, file, lineNumber) {
    if (typeof ga === 'object') {  // Detects Universal Analytics
      ga('send','event','JS Error', message, 'URL: ' + document.location.href + '| File: ' + file + '| Line: ' + lineNumber, 0, {'nonInteraction': true});
    } else if (typeof _gaq === 'object') {  // Detects Classic Analytics
      _gaq.push(['_trackEvent','JS Error', message, 'URL: ' + document.location.href + '| File: ' + file + '| Line: ' + lineNumber, 0, true]);
    }
  }
}

Server-side Errors

Sending application error data into Google Analytics directly from your server let’s you connect backend performance with front-end behavior. It can also contextualize seemingly unconnected issues across your site.

FOR GOOGLE TAG MANAGER:

Although technically not server-side, you could expose some error information into the dataLayer and then pass it into Google Analytics. On your server, this might look something like:

var dataLayer = dataLayer||[];
<?php
foreach ( $err in $errors ) { ?>
  dataLayer.push({
    'event': 'eventFired',
    'eventCategory': 'Server Error',
    'eventAction': '<?php echo $err->errno . $err->errstr ?>',
    'eventLabel': 'URL: ' + {{href}} + '| File: <?php echo $err->errfile ?> | Line: <?php echo $err->errline ?>';
  });
<?php } ?>

And on the client, you’d see:

<script>
  var dataLayer = dataLayer||[];
  dataLayer.push({
    'event': 'eventFired',
    'eventCategory': 'Server Error',
    'eventAction': 'Fatal error: Undefined class constant "MYSQL_ATTR_USE_BUFFERED_QUERY"'
    'eventLabel': 'URL: http://example.com/test/ | File: /local/www/example.com/includes/database/mysql/database.inc | Line: 43',
    'eventValue': 0,
    'eventNonInteraction': true
  });
</script>

Sidenote:

You’ll notice me using the syntax var dataLayer = dataLayer||[]; and then using dataLayer.push({}) in order to populate the dataLayer in my code; I recommend this as best practice to avoid accidentally overwriting needed information in the dataLayer. Basically, this is read by the browser as ‘The dataLayer is equal to itself, or it’s an empty array’. If the dataLayer doesn’t exists, the next section of the ‘OR’ (||) statement is evaluated, namely ‘dataLayer is an empty array’. In this way, if it exists, it will preserve itself, and if it doesn’t, it will create a new array named dataLayer for us to use.

Not instantiating dataLayer in this way can lead to problems if your code gets messy. For example, if you’re loading the dataLayer at the top of the page, then server errors inside the <content> of the page, this could happen:

<!-- Other HTML -->
<script>
  var dataLayer = [{'PageType':'Local'}, {'timestamp': 2849200492}];
  console.log(dataLayer); // Logs '[ { "PageType": "Local" }, {'timestamp': 2849200492} ]'
</script>
<!-- Other HTML -->
<script>
  var dataLayer = [{'event': 'Server Error'}];
  console.log(dataLayer); // Logs '[ { "event": "Server Error" } ]'
</script>

Should you need to reference either the PageType or timestamp values later, they would return undefined. Using dataLayer = dataLayer||[]; and then dataLayer.push() instead of just instantiating the dataLayer prevents this from happening.

FOR UNIVERSAL ANALYTICS:

The Universal Analytics Measurement Protocol provides a relatively painless way to send hits to Google Analytics directly from your server. All it takes is a POST request, which can be pretty simple to put together. Here’s a quick and dirty example using NodeJS:

var http = require('http');

function fireMeasurementProtocolEvent(category, action, label, value, nonInteraction, cid) {

  var ni = !nonInteraction ? '1' : '0';

  var eventData = "?v=1&tid=UA-XXXXXXX-XX&t=event&cid=" + cid + "&ec=" + category + "&ea=" + action + "&el=" + label + "&ev=" + value + "&ni=" + ni;

  var payload = {

    'hostname': 'www.google-analytics.com',
    'path': '/collect' + eventData,
    'method': 'POST'

  };

  var req = http.request(payload);
  req.end();

};

FOR CLASSIC GOOGLE ANALYTICS:

The truly intrepid can manufacturer fake __utm.gif requests – all you need to do is generate a GET request to http://www.google-analytics.com/__utm.gif with the correct parameters appended to the request. Here’s a great reference from Google on how to do just that.

Modal & Dialog Errors

Finally, a great ‘error’ type that I like to catch is any kind of modal or error dialog presented to a user. Even mundane error messages can reveal more sinister patterns lurking underneath. Tracking and analyzing common site messages is essential for good site hygiene.

FOR GOOGLE TAG MANAGER:

Either create an event tag and a macro to grab the text of the modal, or using the generic tracking event outlined above:

var modal = document.getElementById('modal-message');
dataLayer.push({
  'event': 'eventFired',
  'eventCategory': 'Error Modal',
  'eventAction': modal.textContent,
  'eventLabel': '',
  'eventValue':0,
  'eventNonInteraction': true
});

FOR UNIVERSAL ANALYTICS:

var modal = document.getElementById('modal-message');
ga('send', 'event', 'Error Modal', modal.textContent, '', 0, {'nonInteraction': true});

FOR CLASSIC GOOGLE ANALYTICS:

var modal = document.getElementById('modal-message');
_gaq.push(['_trackEvent','Error Modal', modal.textContent, '', 0, true]);

Have any error-collecting techniques of your own that I missed? Tweet them to me at @notdanwilkerson.

Oft overlooked, error tracking is one of the most valuable ways to use Google Analytics. This essential guide covers how to use Google Analytics to track:

(click a link to jump ahead)

Using:

  • Google Tag Manager
  • Universal Analytics
  • Classic Google Analytics

404 Errors

Tracking 404s is great for:

  • Finding broken links (internal and external)
  • Proactively catching broken functionality
  • Tidying up older site architecture

Use Events to capture the previous page of the visit and the complete location of where the 404 occured. These are available at document.referrer and document.location.href, respectively. These two pieces of information can let you track down exactly where the offending link happens to be; capture these instead of relying on the 'Page' or 'Full Referrer' dimension in Google Analytics. Those values can easily be altered by filters, campaign parameters, or by other features built into Google Analytics.

FOR GOOGLE TAG MANAGER:

If you're using Google Tag Manager, checking the title element for the default '404' text is a sturdy test to fire a tracking event. Something like {{title}} equals '404 Page' or {{title}} contains '404 Page', as recommended by Samantha Barnes in her excellent guide to capturing 404 metrics with Google Tag Manager. You can also reference other tags that are on the page - be creative and find a standard value to watch for.

If that's not possible, you'll need to get your developers to populate the dataLayer with an event that you can watch for in Tag Manager, like:

var dataLayer = dataLayer||[];
dataLayer.push({'event':'404 Error'});

Then, you add a rule that watches for the 404 Error event, like so:

Then you create a Google Analytics Event tag and populate the Event Action and Event Label with the full URL of the page and the referrer.

As a best practice, I recommend that you try and decouple the mechanism that fires the event into Google Analytics from the actual event. Doing this means you can use a single 'generic event' tag to handle the processing of all of your events, and instead just push data into the dataLayer for the event tag to reference. For example:

In the above, each macro simply returns a corresponding dataLayer variable for an event value. It watches for 'event':'eventFired' in the dataLayer. To generate a 404 event, all that needs to happen is the following be pushed into the dataLayer:

var referrer = document.referrer;
if (referrer === '') {
  referrer = 'No Referrer';
}
dataLayer.push({
  'event': 'eventFired',
  'eventCategory': '404 Error',
  'eventAction': document.location.href,
  'eventLabel': referrer,
  'eventValue': 0,
  'eventNonInteraction': true
});

This pattern makes adding future events a snap - all you have to do is push the 'eventFired' event into the dataLayer with the corresponding data; no need to create a whole new Google Analytics event tag.

If you're not using Google Tag Manager, you'll have to manually fire these events into Google Analytics. You can either include the following code as part of the 404 page template, or add it wrapped in a test into the header of each page on your site, e.g.:

if (document.title === 'Oops! You've found a 404 Page') {
  // Appropriate event tracking code from below goes here
}

FOR UNIVERSAL ANALYTICS:

var referrer = document.referrer;
if (referrer === '') {
  referrer = 'No Referrer';
}
ga('send', 'event', '404 Error', document.location.href, referrer, 0, {'nonInteraction': true});

FOR CLASSIC GOOGLE ANALYTICS:

var referrer = document.referrer;
if (referrer === '') {
  referrer = 'No Referrer';
}
_gaq.push(['_trackEvent','404 Pages', document.location.href, referrer, 0, true]);

JavaScript Errors

JavaScript errors are errors that the browser throws while executing the code that you've delivered to it. There are many common causes for JavaScript errors - browser compatibility, coding mistakes, and namespace collisions, to name a few. Tracking JavaScript errors can help you ensure a consistent user experience across browsers, catch bugs that were missed during development, and gauge the impact an error is truly having on users so that a fix can be appropriately prioritized.

FOR GOOGLE TAG MANAGER:

It's your lucky day. Google Tag Manager offers a JavaScript Error Listener right out of the box. Just select 'JavaScript Error Listener' from the 'Event Listeners'; I recommend you add this to every page.

Then, you'll need to add another tag that listens for 'gtm.pageError' and uses the associated values to populate an Event for Analytics. I recommend reusing the pattern above for events, like this:

dataLayer.push({
  'event':'eventFired',
  'eventCategory': 'JS Errors',
  'eventAction': {{gtm.errorMessage}},
  'eventLabel': URL: {{href}} | File: {{gtm.errorUrl}} | Line: {{gtm.errorLineNumber}},
  'eventValue': 0,
  'eventNonInteraction': true
});

Otherwise, you'll have to create another tag specifically for turning errors into events, like this:

I make the Event Action the gtm.errorMessage value and the Event Label URL: {{href}} | File: {{gtm.errorUrl}} | Line: {{gtm.errorLineNumber}}. This makes an for an easy-to-read format that can be drilled into for deeper context.

FOR UNIVERSAL ANALYTICS & CLASSIC ANALYTICS:

To track errors in the browser, you'll need to bind an event listener to the window.onerror event that will generate a hit to send to Google Analytics. Doing this in a 100% backwards-compatible, error-free way can be super tricky, but here's a copy-and-paste-friendly snippet you could utilize that should work with most browsers and Google Analytics configurations. Feel free to copy and modify to your tastes:

if (typeof window.onerror === 'object' && window.onerror === null) {  // Checks if this seat is taken/exists
  window.onerror = function(message, file, lineNumber) {
    if (typeof ga === 'object') {  // Detects Universal Analytics
      ga('send','event','JS Error', message, 'URL: ' + document.location.href + '| File: ' + file + '| Line: ' + lineNumber, 0, {'nonInteraction': true});
    } else if (typeof _gaq === 'object') {  // Detects Classic Analytics
      _gaq.push(['_trackEvent','JS Error', message, 'URL: ' + document.location.href + '| File: ' + file + '| Line: ' + lineNumber, 0, true]);
    }
  }
}

Server-side Errors

Sending application error data into Google Analytics directly from your server let's you connect backend performance with front-end behavior. It can also contextualize seemingly unconnected issues across your site.

FOR GOOGLE TAG MANAGER:

Although technically not server-side, you could expose some error information into the dataLayer and then pass it into Google Analytics. On your server, this might look something like:

var dataLayer = dataLayer||[];
<?php
foreach ( $err in $errors ) { ?>
  dataLayer.push({
    'event': 'eventFired',
    'eventCategory': 'Server Error',
    'eventAction': '<?php echo $err->errno . $err->errstr ?>',
    'eventLabel': 'URL: ' + {{href}} + '| File: <?php echo $err->errfile ?> | Line: <?php echo $err->errline ?>';
  });
<?php } ?>

And on the client, you'd see:

<script>
  var dataLayer = dataLayer||[];
  dataLayer.push({
    'event': 'eventFired',
    'eventCategory': 'Server Error',
    'eventAction': 'Fatal error: Undefined class constant "MYSQL_ATTR_USE_BUFFERED_QUERY"'
    'eventLabel': 'URL: http://example.com/test/ | File: /local/www/example.com/includes/database/mysql/database.inc | Line: 43',
    'eventValue': 0,
    'eventNonInteraction': true
  });
</script>

Sidenote:

You'll notice me using the syntax var dataLayer = dataLayer||[]; and then using dataLayer.push({}) in order to populate the dataLayer in my code; I recommend this as best practice to avoid accidentally overwriting needed information in the dataLayer. Basically, this is read by the browser as 'The dataLayer is equal to itself, or it's an empty array'. If the dataLayer doesn't exists, the next section of the 'OR' (||) statement is evaluated, namely 'dataLayer is an empty array'. In this way, if it exists, it will preserve itself, and if it doesn't, it will create a new array named dataLayer for us to use.

Not instantiating dataLayer in this way can lead to problems if your code gets messy. For example, if you're loading the dataLayer at the top of the page, then server errors inside the <content> of the page, this could happen:

<!-- Other HTML -->
<script>
  var dataLayer = [{'PageType':'Local'}, {'timestamp': 2849200492}];
  console.log(dataLayer); // Logs '[ { "PageType": "Local" }, {'timestamp': 2849200492} ]'
</script>
<!-- Other HTML -->
<script>
  var dataLayer = [{'event': 'Server Error'}];
  console.log(dataLayer); // Logs '[ { "event": "Server Error" } ]'
</script>

Should you need to reference either the PageType or timestamp values later, they would return undefined. Using dataLayer = dataLayer||[]; and then dataLayer.push() instead of just instantiating the dataLayer prevents this from happening.

FOR UNIVERSAL ANALYTICS:

The Universal Analytics Measurement Protocol provides a relatively painless way to send hits to Google Analytics directly from your server. All it takes is a POST request, which can be pretty simple to put together. Here's a quick and dirty example using NodeJS:

var http = require('http');

function fireMeasurementProtocolEvent(category, action, label, value, nonInteraction, cid) {

  var ni = !nonInteraction ? '1' : '0';

  var eventData = "?v=1&tid=UA-XXXXXXX-XX&t=event&cid=" + cid + "&ec=" + category + "&ea=" + action + "&el=" + label + "&ev=" + value + "&ni=" + ni;

  var payload = {

    'hostname': 'www.google-analytics.com',
    'path': '/collect' + eventData,
    'method': 'POST'

  };

  var req = http.request(payload);
  req.end();

};

FOR CLASSIC GOOGLE ANALYTICS:

The truly intrepid can manufacturer fake __utm.gif requests - all you need to do is generate a GET request to http://www.google-analytics.com/__utm.gif with the correct parameters appended to the request. Here's a great reference from Google on how to do just that.

Modal & Dialog Errors

Finally, a great 'error' type that I like to catch is any kind of modal or error dialog presented to a user. Even mundane error messages can reveal more sinister patterns lurking underneath. Tracking and analyzing common site messages is essential for good site hygiene.

FOR GOOGLE TAG MANAGER:

Either create an event tag and a macro to grab the text of the modal, or using the generic tracking event outlined above:

var modal = document.getElementById('modal-message');
dataLayer.push({
  'event': 'eventFired',
  'eventCategory': 'Error Modal',
  'eventAction': modal.textContent,
  'eventLabel': '',
  'eventValue':0,
  'eventNonInteraction': true
});

FOR UNIVERSAL ANALYTICS:

var modal = document.getElementById('modal-message');
ga('send', 'event', 'Error Modal', modal.textContent, '', 0, {'nonInteraction': true});

FOR CLASSIC GOOGLE ANALYTICS:

var modal = document.getElementById('modal-message');
_gaq.push(['_trackEvent','Error Modal', modal.textContent, '', 0, true]);

Have any error-collecting techniques of your own that I missed? Tweet them to me at @notdanwilkerson.

How to Handle Existing Subscribers in Your Email Leads Collecting Strategies

When an existing subscriber subscribes to your email lists again, what does it mean to you: a new conversion or just another duplicate email address? Your answer depends on the email marketing strategy you’ve chosen for your business. But no … Continue reading

When an existing subscriber subscribes to your email lists again, what does it mean to you: a new conversion or just another duplicate email address? Your answer depends on the email marketing strategy you’ve chosen for your business. But no matter what, you’ll want to make sure you don’t miss out on valid new subscribers and neither get too annoying to current ones.

One of the first questions we often get from new clients here at PadiAct is:

How can I avoid inviting an existing subscriber to subscribe?

There are multiple ways of approaching this concern, depending on some details regarding the existing subscriber, specific to your strategy.

Allow me to walk you through the 3 of the most common scenarios we’ve seen here at PadiAct and in return I’ll share with you the recommended targeting rules recipes you can use for best results.

“Visitors subscribe once and they get all my future newsletters.”

General invitations to subscribe that sound like “Subscribe to blog updates” or “Why not stay in touch” imply that once the users subscribe, they’ll automatically be included in all future newsletters the website might send out, be them new content, promotions or other type of messages. You probably have only one list where all your subscribers go to.

You will want to make sure that visitors coming from any sort of email marketing campaign are not invited to subscribe twice. Here is the targeting rule you should select from the “Exclude rules” list available per each of your campaigns:

exclude existing subscribers targeting rule screenshot

“Exclude existing subscribers” targeting rule

Using this rule, that was recently released, you make sure that visitors to your website that have subscribed through any other PadiAct campaign or have already interacted with your email newsletters are not to be bothered with the invitation to subscribe again.

“Visitors must subscribe to each new email campaign I run.”

Invitations like “Leave your email address to be contacted by a sales representative” are pretty specific to their message. It would be unwise to start sending to this sort of subscribers general newsletters that they did not really subscribe to. You can however invite the very same subscribers to subscribe to your general newsletters through other PadiAct campaigns.

In this case, if existing subscribers to a list (to be contacted by a sales representative) get to see other targeting campaigns you run and even subscribe to them, you can happily count your conversions pouring in. No worries if the same user sees more than one invitation to subscribe.

It’s worth mentioning that by default, a PadiAct campaign is never displayed to a user who has already subscribed to it – so no extra settings needed from you!

“Subscribers to campaign X should really not see invitation from campaign Y”

Already gave them a 25% off discount yesterday and don’t want them to get a cumulative  35% off coupon  today? Excluding visitors coming from a certain marketing campaign is easy. Select from the “Exclude rules” list available from your campaign page the rule named “Target based on marketing campaigns” and fill it in with the campaign details you wish to exclude:

exclude-marketing-campaigns

What this rule does is make sure existing subscribers to your marketing campaign (made with or without PadiAct) don’t see the invitation to subscribe to this the current campaign.  You can exclude as many marketing campaigns as possible, as long as you have their UTM parameters set in Google Analytics.

However, if you want to exclude people that have interacted just with another PadiAct campaign (no matter if they subscribed or not or if they have already received an email newsletter after subscribing), you can use one of the more advanced targeting rules, called “Exclude Visitors that interact with any of the following 1st Party Cookies“, as follows:exclude-1st-party-cookies-other-campaigns

Make sure to remove the “XXXX” from the cookie name if you want to exclude people who have seen any of the other PadiAct campaigns.

To exclude just people that have interacted with specific other PadiAct campaigns, you need to replace the “XXXX” with the campaign ID, that you can find on the campaign page:

campaign-ID

How do you treat your existing subscribers? Does your strategy fit in the above examples? Have another targeting scenario and need a tip on the right targeting rules to use? Just comment below, I’ll be glad to hear from you.