// 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
1-fused bamboo logo color.png
Bamboo-Slats-01.png
Bamboo-Slats-03.png
Bamboo-Slats-04.png
หนา x กว้าง
ยาว
ราคา/แผ่น
ราคา/ตร.ม.

439฿ 

30 x 100 มม.

1,850 มม.

3,631.10฿

1,860 มม.

2,000 มม.

659฿ 

499฿ 

3,543.01฿

3,838.46฿

30 x 65 มม.

2,440 มม.

1,860 มม.

2,000 มม.

599฿ 

599฿ 

743฿ 

3,776.80฿

4,954.51฿

3,715.00฿

2,440 มม.

2,000 มม.

899฿ 

685฿ 

3,684.43฿

5,269.23฿

40 x 65 มม.

2,440 มม.

1,860 มม.

2,000 มม.

829฿ 

847฿ 

5,226.99฿

4,833.33฿

5,293.75฿

40 x 80 มม.

2,440 มม.

2,000 มม.

1,039฿ 

1,249฿ 

999฿ 

5,322.75฿

4,995.00฿

40 x 100 มม.

2,440 มม.

899฿ 

5,188.85฿

Bamboo-Slats-05.png
Bamboo-Slats-06.png
Bamboo-Slats-07.png

คู่มือการติดตั้งไม้ระแนง

Bamboo-Slats-09.png
Bamboo-Slats-10.png

Note:The installation method is for reference only, the detailed method is subject to construction requirements

ลูกค้าของเรา

bottom of page