The Most Active and Friendliest
Affiliate Marketing Community Online!

“Adavice”/  “CPA

Official ClickerVolt - 100% Free Tracker

Graybeard if you have a minute could you plz skype me "noorou2"
here's the file
/clickervolt$ grep -rni '\{zoneid\}' .
./db/objects/sourceTemplateModels.php:98: "{zoneid}" => "Zone"
PHP:
<?php

namespace ClickerVolt;

require_once __DIR__ . '/../tableSourceTemplates.php';

class SourceTemplateModels
{
    const BING = "Microsoft Ads (Bing Ads)";
    const GOOGLE = "Google Ads (Adwords)";
    const FB = "FB Ads";
    const MEGAPUSH = "MegaPush";
    const RICH_PUSH = "RichPush";
    const ZEROPARK = "Zeropark";
    const WIDGET_MEDIA = "Widget Media";
    const TRAFFIC_STARS = "Traffic Stars";
    const TABOOLA = "Taboola";
    const SELF_ADVERTISER = "Self Advertiser";
    const REVCONTENT = "RevContent";
    const PROPELLERADS = "PropellerAds";
    const POPCASH = "PopCash";
    const POPADS = "PopAds";
    const OUTBRAIN = "Outbrain";
    const MGID = "MGID";
    const AVAZU = "Avazu";
    const ADCASH = "AdCash";
    const ADMAVEN = "AdMaven";

