Chặn Click Tặc Google Ads Theo IP và Thiết Bị

Click tặc có thể khiến ngân sách Google Ads bị tiêu hao bởi những lượt truy cập lặp lại hoặc hành vi bất thường, đặc biệt khi một IP hoặc thiết bị liên tục truy cập và tương tác với website. Code này giải quyết vấn đề bằng cách ghi nhận thông minh các lượt Visit, Call, Zalo và Form, đồng thời lưu lại IP, Device ID, Session, từ khóa và trang truy cập để theo dõi hành vi. Hệ thống tự động phát hiện IP/Device ID có tần suất bất thường, đánh dấu cảnh báo và cho phép chặn Device ID nghi ngờ, đồng thời lưu dữ liệu trong 90 ngày và xuất báo cáo CSV để dễ dàng kiểm tra.

Chú ý: bạn nào muốn thao tác đơn giản, chỉ cần chặn IP đáng ngờ thì thì dùng Theo Dõi Chuyển Đổi Và IP Đáng Ngờ Từ Google Ads Trực Tiếp Trên Website là được nhé.

Code Theo Dõi Google Ads Để Chặn Click Tặc

Đầu tiên, các bạn kiểm tra xem website đã có sẵn plugin Code Spippets chưa, nếu chưa thì các bạn cài đặt plugin Code Snippets lên website.

  • Cách kiểm tra, vào quảng trị website nhìn góc trái, bên dưới phần Cài Đặt vài hảng có menu Code Snippets nghĩa là website đã có plugin này, kéo tới hết menu luôn mà không có chữ Code Snippets nghĩa là chưa cài
  • Nếu chưa cài, các bạn vào phần “Plugin” >> cài mới >> tìm “code spippets” >> bấm cài đặt >> đợi >> bấm kích hoạt

Sau khi có Code Spippets trên máy, các bạn vào Code Spippets >> Add Snippet >> Chọn ô đầu tiên

Chặn Click Tặc Google Ads Theo IP và Thiết Bị 4

Tiếp theo bạn chọn PHP Snippets, đặt tên Snippets là  “Theo Dõi Chuyển Đổi theo IP và thiết bị”, góc trái chọn “Active” luôn, sau đó dán code dưới dây vào rồi lưu.

Bạn nào đã cài Theo Dõi Chuyển Đổi Và IP Đáng Ngờ Từ Google Ads Trực Tiếp Trên Website, thì đoạn code này sẽ ghi đè lên đoạn code bên đó, nên chat zalo với mình để nhận tư vấn trước khi cài cho chắc nhe

Code theo dõi chuyền đổi và chặn click tặc php
/**
* Vinhxdcom Functions - Google Ads Tracking
* Version 30 - Added Fluent Forms & IP/Device Abuse Detector
*
* Tối ưu & Bổ sung:
* - Tương thích PHP 8.4+ (fputcsv & fgetcsv)
* - Tự động bắt sự kiện nộp Form từ Fluent Forms
* - Thống kê & cảnh báo IP bất thường (Vạch đỏ + Badge 🔴 Nx)
* - Thống kê & cảnh báo Device ID bất thường (Tối màu + Badge ⚫ Nx)
*/

if (!defined('ABSPATH')) {
exit;
}

/* =========================================================
* 1. CẤU HÌNH
* ========================================================= */

define('GA_LOG_DIR_NAME', 'ip-logs');
define('GA_LOG_FILE_NAME', 'ads-tracking-v20.csv');
define('GA_BLACKLIST_FILE_NAME', 'blacklist.txt');

define('GA_SESSION_UPDATE_LIMIT', 100);
define('GA_DATA_RETENTION_DAYS', 90);

// Ngưỡng cảnh báo tần suất (Số lần xuất hiện để tính là bất thường)
define('GA_ABUSE_THRESHOLD', 3);

/* =========================================================
* 2. HELPER - ĐƯỜNG DẪN FILE
* ========================================================= */

function ga_get_log_dir() {
$upload_dir = wp_upload_dir();
return trailingslashit($upload_dir['basedir']) . GA_LOG_DIR_NAME;
}

