Rudi Shumpert : Code By Numbers
6Oct/100

Eloqua Form Conversions

A while back I ran into an issue when working to integrate a set of self hosted Eloqua forms on our site.  The issue was compounded by two main items.

1) The forms in question existed or could be presented on almost any page on the site via an ajax modal.

2) All of the forms on the site post to a central object for validation and are then submitted from a secondary page/function.

These two items caused the form to lose the vital Eloqua cookie information which helps to reduce duplicate data and other unpleasantries.  And trust me, no one wants to see a form toss it's cookies.

As it turns out, I was not the only one having this issue.  After a bit of research I found this article on the Eloqua Artisan (http://eloqua.blogspot.com/2010/03/using-form-reposts-for-advanced-form.html) blog that was most helpful in crafting a solution.  I would also like to mention that Steve Woods of Eloqua was very helpful in his fast responses to my questions about the blog post.

The challenge was to take the ideas from this article and apply them to our specific need.  Here is the approach that I took.

Step 1. Create 2 form elements on each form to hold the required information:

<input type="hidden" name="elqCustomerGUID" id="elqCustomerGUID" value="" />
<input type="hidden" name="elqCookieWrite" id="elqCookieWrite" value="0" />

The second element "elqCookieWrite" should always pass a value of 0, the first element will eventually hold the cookie value.

Step 2. Get the cookie value from the Eloqua cookie and pass it into the new form element.To accomplish this, is to use a bit more of the provided Eloqua scripts than the standard install requires.  The code below uses some simple jQuery and an Eloqua specific JavaScript function  "GetElqCustomerGUID" to get the cookie value and then force the value into the newly created form element.

 <script>    var elqPPS = '70'; </script>
 <SCRIPT TYPE='text/javascript' SRC='/core/tracking/elqNow/elqScr.js'></SCRIPT>
 <script>
 $(document).ready(function(){
 $('#elqCustomerGUID').val(GetElqCustomerGUID());
 });
 </script>
 

Now when the form is presented on the page, this code will use the Eloqua function and pass it to our central form processing object.  Doing this allows the form to behave as if it directly posted to Eloqua, but this way you will maintain complete control of all of the form processing steps, including the user experience.

21Jul/102

Share This Page – On Your Terms!

Build your own "Share this page" feature!

Not too long ago I added one of the "Share this page" scripts, AddToAny, to our web site.  This seemed like it was going to work fine but this approach had 3 major drawbacks.

  1. Most of these services require you to link to their JavaScript file on their servers.  Sure this is fairly reliable but I am not a fan of this approach.
  2. Limited tracking / analytic capabilities.
  3. Cookies you can not control.

The first two issues are not huge issues, but while we were testing the site, we noticed that the scripts were adding a few of their own cookies to our users.  I understand why this is, but I did not like it and the feature was pulled.  So I tested out another one, Share This, and it did the same thing. Not only do they add cookies to your users, but they are also tracking usage of their tool on your site.  I don't blame them for this, after all they are providing this as a free service but I still do not like it.

After looking at the scripts for a while I decided that it could not be that difficult to write my own "Share this page" feature.

My goal was to create a widget to let users share the current web page without the limitations listed above.  With just a wee bit of research I found the methods needed to be able to share a page via email, Twitter, Facebook, and LinkedIn. And then track the usage of data in Omniture SiteCatalyst.

<ul>
  <li><A onClick="jsFunctionToRecordClick('Email');" HREF="mailto:?subject=#variables.emailSubject#&body=#variables.emailMessage#">Email </a></li>
  <li><a onClick="jsFunctionToRecordClick('Twitter');" href="http://twitter.com/home?status=#variables.twitterLink#" target="_blank">Twitter </a></li>
  <li><a onClick="jsFunctionToRecordClick('LinkedIn');" href="http://www.linkedin.com/shareArticle?mini=true&url=www.rudishumpert.com&title=AmazingArticle&summary=This is the best ever&source=Rudi"  target="_blank">LinkedIn </a></li>
  <li><a onClick="jsFunctionToRecordClick('Facebook');" href="http://www.facebook.com/share.php?src=bm&u=#variables.currentPage#&t=#variables.twitterLink#&v=3" target="_blank">Facebook </a></li>
</ul>

Sample links without the tracking added:

And then the JS Function: Note the JS function is specific to Omniture tracking but this could be leverage for any analytic solution with some minor tweaking.

			function jsFunctionToRecordClick(category){
				var s = s_gi(s_account);
				s.linkTrackVars="events,eVarN,propN,propN";
				s.linkTrackEvents="eventN";
				s.events="eventN";
				s.eVarN=''+category+'';
				s.propN=''+category+'';
				s.propN=''+category+' | '+s.pageName+'';
				s.tl();
				s.events="";
				s.linkTrackEvents="";
				s.linkTrackVars="";
				s.eVarN='';
				s.propN='';
				s.propN='';
			}

The feature is added to the page using a jQuery menu script that creates the same mouse-over drop down effect that the free scripts use, but you can use any sort of presentation approach that fits your web site's style.

And that is it.  You know have your own custom share this web page feature that your can style however you like and maintain complete control over what cookies are used on your site and what level of tracking you would like to get out of the widget.

14Jul/100

Creating static URL’s from dynamic pages for Eloqua

Sometimes the code... it mocks me. This was the case when working with the implementation scripts from Eloqua. I followed the instructions and by default about 98% of the tracking we needed was being accomplished. The issue I encountered was trying to get Eloqua to differentiate the content being served up on a dynamic page.

One url. page.cfm?urlVariable=1 , page.cfm?urlVariable=2, page.cfm?urlVariable=3. They all showed up as page.cfm in the reports. And while Eloqua does have features that allow you to set up a query string in the admin console, you have to assign each value ahead of time and from what I have been told by folks both inside and outside of Eloqua, you are not able to use those values for certain types of behavioral tracking and filtering.

NOTE: I claim little knowledge of the inner workings of Eloqua and have had to take the word of the support folks and the documentation I could find. If you know this to be different, I would love to hear from you.

After much time spent scouring the web I found this article on an Eloqua blog.
http://eloqua.blogspot.com/2010/05/fun-with-eloqua-and-jquery-tracking-pdf.html

The author of this blog, used a secondary tracking script from Eloqua ( elqFCS.js) and leveraged this and jQuery to auto tag links to any pdf on the sample site. Seeing this approach I was pretty sure I could use this method to meet my goal.

Step 1: Add the link to the additional JS file. It should be part of the standard implementation scripts.

 <SCRIPT TYPE='text/javascript' SRC='/elqNow/elqFCS.js'></SCRIPT>
 

Step 2: Check for the dynamic page, and if found create a "static" url to send to Eloqua.

 <cfparam name="url.urlVariable" default="">
<cfif cgi.path_info EQ "/dynamicPageInQuestion.cfm" and LEN(url.urlVariable) GT 0>
	<script>
		$(document).ready(function(){
			var fullurl = '<cfoutput>http://www.yoursite.com/NameOfYourChoosing/#url.urlVariable#</cfoutput>';
			elqFCS(fullurl);
	 	});
	</script>
</cfif>

That's it! Now inside of Eloqua in addtion to seeing a visit to /dynamicPageInQuestion.cfm you will also see

http://www.yoursite.com/NameOfYourChoosing/1

http://www.yoursite.com/NameOfYourChoosing/2

http://www.yoursite.com/NameOfYourChoosing/3 etc or whatever value you need to be able to filter on.

As of now, this is working and meets the goal / need I had. I'm curious if others have dealt with this, and if so what solutions did they come up with.

18May/100

Omniture – SalesForce Integration: Take 2

In the beginner’s mind there are many possibilities.

The developer side of my brain refuses to believe that there is only one way to do things, so after spending a great deal of time and effort to integrate SalesForce data into Omniture using the standard Genesis integration I felt that there had to be another way.  If you have not read the recent posts by Adam Greco on getting CRM data into Omniture, stop reading this post and go read those first.  Then come back!

What I needed to do was find a way to get a few data points out of SalesForce and into Omniture SiteCatalyst.  The solution also needed to be automated so that it could run every 3-4 hours.  After thinking over the topics discussed is Adam's blog post I had a plan.

The Challenge:

State over time.  That is what this whole exercise comes down to.  How to get Omniture SiteCatalyst to store and measure the state of a data point over a set time.  These data points are up to you and your specific business needs.  Some examples are revenue, leads, etc..

The granular level of data you can/want to pull over is limited only by your your business objectives.  For the purpose of this post, I will only be talking about getting data at a campaign level.

The Setup:

Transaction ID's and a matching key in SalesForce.  If you can, I strongly recommend using the SalesForce campaign id's as your web analytics campaign ID's.  It give you a great 1:1 data point between the two systems.  It also makes it easy to use that campaign ID as your transaction ID.

Incrementor Events.  (2 for every data point in SalesForce that you want to integrate)  These are needed to accomplish the heavy lifting of the state over time.   If you want to track revenue attributed to a specific campaign for example, you create 2 events.  One revenue_positive event, and one revenue_negative event.   Later you will create a calculated metric to get the delta of these two events to get the actual number.

State Manager.  You have to have some mechanism to get the data out of SalesForce and then be able to determine the difference in the value of the data points you want to integrate into Omniture.  There are numerous ways that you could accomplish this, but I chose to write a custom ColdFusion / SQL solution.

The flow chart above shows at a high level all of the steps in the process.

1) Pull a list of transaction ids/ campaign ids from Omniture and store that list in a new db table.