    static function getModels()
    {
        $models = [];
        self::push($models, self::createTemplate(self::ADMAVEN, [
            "{pubfeed}" => "Publisher Feed ID",
            "{remfeed}" => "Remote Feed ID",
            "{keyword}" => "Keyword",
            "{query}" => "Search Query",
            "{banner}" => "Banner",
            "{referrer_domain}" => "Referrer Domain",
            "{country}" => "Country Code",
        ], "{subid}", "{bid}"));

        self::push($models, self::createTemplate(self::ADCASH, [
            "[zone]" => "Zone",
            "[campaign]" => "Campaign",
            "[country]" => "Country",
            "[lang]" => "Language",
        ], "[clickid]", null));

        self::push($models, self::createTemplate(self::AVAZU, [
            "{bundle_id}" => "Bundle ID",
            "{publisher_name}" => "Publisher Name",
            "{source_name}" => "Source Name",
            "{creative_id}" => "Creative ID",
            "{category}" => "Category",
            "{exchange}" => "Exchange",
            "{media}" => "Media",
            "{country}" => "Country",
            "{carrier}" => "Carrier",
        ], "{subid}", null));

        self::push($models, self::createTemplate(self::MGID, [
            "{widget_id}" => "Publisher",
            "{teaser_id}" => "Teaser ID",
            "{campaign_id}" => "Campaign ID",
        ], "{click_id}", null));

        self::push($models, self::createTemplate(self::OUTBRAIN, [
            "{{publisher_name}}" => "Publisher Name",
            "{{publisher_id}}" => "Publisher ID",
            "{{campaign_id}}" => "Campaign ID",
            "{{section_name}}" => "Section Name",
            "{{ad_id}}" => "Ad ID",
        ], "{{ob_click_id}}", null));

        self::push($models, self::createTemplate(self::POPADS, [
            "[WEBSITEID]" => "Publisher",
            "[CAMPAIGNNAME]" => "Campaign",
            "[CATEGORYNAME]" => "Category Name",
            "[CATEGORYID]" => "Category ID",
            "[FORMFACTORNAME]" => "Form Factor",
            "[QUALITY]" => "Quality Score",
            "[COUNTRY]" => "Country",
            "[ISPNAME]" => "ISP",
        ], "[IMPRESSIONID]", "[BID]"));

        self::push($models, self::createTemplate(self::POPCASH, [
            "[siteid]" => "Publisher",
            "[campaignid]" => "Campaign ID",
            "[category]" => "Category",
            "[cc]" => "Country Code",
            "[operatingsystem]" => "OS",
            "[device]" => "Device Type",
            "[connection]" => "Connection Type",
            "[carrier]" => "Carrier",
        ], "[clickid]", "[bid]"));

        self::push($models, self::createTemplate(self::PROPELLERADS, [
            "{zoneid}" => "Zone",
            "{campaignid}" => "Campaign",
        ], "\${SUBID}", null));

        self::push($models, self::createTemplate(self::REVCONTENT, [
            "{widget_id}" => "Widget",
            "{adv_targets}" => "Target",
            "{boost_id}" => "Campaign",
            "{content_id}" => "Content",
        ], null, null));

        self::push($models, self::createTemplate(self::RICH_PUSH, [
            "[ADVERTISER_ID]" => "Advertiser ID",
            "[SSP_ID]" => "Segment ID",
            "[CAMPAIGN_ID]" => "Campaign ID",
            "[CREATIVE_ID]" => "Creative ID",
            "[SOURCE_ID]" => "Source ID",
            "[COUNTRY_CODE]" => "Country Code",
            "[OS]" => "OS",
        ], "[CLICK_ID]", null));

        self::push($models, self::createTemplate(self::SELF_ADVERTISER, [
            "@@SOURCE@@" => "Source",
            "@@CAMPAIGN-KEYWORD@@" => "Campaign Keyword",
        ], "@@CLICK-ID@@", null));

        self::push($models, self::createTemplate(self::BING, [
            "{keyword}" => "Keyword",
            "{QueryString}" => "Query",
            "{AdGroup}" => "Ad Group",
            "{AdId}" => "Ad ID",
            "{BidMatchType}" => "Bid Match Type",
            "{MatchType}" => "Match Type",
            "{Network}" => "Network",
            "{TargetId}" => "Target ID",
            "{lpurl}" => "LP URL",
        ], null, null));

        self::push($models, self::createTemplate(self::GOOGLE, [
            "{keyword}" => "Keyword",
            "{creative}" => "Creative",
            "{adgroupid}" => "Ad Group ID",
            "{placement}" => "Placement",
            "{adposition}" => "Ad Position",
            "{matchtype}" => "Match Type",
            "{network}" => "Network",
            "{target}" => "Target",
            "{lpurl}" => "LP URL",
        ], null, null));

        self::push($models, self::createTemplate(self::FB, [
            "campaign_replace" => "Campaign",
            "adset_replace" => "Adset",
            "ad_replace" => "Ad",
        ], null, null));

        self::push($models, self::createTemplate(self::MEGAPUSH, [
            "{feedid}" => "Feed ID",
            "{camp_id}" => "Camp ID"
        ], "{clickid}", "{bid}"));

        self::push($models, self::createTemplate(self::ZEROPARK, [
            "{source}" => "Source",
            "{target}" => "Target",
            "{keyword}" => "Keyword",
            "{match}" => "Match",
            "{traffic_type}" => "Traffic Type",
            "{visitor_type}" => "Visitor Type",
            "{campaign_id}" => "Campaign ID",
            "{ad_copy_name}" => "Ad Copy Name",
        ], "{cid}", "{visit_cost}"));

        self::push($models, self::createTemplate(self::WIDGET_MEDIA, [
            "{advertiserId}" => "Advertiser ID",
            "{pid}" => "Placement ID",
            "{adId}" => "Ad ID",
            "{campaignGroupId}" => "Campaign Group ID",
            "{campaignId}" => "Campaign ID",
            "{width}" => "Width",
            "{height}" => "Height",
            "{country}" => "Country",
            "{os}" => "OS",
        ], "{transactionId}", null));

        self::push($models, self::createTemplate(self::TRAFFIC_STARS, [
            "{keywords}" => "Keywords",
            "{site_id}" => "Site ID",
            "{site_host}" => "Site Host",
            "{adspot_id}" => "Adspot ID",
            "{campaign_id}" => "Campaign ID",
            "{category_id}" => "Category ID",
            "{creative_id}" => "Creative ID",
            "{referrer}" => "Referrer",
            "{carrier}" => "Carrier",
        ], "{click_id}", "{cost}"));

        self::push($models, self::createTemplate(self::TABOOLA, [
            "{site}" => "Publisher",
            "{title}" => "Ad",
            "{thumbnail}" => "Creative",
            "{campaign}" => "Campaign",
        ], null, null));

        uasort($models, function ($a, $b) {
            return strcasecmp($a['sourceName'], $b['sourceName']);
        });
        return $models;
    }

    static private function push(&$models, $source)
    {
        $models[$source['sourceId']] = $source;
    }

