International Traffic Breakdown
Total Intl. Sessions
0
Conversion Rate
0%
Total Revenue
$0
Top Country
N/A
Traffic by Country
Top 10 Countries by Sessions
Top 10 Countries by Revenue
Detailed Country Data
| Country | Sessions | Bounce Rate | Conv. Rate | Revenue |
|---|
Add/Edit Country Traffic Data
Manage All Traffic Data
| Country | Sessions | Revenue | Action |
|---|
Error: A required library is missing.
'; return; } // --- DATA MANAGEMENT --- let trafficData = JSON.parse(localStorage.getItem('itd_traffic')) || []; const getSampleData = () => [ { country: 'United Kingdom', code: 'GBR', sessions: 85200, bounce: 35.2, conv: 3.8, revenue: 120500 }, { country: 'Canada', code: 'CAN', sessions: 78900, bounce: 40.1, conv: 3.5, revenue: 110200 }, { country: 'Australia', code: 'AUS', sessions: 65100, bounce: 33.5, conv: 4.1, revenue: 98500 }, { country: 'Germany', code: 'DEU', sessions: 52300, bounce: 45.8, conv: 2.5, revenue: 65400 }, { country: 'India', code: 'IND', sessions: 45800, bounce: 55.2, conv: 1.8, revenue: 32100 }, { country: 'France', code: 'FRA', sessions: 38200, bounce: 42.1, conv: 2.9, revenue: 48900 }, { country: 'Japan', code: 'JPN', sessions: 31500, bounce: 38.9, conv: 3.2, revenue: 45200 }, { country: 'Brazil', code: 'BRA', sessions: 28900, bounce: 60.3, conv: 1.5, revenue: 21300 }, { country: 'Mexico', code: 'MEX', sessions: 25400, bounce: 58.1, conv: 1.9, revenue: 24500 }, { country: 'Netherlands', code: 'NLD', sessions: 21800, bounce: 36.4, conv: 4.5, revenue: 38900 }, ]; if (trafficData.length === 0) trafficData = getSampleData(); const saveState = () => localStorage.setItem('itd_traffic', JSON.stringify(trafficData)); // --- CHART INSTANCES & UTILITIES --- let mapChart, sessionsChart, revenueChart; const tabButtons = document.querySelectorAll('.itd-tab-button'); const tabContents = document.querySelectorAll('.itd-tab-content'); const nextBtn = document.getElementById('itd-next-btn'); const prevBtn = document.getElementById('itd-prev-btn'); const formatCurrency = (val) => val.toLocaleString('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0 }); // --- RENDER FUNCTIONS --- const renderAll = () => { try { renderKPIs(); renderMapChart(); renderSessionsChart(); renderRevenueChart(); renderCountryTable(); renderManageTable(); updateNavButtons(); } catch(error) { console.error("Dashboard rendering failed:", error); } }; const renderKPIs = () => { const totalSessions = trafficData.reduce((sum, d) => sum + d.sessions, 0); const totalRevenue = trafficData.reduce((sum, d) => sum + d.revenue, 0); const totalConversions = trafficData.reduce((sum, d) => sum + (d.sessions * (d.conv / 100)), 0); const avgConvRate = totalSessions > 0 ? (totalConversions / totalSessions) * 100 : 0; const topCountry = trafficData.length > 0 ? [...trafficData].sort((a,b) => b.sessions - a.sessions)[0].country : 'N/A'; document.getElementById('itd-sessions-kpi').textContent = totalSessions.toLocaleString(); document.getElementById('itd-conv-rate-kpi').textContent = `${avgConvRate.toFixed(1)}%`; document.getElementById('itd-revenue-kpi').textContent = formatCurrency(totalRevenue); document.getElementById('itd-top-country-kpi').textContent = topCountry; }; const renderMapChart = () => { const seriesData = trafficData.map(d => ({ x: d.code, y: d.sessions })); const options = { chart: { type: 'map', height: 400 }, series: [{ name: 'Sessions', data: seriesData }], map: { map: 'world' }, colorScale: { ranges: [ { from: 0, to: 10000, name: '0-10k', color: '#dbeafe' }, { from: 10001, to: 50000, name: '10k-50k', color: '#60a5fa' }, { from: 50001, to: 100000, name: '50k+', color: '#2563eb' } ] }, tooltip: { y: { formatter: val => `${val.toLocaleString()} Sessions` } } }; if(mapChart) mapChart.destroy(); document.querySelector("#itd-map-chart").innerHTML = ''; mapChart = new ApexCharts(document.querySelector("#itd-map-chart"), options); mapChart.render(); }; const renderSessionsChart = () => { const sortedData = [...trafficData].sort((a,b) => b.sessions - a.sessions).slice(0, 10); const options = { chart: { type: 'bar', height: 400, toolbar: { show: false } }, series: [{ name: 'Sessions', data: sortedData.map(d => d.sessions) }], xaxis: { categories: sortedData.map(d => d.country) }, plotOptions: { bar: { horizontal: true, distributed: true } }, legend: { show: false } }; if(sessionsChart) sessionsChart.destroy(); document.querySelector("#itd-sessions-chart").innerHTML = ''; sessionsChart = new ApexCharts(document.querySelector("#itd-sessions-chart"), options); sessionsChart.render(); }; const renderRevenueChart = () => { const sortedData = [...trafficData].sort((a,b) => b.revenue - a.revenue).slice(0, 10); const options = { chart: { type: 'bar', height: 400, toolbar: { show: false } }, series: [{ name: 'Revenue', data: sortedData.map(d => d.revenue) }], xaxis: { categories: sortedData.map(d => d.country) }, yaxis: { labels: { formatter: val => formatCurrency(val).replace('.00','') } }, plotOptions: { bar: { horizontal: false, distributed: true } }, legend: { show: false }, colors: [ 'var(--itd-success-color)'], tooltip: { y: { formatter: val => formatCurrency(val) } } }; if(revenueChart) revenueChart.destroy(); document.querySelector("#itd-revenue-chart").innerHTML = ''; revenueChart = new ApexCharts(document.querySelector("#itd-revenue-chart"), options); revenueChart.render(); }; const renderCountryTable = () => { const tbody = document.getElementById('itd-country-tbody'); tbody.innerHTML = ''; [...trafficData].sort((a,b) => b.sessions - a.sessions).forEach(d => { tbody.innerHTML += `