Other in archive


Сервер документації (+тимчасово для скриптів автоматизації)

Первинні налаштування

Треба створити користувача sudo (щоб не працювати з під root)

adduser oleksandr-d

занести користувача в групу sudo

sudo usermod -aG sudo oleksandr-d

Встановлюю PHP та модулі

sudo apt install -y php-cli php-openssl php-mbstring php-iconv php-tokenizer php-gd php-mysql php-xml php-ldap php-curl php-gd php-simplexml php-dom php-pdo

Встановлюю php-fpm, щоб використовувати nginx, як web-сервер.

sudo apt install php-fpm

Встановлюю MySQL

sudo apt install mysql-server
sudo mysql_secure_installation

# Remove anonymous users? [Y/n]                     Type Y
# Disallow root login remotely? [Y/n]               Type Y
# Remove test database and access to it? [Y/n]      Type Y
# Reload privilege tables now? [Y/n]                Type Y

Налаштовую php-fpm

sudo nano /etc/php/8.3/fpm/php.ini
file_uploads = On
allow_url_fopen = On
memory_limit = 256M
upload_max_filesize = 100M
cgi.fix_pathinfo = 0
max_execution_time = 360
date.timezone = Europe/Kyiv

Встановлюю Composer

Завантажте сценарій інсталятора Composer.

curl -sS https://getcomposer.org/installer -o composer-setup.php

Виконайте наведені нижче команди, щоб перевірити інсталятор.

HASH=`curl -sS https://composer.github.io/installer.sig`
echo $HASH
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Наведені вище команди захоплюють хеш-значення інсталятора та зіставляють його із завантаженим сценарієм. Ви повинні побачити такі дані, якщо інсталятор безпечний для запуску.

Installer verified

Встановіть Composer.

sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Перевірте інсталяцію, перевіривши її версію.

composer --version

Створюю базу даних bookstack з користувачем bookstackuser та даю йому повний доступ до цієї бази даних.

sudo mysql
CREATE DATABASE bookstack; 
CREATE USER 'bookstackuser'@'localhost' IDENTIFIED WITH mysql_native_password BY '********************';
GRANT ALL ON bookstack.* TO 'bookstackuser'@'localhost'; FLUSH PRIVILEGES;
exit

Дозволяю доступ по ssh через порт 22

sudo ufw allow ssh

Встановлюємо Nginx  та надаю доступ до портів

sudo apt install nginx
sudo ufw allow 'Nginx Full'

Перевіряємо налаштування брандмауера (необхідні налаштування є в списку відповіді) та потім вмикаємо його

sudo ufw app list

# Available applications:
#   Nginx Full
#   Nginx HTTP
#   Nginx HTTPS
#   OpenSSH

sudo ufw enable

sudo ufw status
# Status: active

# To                         Action      From
# --                         ------      ----
# 22/tcp                     ALLOW       Anywhere
# Nginx Full                 ALLOW       Anywhere
# 22/tcp (v6)                ALLOW       Anywhere (v6)
# Nginx Full (v6)            ALLOW       Anywhere (v6)

Завантажую сам BookStack та налаштовую
Створіть кореневу папку для програми BookStack.

sudo mkdir -p /var/www/bookstack

Роблю власником себе (поточного юзера з якого працюю), щоб не працювати постійно з sudo та для nginx

sudo chown -R oleksandr-d:www-data /var/www/bookstack

Переходжу в створену папку, та клоную репозиторій з BookStack (крапка в кінці треба, щоб розпакувалось в поточну папку. а не створювалась нова).

cd /var/www/bookstack
git clone https://github.com/BookStackApp/BookStack.git --branch=release --single-branch .

Встановлюємо Composer для bookstack

composer install --no-dev

Копіюю файл, та налаштовую дані для додатку

cp .env.example .env

Відкрийте файл для редагування.

nano .env

Заповніть URL-адресу програми та дані бази даних. Якщо ви збираєтеся використовувати функції електронної пошти, заповніть дані SMTP або видаліть їх із файлу.