    static private function createTemplate($name, $vars, $externalID, $cost)
    {
        $varValues = array_keys($vars);
        $varNames = array_values($vars);
        $id = preg_replace("/[^a-z0-9]/", '', strtolower($name));
        $tpl = new SourceTemplate($id, $name, $varValues, $varNames);
        return $tpl->toArray();
    }
}


Graybeard if you have a minute could you plz skype me noorou2
 
MY CLICKERVOLT REVIEW

I finally had the time to test ClickerVolt with a live campaign. My previous tests were done on a very basic level, but this time I decided to test this tracker with a campaign getting 22,000 hits per day.

The result? Sadly, not so good.

Here are my observations:

-Installation-
I've tested many self-hosted trackers and this is by far the easiest to install. Just setup Wordpress, install the plugin and you're done. HOWEVER, as soon as you start sending traffic in high volumes, things start to break apart.

-Stats stop working after a few thousand hits-
I'm almost certain this is a PHP or MYSQL configuration issue, but unfortunately there is a lack of detailed documentation on server requirements and setup, so I haven't been able to fix this.

What happens is this: You start sending traffic to your campaign, and after a few thousand hits the stats will stop updating. The campaign links and redirects work, but no stats are being recorded, conversions are not showing either.
This is an optimized campaign that I ported to ClickerVolt. I can see 100+ conversions on my ClickDealer dashboard, but ClickerVolt is only showing 24. Live Clicks are not working either.

Things I've tried:

I setup two 1 CPU 2GB RAM VPS servers, one is using OpenLiteSpeed and the other NGINX.
OpenLiteSpeed: Not working, just as described above.
NGINX: Partially working, after some time click stats start to update as a cascade, like they got buffered and released all of a sudden. However, all conversions are lost.

Maybe I'll try with Apache next time and see what happens, but I just spend a full day trying to solve this issue without success, and time is money. I also lost a full day of stats.

Bear in mind I'm using the free version and I'm not paying for support. This might be a simple issue to fix, but if you're looking for a free tracker, beware. Also, having to pay for support just to make the tracker work as expected doesn't leave a good taste in my mouth. I'm pretty sure I'm not the first one to experience this so a very basic troubleshooting guide would be great.

-Other functionalities-

Params/Variables:
These are a breeze to work with. There are templates for many Affiliate Networks and traffic sources. You can setup your campaign links in no time. It even gives you the Postback URL with all parameters set. Just copy and paste in your Affiliate Network. Done.

Cost tracking: I don't know why, but there's no cost parameter in the traffic source menu. This means you have to setup the cost manually, being CPC or CPA. This absolutely sucks and gets me back to the iMobitrax era. Let's say you want to test a different bid on your traffic source. You will have to update the cost (bid) manually on ClickerVolt and this makes the cost of every click on the campaign to change. Now your campaign cost is messed up. Bummer.

Parallel tracking: This feature works as expected. You can run campaigns on Google Ads or track organic traffic coming directly to your webpage/landing page. The only thing I would add is a "Parallel tracking parameter", or any other way to enable/disable it. Let's say you're using the tracker on an arbitrage site. As it is now, all clicks coming to your page (from the campaign link or organic) add to the cost of the campaign. If you have a lot of organic traffic this will mess up your cost stats.

AIDA: Amazing feature. You can optimize your campaigns before getting conversions and spending a lot of money. This function let you know if a particular audience (webID, widget, keyword, etc.) is interested in your product/service based on their activity on your landing page. I think this is the best ClickerVolt's feature. There's a case study on their website if you want to know more.

Fraud Detection: Also an amazing feature. You can even setup Google's Recaptcha to protect your campaign from bots. I run a lot of pop traffic so this feature is a must for me.

Reports: The stats are what you would expect from a tracker and also remind me of iMobitrax. Simple to use, you can group stats by segments and also get a configurable heatmap. There's a Live Clicks Tab where you can see every visitor in real time.

The only things I would add to the reports is automatic refresh when changing grouping settings and a Conversions Tab. This would be very useful, specially for multi-geo campaigns.

-CONCLUSION-
I love this tracker, it's very easy to install/update, it's lightweight, it's very fast and simple to setup. The AIDA tracking and Fraud Detection are amazing features for a free tracker. If I could only make it work.