2) Loop over that table and query SalesForce to get the data points you want to move, and store that in a second database table.

3) The very first time you run this process you are creating the state.  This copies the data into the third state database table.  Each time after that, you compare the values in the 3rd table with the data in the 2nd table.   This drives the values you pass into the incrementor events.   If the first time you pull data from SalesForce to find the revenue for a campaign is $100.00 that gets stored in the third table.  You pass 100 to the revenue_positive and 0 to the revenue_negative.  The next data pull the revenue is now 110.  After the comparison, you pass a 10 to the revenue_positive and 0 to the revenue_negative.  Now on a future data pull, you find the revenue is down to 50.  You now send a 0 in the revenue_positive and a 60 to the revenue_negative events.   When you create the calculated metric you will see the new value of 50 for that calculated metric.

<cfset variables.revenuewon_str="#variables.revenue_pos_event#=0|#variables.revenue_neg_event#=0">
<cfif variables.DIF_revenuewon EQ 0>
	<cfset variables.revenuewon_str="#variables.revenue_pos_event#=0|#variables.revenue_neg_event#=0">
<cfelseif variables.DIF_revenuewon GT 0>
	<cfset variables.revenuewon_str="#variables.revenue_pos_event#=#variables.DIF_revenuewon#|#variables.revenue_neg_event#=0">