APP_URL=https://doc.rtb-system.online

DB_HOST=localhost
DB_DATABASE=bookstack
DB_USERNAME=bookstackuser
DB_PASSWORD=**********************


# Can be 'smtp' or 'sendmail'
MAIL_DRIVER=smtp

MAIL_FROM_NAME="RTB Documentation"
MAIL_FROM=my@email.com


MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=my@email.com
MAIL_PASSWORD="**** **** **** ****"
MAIL_ENCRYPTION=tls

Далі генерую ключ для artisan який запишеться в файл .env

php artisan key:generate

Налаштовую додаткові права для юзера до каталогу з bookstack

sudo chown -R oleksandr-d:www-data /var/www/bookstack
sudo chmod -R 755 /var/www/bookstack
sudo chmod -R 775 /var/www/bookstack/storage /var/www/bookstack/bootstrap/cache /var/www/bookstack/public/uploads
sudo chmod 640 /var/www/bookstack/.env

Роблю artisan міграцію

php artisan migrate

Далі встановимо та налаштуємо certbot та конфігурацію nginx
Спочатку зупинимо nginx

sudo systemctl stop nginx.service

Встановлюємо  Certbot

sudo apt install snapd
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Перевірити версію

certbot --version

Генеруємо сертифікат

sudo certbot certonly

Тепер запускаю та вмикаю nginx

sudo systemctl start nginx.service
sudo systemctl enable nginx.service

Налаштовую конфігурацію для nginx

sudo nano /etc/nginx/sites-available/bookstack
# HTTP — редірект на HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name notes.bistats.site;

    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPS — конфігурація SSL
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name notes.bistats.site;

    ssl_certificate /etc/letsencrypt/live/notes.bistats.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/notes.bistats.site/privkey.pem;

    root /var/www/bookstack/public;
    index index.php index.html index.htm;

    client_max_body_size 100M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
sudo ln -s /etc/nginx/sites-available/bookstack /etc/nginx/sites-enabled/
sudo systemctl restart nginx.service

Була помилка додав ще раз права на необхідні папки.

Перехоплення пустого адтайтлу | FB n2s (костиль)

Для n2s потрібно щоб адтайтл надходив з кліком до провайдера.
Але інколи адтайтла з джерела відсутній, тому в такому разі в трекері в трекері робимо правило для пустого адтайтла куди додаємо офер з пропсианим адтайтлом в самому посиланні офера.
Регулярка для правила .{2,} 

image.png

image.png

News site

host/

Робимо глобальний масив, який буде оновлювати 
Читамєо /data/articles.json 
Розбираємо на масиви по кожній категорії, а також робимо масив з articlepath робмлю для перевірки чи є такий шлях, інакше відправляти всіх на головну сторінку.

Задачі

image.png

E стовбчик

Може бути дуже різні дані. Тому потрібно ретельно це перевіряти:
- якщо це ківорди чи адтайтли то потрібно їх енкодити
- перевіряти кількість рядків
- символи заекодити &#%?=+{}[]|^, і ~,
- всякі \r \n \t \v  видалити (в певних моментах вже після обробки масииву ківордів та адтайтлу). Бо трекери не обробляють такі символи, та інколи це призводить не коректного формуваня Offer URL в трекерах.
Трекер потім передає це все, як є.

API (tracker/crossroads/tonic)

Запускати API, тільки якщо це peerclick (точніше не clickflare/keitaro)

Для дока задач.

Можна просто зробити функції, які збиратимуть і передаватимуть дані:
- по стовбчику в обраному рядку
- назва рядка

Передаватиуть ці дані на мій сервак.
А я поверну відповідь, який текст і колір в стовбчику проставити, ну і якусь додаткову інфу, про помилки чи ще щось.

В себе відповідно логуватиму це все, у вигляді назва дока, назва аркуша, номер рядка.