SURPRISE: I don't know if this has anything to do with the tracker, but after I ported my campaign to ClickerVolt, I started to get more conversions. Hmm, lucky day? redirect speed? For now there's no way to know since the stats are all messed up.

If someone has experienced the same issues and know how to fix them, please share the knowledge. I would be very grateful! :)











 
Hey Graybeard!

No cPanel here, Openlitespeed server is using CyberPanel, and NGINX server has no panel at all.

Are you using ClickerVolt succesfully?
 
You need to try passing the zoneid parameter's value (eg: /30483/) to the url of the frame ... is such a way that you would be able to capture that value back in the tracker or from the actual seller/or network's post back.

***edit I left this as general information but it's no really on the thread topic but may be useful to someone's future needs **

PHP:
$server = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
  $qstr = $_SERVER['QUERY_STRING'];
    $myzoneid = $_GET['zoneid'];
echo  <<<EOL
$server <br>
$qstr <br>
zone is: $myzoneid
<p>iframe is: iframeURL/?zoneid=$myzoneid&more=stuff</p>
EOL;

returns:
http://localhost/de/
zoneid=30483
zone is: 30483

iframe is: iframeURL/?zoneid=30483&more=stuff

some assembly required :p
 
Last edited:
@BenitoB thanks a ton for your review and feedback, I really appreciate it considering the time it takes to give as many details as you just did, you rock man!

Since you seem to love ClickerVolt apart from the glitches you experienced, let's try to troubleshoot it if you don't mind? It will only make things better for everyone.

Just to reassure you, 22,000 hits per day is really nothing - I've seen it process 100k per day on a 2 CPU server and remain with a very low CPU usage. So I would guess 22k hits should be fine on the 1 CPU server you tried.

However, I've also seen some WordPress installations not keep up with the wp-cron job.

Wp-cron is a kind of virtual cron job offered by WordPress, it's really cool for most people as they don't need to setup an external cron job, however on some installs it gets laggy (no idea why, maybe someone more technical could chime in here).

However, there are guides online showing how to use a real cron job instead of the virtual wp-cron - I believe this is the simple fix that will make your stats live again.

Here's one of those tutorials:
How to Disable WP-Cron (wp-cron.php) for Faster Performance

For the frequency, you should set something like once per minute.

On another note, I don't believe you have lost any conversion, they're probably not processed - the programmer told me that each event is simply stored in a local file, and those files get deleted as they are being processed and inserted into db. So your events are probably there waiting to be processed.

Let me know how it goes after you setup a real system cron.
 
BTW, almost forgot - it's better to use NGINX as you did in your second test. For server setup, I don't really bother optimizing anything, I just spawn VULTR droplets using their one-click Wordpress install.
 
@JackySan and @Graybeard thanks for taking the time to help me figure this out.

After trying many server settings I could finally make it work!

For anyone willing to try this amazing tracker, here are some basic configuration settings proven to work:

1- Deploy a server with Apache 2.4+, and MySQL 5.7+.
Other server configurations like NGINX and OpenLiteSpeed do not work as expected. Older versions of MySQL also show errors when trying to use the Live Clicks tab. If you're on shared hosting just make sure to have recent versions of Apache/MySQL.

2- Disable Wordpress Cron - Here's why this is better:
All clicks and actions(conversions) are stored as files on your server before getting written to the database. As soon as wp-cron.php is triggered, the tracker "pushes" this data to the mysql database. However, the wp-cron is set to trigger only when someone loads your webpage.

Let's say you don't have any organic traffic and you go to sleep. The wp-cron won't trigger for many hours, and by the time you wake up and load your tracker, you'll have THOUSANDS of files (clicks and actions) on queue ready to be pushed to the database. This will take some time, so you'll need to be patient and hit the "Refresh" button many times to let the tracker push all that data to the database.
In my experience, all clicks get moved correctly to the database, even if there are thousands. The actions however, after being queued for a long time (many hours) were lost, I just got like 30% of them all. I don't know why.

To disable wp-cron:
  • Open your Wordpress main folder and edit the wp-config.php file.
  • Find the following line of code: $table_prefix = 'wp_'
  • Now add this line below: define('DISABLE_WP_CRON', true);
  • Done!