<cfelse>
	<cfset variables.revenuewon_str="#variables.revenue_pos_event#=0|#variables.revenue_neg_event#=#ABS(variables.DIF_revenuewon)#">
</cfif>

The code sample above evaluates the difference in the data point between tables 2 and 3 and generates the string required to send the data to Omniture.

4) Push the data to Omniture.  After you create the txt file with the transaction id and the values for the events, set up an automatic ftp using the Omniture DataSources.

5) Automate.  Since the controlling code to power this process was ColdFusion, all that was required was to set up a scheduled task within the ColdFusion admin and done!

The Result:

My Photoshop-fu is weak.

Now, right inside of SiteCatalyst, you can see SalesForce data points that matter to you in your reports.  Of course, the data will look much cleaner that my mocked up image...hopefully.

5Apr/1011

Jive + Omniture + Automation = Happiness

I am a true believer in automation, so the last thing I want to do is create a process or work flow that I or someone else has to baby sit.   When I began working on a project to see what type of data I could get from Jive, an online community application, and into Ominture I wanted to make sure that the solution could be automated.

Before we get into it, there is a key point I want to make about the data.  The data base that you get from Jive is not your typical clickstream data set.  It is an activity database.  You will not get pagenames, or visitor session information.  What you will get is an activity logged for everything a users does on the community site.  Views/creates/modifies  a thread, blog post, question, poll, etc..   If the user is logged in, you get their user id, name, etc..   If the user is not logged in, they all show up as a single user. Even with this limitation, there is still plenty of useful data to be found.

Read the rest of this entry »

Get Adobe Flash playerPlugin by wpburn.com wordpress themes