В git зробити 2 гілки stage/master
Щоб можна було тестувати.
Тест док зробити з одним аркушем, де буде набір всіх шаблонів задач. Можливо в якомусь стовбчику буде клітинка з посиланням на доку.

І так в мене буде одне джерело коду та логів.

Errors

Робити в коді різні перевірки і формувати помилки і потім повертати їх та вписувати в стовбчик D 

TS

Потрібно буде зробити нові TS, де дати відповідні імена віхідним параметрам
Наприклад там де campaign_item, так і називати, а не tease ID.
Але це застосовувати там де генерується повне посилання для тизера.
Бо там де шаблони, можуть бути помилки від баєрів
Тобто не ламати досвід, а робити це безшовно де це можливо. Повністю проблему не прибере, але зменшить об'єм де треба враховувати нюанси

Name Campaign

Зробити перейменування камапній в crossroad та tonic під час генеруваня самого посиланя Offer URL та імені кампанії. Якщо буде відповідно помилка, то її виведемо.
Або для цих н2с першим тегом вписувати номер дяка задачі.
Або коли згенерувалось ім'я, то перевірити чи є таке в н2с провайдерів, і якщо є тоді додавати тег (наприклад tmestamp цілочисельний).

Документація

Описати документацію по скрипту, звідповідними окремими посиланнями на доку по інтеграції з ПП, TS, трекером.

System1 | отримання партнерського посилання і подача задачі

Подаємо запит на отримання партнерського посилання.
Вказуємо необхідні дані:
image.png

Статус своїх запитів можете перевіряти тут.
image.png

Результат ви побачите в Status, а також якщо клікнете на свій запит, то перейдете на сторінку де буде відповідь від модерації, та посилання, яке копіюємо.
image.png

Задачу подаємо як з іншими провайдерами

Для DSP ще окремо вказуємо adtitle

image.png

domain active постбеки та пікселі

RTBEuro
Ad Click Pixel
https://flarequick.com/cf/cv?click_id={$tg10}&payout={$estimatedGoogleCPCToday}&txid={$datetimepst}&param1={$query}&ct=sale

Domain Pixel Example
LANDER
!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', '506752001994869'); 
fbq('track', 'ViewContent',{}, {eventID: '{$uuid}'});

SERP
!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', '506752001994869'); 
fbq('track', 'Search',{}, {eventID: '{$uuid}'});

focus(); var listener = window.addEventListener("blur", function() { active_element = document.activeElement; if ("IFRAME" == active_element.tagName && 1 == window.location.href.includes("caf_results")) { fbq('track', 'Purchase',{}, {eventID: '{$uuid}'}); } });






RTBEuro2
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale

Domain Pixel Example
LANDER
!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', '1754180308492861'); 
fbq('track', 'ViewContent',{}, {eventID: '{$uuid}'});

SERP
!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', '1754180308492861'); 
fbq('track', 'Search',{}, {eventID: '{$uuid}'});

focus(); var listener = window.addEventListener("blur", function() { active_element = document.activeElement; if ("IFRAME" == active_element.tagName && 1 == window.location.href.includes("caf_results")) { fbq('track', 'Lead',{}, {eventID: '{$uuid}'}); } });




RTBEuro3
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale

Domain Pixel Example
LANDER
N/A

SERP
N/A




RTBEuro4
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale

Domain Pixel Example
LANDER
N/A

SERP
N/A




RTBEuro5
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale

Domain Pixel Example
LANDER
N/A

SERP
N/A






RTBEuro6
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale

Domain Pixel Example
LANDER
(function (p, i, x, e, l) {
  if (typeof window !== undefined) {
    window._dojoPixel = {};
    window._dojoPixel.events_queue =  window._dojoPixel.events_queue || [];
    window._ddq = function () {
      window._dojoPixel.events_queue.push(arguments);
    };
    var f = p.getElementsByTagName(i)[0],
      k = p.createElement(i);
    k.async = 1;
    k.src = "https://pixel.clickslogistics.com/load.js?id=6750cdd0fbd01c91d81af07e";
    f.parentNode.insertBefore(k, f);
  }
})(document, "script");
_ddq("PIXEL_INIT", {
  "keyword": "Personal Loans"
});
_ddq("PAGE_VIEW");