3- Add a real cronjob to load wp-cron.php every minute:
Now that we disabled the predefined behaviour of wp-cron, we need to tell the server to load it every minute. This will push all your clicks and actions to the database every minute, so you don't end up with thousands of files on queue.

If using cPanel:
  • Log in to cPanel and scroll down to Cron Jobs, under the Advanced Section.
  • Go to the Add New Cron Job section and set it to run every minute. Just put "1" on Minutes, and an * in every other field.
  • Enter the following command in the Command field, replacing "example" with your own domain name:
    curl http://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
  • Click on Add New Cron Job
  • Done!
If using a VPS:
  • Go to the terminal and open crontab with command: crontab -e
  • Add the following line at the end, replacing "example" with your own domain name:
    * * * * * curl http://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
  • Done!
Now ClickerVolt will push the stats to the database every minute and work smoother! :D

Some Timezone weird behaviour:

ClickerVolt shows your "Links" and "Reports" stats in UTC Timezone. However, all Live Clicks display the local timezone. I'm in UTC -05:00, that means at 19:01 o'clock (my timezone) ClickerVolt is already saving stats for the next day. So if I go to my stats, select TODAY and hit refresh, nothing will update anymore, since ClickerVolt is now saving all stats for the day ahead (UTC 00:00).
This might make you scratch your head, since you're watching activity under the Live Clicks tab (local timezone), but nothing is changing on the other tabs.
To see the new stats you need to change the date manually and set it to the next day. Only then you'll see the new clicks comming in.

I hope this makes sense.

Now that everything is set and working, it's time to keep testing this great tracking tool! :)
 
**edit: these are the global tokens available to the ClickerVolt templates

here's the file
/clickervolt$ grep -rni '\{zoneid\}' .
./db/objects/sourceTemplateModels.php:98: "{zoneid}" => "Zone"
PHP:
<?php

namespace ClickerVolt;

require_once __DIR__ . '/../tableSourceTemplates.php';

class SourceTemplateModels
{
    const BING = "Microsoft Ads (Bing Ads)";
    const GOOGLE = "Google Ads (Adwords)";
    const FB = "FB Ads";
    const MEGAPUSH = "MegaPush";
    const RICH_PUSH = "RichPush";
    const ZEROPARK = "Zeropark";
    const WIDGET_MEDIA = "Widget Media";
    const TRAFFIC_STARS = "Traffic Stars";
    const TABOOLA = "Taboola";
    const SELF_ADVERTISER = "Self Advertiser";
    const REVCONTENT = "RevContent";
    const PROPELLERADS = "PropellerAds";
    const POPCASH = "PopCash";
    const POPADS = "PopAds";
    const OUTBRAIN = "Outbrain";
    const MGID = "MGID";
    const AVAZU = "Avazu";
    const ADCASH = "AdCash";
    const ADMAVEN = "AdMaven";

