// URL Parameter Capture Script for Google Ads Tracking
// Place this code in Wix Custom Code (Site-wide or page-specific)
(function() {
'use strict';
// Function to get URL parameters
function getURLParameters() {
const urlParams = new URLSearchParams(window.location.search);
const params = {};
// Capture all URL parameters
for (const [key, value] of urlParams) {
params[key] = value;
}
return params;
}
// Function to get or generate unique visitor ID
function getVisitorId() {
let visitorId = localStorage.getItem('visitor_id');
if (!visitorId) {
visitorId = 'visitor_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
localStorage.setItem('visitor_id', visitorId);
}
return visitorId;
}
// Function to save tracking data
function saveTrackingData(data) {
// Save to localStorage with timestamp
const trackingData = {
...data,
timestamp: new Date().toISOString(),
visitor_id: getVisitorId(),
page_url: window.location.href,
referrer: document.referrer
};
// Store in localStorage
localStorage.setItem('tracking_data', JSON.stringify(trackingData));
// Also store in sessionStorage for session-based tracking
sessionStorage.setItem('current_session_tracking', JSON.stringify(trackingData));
console.log('Tracking data saved:', trackingData);
return trackingData;
}
// Function to get saved tracking data
function getTrackingData() {
const stored = localStorage.getItem('tracking_data');
return stored ? JSON.parse(stored) : null;
}
// Function to create tracking code for LINE button
function generateTrackingCode(trackingData) {
if (!trackingData) return null;
// Create a compressed tracking code
const code = btoa(JSON.stringify({
gclid: trackingData.gclid || '',
utm_source: trackingData.utm_source || '',
utm_medium: trackingData.utm_medium || '',
utm_campaign: trackingData.utm_campaign || '',
visitor_id: trackingData.visitor_id,
timestamp: trackingData.timestamp
}));
return code;
}
// Main execution
function initTracking() {
// Get URL parameters
const urlParams = getURLParameters();
// Check if this is a Google Ads click (has gclid or utm parameters)
const isGoogleAdsClick = urlParams.gclid ||
urlParams.utm_source === 'google' ||
urlParams.utm_medium === 'cpc';
if (isGoogleAdsClick || Object.keys(urlParams).length > 0) {
// Save tracking data
const trackingData = saveTrackingData(urlParams);
// Update LINE buttons with tracking code
updateLINEButtons(trackingData);
} else {
// Check if we have previous tracking data
const existingData = getTrackingData();
if (existingData) {
updateLINEButtons(existingData);
}
}
}
// Function to update LINE buttons with tracking parameters
function updateLINEButtons(trackingData) {
const trackingCode = generateTrackingCode(trackingData);
// Find all LINE buttons/links
const lineButtons = document.querySelectorAll('a[href*="line.me"], a[href*="line://"], .line-button, [data-line-button]');
lineButtons.forEach(button => {
const originalHref = button.href;
if (originalHref && trackingCode) {
// Add tracking parameter to LINE URL
const separator = originalHref.includes('?') ? '&' : '?';
const newHref = `${originalHref}${separator}tracking=${encodeURIComponent(trackingCode)}`;
button.href = newHref;
button.setAttribute('data-tracking-code', trackingCode);
}
});
// Also make tracking code available globally for manual use
window.trackingCode = trackingCode;
window.trackingData = trackingData;
}
// Function to send tracking data to external service (like n8n webhook)
function sendToWebhook(trackingData, event = 'page_visit') {
// Replace with your n8n webhook URL
const webhookURL = 'https://n8n.sakww.com/webhook-test/get-url';
if (!webhookURL || webhookURL === 'https://n8n.sakww.com/webhook-test/get-url') {
console.log('Webhook URL not configured');
return;
}
const payload = {
event: event,
data: trackingData,
user_agent: navigator.userAgent,
screen_resolution: `${screen.width}x${screen.height}`
};
fetch(webhookURL, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}).then(response => {
console.log('Tracking data sent to webhook:', response.status);
}).catch(error => {
console.error('Error sending tracking data:', error);
});
}
// Initialize tracking when page loads
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initTracking);
} else {
initTracking();
}
// Re-run when new content is loaded (for Wix dynamic content)
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.addedNodes.length) {
const trackingData = getTrackingData();
if (trackingData) {
setTimeout(() => updateLINEButtons(trackingData), 100);
}
}
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
// Global functions for manual use
window.getTrackingData = getTrackingData;
window.getTrackingCode = function() {
const data = getTrackingData();
return data ? generateTrackingCode(data) : null;
};
// Optional: Send tracking data to webhook on page load
// Uncomment the lines below if you want to send data immediately
/*
setTimeout(() => {
const trackingData = getTrackingData();
if (trackingData && (trackingData.gclid || trackingData.utm_source)) {
sendToWebhook(trackingData, 'google_ads_click');
}
}, 1000);
*/
})();
top of page
หนา x กว้าง
ยาว
ราคา/แผ่น
ราคา/ตร.ม.
คู่มือการติดตั้งไม้ระแนง
Note:The installation method is for reference only, the detailed method is subject to construction requirements
bottom of page