SERP
N/A




RTBSystem2
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale

Domain Pixel Example
LANDER
!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', '541549895129299'); 
fbq('track', 'ViewContent',{}, {eventID: '{$uuid}'});

SERP
!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', '541549895129299'); 
fbq('track', 'Search',{}, {eventID: '{$uuid}'});

focus(); var listener = window.addEventListener("blur", function() { active_element = document.activeElement; if ("IFRAME" == active_element.tagName && 1 == window.location.href.includes("caf_results")) { fbq('track', 'Lead',{}, {eventID: '{$uuid}'}); } });




RTBSystem3
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale


Domain Pixel Example
LANDER
N/A

SERP
N/A





RTBSystemMGID
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale


Domain Pixel Example
LANDER
N/A

SERP
N/A





RTBSystemPangle
Ad Click Pixel
https://flarequick.com/cf/cv?click_id={$tg10}&payout={$estimatedGoogleCPCToday}&txid={$datetimepst}&param1={$query}&ct=sale

Domain Pixel Example
LANDER
!function (w, d, t) { w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t][];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t][],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src=i+"?sdkid="+e+"&lib="+t;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(o,a)};
ttq.load('CPK3VVJC77U5SPBHJOP0);
ttq.track('CompletePayment'); ttq.page(); }(window, document, 'ttq');

SERP
!function (w, d, t) { w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t][];ttq.methods=["page","track","identify","instances","debug","on","off","once","ready","alias","group","enableCookie","disableCookie"],ttq.setAndDefer=function(t,e){t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);ttq.instance=function(t){for(var e=ttq._i[t][],n=0;n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e},ttq.load=function(e,n){var i="https://analytics.tiktok.com/i18n/pixel/events.js";ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=i,ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},ttq._o[e]=n||{};var o=document.createElement("script");o.type="text/javascript",o.async=!0,o.src=i+"?sdkid="+e+"&lib="+t;var a=document.getElementsByTagName("script")[0];a.parentNode.insertBefore(o,a)};
ttq.load('CPK3VVJC77U5SPBHJOP0');
ttq.track('CompletePayment'); ttq.page(); }(window, document, 'ttq');






IdealMediaNative
Ad Click Pixel
https://flarequick.com/cf/cv?click_id={$tg10}&payout={$estimatedGoogleCPCToday}&txid={$datetimepst}&param1={$query}&ct=sale

Domain Pixel Example
LANDER
!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', '1140136920409549'); 
fbq('track', 'ViewContent',{}, {eventID: '{$uuid}'});

SERP
!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', '1140136920409549'); 
fbq('track', 'Search',{}, {eventID: '{$uuid}'});

focus(); var listener = window.addEventListener("blur", function() { active_element = document.activeElement; if ("IFRAME" == active_element.tagName && 1 == window.location.href.includes("caf_results")) { fbq('track', 'Purchase',{}, {eventID: '{$uuid}'}); } });




IdealMediaNews
Ad Click Pixel
https://pstb.gopeerclick.com/postback?userid=5906&cid={$fbclid}&payout={$estimatedGoogleCPCYesterday}&status=sale


Domain Pixel Example
LANDER
N/A

SERP
N/A

 

Макроси для джерел трафіку