    static function getModels()
    {
        $models = [];
        self::push($models, self::createTemplate(self::ADMAVEN, [
            "{pubfeed}" => "Publisher Feed ID",
            "{remfeed}" => "Remote Feed ID",
            "{keyword}" => "Keyword",
            "{query}" => "Search Query",
            "{banner}" => "Banner",
            "{referrer_domain}" => "Referrer Domain",
            "{country}" => "Country Code",
        ], "{subid}", "{bid}"));

        self::push($models, self::createTemplate(self::ADCASH, [
            "[zone]" => "Zone",
            "[campaign]" => "Campaign",
            "[country]" => "Country",
            "[lang]" => "Language",
        ], "[clickid]", null));

        self::push($models, self::createTemplate(self::AVAZU, [
            "{bundle_id}" => "Bundle ID",
            "{publisher_name}" => "Publisher Name",
            "{source_name}" => "Source Name",
            "{creative_id}" => "Creative ID",
            "{category}" => "Category",
            "{exchange}" => "Exchange",
            "{media}" => "Media",
            "{country}" => "Country",
            "{carrier}" => "Carrier",
        ], "{subid}", null));

        self::push($models, self::createTemplate(self::MGID, [
            "{widget_id}" => "Publisher",
            "{teaser_id}" => "Teaser ID",
            "{campaign_id}" => "Campaign ID",
        ], "{click_id}", null));

        self::push($models, self::createTemplate(self::OUTBRAIN, [
            "{{publisher_name}}" => "Publisher Name",
            "{{publisher_id}}" => "Publisher ID",
            "{{campaign_id}}" => "Campaign ID",
            "{{section_name}}" => "Section Name",
            "{{ad_id}}" => "Ad ID",
        ], "{{ob_click_id}}", null));

        self::push($models, self::createTemplate(self::POPADS, [
            "[WEBSITEID]" => "Publisher",
            "[CAMPAIGNNAME]" => "Campaign",
            "[CATEGORYNAME]" => "Category Name",
            "[CATEGORYID]" => "Category ID",
            "[FORMFACTORNAME]" => "Form Factor",
            "[QUALITY]" => "Quality Score",
            "[COUNTRY]" => "Country",
            "[ISPNAME]" => "ISP",
        ], "[IMPRESSIONID]", "[BID]"));

        self::push($models, self::createTemplate(self::POPCASH, [
            "[siteid]" => "Publisher",
            "[campaignid]" => "Campaign ID",
            "[category]" => "Category",
            "[cc]" => "Country Code",
            "[operatingsystem]" => "OS",
            "[device]" => "Device Type",
            "[connection]" => "Connection Type",
            "[carrier]" => "Carrier",
        ], "[clickid]", "[bid]"));

        self::push($models, self::createTemplate(self::PROPELLERADS, [
            "{zoneid}" => "Zone",
            "{campaignid}" => "Campaign",
        ], "\${SUBID}", null));

        self::push($models, self::createTemplate(self::REVCONTENT, [
            "{widget_id}" => "Widget",
            "{adv_targets}" => "Target",
            "{boost_id}" => "Campaign",
            "{content_id}" => "Content",
        ], null, null));

        self::push($models, self::createTemplate(self::RICH_PUSH, [
            "[ADVERTISER_ID]" => "Advertiser ID",
            "[SSP_ID]" => "Segment ID",
            "[CAMPAIGN_ID]" => "Campaign ID",
            "[CREATIVE_ID]" => "Creative ID",
            "[SOURCE_ID]" => "Source ID",
            "[COUNTRY_CODE]" => "Country Code",
            "[OS]" => "OS",
        ], "[CLICK_ID]", null));

        self::push($models, self::createTemplate(self::SELF_ADVERTISER, [
            "@@SOURCE@@" => "Source",
            "@@CAMPAIGN-KEYWORD@@" => "Campaign Keyword",
        ], "@@CLICK-ID@@", null));

        self::push($models, self::createTemplate(self::BING, [
            "{keyword}" => "Keyword",
            "{QueryString}" => "Query",
            "{AdGroup}" => "Ad Group",
            "{AdId}" => "Ad ID",
            "{BidMatchType}" => "Bid Match Type",
            "{MatchType}" => "Match Type",
            "{Network}" => "Network",
            "{TargetId}" => "Target ID",
            "{lpurl}" => "LP URL",
        ], null, null));

        self::push($models, self::createTemplate(self::GOOGLE, [
            "{keyword}" => "Keyword",
            "{creative}" => "Creative",
            "{adgroupid}" => "Ad Group ID",
            "{placement}" => "Placement",
            "{adposition}" => "Ad Position",
            "{matchtype}" => "Match Type",
            "{network}" => "Network",
            "{target}" => "Target",
            "{lpurl}" => "LP URL",
        ], null, null));

        self::push($models, self::createTemplate(self::FB, [
            "campaign_replace" => "Campaign",
            "adset_replace" => "Adset",
            "ad_replace" => "Ad",
        ], null, null));

        self::push($models, self::createTemplate(self::MEGAPUSH, [
            "{feedid}" => "Feed ID",
            "{camp_id}" => "Camp ID"
        ], "{clickid}", "{bid}"));

        self::push($models, self::createTemplate(self::ZEROPARK, [
            "{source}" => "Source",
            "{target}" => "Target",
            "{keyword}" => "Keyword",
            "{match}" => "Match",
            "{traffic_type}" => "Traffic Type",
            "{visitor_type}" => "Visitor Type",
            "{campaign_id}" => "Campaign ID",
            "{ad_copy_name}" => "Ad Copy Name",
        ], "{cid}", "{visit_cost}"));

        self::push($models, self::createTemplate(self::WIDGET_MEDIA, [
            "{advertiserId}" => "Advertiser ID",
            "{pid}" => "Placement ID",
            "{adId}" => "Ad ID",
            "{campaignGroupId}" => "Campaign Group ID",
            "{campaignId}" => "Campaign ID",
            "{width}" => "Width",
            "{height}" => "Height",
            "{country}" => "Country",
            "{os}" => "OS",
        ], "{transactionId}", null));

        self::push($models, self::createTemplate(self::TRAFFIC_STARS, [
            "{keywords}" => "Keywords",
            "{site_id}" => "Site ID",
            "{site_host}" => "Site Host",
            "{adspot_id}" => "Adspot ID",
            "{campaign_id}" => "Campaign ID",
            "{category_id}" => "Category ID",
            "{creative_id}" => "Creative ID",
            "{referrer}" => "Referrer",
            "{carrier}" => "Carrier",
        ], "{click_id}", "{cost}"));

        self::push($models, self::createTemplate(self::TABOOLA, [
            "{site}" => "Publisher",
            "{title}" => "Ad",
            "{thumbnail}" => "Creative",
            "{campaign}" => "Campaign",
        ], null, null));

        uasort($models, function ($a, $b) {
            return strcasecmp($a['sourceName'], $b['sourceName']);
        });
        return $models;
    }

