Facebook multiple pixels

Honit lidi na sociálních sítích je dřina a k tomu nám dopomáhej pixel. A čím více pixelů, tím více konverzí.

Správně byste na stránkách měli mít jen jeden facebook pixel a v případě, že jej potřebujete replikovat do dalších účtů, máte si zřídit Facebook for business a všechny reklamní účty pod něj nalinkovat a zapnout sdílení dat.

Teorie dobrá, ale narazil jsem na situaci, kdy klient přecházel od jedné mediální agentury pod vlastní účty a v jeden čas potřebovali jet paralelně na dvou pixelech. Mediálka zásadně odmítala účty propojovat.

Klasický facebook loader

// @start Facebook page view code
!function(f,b,e,v,n,t,s){
if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');

fbq('init', '6541231454');
fbq('track', "PageView");

No a další takový trakař tam nechcete tahat. A on i pak Facebook prská, že máte duplicitní trakaře na stránce.

Druhý trakař

Jak tedy navrhnout vlastní trakař, co se tváří jako facebookový originál, ale má 1/12 velikost?

Začneme odposlouchávat traffic Charlesem. Časem zjistíme, co jsou konstanty, co jsou uživatelské vstupy a co je sbíráno z webu.

Primárně tedy budeme potřebovat tato data:

var payload = {
	'id': fbid,
	'ev': event,
	'dl': window.document.location,
	'rl': '',
	'if': 'false',
	'ts': (new Date).getTime(),
	'v': '2.5.0',
	'pv': 'visible'
};

Tak teď už k tomu jen dopsat kudrlinky a tradá… trakař je na světě.

var facebook_tmp_tracker = "fbq_tmp";

(function(w){

	var merge_options=function(a,b){var c={};for(var d in a)c[d]=a[d];for(var d in b)c[d]=b[d];return c};

	var serialize=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")};

	var createImage=function(a){var b=new Image;b.src=a};

	w[facebook_tmp_tracker] = function(action,event,params){
	 	if(action == "track" && typeof(event)=="string" ){

	 		var fbid = w[facebook_tmp_tracker+"ID"] || '0';
			var payload = {
				'id': fbid,
				'ev': event,
				'dl': window.document.location,
				'rl': '',
				'if': 'false',
				'ts': (new Date).getTime(),
				'v': '2.5.0',
				'pv': 'visible'
			}; 

			if(typeof(params)=="object"){
				payload = merge_options(payload,params);
			}

			// Prepare URL
			var collector = "https://www.facebook.com/tr/";
			var src = collector+"?"+serialize(payload);
			 
			// Request server for image
			createImage(src);
	 	}
	 	else if(action == "init"){
	 		w[facebook_tmp_tracker+"ID"] = event;
	 	}
	 	else {
	 		console.log("FB tracker called with incorrect parameters");
	 	}
	}

})(window,facebook_tmp_tracker);


window[facebook_tmp_tracker]('init', '54854524');
window[facebook_tmp_tracker]('track', "PageView");

Jen si to zkuste, rázem máme na webu dva facebook trakaře a nikoho to netrápí.

Co když chci trakaře tři?

Není problém, script zkopírujeme a změníme jen proměnné facebook_tmp_tracker .

var facebook_tmp_tracker2="fbq_tmp2";

// Alternativní loader (minifikovaná verze)
!function(a){var b=function(a,b){var c={};for(var d in a)c[d]=a[d];for(var d in b)c[d]=b[d];return c},c=function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));return b.join("&")},d=function(a){var b=new Image;b.src=a};a[facebook_tmp_tracker]=function(e,f,g){if("track"==e&&"string"==typeof f){var h=a[facebook_tmp_tracker+"ID"]||"0",i={id:h,ev:f,dl:window.document.location,rl:"",if:"false",ts:(new Date).getTime(),v:"2.5.0",pv:"visible"};"object"==typeof g&&(i=b(i,g));var j="https://www.facebook.com/tr/",k=j+"?"+c(i);d(k)}else"init"==e?a[facebook_tmp_tracker+"ID"]=f:console.log("FB tracker called with incorrect parameters")}
}(window,facebook_tmp_tracker2);

window[facebook_tmp_tracker2]('init', '6546121');
window[facebook_tmp_tracker2]('track', "PageView");

Proč takhle?

V moměntě, kdy se zbavíte staré mediálky, tak jen změníte hodnoty proměnné facebook_tmp_tracker  na fbq a jedete na centrálním trackeru. Jde o to, že už se pak nemusí příliš zasahovat do aplikace. Což šetří čas i peníze.

Druhá možnost je mít implementovány paraleně různé strategie. Jedna mediálka chce trackovat speciální promo akce, druhá se specializuje na brand awareness.

Disclamer

Script si rozhodně nehraje na oficiální náhražku trakaře od facebooku, má velmi omezené možnosti (zvládá jen základní trackovací věci, co facebook ve verzi 2.5.0 nabízel). Obávám se, že může být problém s trackováním transakcí a podobné, advanced věci. Ale účel tohoto scriptu je na míle daleko od toho a i tak by to nějak šlo ohackovat, kdyby to někdo potřeboval.

Je možné, že v některých browserech nepojede, ale to mě netrápí. Script spokojeně používám několik let a nikdo si nestěžoval. Navíc má jen 800 bajtů, takže nikoho neotravuje.