Джерело трафіку Макроси
Yahoo
teaser_id={adid}&campaign_id={campaignid}&widget_id=${pubid}&site=${SUPPLY_NAME}&title={title}&adgroupid={adgroupid}&creative={creative}&device={device}
Outbrain external_id={{ob_click_id}}&teaser_id={{ad_id}}&campaign_id={{campaign_id}}&widget_id={{publisher_id}}&site={{publisher_name}}&title={{ad_title}}&section_id={{section_id}}&section_name={{section_name}}&req_id={{req_id}}&promoted_link_id={{promoted_link_id}}&time_stamp={{time_stamp}}
Recreative teaser_id={OfferID}&campaign_id={CompanyID}&widget_id={SiteID}&device={DeviceType}&external_id={RCuid}
MGID teaser_id={teaser_id}&campaign_id={campaign_id}&widget_id={widget_id}&category_id={category_id}&client_id={client_id}&site={referrer}&title={title}&cost={click_price}&external_id={click_id}
Adnow teaser_id={{tid}}&campaign_id={{campaignid}}&widget_id={{site_id}}&geo={{country}}&browser={{browser}}&platform={{platform}}&location={{location}}&category_id={{catid}}&site={{domain}}&cost={{price}}&external_id={{clickId}}
Revcontent widget_id={widget_id}&teaser_id={content_id}&title={content_headline}&campaign_id={boost_id}&utm_targeting={adv_targets}&target_id={target_id}&site={site_name}&user_ip={user_ip}&city={city}&state={state}&geo={country}&c_s_c={city|state|country}&external_id={conversion_uuid}
Taboola site_name={site}&widget_id={site}&site={site_domain}&thumbnail={thumbnail}&title={title}&tamp={timestamp}&platform={platform}&campaign_id={campaign_id}&campaign_name={campaign_name}&campaign_item_id={campaign_item_id}&site_id={site_id}&cost={cpc}&external_id={click_id}
Traffichunt teaser_id=[banner]&campaign_id=[camp_id]&widget_id=[adspace]&site=[site]&country=[country]&user_os=[user_os]&carrier=[carrier]&banner_size=[banner_size]&sub_id=[sub_id]&cost=[cost]&external_id=[txn_id]
Tapnative teaser_id=[AD_ID]&campaign_id=[CAMPAIGN_NAME]&widget_id=[PLACEMENT_ID]&site=[DOMAIN]&pub_name=[PUBLISHER_NAME]&USER_UA=[USER_UA]&DEVICE_ID=[DEVICE_ID]&external_id=[TRANSACTION_ID]
Dable teaser_id=[CONTENT_NAME]&campaign_id=[CAMPAIGN_NAME]&widget_id=[SERVICE_NAME]&service_type=[SERVICE_TYPE]
Mondiad teaser_id=[creativeid]&campaign_id=[campaignid]&widget_id=[subid]&zoneid=[zoneid]&carrier=[carrier]&subscriptionage=[subscriptionage]&adformat=[adformat]&cost=[bid]&external_id=[clickid]
Geospot teaser_id={CREATIVE_ID}&campaign_id={CAMPAIGN_ID}&widget_id={PUBLISHER_ID}&geo={COUNTRY_CODE}&site={APP_DOMAIN}&APP_NAME={APP_NAME}&APP_ID={APP_ID}&APP_BUNDLE={APP_BUNDLE}&DPI={DEVICE_PLATFORM_ID}&DNT={DNT}&APP_NAME_ALPHANUM={APP_NAME_ALPHANUM}&external_id={CONVERSION_ID}
FB source={{source}}&placement={{placement}}&ad_id={{ad_id}}&adset_id={{adset_id}}&campaign_id={{campaign_id}}&ad_name={{ad_name}}&adset_name={{adset_name}}&sub1={sub1}&sub2={sub2}&sub3={sub3}&fbpixel=fbpixel
Mediago teaser_id=${AD_ID}&campaign_id=${CAMPAIGN_ID}&widget_id=${SITE_ID}&site=${PUBLISHER_NAME}&title=${AD_TITLE}&source=${SOURCE}&assetid=${ASSET_ID}&campaignname=${CAMPAIGN_NAME}&bidtime=${BID_TIME_STAMP}&platform=${PLATFORM}&contentname=${CONTENT_NAME}&assetname=${AD_ASSET_NAME}&cost=${CPC}&external_id=${TRACKING_ID}
popin teaser_id=${CONTENT_ID}&campaign_id=${CAMPAIGN_ID}&widget_id=${PUBLISHER_ID}&site=${PUBLISHER_NAME}&title=${AD_TITLE}&source=${SOURCE}&assetid=${ASSET_ID}&adsetname=${AD_ASSET_NAME}&campaignname=${CAMPAIGN_NAME}&bidtime=${BID_TIME_STAMP}&platform=${PLATFORM}&contentname=${CONTENT_NAME}&cost=${CPC}&external_id=${TRACKING_ID}
DABLE

