Vergelijk Sim Only

Vergelijk de goedkoopste sim only aanbiedingen van diverse telecomwinkels
www.vergelijksimonly.nl
Categorieën Uit mijn archief

Eigen affiliate stats: combineer meerdere netwerken

Op 27 juni 2011 door in Affiliate.

Veel affiliates werken samen met verschillende netwerken om zo een compleet aanbod op hun sites te kunnen leveren, of bijvoorbeeld om risico’s qua betalingen te spreiden. Echter, als je met meerdere netwerken zaken doet, wordt het wel steeds lastiger om een overzicht te houden van welke campagnes nou goed lopen, en welke niet.

Daarom kan het wenselijk zijn om de statistieken van de verschillende netwerken samen te voegen in een eigen affiliate systeem. Afhankelijk van hoe uitgebreid je het zelf bouwt, kun je dan de voor jou gewenste data naar boven halen. Eerste doelstelling voor mijzelf was om ÊÊn allesomvattende laatste leads pagina te bouwen, maar nadat deze basis er lag kon ik vrij eenvoudig uitbreidingen maken (daarover later meer).

PHP script om transacties (leads/sales) te downloaden van:
Affilinet
Daisycon
TradeTracker
Zanox

UPDATE: na de overname van M4N door zanox, en het daarmee verdwijnen van het systeem van M4N, is een deel van de ondergenoemde scripts overbodig geworden. In principe werken de scripts van de andere netwerken ook zonder dat je het M4N API systeem opzet, je hoeft dan enkel de database structuur op te zetten.

Als fundament voor mijn eigen statistieken systeem heb ik het API script van M4N genomen. Daarmee kun je alvast de M4N statistieken naar je eigen systeem halen, andere netwerken hoef je dan alleen nog maar toe te voegen, hetgeen ik dan ook allemaal in de m4n_api tabel heb gedaan. Mijn eerste uitbreiding was echter de toevoeging van M4Dart data waardoor ik extra informatie over de binnengekomen leads heb (bij andere netwerken gebruik je hiervoor de subid’s). Kwestie van de leadtabel uitbreiden met de gewenste velden, en het importscript dat de API aanroept iets tweaken.

M4N API interface screenshot

Nadat deze basis er stond, was het een kwestie van andere netwerken toevoegen. Omdat niet elk script even sexy code bevat zal ik hier nu eerst Daisycon, TradeTracker en Affilinet als voorbeeldcode meegeven. Doe er je voordeel mee! 😉

Leads downloaden voor TradeTracker
Allereerst zul je toegang tot de webservices van TradeTracker moeten vragen, de verificatie data kun je vervolgens in regel 7 van het script invoeren:

<?php
$link = mysql_connect($db_host, $db_user, $db_pass) or die ('Error connecting to MySQL');
mysql_select_db($db_name);

