Getting the right traffic to your home page

You know what you want — more clients.

Why struggle with what to do next?

Welcome to Excelovation.  Where marketing plans start with data, not guesswork. And every idea is centered on your target market.

Stop worrying about how. Leave the tactics to us.

What does your target audience think?

Answer one simple question about your business, and we’ll provide a live, FREE assessment of your website’s success from your prospect’s point of view.

I want to know!
Get a Free Website Assessment

What's Really Happening?

We’ll analyze traffic and competitors and develop a plan to attract qualified visitors.

I want interested visitors

What Stops Visitors?

We’ll identify potential road blocks on your site and develop a testing strategy to remove them.

I want more business

An Untouched Website Dies

We’ll develop a simple yet effective plan to continually improve your site.

I want visitors and business
/* READING VIEW TIME ------------------------------------------------------------------------- Purpose: Log user page viewing time at 3, 5 and 15 seconds. Code Author: Angie Schottmuller. Note: By default, GA recognizes a logged event as an "interaction". As a result of calling the following event, GA will NOT count visits exceeding a 5-second view time in its bounce rate calculation. (a.k.a. 'adjusted bounce rate') -------------------------------------------------------------------------------------------- */ // 3-Second View Tracking (Early bounce check) *NON-INTERACTION* setTimeout("ga('send','event', 'Reading', ' Viewed 3 Seconds+', 'Page: '+ location.pathname.toLowerCase())",3000, {'nonInteraction': 1}); // 5-Second View Tracking -- 'NON-BOUNCE' INTERACTION (ADJUSTED BOUNCE RATE) setTimeout("ga('send','event', 'Reading', ' Viewed 5 Seconds+', 'Page: '+ location.pathname.toLowerCase())",5000, {'nonInteraction': 0}); // 15-Second View Tracking -- 'STICK' INTERACTION setTimeout("ga('send','event', 'Reading', ' Viewed 15 Seconds+', 'Page: '+ location.pathname.toLowerCase())",15000, {'nonInteraction': 0}); /* READING SCROLL BEHAVIOR ------------------------------------------------------------------------- Purpose: Log user page viewing time at the point they scroll beyond fold (area displayed for respective screen size) and scroll all the way to the bottom. >> REQUIRES jQuery code inclusion. << Code Author: Justin Cutroni / Modified by Angie Schottmuller. Original Source: http://cutroni.com/blog/2014/02/12/advanced-content-tracking-with-universal-analytics/ --------------------------------------------------------------------------------------------------- */ jQuery(function($) { // Debug flag var debugMode = false; // Default time delay before checking location var callBackTime = 100; // Every 0.1 seconds // # px before tracking a reader var readerLocation = 150; // Set some flags for tracking & execution var timer = 0; var scroller = false; var didComplete = false; // Set some time variables to calculate reading time var startTime = new Date(); var beginning = startTime.getTime(); var totalTime = 0; var foldToBottomTime = 0; var nonInteraction = 0; // Default to the event impacting bounce rate // Get some information about the current page var eventLabel = "Page: " + location.pathname.toLowerCase(); var browserscreenheight = $(window).height(); // Check the location and track user function trackLocation() { // .scrollTop = The vertical scroll position is the same as the number of pixels that are hidden from view above the scrollable area. If the scroll bar is at the very top, or if the element is not scrollable, this number will be 0. bottom = browserscreenheight + $(window).scrollTop(); // Browser Viewport Height + Scrolled Pixels Out of View height = $(document).height(); // HTML document height // If user starts to scroll send an event ("Scroll Beyond Fold", fka "StartReading") if (bottom > readerLocation && !scroller) { currentTime = new Date(); scrollStart = currentTime.getTime(); timeToScroll = Math.round((scrollStart - beginning) / 1000); if (timeToScroll < 5) { // If ABR threshold isn't set, count as non-interaction so bounce-rate is not impacted. nonInteraction = 1; } if (!debugMode) { ga('send', 'event', 'Reading', 'Scroll Beyond Fold', eventLabel + '; Fold: ' + browserscreenheight + 'px; Scroll Start: ' + timeToScroll + 's', browserscreenheight, {'nonInteraction': nonInteraction}); } else { alert('Scroll Beyond Fold ' + timeToScroll); } scroller = true; } // If user has hit the bottom of page send an event ("Scroll to Bottom", fka "PageBottom") if (bottom >= height && !didComplete) { currentTime = new Date(); end = currentTime.getTime(); totalTime = Math.round((end - beginning) / 1000); // Total time to get to the bottom foldToBottomTime = Math.round((end - scrollStart) / 1000); // Time from first scrolling to page bottom if (totalTime < 5) { // If ABR threshold isn't set, count as non-interaction so bounce-rate is not impacted. nonInteraction = 1; } if (!debugMode) { ga('send', 'event', 'Reading', 'Scroll to Bottom', eventLabel + '; Top-to-Bottom Time: ' + totalTime + 's; Fold-to-Bottom Time: ' + foldToBottomTime + ' seconds', totalTime, {'nonInteraction': nonInteraction}); } else { alert('Scroll to Bottom '+totalTime); } didComplete = true; } } // END: function trackLocation(); // Track the scrolling with page view time ------------------------------------------------------------------- $(window).scroll(function() { // Use a buffer so we don't call trackLocation too often. if (timer) { clearTimeout(timer);} // Don't call if both events have been satisfied if (!scroller || !didComplete) { if (!debugMode) { timer = setTimeout(trackLocation, callBackTime); } } // END: Check if both scroll events have been logged }); // END: Add function to the window's scroll event }); // END: READING SCROLL BEHAVIOR /* .-. "R2-D2, are you sure this will track key events /_ _\ / for optimization audits? It looks dreadful." |o^o| \ _ / .-'-'-. "BEE DEEP BLEEP BEE ARRR BLOOP" /`) . (`\ (a.k.a. Yes, Jedi Master Schottmuller would not lead us astray.) / /|.-'-.|\ \ / \ \| (_) |/ / .-""-. \_\'-.-'/_/ /[] _ _\ /_/ \_/ \_\ _|_o_LII|_ |'._.'| / | ==== | \ | | | |_| ==== |_| \_|_/ ||" || || |-|-| ||LI o || |_|_| ||'----'|| /_/ \_\ /__| |__\ DYNAMIC CLICK EVENT TRACKING ------------------------------------------------------------------------- Purpose: Upon click action, dynamically track events for: jump-to bookmarks/tabs, file downloads, mailto:, tel: click-to-call, and external domain links. Code Author: Angie Schottmuller Original Source: ? ------------------------------------------------------------------------------------------------------- */ function _gaLt(event){ var el = event.srcElement || event.target; /* Loop up the tree through parent elements if clicked element is not a link (eg: an image inside a link) */ while(el && (typeof el.tagName == 'undefined' || el.tagName.toLowerCase() != 'a' || !el.href)) el = el.parentNode; var track = false; var evCat = ""; var evAction = ""; var evLabel = ""; var filetypes = /\.(avi|doc.*|dmg|exe|flv|mov|mp3|pdf|ppt.*|rar|txt|wav|wma|wmv|xls.*|xlt.*|zip)$/i; if(el && el.href){ if(el.hash !==""){ /* jump-to bookmark anchor */ evCat = "Interact"; // NOTE: Ensure all clickable page elements have ID attributes for this to work properly evAction = "Jump to " + el.hash + " from #" + el.id; evLabel = "Page: " + document.location.pathname.toLowerCase(); track = true; } else if(el.href.match(filetypes)){ /* file download */ /* REVISIT: Determine if file downloads on the same server should be tracked as virtual page views, events, or both. */ var extension = el.href.substr( (el.href.lastIndexOf('.') +1) ); evCat = "Download"; evAction = "Download-" + extension.toUpperCase(); evLabel = "File: " + el.href.toLowerCase() + ", Page: " + document.location.pathname.toLowerCase(); track = true; } else if(el.href.match(/^mailto\:/i) ){ /* mailto: */ evCat = "Contact"; evAction = "Email Click"; evLabel = "Email: " + el.href.replace(/^mailto\:/i, '') + "; Page: " + document.location.pathname.toLowerCase(); track = true; } else if(el.href.match(/^tel\:/i) ){ /* tel: click-to-call */ evCat = "Contact"; evAction = "Click-to-Call"; evLabel = "Call: " + el.href.replace(/^tel\:/i, '') + "; Page: " + document.location.pathname.toLowerCase(); track = true; } else if(el.href.indexOf(location.host) == -1){ /* external link */ /* FINISH - Confirm this adequately covers external links */ evCat = "Outgoing Links"; evAction = "Link: " + el.href; evLabel = "Page: " + document.location.pathname.toLowerCase(); track = true; } if (track) { // Log the event ga("send", "event", evCat, evAction, evLabel); /* if target not set then delay opening of window by 0.5s to allow tracking */ if(!el.target || el.target.match(/^_(self|parent|top)$/i)){ setTimeout(function(){ document.location.href = el.href; }.bind(el),500); /* Prevent standard click */ event.preventDefault ? event.preventDefault() : event.returnValue = !1; } } } } /* Attach the event to all clicks in the document after page has loaded */ var w = window; w.addEventListener ? w.addEventListener("load",function(){document.body.addEventListener("click",_gaLt,!1)},!1) : w.attachEvent && w.attachEvent("onload",function(){document.body.attachEvent("onclick",_gaLt)}); // END: DYNAMIC CLICK EVENT TRACKING