image.png

image.png

geozo

teaser_id=[AD_ID]&widget_id=[BLOCK_ID]&adgroup=[AD_GROUP_ID]&category=[CATEGORY_ID]&template=[TEMPLATE_ID]&cost=[BID]&external_id=[CLICK_ID]

Створити pixel / dataset у Facebook

Disclaimer!
У Facebook є багато варіантів інтерфейсу, або їх мутацій. Тому назви кнопок або їх розташування може змінюватись навіть на одному  і тому самому аккаунті.

Створення pixel

Йдемо за посиланням (при потребі логінимось повторно та вказуєте всі дані потрібні для автентифікації).
https://business.facebook.com/settings/people?

Обраємо потрібний Bussiness Manager (далі BM).

image.png

Далі йдемо в Data sources -> Datasets
Завантажиться список пікселів, ми створюємо новий (Add).

Вказуємо ім'я і клікаємо Create 
Подалші вікна, попапи, якщо вони будуть можемо ігнорувати / закривати.

image.png

І побачимо наш створений pixel / dataset

image.pngДалі потрібно видати дозволи нашому користувачеві (соц. профілю доступ до цього пікселя, а також пошерити/ прикріпити до рекламний аккаунтів (Ad accounts, скорочено РА або AA). Також бажано обрати системного користувача додатково (Conversion API)

image.png

image.png

image.png

І шеримо на рекламний аккаунт або декілька

image.png

image.png


Отримати код пікселя

Переходимо в менеджер подій

image.png

image.png

image.png

Копіюєте код, щоб вставляти його напряму в код лендінгу.

image.png

Мжна використовувати цей шаблонний код, змінюючи тільки ID пікселя та назву події (якщо потрібно)
В плівому стовбчику і підсвічу зеленим, те що можна змінювати, для адаптації під вас. В правому буде код/шаблон для копіювання.

<!-- Meta Pixel Code -->
<script>
!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', '1111111111111111111111');
fbq('track', 'Lead');
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=1111111111111111111111&ev=Lead&noscript=1"
/></noscript>
<!-- End Meta Pixel Code -->
<!-- Meta Pixel Code -->
<script>
!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', '1111111111111111111111');
fbq('track', 'Lead');
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=1111111111111111111111&ev=Lead&noscript=1"
/></noscript>
<!-- End Meta Pixel Code -->

Отримання токена пікселя

Це потрібно для додаткових інтеграцій. Також потрібен і ID пікселя, ви його бачите в списку пікселів.
Але отримаємо все також в менеджері подій (ID пікселя це тільки цифри).

image.png

Гортаємо нижче та шукаємо Conversions API, нам потрібно згенерувати token

image.png

Отримуємо токен.

Якщо одразу захочете згенерувати токен і для іншого пікселя. Обов'язково!!! Перезавантажте/оновіть сторінку.
Інакше отримаєте токен з попереднього пікселя, або додатковий токен для попереднього пікселя.

image.png


Тестування подій | отримання тестового коду/події

Для цього процесу нам потрібен тестовий код. Беремо його на вкладці "Test events" в менеджері подій.
І також тут буде видно результат тестування (інколи треба оновити сторінку).
Сам код будемо виставляти в іншому місці.

image.png

Tonic Facebook RSOC - отримання посилання (за комплаєнсом)

Спосіб 1

Заходимо в налаштування кампанії

image.png

Клікаємо на помічник параметрів

image.png

Далі:
- вказуєте adtitle
- проставляєте галочки (іноді не виставлені автоматично)
- та задаємо додаткові параметри (кнопка Add). Нам потрібно три параметри, щоб потім оптимайзер міг отримати статистику правильно
subid3: {{campaign.id}}
subid4: {{adset.id}}
subid2: {{ad.id}}

Піксель налаштовуєте як зазвичай (тут автоматично додається dpco, та перехопиться fbclid).
Копіюєте сформовану Tracking Link та вставляєте її як URL креативу у Facebook.


Спосіб 2 (простіший)

В морді берете direct link

image.png


Задача в документі

image.png

Посилання генеруєте так

image.pngАвтоматичного перейменування кампанії в тонік поки що немає.
Потрібне посилання вам берете із стовбчика M


!!! Таргетинг у Facebook

Facebook Audience Network (FAN) Usage Prohibited:
The use of Facebook Audience Network (FAN) is strictly prohibited. All Facebook 
campaigns and any traffic directed to your content or article pages must have FAN 
explicitly deactivated to remain in compliance with policies.

Тобто, потрібно виключити FAN.
У вас інтерфейс може бути іншим трохи.
Але це налаштовується на етапі налаштувань адсета (групи оголошень).

image.png

Далі внизу вимикаємо FAN (знімаємо галочки)

image.png

Tonic - RSOC

Технічні дрібниці по інтеграції The Optimizer

 

Для Optimizer
mgid 	 |	subid4 | 	{campaign_id}|{teaser_id}|{widget_id}|{source_id}
facebook | 	subid2 |	{ad.id}}
    		subid3 | 	{{campaign.id}}
    		subid4 |	{{adset.id}}|{{campaign.id}}|{{ad.id}}|{{placement}}