$client = new SoapClient('http://ws.tradetracker.com/soap/affiliate?wsdl', array('compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP));
//vul hieronder je eigen verificatie data in
$client->authenticate(12345, '349dae9097c9809d90f0989ee8790898710ab90c');

//geef hier je eigen site ID's in, enkel leads van de genoemde sites worden opgehaald (je kunt de lijst rustig langer maken)
$siteIDs = array();
$siteIDs[0] = 123;
$siteIDs[1] = 456;
$siteIDs[2] = 789;

$statuses = array();
$statuses[0] = 'pending';
$statuses[1] = 'accepted';
$statuses[2] = 'rejected';

for ($e = 0; $e < count($siteIDs); $e++)
	{
	$affiliateSiteID = $siteIDs[$e];
	$fromdate = date("Y-m-d", strtotime("-3 months"));
	$todate = date("Y-m-d");
	for ($i = 0; $i < count($statuses); $i++)
		{
		$leadstatus = $statuses[$i];
		$options = array (
			'registrationDateFrom' => $fromdate,
			'registrationDateTo' => $todate,
			'transactionStatus' => $leadstatus
		);

		//geef in de database netjes mee van welk netwerk deze leads komen
		$network = 'tradetracker';
		$leadstatuses = array();
		//elk netwerk gebruikt zijn eigen statussen, hieronder worden ze omgezet tot de standaard die het M4N script hanteert
		$leadstatuses['pending'] = 'TO_BE_APPROVED';
		$leadstatuses['accepted'] = 'ACCEPTED';
		$leadstatuses['rejected'] = 'REJECTED';

		foreach ($client->getConversionTransactions($affiliateSiteID, $options) as $transaction)
			{
			$leadid = $transaction->ID;
			$leaddescription = $transaction->description;
			$leadreward = $transaction->commission;
			$leadstatus = $transaction->transactionStatus;
			$leadstatus = $leadstatuses[$leadstatus];

			//Check if lead exists
			$SQL_check="SELECT id FROM m4n_api where id='".$leadid."'";
			$SQL_check_res=mysql_query($SQL_check);
			$SQL_check_aantal=mysql_num_rows($SQL_check_res);

			//Row exists, update row
			if($SQL_check_aantal>0)
				{
				$SQL_update="UPDATE `".$db_name."`.`m4n_api` SET
				description='".$leaddescription."',
				reward='".$leadreward."',
				status='".$leadstatus."'
				WHERE
				id='".$leadid."'
				";
				$SQL_update_res=mysql_query($SQL_update);
				}
			else
				{
				$leadleadtime = $transaction->registrationDate;
				$leadleadtime = str_replace("T", " ", $leadleadtime);
				$leadmerchant = $transaction->campaign->name;
				$leadmerchantid = $transaction->campaign->ID;
				$leadprice = $transaction->orderAmount;
				$hash = $transaction->reference;

				$SQL_insert="INSERT into `".$db_name."`.`m4n_api`
				(
					id,
					leadtime,
					description,
					merchant,
					merchantID,
					price,
					reward,
					status,
					m4dadvn,
					network
				)
				values
				(
					'".$leadid."',
					'".$leadleadtime."',
					'".$leaddescription."',
					'".$leadmerchant."',
					'".$leadmerchantid."',
					'".$leadprice."',
					'".$leadreward."',
					'".$leadstatus."',
					'".$hash."',
					'".$network."'
				)";

				$SQL_insert_res=mysql_query($SQL_insert);
				}
			}
		}
	}
?>


Leads downloaden voor Affilinet
Ook bij Affilinet zul je eerst toegang tot de webservices moeten vragen, en deze verificatie data kun je dan in regel 9 van het Affilinet script invoeren:

<?php
$link = mysql_connect($db_host, $db_user, $db_pass) or die ('Error connecting to MySQL');
mysql_select_db($db_name);

define ("WSDL_LOGON", "https://api.affili.net/V2.0/Logon.svc?wsdl");
define ("WSDL_STATS",  "https://api.affili.net/V2.0/PublisherStatistics.svc?wsdl");

$Username   = '123456'; // the publisher ID
$Password   = 'Mafdsafda5ffoLafafdhP74asfgN1otNo'; // the publisher web services password

$SOAP_LOGON = new SoapClient(WSDL_LOGON);
$Token      = $SOAP_LOGON->Logon(array(
             'Username'  => $Username,
             'Password'  => $Password,
             'WebServiceType' => 'Publisher'
             ));

//Bij affilinet is het aantal leads dat je per request kunt ophalen beperkt, pas je StartDate en EndDate daarop aan (bij meer leads kun dan je meerdere requests doen)
$StartDate = strtotime("-1 months");
$EndDate   = strtotime("-1 minutes");
$Status	= 'All';

$params = array(
		'StartDate' => $StartDate,
		'EndDate' => $EndDate,
		'TransactionStatus' => $Status
        );

$pagesize = array(
		'CurrentPage' => 1,
		'PageSize' => 100
        );

$SOAP_REQUEST = new SoapClient(WSDL_STATS);
$req = $SOAP_REQUEST->GetTransactions(array(
            'CredentialToken' => $Token,
            'TransactionQuery' => $params,
			'PageSettings' => $pagesize
            ));

//geef in de database netjes mee van welk netwerk deze leads komen
$network = 'affilinet';
$leadstatuses = array();
//elk netwerk gebruikt zijn eigen statussen, hieronder worden ze omgezet tot de standaard die het M4N script hanteert
$leadstatuses['Open'] = 'TO_BE_APPROVED';
$leadstatuses['Confirmed'] = 'ACCEPTED';
$leadstatuses['Cancelled'] = 'REJECTED';

if(!empty($req))
	{
	$salescount = $req->TotalRecords;
	//print 'REQUEST SUCCESFUL: '.$salescount.' transactions.<br>';
	if ($salescount > 1)
		{
		for ($e = 0; $e < $salescount; $e++)
			{
			$leadid = $req->TransactionCollection->Transaction[$e]->TransactionId;
			$leaddescription = $req->TransactionCollection->Transaction[$e]->RateInfo->RateDescription;
			$leadreward = $req->TransactionCollection->Transaction[$e]->PublisherCommission;
			$leadstatus = $req->TransactionCollection->Transaction[$e]->TransactionStatus;
			$leadstatus = $leadstatuses[$leadstatus];
			//print $leadid.' - '.$leadstatus.'<br>';

			//Check if lead exists
			$SQL_check="SELECT id FROM m4n_api where id='".$leadid."'";
			$SQL_check_res=mysql_query($SQL_check);
			$SQL_check_aantal=mysql_num_rows($SQL_check_res);

			//Row exists, update row
			if($SQL_check_aantal>0)
				{
				$SQL_update="UPDATE `".$db_name."`.`m4n_api` SET
				description='".$leaddescription."',
				reward='".$leadreward."',
				status='".$leadstatus."'
				WHERE
				id='".$leadid."'
				";
				$SQL_update_res=mysql_query($SQL_update);
				}
			else
				{
				$leadclicktime = $req->TransactionCollection->Transaction[$e]->ClickDate;
				$leadclicktime = str_replace("T", " ", $leadclicktime);
				$leadleadtime = $req->TransactionCollection->Transaction[$e]->RegistrationDate;
				$leadleadtime = str_replace("T", " ", $leadleadtime);
				$leadmerchant = $req->TransactionCollection->Transaction[$e]->ProgramTitle;
				$leadmerchantid = $req->TransactionCollection->Transaction[$e]->ProgramId;
				$leadprice = $req->TransactionCollection->Transaction[$e]->NetPrice;
				$hash = $req->TransactionCollection->Transaction[$e]->SubId;

				$SQL_insert="INSERT into `".$db_name."`.`m4n_api`
				(
					id,
					clicktime,
					leadtime,
					description,
					merchant,
					merchantID,
					price,
					reward,
					status,
					m4dadvn,
					network
				)
				values
				(
					'".$leadid."',
					'".$leadclicktime."',
					'".$leadleadtime."',
					'".$leaddescription."',
					'".$leadmerchant."',
					'".$leadmerchantid."',
					'".$leadprice."',
					'".$leadreward."',
					'".$leadstatus."',
					'".$hash."',
					'".$network."'
				)";

				$SQL_insert_res=mysql_query($SQL_insert);
				}
			}
		}
	else
		{
		$leadid = $req->TransactionCollection->Transaction->TransactionId;
		$leaddescription = $req->TransactionCollection->Transaction->RateInfo->RateDescription;
		$leadreward = $req->TransactionCollection->Transaction->PublisherCommission;
		$leadstatus = $req->TransactionCollection->Transaction->TransactionStatus;
		$leadstatus = $leadstatuses[$leadstatus];
		//print $leadid.' - '.$leadstatus.'<br>';

		//Check if lead exists
		$SQL_check="SELECT id FROM m4n_api where id='".$leadid."'";
		$SQL_check_res=mysql_query($SQL_check);
		$SQL_check_aantal=mysql_num_rows($SQL_check_res);

		//Row exists, update row
		if($SQL_check_aantal>0)
			{
			$SQL_update="UPDATE `".$db_name."`.`m4n_api` SET
			description='".$leaddescription."',
			reward='".$leadreward."',
			status='".$leadstatus."'
			WHERE
			id='".$leadid."'
			";
			$SQL_update_res=mysql_query($SQL_update);
			}
		else
			{
			$leadclicktime = $req->TransactionCollection->Transaction[$e]->ClickDate;
			$leadclicktime = str_replace("T", " ", $leadclicktime);
			$leadleadtime = $req->TransactionCollection->Transaction[$e]->RegistrationDate;
			$leadleadtime = str_replace("T", " ", $leadleadtime);
			$leadmerchant = $req->TransactionCollection->Transaction[$e]->ProgramTitle;
			$leadmerchantid = $req->TransactionCollection->Transaction[$e]->ProgramId;
			$leadprice = $req->TransactionCollection->Transaction[$e]->NetPrice;
			$hash = $req->TransactionCollection->Transaction[$e]->SubId;

			$SQL_insert="INSERT into `".$db_name."`.`m4n_api`
			(
				id,
				clicktime,
				leadtime,
				description,
				merchant,
				merchantID,
				price,
				reward,
				status,
				m4dadvn,
				network
			)
			values
			(
				'".$leadid."',
				'".$leadclicktime."',
				'".$leadleadtime."',
				'".$leaddescription."',
				'".$leadmerchant."',
				'".$leadmerchantid."',
				'".$leadprice."',
				'".$leadreward."',
				'".$leadstatus."',
				'".$hash."',
				'".$network."'
			)";

			$SQL_insert_res=mysql_query($SQL_insert);
			}
		}
	}
else
	{
	print 'AFFILINET LEAD SCRIPT ERROR: EMPTY REQUEST';
	}
?>


Sales downloaden van Daisycon
Bij Daisycon heb je automatisch toegang tot de API, je kunt hiervoor je reguliere gebruikersnaam en het bijbehorende wachtwoord in het PHP script invoeren.

<?php
$link = mysql_connect($db_host, $db_user, $db_pass) or die ('Error connecting to MySQL');
mysql_select_db($db_name);

//voer je gebruikersnaam / wachtwoord in
$sUsername = 'enteryourusername';
$sPassword = 'enteryourpassword';
$sWsdl = "http://api.daisycon.com/publisher/soap/transaction/wsdl/";
$aOptions = array(
	'login'		=> $sUsername,
	'password'	=> md5($sPassword),
	'features'	=> SOAP_SINGLE_ELEMENT_ARRAYS,
	'encoding'	=> 'utf-8',
	'trace'		=> 1,
);

//Bij Daisycon kun je per request data van maximaal 3 maanden ophalen, pas je selection_start en selection_end aan en maak een nieuw request als je meer dan 3 maanden wil downloaden (enkel nodig als je sales langer dan 90 dagen open staan)
$aFilter = array(
	'selection_start'	=> date('Y-m-d', strtotime('-3 months')),
	'selection_end'		=> date('Y-m-d'),
	'offset'			=> 0
);

$oSoapClient = new SoapClient($sWsdl, $aOptions);
$aResult = $oSoapClient->getTransactions($aFilter);

//geef in de database netjes mee van welk netwerk deze leads komen
$network = 'daisycon';

$leadstatuses = array();
$leadstatuses['open'] = 'TO_BE_APPROVED';
$leadstatuses['pending'] = 'TO_BE_APPROVED';
$leadstatuses['confirmed'] = 'ACCEPTED';
$leadstatuses['rejected'] = 'REJECTED';

for ($i = 0; $i < $aResult['responseInfo']->totalResults; $i++)
	{
	//Check if lead exists
	$SQL_check="SELECT id FROM m4n_api where id='".$aResult['return'][$i]->affiliatemarketing_id."'";
	$SQL_check_res=mysql_query($SQL_check);
	$SQL_check_aantal=mysql_num_rows($SQL_check_res);

	if($SQL_check_aantal>0)
		{
		//Row exists, update row
		$SQL_update="UPDATE `".$db_name."`.`m4n_api` SET
		description='".$aResult['return'][$i]->description."',
		reward='".$aResult['return'][$i]->commision."',
		status='".$leadstatuses[$aResult['return'][$i]->status]."'
		WHERE
		id='".$aResult['return'][$i]->affiliatemarketing_id."'
		";

		$SQL_update_res=mysql_query($SQL_update);
		}
	else
		{
		//Insert new row
		$pattern = '/([0-9]{2})-([0-9]{2})-([0-9]{4})[ ]([0-9]{2})[:]([0-9]{2})/';
		$replacement = '$3-$2-$1 $4:$5:00';

		$clicktime = $aResult['return'][$i]->date_click;
		$clicktime = preg_replace($pattern, $replacement, $clicktime);

		$leadtime = $aResult['return'][$i]->date_transaction;
		$leadtime = preg_replace($pattern, $replacement, $leadtime);

		$SQL_insert="INSERT into `".$db_name."`.`m4n_api`
		(
			id,
			clicktime,
			leadtime,
			description,
			ipaddress,
			merchant,
			merchantID,
			price,
			reward,
			status,
			m4dadvn,
			network
		)
		values
		(
			'".$aResult['return'][$i]->affiliatemarketing_id."',
			'".$clicktime."',
			'".$leadtime."',
			'".$aResult['return'][$i]->description."',
			'".$aResult['return'][$i]->ip."',
			'".$aResult['return'][$i]->program_name."',
			'".$aResult['return'][$i]->program_id."',
			'".$aResult['return'][$i]->revenue."',
			'".$aResult['return'][$i]->commision."',
			'".$leadstatuses[$aResult['return'][$i]->status]."',
			'".$aResult['return'][$i]->sub_id."',
			'".$network."'
		)";
		$SQL_insert_res=mysql_query($SQL_insert);
		}
	}
?>


Sales downloaden van Zanox
Bij Zanox moet je sowieso de ApiClient.php nog even downloaden en op je server plaatsen. Verder werkt onderstaand script vergelijkbaar met de eerder genoemde netwerken, zodat alles in 1 database terecht komt.

<?php
require_once('client/ApiClient.php');

$link = mysql_connect($db_host, $db_user, $db_pass) or die ('Error connecting to MySQL');
mysql_select_db($db_name);

$client = ApiClient::factory(PROTOCOL_SOAP);
//vul hieronder je eigen API credentials in
$client->setConnectId('61E8CCD31F914ABBC546');
$client->setSecretKey('1234567/1234abc');
$network = 'zanox';

for ($days = 0; $days < 91; $days++)
	{
	$date = mktime(0,0,0,date(m),date(d)-$days,date(Y));
	$date = date('Y-m-d', $date);
	
	$sales = $client->getSales($date, 'trackingDate', NULL, NULL, NULL, 0, 50);
	//print_r($sales);
	$leadstatuses = array();
	$leadstatuses['open'] = 'TO_BE_APPROVED';
	$leadstatuses['confirmed'] = 'ACCEPTED';
	$leadstatuses['approved'] = 'ACCEPTED';
	$leadstatuses['rejected'] = 'REJECTED';

	$pattern = '/([0-9]{4})-([0-9]{2})-([0-9]{2})[T]([0-9]{2})[:]([0-9]{2})[:]([0-9]{2})\\.([0-9]{3})\\+([0-9]{2})[:]([0-9]{2})/';
	$replacement = '$1-$2-$3 $4:$5:$6';

	for ($i = 0; $i < $sales->total; $i++)
		{
		$leadid = $sales->saleItems->saleItem[$i]->id;
		$clicktime = $sales->saleItems->saleItem[$i]->clickDate;
		$clicktime = preg_replace($pattern, $replacement, $clicktime);
		$leadtime = $sales->saleItems->saleItem[$i]->trackingDate;
		$leadtime = preg_replace($pattern, $replacement, $leadtime);
		$merchant = $sales->saleItems->saleItem[$i]->program->_;
		$merchantid = $sales->saleItems->saleItem[$i]->program->id;
		$leaddescription = $sales->saleItems->saleItem[$i]->trackingCategory->_;
		$leadprice = $sales->saleItems->saleItem[$i]->amount;
		$leadreward = $sales->saleItems->saleItem[$i]->commission;
		$leadstatus = $sales->saleItems->saleItem[$i]->reviewState;
		$leadstatus = $leadstatuses[$leadstatus];
		$hash = $sales->saleItems->saleItem[$i]->gpps->gpp[0]->_;
		
		//Check if lead exists
		$SQL_check="SELECT id FROM m4n_api where id='".$leadid."'";
		$SQL_check_res=mysql_query($SQL_check);
		$SQL_check_aantal=mysql_num_rows($SQL_check_res);

		if($SQL_check_aantal>0)
			{
			//Row exists, update row
			$SQL_update="UPDATE `".$db_name."`.`m4n_api` SET 
			description='".$leaddescription."',
			reward='".$leadreward."',
			status='".$leadstatus."' 
			WHERE 
			id='".$leadid."'
			";

			$SQL_update_res=mysql_query($SQL_update);
			}
		else
			{
			//Insert new row

			$SQL_insert="INSERT into `".$db_name."`.`m4n_api`
			(
				id,
				clicktime,
				leadtime,
				description,
				merchant,
				merchantID,
				price,
				reward,
				status,
				m4dadvn,
				network
			)
			values
			(
				'".$leadid."',
				'".$clicktime."',
				'".$leadtime."',
				'".$leaddescription."',
				'".$merchant."',
				'".$merchantid."',
				'".$leadprice."',
				'".$leadreward."',
				'".$leadstatus."',
				'".trim($hash)."',
				'".$network."'
			)";
			$SQL_insert_res=mysql_query($SQL_insert);
			}
		}
	}

Met deze scripts heb je in ieder geval al 5 netwerken in je eigen affiliate statistieken opgenomen. Uitbreidingen naar andere affiliate netwerken kun je op basis hierval wellicht zelf uitwerken.

Een extra functionaliteit die ik zelf nog heb toegevoegd is een koppeling naar al mijn clicks. Hiervoor sla ik alle uitgaande clicks op inclusief data zoals traffic source, keywords en pagina waarop de click is gedaan. Door de click data te combineren met alle leads, kun je voor jezelf een overzicht maken van de omzet per site, best presterende pagina’s, beste keywords etc. Je kunt het zo gek maken als je zelf wilt, maar belangrijkste is dat je de data boven tafel haalt, waarop je ook daadwerkelijk actie wilt ondernemen.

N.B. Let erop dat bovenstaande PHP scripts aangepast dienen te worden op je eigen situatie. Zelf heb ik voor extra data enkele kolommen in de database toegevoegd; als een script voor jou niet werkt, check dan of alle benodigde kolommen in je database aanwezig zijn.

10 reacties op “Eigen affiliate stats: combineer meerdere netwerken”

  1. Albert Knol zegt:

    Ruud,

    Hoe verwerk ik bovengenoemde php codes? Maak ik hier een speciale function voor aan (bijv function_tt.php) ? Dit heb ik gedaan met bovengenoemde code en mijn eigen waarden ingevuld. Maar het script haalt dan niets binnen. Wat doe ik verkeerd?

  2. Ruud Kok zegt:

    Dit script is gebouwd om data uit andere systemen in te laden in het script van M4N. Als je dat hebt draaien, zet je bovenstaande scripts in aparte bestanden die je via een cronjob zo nu en dan laat draaien.

    Om te kijken of je uberhaupt data binnenkrijgt van TradeTracker kun je ook de data in $client afdrukken.

    Zet hiervoor in regel 41 van het TT script:
    print_r($client);

    of in regel 48 van het Affilinet script:
    print_r($req);

  3. Edwin zegt:

    Mooi Ruud! Handig voor veel mensen denk ik. We gaan even kijken of we het M4N script ook automatisch met Zanox data kunnen aanvullen.

  4. Ruud Kok zegt:

    @Edwin: Dat is goed nieuws 🙂

  5. Steffan zegt:

    Voor diegenen die bovenstaande te complex vinden om zelf een statistieken applicatie in elkaar te draaien heb ik het (voor)werk al gedaan.

    Neem eens een kijkje op http://bit.ly/OverUAS 🙂

  6. Albert Knol zegt:

    Ben wel benieuwd hoe die ervoor Zanox dan uitziet…

  7. Kor zegt:

    Ik stem in met Albert Knol!

  8. Tom zegt:

    Hallo Ruud,

    Ziet er prima uit. Ik zou alleen je eigen gebruikersnaam/wachtwoord
    even wijzigen in de code voor affili.net

    Mvg, Tom

  9. Roy zegt:

    Beste Ruud en lezers,

    Is er iemand die dit voor mij werkend kan maken?
    Voor meerdere netwerken? Of op weg kan helpen?

    Of zijn er inmiddels andere tools voor handen om al je statistieken uit alle netwerken in te zien?

    MvG,

    Roy

  10. Rutger zegt:

    Thnx! Precies wat ik zocht!

    Binnenkort maar eens implementeren en mijn overige aff netwerken toevoegen.

Laat een reactie achter

Overig

© Ruud Kok 2006-2014 - Cookiebeleid

Deze website maakt gebruik van cookies. Waarom? Klik HIER voor meer informatie.      Sluit