    static private function push(&$models, $source)
    {
        $models[$source['sourceId']] = $source;
    }

    static private function createTemplate($name, $vars, $externalID, $cost)
    {
        $varValues = array_keys($vars);
        $varNames = array_values($vars);
        $id = preg_replace("/[^a-z0-9]/", '', strtolower($name));
        $tpl = new SourceTemplate($id, $name, $varValues, $varNames);
        return $tpl->toArray();
    }
}
 
Last edited:
@BenitoB thanks a lot for the update, and great guide for the cron setup!

Do you allow me to use it for a trouble shooting article?

For the timezone issue, this thing annoys me too - the dev will add a timezone picker in a coming update, where by default it will be on local timezone, like the live clicks.
 
Code:
*/1 * * * * curl http://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
#or
*/1 * * * * (cd /path/to/file; php wp-cron.php?doing_wp_cron )> /dev/null 2>&1
Is the way I would do it ...
I have had to make permission changes on Nginx in the past in order to have Wordpress run properly but I have no idea if that would cure the 'needs Apache issue'.

You need a separate VPS with just Apache2 and MySQL 5.7 2G RAM. That's $10 mo for me with 5TB bandwidth so the cost is very minimal.

I know that I set one of my servers to -5GMT but the Nginx log is still +0000 or UTC time is relative as they say :D
Code:
$ php -r "echo date_default_timezone_get();"
America/New_York
PHP uses that server's default time zone
I have an Apache install on the same server on a non-standard port and the log shows +0000 GMT also
Code:
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2019-10-29 12:45:00 |<<UTC too
+---------------------+
1 row in set (0.00 sec)
You might try resetting the server time zone and see what happens with the ClickerVolt time -- may fix just that IDK --easily enough changed back ;)

Thanks for the debugging info -- much appreciated
in clickervolt.php
Code:
    14  namespace ClickerVolt;
    17  // TODO: add external cron option
Thanks for your contribution ;)


On the cronjob, do I input http or https? Does it matter? Thanks.
 
Guys I just read this and I'm worried about Jacky's health.

He was always a nice guy to me, answered my emails about bug reports or questions I had, and shared a lot of valuable knowledge without ever charging a dime. Clickervolt is a great example of how much he gave to the community.

Does anyone know something about him?

I really hope he's doing well.
 
check the server /path/error.log
it's named in your nginx virtual configuration file try;
Code:
egrep -rni 'error\.log'   /etc/nginx/sites-available/
or /var/log/nginx/error.log (<default location)
see if there is some PHP error?
 
Is his profile picture really him? If so, I found something, same photo but different name. If it's a stock pic from somewhere, nevermind.
 
Last edited:
Is his profile picture really him? If so, I found something, same photo but different name. If it's a stock pic from somewhere, never mind.

I'm pretty sure it is a stock photo.

upload_2020-12-9_13-52-26.png


I tried to contact the developer but didn't get a response. It's been a week since the SOS post on the official site, and more than a month without a reply from Jacky, so at this point we can assume something bad happened.
 
MI
Back