outbrain |	subid4 | 	{{campaign_id}}|{{ad_id}}|{{section_id}}|{{publisher_id}}|{{section_name}}|{{publisher_name}}
taboola  | 	subid4 | 	{campaign_id}|{campaign_item_id}|{site}|{site_id}|{site_domain}
newsbreak|	subid4 | 	__CAMPAIGN_ID__|__FLIGHT_ID__|__CREATIVE_ID__

 

Посилання з Tonic

Берете Use direct link або D.Link в морді

image.png

image.png

Таблиця постбеків

Постбеки виставляєте в налаштуваннях кампанії тоніка в підменю Callbacks

Traffic Source Postback URL
mgid Передавати виплату попередню
https://a.mgid.com/postback?c={subid1}&e=sale&r={revenue}

 

Без виплати 

https://a.mgid.com/postback?c={subid1}&e=sale&r=0

 

facebook Працюєте як зазвичай з conversion token та pixel/dataset id
outbrain
https://tr.outbrain.com/unifiedPixel?ob_click_id={subid1}&name=sale&orderValue={revenue}&currency=USD

taboola
https://trc.taboola.com/actions-handler/log/3/s2s-action?click-id={subid1}&name=sale&revenue={revenue}&currency=USD

newsbreak

complete_payment

https://business.newsbreak.com/tracking/attribute?callback={subid1}&event_type=complete_payment&nb_value={revenue}

click_button

https://business.newsbreak.com/tracking/attribute?callback={subid1}&event_type=click_button&nb_value={revenue}

revcontent

???

DSP mgid

???


Генерування посилання для Джерела трафіку

Генерується автоматично під час генерації імені кампанії. (стовбчик M)
Перейменування кампаній в тоніку автоматичне, поки що не працює.

image.png


Постбек

Налаштовуєте в самій кампанії в кабінеті Tonic

image.png

Для MGID є нюанс. Коли виставляєте посилання воно може не прийнятись бо домен не одобрений, або прийнятись і модератори його промодерують. Інколи і вони не модерують і кажуть що не будуть.
Тімлідам покажу як модерувати/одобрювати домен в cab.
Також домен зазвичай опрувиться для одного кабінету, покажу як дозволити його для інших кабінетів, якщо потібно.