SEO Performance Monitoring Dashboard
Organic Sessions
0
Avg. Keyword Rank
0
Keywords in Top 3
0
Total Backlinks
0
Performance Trends (Last 30 Days)
Keyword Ranking Distribution
Technical Health
Site Speed
0
/ 100Mobile Friendliness
0
/ 100Crawl Errors
0
SSL Status
Secure
Tracked Keywords
| Keyword | Search Volume | Current Rank | Landing Page |
|---|
Add Keyword to Track
Manage All Tracked Keywords
| Keyword | Rank | Action |
|---|
Error: A required library is missing.
'; return; } // --- DATA MANAGEMENT --- let keywords = JSON.parse(localStorage.getItem('seo_keywords')) || []; const getSampleData = () => [ { id: 1, keyword: 'best running shoes for men', volume: 74000, rank: 2, page: '/running-shoes/men' }, { id: 2, keyword: 'womens yoga pants', volume: 49500, rank: 5, page: '/apparel/yoga-pants' }, { id: 3, keyword: 'smart fitness watch reviews', volume: 33100, rank: 8, page: '/blog/fitness-watch-review' }, { id: 4, keyword: 'buy protein powder online', volume: 22200, rank: 12, page: '/supplements' }, { id: 5, keyword: 'lightweight gym t-shirt', volume: 9900, rank: 4, page: '/apparel/shirts' }, { id: 6, keyword: 'high support sports bra', volume: 14800, rank: 25, page: '/apparel/sports-bras' }, { id: 7, keyword: 'noise cancelling earbuds for gym', volume: 8100, rank: 52, page: '/electronics/earbuds' }, ]; if (keywords.length === 0) keywords = getSampleData(); const saveState = () => localStorage.setItem('seo_keywords', JSON.stringify(keywords)); // --- CHART INSTANCES & UTILITIES --- let trendChart, distributionChart; const tabButtons = document.querySelectorAll('.seo-tab-button'); const tabContents = document.querySelectorAll('.seo-tab-content'); const nextBtn = document.getElementById('seo-next-btn'); const prevBtn = document.getElementById('seo-prev-btn'); // --- RENDER FUNCTIONS --- const renderAll = () => { try { renderKPIs(); renderTrendChart(); renderDistributionChart(); renderTechHealth(); renderKeywordsTable(); renderManageTable(); updateNavButtons(); } catch(error) { console.error("Dashboard rendering failed:", error); } }; const renderKPIs = () => { const avgRank = keywords.length > 0 ? keywords.reduce((sum, k) => sum + k.rank, 0) / keywords.length : 0; document.getElementById('seo-sessions-kpi').textContent = (12450).toLocaleString(); // Static sample document.getElementById('seo-avg-rank-kpi').textContent = avgRank.toFixed(1); document.getElementById('seo-top3-kpi').textContent = keywords.filter(k => k.rank <= 3).length; document.getElementById('seo-backlinks-kpi').textContent = (5280).toLocaleString(); // Static sample }; const renderTrendChart = () => { const options = { chart: { type: 'line', height: 350, toolbar: { show: false } }, series: [ { name: 'Organic Sessions', data: [9800, 10500, 11200, 12450] }, { name: 'Avg. Rank', data: [15.2, 13.1, 11.8, 10.5] } ], xaxis: { categories: ['Apr 2025', 'May 2025', 'Jun 2025', 'Jul 2025'] }, yaxis: [ { title: { text: 'Sessions' } }, { opposite: true, reversed: true, title: { text: 'Avg. Rank' } } ], stroke: { curve: 'smooth', width: 3 }, colors: ['var(--seo-primary-color)', 'var(--seo-success-color)'] }; if(trendChart) trendChart.destroy(); document.querySelector("#seo-trend-chart").innerHTML = ''; trendChart = new ApexCharts(document.querySelector("#seo-trend-chart"), options); trendChart.render(); }; const renderDistributionChart = () => { const distribution = { 'Top 3': keywords.filter(k => k.rank <= 3).length, 'Rank 4-10': keywords.filter(k => k.rank > 3 && k.rank <= 10).length, 'Rank 11-50': keywords.filter(k => k.rank > 10 && k.rank <= 50).length, 'Rank 51+': keywords.filter(k => k.rank > 50).length }; const options = { chart: { type: 'donut', height: 350 }, series: Object.values(distribution), labels: Object.keys(distribution), legend: { position: 'bottom' }, colors: ['var(--seo-success-color)', '#5dade2', 'var(--seo-warning-color)', 'var(--seo-danger-color)'] }; if(distributionChart) distributionChart.destroy(); document.querySelector("#seo-distribution-chart").innerHTML = ''; distributionChart = new ApexCharts(document.querySelector("#seo-distribution-chart"), options); distributionChart.render(); }; const renderTechHealth = () => { document.getElementById('seo-speed-score').textContent = '92'; document.getElementById('seo-mobile-score').textContent = '100'; const crawlErrorsEl = document.getElementById('seo-crawl-errors'); crawlErrorsEl.textContent = '3'; crawlErrorsEl.className = 'value negative'; // Make it red as it's bad }; const renderKeywordsTable = () => { const tbody = document.getElementById('seo-keywords-tbody'); tbody.innerHTML = ''; keywords.sort((a,b) => a.rank - b.rank).forEach(k => { tbody.innerHTML += `