function ga_get_log_file() {
return trailingslashit(ga_get_log_dir()) . GA_LOG_FILE_NAME;
}

function ga_get_blacklist_file() {
return trailingslashit(ga_get_log_dir()) . GA_BLACKLIST_FILE_NAME;
}

/* =========================================================
* 3. BLACKLIST
* ========================================================= */

function ga_handle_blacklist($device_id = '', $action = 'check') {

$device_id = sanitize_text_field($device_id);

if (empty($device_id) || $device_id === 'unknown') {
return false;
}

$dir = ga_get_log_dir();
$file = ga_get_blacklist_file();

if (!file_exists($dir)) {
wp_mkdir_p($dir);
}

if ($action === 'check') {
if (!file_exists($file)) {
return false;
}

$fp = fopen($file, 'r');
if (!$fp) {
return false;
}

$result = false;

if (flock($fp, LOCK_SH)) {
while (($line = fgets($fp)) !== false) {
if (trim($line) === $device_id) {
$result = true;
break;
}
}
flock($fp, LOCK_UN);
}

fclose($fp);
return $result;
}

if ($action === 'add') {
$fp = fopen($file, 'c+');
if (!$fp) {
return false;
}

$result = false;

if (flock($fp, LOCK_EX)) {
$blacklist = [];
rewind($fp);

while (($line = fgets($fp)) !== false) {
$line = trim($line);
if ($line !== '') {
$blacklist[] = $line;
}
}

if (!in_array($device_id, $blacklist, true)) {
$blacklist[] = $device_id;
rewind($fp);

foreach ($blacklist as $id) {
fwrite($fp, $id . PHP_EOL);
}

ftruncate($fp, ftell($fp));
}

$result = true;
flock($fp, LOCK_UN);
}

fclose($fp);
return $result;
}

return false;
}

/* =========================================================
* 4. LẤY IP
* ========================================================= */

function ga_get_client_ip() {
$ip = '';

if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$forwarded = explode(',', wp_unslash($_SERVER['HTTP_X_FORWARDED_FOR']));
$ip = trim($forwarded[0]);
} elseif (!empty($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}

return sanitize_text_field($ip);
}

/* =========================================================
* 5. GHI SMART LOG
* ========================================================= */

function ga_write_smart_log($type = 'visit', $ajax_data = []) {

$allowed_types = ['visit', 'call', 'zalo', 'form'];

$type = sanitize_key($type);
if (!in_array($type, $allowed_types, true)) {
$type = 'visit';
}

$ip = ga_get_client_ip();
$device_id = !empty($ajax_data['device_id']) ? sanitize_text_field(wp_unslash($ajax_data['device_id'])) : 'unknown';
$session_id = !empty($ajax_data['session_id']) ? sanitize_text_field(wp_unslash($ajax_data['session_id'])) : 'nosession';
$page_url = !empty($ajax_data['url']) ? esc_url_raw(wp_unslash($ajax_data['url'])) : '(không rõ)';
$current_kw = !empty($ajax_data['keyword']) ? sanitize_text_field(wp_unslash($ajax_data['keyword'])) : '(không có)';
$current_cp = !empty($ajax_data['campaignid']) ? sanitize_text_field(wp_unslash($ajax_data['campaignid'])) : '(không có)';

$dir = ga_get_log_dir();
if (!file_exists($dir)) {
wp_mkdir_p($dir);
}

$file = ga_get_log_file();
$fp = fopen($file, 'c+');

if (!$fp) {
return false;
}

if (!flock($fp, LOCK_EX)) {
fclose($fp);
return false;
}

$rows = [];
$header_written = false;

rewind($fp);

while (($data = fgetcsv($fp, 0, ',', '"', '\')) !== false) {
if (empty($data)) {
continue;
}

$data = array_pad($data, 11, '');
$rows[] = $data;

if (isset($data[0]) && $data[0] === 'datetime') {
$header_written = true;
}
}

if (!$header_written) {
array_unshift($rows, [
'datetime', 'ip', 'action', 'keyword', 'campaignid',
'source', 'count', 'device_id', 'first_time', 'page_url', 'session_id'
]);
}

$now = current_time('mysql');

switch ($type) {
case 'call':
$action_label = 'Call Click';
break;

case 'zalo':
$action_label = 'Zalo Click';
break;

case 'form':
$action_label = 'Form Submit';
break;

default:
$action_label = 'Visit';
break;
}

$updated = false;

if ($type === 'visit') {
$row_count = count($rows);
$start_index = max(1, $row_count - GA_SESSION_UPDATE_LIMIT);

for ($i = $row_count - 1; $i >= $start_index; $i--) {
$same_device = isset($rows[$i][7]) && $rows[$i][7] === $device_id;
$same_session = isset($rows[$i][10]) && $rows[$i][10] === $session_id;
$is_visit = isset($rows[$i][2]) && $rows[$i][2] === 'Visit';

if ($same_device && $same_session && $is_visit) {
$rows[$i][0] = $now;
$rows[$i][1] = trim($ip);
$rows[$i][6] = ((int) $rows[$i][6]) + 1;
$rows[$i][9] = $page_url;

if ($current_kw !== '(không có)') {
$rows[$i][3] = $current_kw;
}

if ($current_cp !== '(không có)') {
$rows[$i][4] = $current_cp;
}

if ($current_kw !== '(không có)' || $current_cp !== '(không có)') {
$rows[$i][5] = 'Google Ads';
}

$updated = true;
break;
}
}
}

if (!$updated) {
$source = ($current_kw !== '(không có)' || $current_cp !== '(không có)') ? 'Google Ads' : 'Tự nhiên/Khác';

$rows[] = [
$now, trim($ip), $action_label, $current_kw, $current_cp,
$source, 1, $device_id, $now, $page_url, $session_id
];
}

rewind($fp);

foreach ($rows as $row) {
fputcsv($fp, $row, ',', '"', '\');
}

ftruncate($fp, ftell($fp));
flock($fp, LOCK_UN);
fclose($fp);

return true;
}

/* =========================================================
* 6. CLEANUP 90 NGÀY
* ========================================================= */

if (!wp_next_scheduled('ga_daily_cleanup_logs')) {
wp_schedule_event(time(), 'daily', 'ga_daily_cleanup_logs');
}

add_action('ga_daily_cleanup_logs', function () {
$file = ga_get_log_file();
if (!file_exists($file)) return;

$fp = fopen($file, 'c+');
if (!$fp) return;

if (!flock($fp, LOCK_EX)) {
fclose($fp);
return;
}

$new_lines = [];
$limit = strtotime('-' . GA_DATA_RETENTION_DAYS . ' days');

rewind($fp);

while (($data = fgetcsv($fp, 0, ',', '"', '\')) !== false) {
if (empty($data)) continue;

if (isset($data[0]) && $data[0] === 'datetime') {
$new_lines[] = $data;
continue;
}

if (!isset($data[0])) {
$new_lines[] = $data;
continue;
}

$time = strtotime($data[0]);
if ($time === false || $time > $limit) {
$new_lines[] = $data;
}
}

rewind($fp);
foreach ($new_lines as $row) {
fputcsv($fp, $row, ',', '"', '\');
}

ftruncate($fp, ftell($fp));
flock($fp, LOCK_UN);
fclose($fp);
});

/* =========================================================
* 7. AJAX - BLOCK DEVICE
* ========================================================= */

add_action('wp_ajax_ga_block_device', function () {
if (!current_user_can('manage_options')) {
wp_send_json_error(['message' => 'Bạn không có quyền.'], 403);
}

check_ajax_referer('ga_block_device', 'nonce');

$id = isset($_POST['device_id']) ? sanitize_text_field(wp_unslash($_POST['device_id'])) : '';

if (empty($id) || $id === 'unknown') {
wp_send_json_error(['message' => 'Device ID không hợp lệ.']);
}

if (ga_handle_blacklist($id, 'add')) {
wp_send_json_success();
}

wp_send_json_error();
});

/* =========================================================
* 8. AJAX - TRACKING
* ========================================================= */

add_action('wp_ajax_ga_log_visit', 'ga_ajax_log_visit');
add_action('wp_ajax_nopriv_ga_log_visit', 'ga_ajax_log_visit');

function ga_ajax_log_visit() {
$type = isset($_POST['type']) ? sanitize_key(wp_unslash($_POST['type'])) : 'visit';
$allowed_types = ['visit', 'call', 'zalo', 'form'];

if (!in_array($type, $allowed_types, true)) {
wp_send_json_error(['message' => 'Invalid tracking type.'], 400);
}

ga_write_smart_log($type, $_POST);
wp_send_json_success();
}

/* =========================================================
* 9. FRONTEND TRACKING (SUPPORT FLUENT FORMS)
* ========================================================= */

add_action('wp_footer', function () {

$device_id_cookie = isset($_COOKIE['ga_device_id']) ? sanitize_text_field(wp_unslash($_COOKIE['ga_device_id'])) : '';
$is_blacklisted = !empty($device_id_cookie) ? ga_handle_blacklist($device_id_cookie, 'check') : false;
?>

<script>
    (function () {
        'use strict';

        const ID_KEY = 'ga_device_id';
        const SS_KEY = 'ga_session_id';

        const urlParams = new URLSearchParams(window.location.search);
        let deviceId  = localStorage.getItem(ID_KEY);

        if (!deviceId) {
            const cookieMatch = document.cookie.match('(^|;)\s*' + ID_KEY + '\s*=\s*([^;]+)');
            deviceId = cookieMatch ? cookieMatch[2] : ('dev_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now());
        }

        try {
            localStorage.setItem(ID_KEY, deviceId);
        } catch (e) {}

        document.cookie = ID_KEY + '=' + encodeURIComponent(deviceId) + ';path=/;max-age=31536000;SameSite=Lax';

        let sessionId = sessionStorage.getItem(SS_KEY);
        if (!sessionId) {
            sessionId = 'ss_' + Date.now() + '_' + Math.random().toString(36).substr(2, 5);
            try {
                sessionStorage.setItem(SS_KEY, sessionId);
            } catch (e) {}
        }

        <?php if ($is_blacklisted) : ?>
        window.addEventListener('load', function () {
            if (typeof gtag === 'function') {
                gtag('event', 'mark_as_spammer', { device_id: deviceId });
            }
        });
        <?php endif; ?>

        function sendLog(type) {
            const fd = new FormData();
            fd.append('action', 'ga_log_visit');
            fd.append('type', type);
            fd.append('device_id', deviceId);
            fd.append('session_id', sessionId);
            fd.append('url', window.location.href);
            fd.append('keyword', urlParams.get('keyword') || '');
            fd.append('campaignid', urlParams.get('campaignid') || '');

            fetch('<?php echo esc_url(admin_url('admin-ajax.php')); ?>', {
                method: 'POST',
                body: fd,
                keepalive: true,
                credentials: 'same-origin'
            }).catch(function () {});
        }

        // Send Initial Visit
        setTimeout(function () {
            sendLog('visit');
        }, 2000);

        // Heartbeat Visits
        setTimeout(function () {
            sendLog('visit');
            setInterval(function () {
                sendLog('visit');
            }, 20000);
        }, 10000);

        // Track Call & Zalo Click
        document.addEventListener('click', function (e) {
            const link = e.target.closest('a');
            if (!link) return;

            const href = link.getAttribute('href') || '';
            let type = '';

            if (href.toLowerCase().startsWith('tel:')) {
                type = 'call';
            } else if (href.includes('zalo.me/')) {
                type = 'zalo';
            }

            if (type) {
                sendLog(type);
            }
        }, true);

        // Track Fluent Forms Submission Success
        if (typeof window.jQuery !== 'undefined') {
            window.jQuery(document).on('fluentform_submission_success', function () {
                sendLog('form');
            });
        }
        document.addEventListener('fluentform_submission_success', function () {
            sendLog('form');
        });

    })();
    </script>

<?php }); /* ========================================================= * 10. ADMIN MENU * ========================================================= */ add_action('admin_menu', function () { add_menu_page( 'Ads Logs', 'Ads Logs', 'manage_options', 'ads-logs', 'ga_render_logs_v30', 'dashicons-shield-alt', 80 ); }); /* ========================================================= * 11. ADMIN FOOTER - BLOCK BUTTON * ========================================================= */ add_action('admin_footer', function () { $screen = get_current_screen(); if (!$screen || $screen-&amp;amp;amp;amp;gt;id !== 'toplevel_page_ads-logs') {&amp;amp;amp;amp;lt;br ?> return;
}

$nonce = wp_create_nonce('ga_block_device');
?>

<script>
    function manualMarkSpam(id) {
        if (!id || id === 'unknown') {
            alert('Không thể chặn ID unknown.');
            return;
        }

        if (!confirm('Chặn thiết bị này?')) {
            return;
        }

        jQuery.post(
            ajaxurl,
            {
                action: 'ga_block_device',
                device_id: id,
                nonce: '<?php echo esc_js($nonce); ?>'
            },
            function (res) {
                if (res.success) {
                    alert('Đã chặn thiết bị!');
                    location.reload();
                } else {
                    alert(res.data && res.data.message ? res.data.message : 'Có lỗi xảy ra.');
                }
            }
        );
    }
    </script>

<?php &amp;amp;amp;amp;lt;br ?> });

/* =========================================================
* 12. ADMIN LOGS (HIGHLIGHT ABUSE IP & DEVICE ID)
* ========================================================= */

function ga_render_logs_v30() {

if (!current_user_can('manage_options')) {
wp_die(esc_html__('Bạn không có quyền truy cập.'));
}

$file = ga_get_log_file();

echo '
<div class="wrap">';
echo '
<h1>' . esc_html('Nhật ký quảng cáo (V30)') . '</h1>
';

if (!file_exists($file)) {
echo '

' . esc_html('Chưa có dữ liệu.') . '

';
echo '

</div>
';
return;
}

$download_url = add_query_arg([
'page' => 'ads-logs',
'download_csv' => '1'
], admin_url('admin.php'));

echo '
<div style="margin: 15px 0;">';
echo '<a class="button button-primary" href="' . esc_url($download_url) . '">' . esc_html('Tải về báo cáo CSV') . '</a>';
echo '</div>
';

$all_data = [];
$device_sessions = [];

// Đếm tần suất IP & Device ID
$ip_counts = [];
$device_counts = [];

if (($fp = fopen($file, 'r')) !== false) {

while (($c = fgetcsv($fp, 0, ',', '"', '\')) !== false) {

if (empty($c) || $c[0] === 'datetime') {
continue;
}

$c = array_pad($c, 11, '');
$all_data[] = $c;

$ip_val = !empty($c[1]) ? trim($c[1]) : '';
$device_id = !empty($c[7]) ? trim($c[7]) : 'unknown';
$session_id = !empty($c[10]) ? trim($c[10]) : 'nosession';

// Đếm IP
if ($ip_val) {
$ip_counts[$ip_val] = isset($ip_counts[$ip_val]) ? $ip_counts[$ip_val] + 1 : 1;
}

// Đếm Device ID
if ($device_id && $device_id !== 'unknown') {
$device_counts[$device_id] = isset($device_counts[$device_id]) ? $device_counts[$device_id] + 1 : 1;
}

if (!isset($device_sessions[$device_id])) {
$device_sessions[$device_id] = [];
}

$device_sessions[$device_id][$session_id] = true;
}

fclose($fp);
}

$all_data = array_reverse($all_data);

echo '

';echo '';echo '';echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';
echo '';echo '';foreach ($all_data as $c) {$d_id = isset($c[7]) ? $c[7] : 'unknown';
$ip_val = isset($c[1]) ? $c[1] : '';
$start_time = isset($c[8]) ? $c[8] : '';
$last_time = isset($c[0]) ? $c[0] : '';
$action = isset($c[2]) ? $c[2] : '';
$count = isset($c[6]) ? (int)$c[6] : 0;
$keyword = isset($c[3]) ? $c[3] : '';
$page_url = isset($c[9]) ? $c[9] : '';$is_black = ga_handle_blacklist($d_id, 'check');$ip_freq = isset($ip_counts[$ip_val]) ? $ip_counts[$ip_val] : 0;
$dev_freq = isset($device_counts[$d_id]) ? $device_counts[$d_id] : 0;$duration = 0;
if ($start_time && $last_time) {
$start_timestamp = strtotime($start_time);
$last_timestamp = strtotime($last_time);if ($start_timestamp !== false && $last_timestamp !== false) {
$duration = max(0, $last_timestamp - $start_timestamp);
}
}// Style cơ bản
$row_style = 'font-size:11px;color:#000 !important;';// Nếu IP bất thường (xuất hiện >= GA_ABUSE_THRESHOLD lần) -> Vạch đỏ bên trái + Nền hồng
if ($ip_freq >= GA_ABUSE_THRESHOLD) {
$row_style .= 'border-left: 4px solid #d32f2f !important; background-color: #fff5f5 !important;';
}if ($is_black) {
$row_style .= 'background-color:#fff9c4 !important;font-weight:bold;';
} elseif ($action === 'Call Click') {
$row_style .= 'background-color:#ffd9d9 !important;font-weight:bold;';
} elseif ($action === 'Zalo Click') {
$row_style .= 'background-color:#e2efff !important;font-weight:bold;';
} elseif ($action === 'Form Submit') {
$row_style .= 'background-color:#e8f5e9 !important;font-weight:bold;'; // Nền xanh lá nhạt cho Form Submit
}$session_count = isset($device_sessions[$d_id]) ? count($device_sessions[$d_id]) : 0;if ($duration > 60) {
$minutes = floor($duration / 60);
$seconds = $duration % 60;
$duration_text = $minutes . 'p ' . $seconds . 's';
} else {
$duration_text = $duration . 's';
}echo '';echo '';// Hiển thị IP + Badge đỏ nếu bất thường
echo '';// Hành động
echo '';
echo '';
echo '';// Hiển thị Device ID (Tối đi + Badge đen nếu bất thường)
if ($dev_freq >= GA_ABUSE_THRESHOLD && $d_id !== 'unknown') {
echo '';
} else {
echo '';
}echo '';
echo '';
echo '';
echo '';
echo '';
}echo '';
echo '
<table class="widefat striped" style="color: #000;">
<thead>
<tr>
<th>Thời gian bắt đầu</th>
<th>IP</th>
<th>Hành động</th>
<th>Lượt tương tác</th>
<th>Số phiên</th>
<th>Thiết bị ID</th>
<th>Thời lượng</th>
<th>Từ khóa</th>
<th>Trang chuyển đổi</th>
<th>Thao tác</th>
</tr>
</thead>
<tbody>
<tr>
<td>' . esc_html($start_time) . '</td>
<td><strong>' . esc_html($ip_val) . '</strong>';
if ($ip_freq >= GA_ABUSE_THRESHOLD) {
echo ' <span style="color: #d32f2f; font-weight: bold; font-size: 10px;">🔴 ' . esc_html($ip_freq) . 'x</span>';
}
echo '</td>
<td><strong>' . esc_html($action) . '</strong></td>
<td align="center">' . esc_html($count) . '</td>
<td style="font-weight: bold;" align="center">' . esc_html($session_count) . '</td>
<td><span style="color: #666666; font-weight: 600;">' . esc_html($d_id) . '</span> <span style="color: #333333; background: #e0e0e0; padding: 1px 5px; border-radius: 8px; font-size: 10px;">⚫ ' . esc_html($dev_freq) . 'x</span></td>
<td>' . esc_html($d_id) . '</td>
<td style="font-weight: bold;" align="center">' . esc_html($duration_text) . '</td>
<td>' . esc_html($keyword) . '</td>
<td style="max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;" title="' . esc_attr($page_url) . '">' . esc_html($page_url) . '</td>
<td>';

if ($is_black) {
echo esc_html('⛔ Đã chặn');
} else {
echo '<button class="button button-small" type="button">' . esc_html('Chặn') . '</button>';
}

echo '</td>
</tr>
</tbody>
</table>
';
echo '

';
}

/* =========================================================
* 13. DOWNLOAD CSV
* ========================================================= */

add_action('admin_init', function () {

if (!isset($_GET['page']) || $_GET['page'] !== 'ads-logs') {
return;
}

if (!isset($_GET['download_csv'])) {
return;
}

if (!current_user_can('manage_options')) {
wp_die(esc_html__('Bạn không có quyền tải báo cáo.'));
}

$file = ga_get_log_file();

if (!file_exists($file)) {
wp_die(esc_html__('Không tìm thấy file dữ liệu.'));
}

while (ob_get_level() > 0) {
ob_end_clean();
}

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename=ads-report-v30.csv');

echo "\xEF\xBB\xBF";
echo "sep=,\n";

readfile($file);

exit;
});

Làm gì với công cụ này

Sau khi cài xong, trên menu Code Snippets  sẽ có 1 menu tên là Chuyển Đổi. Chú ý là công cụ này chỉ ghi nhận data từ Google Ads, và chỉ thu nhập data từ lúc bạn cài đặt, nên nếu web bạn không  chạy Google Ads hoặc chỉ mới cài thì không có dữ liệu gì nha

Xem chuyển đổi từ Google Ads

Giao diện Chuyển Đổi sẽ có sẵn 3 tab: Tất cả, Chỉ chuyển đổi và IP đáng ngờ và Device đáng ngờ

Bấm vào mục “Chỉ Chuyển Đổi”, bạn sẽ xem được các chuyển đổi từ google Ads. Chú ý hàng cuối cùng nguồn “Google Ads” nhe, vì nếu chuyển đổi tự nhiên( SEO, bạn tự test..) thì cũng sẽ ghi nhận nhé

Chặn Click Tặc Google Ads Theo IP và Thiết Bị 5

Xem IP truy cập nhiều

Mục IP truy cập nhiều sẽ là các ip truy cập nhiều từ “Nguồn: Google Ads”. Bạn chú ý thêm đó là các dãy Ip bắt đầu bằng 72.****, 162.****, 193.*** là bot của Google Ads, bot này truy cập không làm tốn tiền của bạn và bạn cũng không chặn được bot này nhe.

  • 72.14.201.x: Đây là dải IP thuộc sở hữu của Google LLC. Nó thường được dùng bởi Mediapartners-Google (AdsBot). Nhiệm vụ của nó là truy cập vào trang đích (landing page) để kiểm tra nội dung, tốc độ trang và tính liên quan của quảng cáo.
  • 193.186.x.x và 162.120.x.x: Đây cũng là các dải IP từ các trung tâm dữ liệu mà Google thường xuyên sử dụng để giả lập thiết bị di động nhằm kiểm tra trải nghiệm người dùng trên mobile.

Chặn IP truy cập nhiều

Nếu bạn phát hiện IP truy cập nhiều, nhưng không mang lại chuyển đổi, thì nó có thể là Click tặc, click phá… Hãy copy ip đó vào tài khoản Google Ads của bạn. Sau đó vào mục Quản trị ( menu dọc góc trái ) >> Dán IP, sau đó lưu lại là được nhé

Device đáng ngờ

Chặn Click Tặc Google Ads Theo IP và Thiết Bị 6
Mục này bạn sẽ xem được những thiết bị đã truy cập quảng cáo có vẻ đáng ngờ.

Chú ý: thiết bị nhận diện theo cookie trình duyệt, nếu người dùng sử dụng chrome thì sẽ tính là 1 ID, dùng safari sẽ tính 1 ID khác. Tuy nhiên ở level click tặc cơ bản, người dùng sẽ không có đổi trình duyệt chỉ để click quảng cáo đâu

Thiết lập để chặn Device

Code trên website đóng vai trò “phát hiện và dán nhãn” (bắn event mark_as_spammer sang Google Analytics), còn để thực sự ngăn tiền quảng cáo tiếp tục cắn vào các thiết bị này, bạn cần cấu hình chặn ở phía Google Analytics (GA4) và Google Ads.

Dưới đây là các bước quy trình setup trọn gói từ GA4 sang Google Ads để tối ưu nhất:

Setup trong Google Analytics 4 (GA4)

Bạn cần tạo một Tệp đối tượng (Audience) gom tất cả những thiết bị đã bị dán nhãn spam.

  • Vào Google Analytic >> Quản trị (Admin) >> Tệp đối tượng (Audiences) >> Tệp đối tượng mới (New audience).
  • Chọn Tạo tệp đối tượng tùy chỉnh (Create a custom audience).
  • Đặt tên tệp: Danh sách thiết bị Spam / Click tặc.
  • Tại ô điều kiện, tìm event name: mark_as_spammer.
  • Đổi Thời hạn thành viên (Membership duration) thành Thời hạn tối đa (Set to maximum limit) (thường là 540 ngày).
  • Nhấn Lưu (Save).

Liên kết GA4 với Google Ads

(Nếu bạn đã liên kết tài khoản rồi thì có thể bỏ qua bước này)

  • Trong Google Analytics >> Quản trị >> Liên kết Google Ads (Google Ads Links).
  • Chọn tài khoản Google Ads của bạn và bật tính năng Bật chế độ quảng cáo cá nhân hóa (Enable Personalized Advertising) để tệp đối tượng vừa tạo bên GA4 tự động đồng bộ sang Google Ads.

 Cấu hình Loại trừ Tệp Đối tượng trong Google Ads

Bây giờ bạn đưa tệp đối tượng Spam vào danh sách loại trừ để chiến dịch quảng cáo không phân phối tới họ nữa.

  • Đăng nhập Google Ads >> Vào Công cụ & Cài đặt (Tools & Settings) >> Trình quản lý đối tượng (Audience Manager).
  • Kiểm tra xem tệp Danh sách thiết bị Spam / Click tặc từ GA4 đã xuất hiện ở đây chưa (thường mất vài giờ để GA4 sync sang).

Vào chiến dịch quảng cáo bạn muốn chặn:

  • Chọn Chiến dịch (Campaigns) >> Chọn chiến dịch Google Ads đang chạy.
  • Chọn tab Đối tượng (Audiences) >> Cuộn xuống mục Lượt loại trừ (Exclusions).
  • Nhấn nút bút chì/dấu + để thêm loại trừ.
  • Chọn Phân đoạn đối tượng (Audience segments) $\rightarrow$ Tìm và tick chọn tệp Danh sách thiết bị Spam / Click tặc.
  • Nhấn Lưu (Save).

Lưu ý thực tế cho dân chạy Ads:

  • Google Ads chỉ loại trừ được khi người dùng đăng nhập tài khoản Google: Cơ chế này dựa vào ID của GA4 phối hợp với Google Signals / Cookie. Nếu đối thủ đổi IP + dùng tab vô danh (Incognito) + không đăng nhập Gmail, Google Ads vẫn khó nhận diện 100%.
  • Giải pháp kết hợp IP (Nên làm song song): Ngoài chặn device_id qua GA4, trong bảng Ads Logs của bạn có ghi lại địa chỉ IP. Bạn nên lấy luôn các IP có tần suất tương tác bất thường đập thẳng vào mục Loại trừ IP (IP Exclusions) trực tiếp trong Cài đặt chiến dịch của Google Ads để chặn triệt để hơn.

Hiện” từ khóa” kích hoạt quảng cáo

Nếu không setup phần này, cột “từ khóa” sẽ chỉ hiển thị là (không có), bạn cần làm thêm thao tác sau để công cụ nghi nhận từ khóa kích hoạt quảng cáo nhe

Bạn cùng vào Google Ads >> Quản trị >> Theo Dõi, phần “Hậu tó URL cuối cùng..”, dán đoạn sau vào

keyword={keyword}&network={network}&device={device}

Khám phá thêm nhiều kiến thức hữu ích về website