Executive Dashboard
KPIs
Trends
Virality
Sentiment
Deep Dive
FitLife Pro
AS
Crisis Alert — Negative Sentiment Spike
Sentiment on FitLife Pro dropped 35% in the last 2 hours. 12 flagged comments.
12 min ago
Engagement Rate
4.2%
+12% vs last week
Total Reach
24.5K
+8.3% vs last week
Sentiment Score
0.82
Positive — stable
Virality Rate
67%
−3.1% vs last week
Engagement & Reach — 30 Days
All pages · daily
Sentiment Split
847 posts · last 30 days
Positive 60%
Neutral 18%
Mixed 11%
Negative 11%
Format Performance
Avg engagement by type
Posting Heatmap
Engagement by day & time
This Week vs Last
Key metric comparison
Top Posts — Last 14 Days
Ranked by engagement
#PostFormatPostedReachEng%SharesSentimentVirality
01Product launch video — new supplement lineVideoTue 6:12 PM18.4K4.8%8920.9489%
02Behind the scenes — our morning routineReelWed 7:00 PM14.2K4.2%4450.8874%
03Customer transformation — 12 week journeyPhotoMon 12:00 PM11.8K3.9%3120.9168%
04Nutrition tips carousel — 5 meal prep hacksCarouselThu 5:45 PM9.4K3.4%1980.8561%
AI Activity Feed
Real-time intelligence
Virality predicted — Product launch video scored 89%. Boost within 2 hours.
2h ago
Timing shift — Morning posts 23% lower this week. Consider 6 PM slot.
5h ago
New segment — "Health-conscious millennials" cluster detected (14%).
1d ago
Emotion Radar
This week vs last week
VIRAL POSTS/MONTH
14
▲ 4 vs last month
AVG VIRALITY SCORE
0.67
▲ 12% vs last month
PREDICTION ACCURACY
94%
Last 50 predictions
SUPER SHARERS
12
Drive 34% of shares
Share Velocity — 48h
Shares per hour · red line = viral threshold 200/hr
Score Distribution
All posts this month
Viral Triggers
Impact ranking
Probability by Day & Time
% chance of exceeding threshold
Super Sharer Cascade — Last Viral Post
Pathway from post to algorithm pickup
Post published
Tue 1:17 PM
@dave_memes
+5 min · 8K
Dark Humour
Cluster
+22 min · 18K
Late-Night
Cluster
+45 min · 12K
Algorithm
Pickup
+62 min · 47K
OVERALL SCORE
0.82
Positive — stable
POSITIVE RATE
60%
508 posts
NEGATIVE RATE
11%
▲ 3% this week
CRISIS EVENTS
2
Last 30 days
Sentiment Over Time — 30 Days
Positive and negative rate daily
Emotion Breakdown
Comment classification
Sentiment by Page vs Benchmark
Sentiment → Engagement
60-post scatter correlation
Flagged Comments
AI risk-scored · respond directly
3 unreviewed
PriorityCommentPageTimeReactionsAI RiskEmotionAction
High"This product is way overpriced. Very disappointed."Kelpie Daily2h ago140.78Anger
Medium"Still waiting 2 weeks. No response from support."Kelpie Daily5h ago80.61Frustration
CORRELATION R²
0.847
Timing vs engagement
STATISTICAL SIG.
p<0.01
Timing effect confirmed
ANOMALIES
3
Posts this month
CONFIDENCE BAND
95%
Forecast accuracy
Caption Length vs Engagement Rate
Word count buckets · avg eng rate per bucket
Emoji Count vs Engagement Lift
0–8 emojis · avg relative uplift vs no-emoji baseline
Rolling Volatility (σ)
30-day std dev of engagement rate
Shares → Reach Multiplier
Each share = how many impressions gained
Post Frequency vs Avg Eng Rate
Posts per week — does cadence hurt quality?
Engagement Funnel
Impressions → Reach → Engagements → Shares → Saves
Hour × Day Engagement Matrix
Full 168-hour week — exact engagement %
Raw Data — Last 30 Days
All posts · all metrics · machine-readable
DatePageFormatPosted AtCaption WordsEmojisReachImpressionsEngagementsEng Rate %LikesCommentsSharesSavesSentimentEmotionTopicVirality ScoreSuper Sharer Triggered
// ─── DEEP DIVE CHARTS ─── function initDeepDive(){ once('cap-len',()=>{ new Chart(document.getElementById('captionLenChart'),{type:'bar',data:{ labels:['1-5 words','6-10','11-15','16-20','21-30','31-50','50+'], datasets:[{label:'Avg Eng Rate %',data:[2.1,2.8,3.4,4.2,4.8,3.9,2.6], backgroundColor:['rgba(0,212,170,0.45)','rgba(0,212,170,0.6)','rgba(0,212,170,0.72)','rgba(0,212,170,0.88)','rgba(0,212,170,0.95)','rgba(251,191,36,0.65)','rgba(248,113,113,0.55)'], borderRadius:6,borderSkipped:false}]}, options:{responsive:true,maintainAspectRatio:true, plugins:{tooltip:{callbacks:{label:ctx=>'Avg: '+ctx.parsed.y.toFixed(2)+'% ('+[84,142,198,231,184,97,41][ctx.dataIndex]+' posts)'}}}, scales:{x:{grid:{display:false},ticks:{font:{size:9}}}, y:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{callback:v=>v+'%',font:{size:9}}}}}}); }); once('emoji',()=>{ new Chart(document.getElementById('emojiChart'),{type:'line',data:{ labels:['0','1','2','3','4','5','6','7','8+'], datasets:[{label:'Uplift vs baseline',data:[0,8,18,28,34,29,22,14,6], borderColor:'#fbbf24',backgroundColor:'rgba(251,191,36,0.08)',borderWidth:2.5, pointRadius:5,pointBackgroundColor:'#fbbf24',pointBorderColor:'#0c1221',pointBorderWidth:2,fill:true,tension:0.4}]}, options:{responsive:true,maintainAspectRatio:true, plugins:{tooltip:{callbacks:{label:ctx=>'Eng uplift: +'+(ctx.parsed.y>0?'+':'')+ctx.parsed.y+'%'}}}, scales:{x:{grid:{display:false},ticks:{font:{size:9}},title:{display:true,text:'Emojis in caption',font:{size:9}}}, y:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{callback:v=>(v>=0?'+':'')+v+'%',font:{size:9}}}}}}); }); once('volatility',()=>{ const days=Array.from({length:30},(_,i)=>i+1+''); const eng=[3.1,3.4,3.2,2.8,4.1,3.9,4.2,3.7,4.0,4.3,3.8,4.5,4.1,4.6,4.2,3.9,4.4,4.7,4.3,4.8,4.1,4.5,4.9,4.6,4.2,4.8,5.1,4.7,4.3,4.8]; // Rolling 7-day std dev const vol=days.map((_,i)=>{ if(i<6)return null; const slice=eng.slice(i-6,i+1); const mean=slice.reduce((a,b)=>a+b)/slice.length; return Math.sqrt(slice.reduce((s,v)=>s+(v-mean)**2,0)/slice.length).toFixed(3); }); new Chart(document.getElementById('volatilityChart'),{type:'line',data:{labels:days,datasets:[ {label:'Eng Rate',data:eng,borderColor:'rgba(0,212,170,0.5)',backgroundColor:'transparent',borderWidth:1.5,pointRadius:0,tension:0.4,yAxisID:'y'}, {label:'7d σ Volatility',data:vol,borderColor:'#f87171',backgroundColor:'rgba(248,113,113,0.07)',borderWidth:2,pointRadius:0,fill:true,tension:0.4,yAxisID:'y1'}]}, options:{responsive:true,maintainAspectRatio:true,interaction:{mode:'index',intersect:false}, plugins:{legend:{display:true,position:'top',labels:{boxWidth:8,font:{size:9},padding:8}}, tooltip:{callbacks:{label:ctx=>ctx.dataset.label+': '+ctx.parsed.y+(ctx.datasetIndex===0?'%':'σ')}}}, scales:{x:{grid:{display:false},ticks:{maxTicksLimit:8,font:{size:9}}}, y:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{callback:v=>v+'%',font:{size:9}}}, y1:{position:'right',grid:{display:false},ticks:{callback:v=>v+'σ',font:{size:9}}}}}}); }); once('share-mult',()=>{ new Chart(document.getElementById('shareMultChart'),{type:'bar',data:{ labels:['Drinking Memes','Kelpie Daily','UK Jail News','Average'], datasets:[{label:'Impressions per share',data:[48.4,32.1,27.8,36.1], backgroundColor:['rgba(0,212,170,0.8)','rgba(99,102,241,0.7)','rgba(251,191,36,0.65)','rgba(255,255,255,0.12)'], borderRadius:8}]}, options:{responsive:true,maintainAspectRatio:true, plugins:{tooltip:{callbacks:{label:ctx=>ctx.parsed.y.toFixed(1)+' impressions per share'}}}, scales:{x:{grid:{display:false},ticks:{font:{size:10}}}, y:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{font:{size:9}}}}}}); }); once('freq-eng',()=>{ new Chart(document.getElementById('freqEngChart'),{type:'scatter',data:{datasets:[ {label:'Weekly data',data:[{x:1,y:5.2},{x:2,y:4.8},{x:3,y:4.6},{x:4,y:4.4},{x:5,y:4.2},{x:6,y:4.0},{x:7,y:3.8},{x:8,y:3.6},{x:9,y:3.4},{x:10,y:3.2},{x:11,y:3.0},{x:12,y:2.8},{x:3,y:4.9},{x:5,y:4.3},{x:7,y:3.9}], backgroundColor:'rgba(0,212,170,0.6)',borderColor:'rgba(0,212,170,0.9)',pointRadius:6,pointHoverRadius:8}, {label:'Trend line',data:[{x:1,y:5.1},{x:12,y:2.9}], type:'line',borderColor:'rgba(248,113,113,0.7)',borderDash:[5,4],borderWidth:2,pointRadius:0,fill:false}]}, options:{responsive:true,maintainAspectRatio:true, plugins:{tooltip:{callbacks:{label:ctx=>`Week: ${ctx.parsed.x} posts/wk, Eng: ${ctx.parsed.y.toFixed(1)}%`}}}, scales:{x:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{font:{size:9}},title:{display:true,text:'Posts per week',font:{size:9}}}, y:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{callback:v=>v+'%',font:{size:9}},title:{display:true,text:'Avg Eng Rate',font:{size:9}}}}}}); }); once('funnel',()=>{ // Horizontal funnel as bar chart const vals=[284200,111800,18240,3284,1847]; const labels=['Impressions','Reach','Engagements','Shares','Comments']; new Chart(document.getElementById('funnelChart'),{type:'bar',data:{ labels,datasets:[{label:'Volume',data:vals, backgroundColor:['rgba(99,102,241,0.75)','rgba(0,212,170,0.85)','rgba(0,212,170,0.65)','rgba(0,212,170,0.45)','rgba(0,212,170,0.3)'], borderRadius:5,borderSkipped:false}]}, options:{indexAxis:'y',responsive:true,maintainAspectRatio:true, plugins:{tooltip:{callbacks:{label:ctx=>{const v=ctx.parsed.x;const pct=(v/vals[0]*100).toFixed(1);return v.toLocaleString()+' ('+pct+'% of impressions)'; }}}}, scales:{x:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{callback:v=>v>=1000?(v/1000).toFixed(0)+'K':v,font:{size:9}}}, y:{grid:{display:false},ticks:{font:{size:9}}}}}}}); }); once('hour-day',()=>{ // 7×24 matrix rendered as bar groups const dows=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']; const hours=['6AM','9AM','12PM','3PM','6PM','9PM']; const vals=[[1.2,1.8,2.4,2.1,4.8,3.2],[1.4,2.1,2.8,2.6,5.1,3.6],[1.1,1.6,2.2,2.0,4.2,2.9],[1.3,1.9,2.7,2.4,4.6,3.4],[1.0,1.5,2.0,1.8,3.8,3.1],[0.8,1.1,1.6,1.9,3.2,4.2],[0.6,0.9,1.4,1.7,2.8,3.9]]; const colors=['rgba(0,212,170,0.35)','rgba(0,212,170,0.5)','rgba(0,212,170,0.65)','rgba(0,212,170,0.55)','rgba(0,212,170,0.9)','rgba(99,102,241,0.7)']; new Chart(document.getElementById('hourDayMatrix'),{type:'bar',data:{labels:dows, datasets:hours.map((h,i)=>({label:h,data:vals.map(row=>row[i]),backgroundColor:colors[i],borderRadius:3}))}, options:{responsive:true,maintainAspectRatio:true, plugins:{legend:{display:true,position:'top',labels:{boxWidth:8,font:{size:8},padding:6}}, tooltip:{callbacks:{label:ctx=>ctx.dataset.label+': '+ctx.parsed.y.toFixed(1)+'% eng'}}}, scales:{x:{grid:{display:false},ticks:{font:{size:9}}}, y:{grid:{color:'rgba(255,255,255,0.04)'},ticks:{callback:v=>v+'%',font:{size:9}}}}}}); }); once('raw-data',()=>{ const tbody=document.getElementById('rawDataBody');if(!tbody)return; const pages=['Drinking Memes','Kelpie Daily','UK Jail News']; const formats=['Photo','Video','Reel','Carousel','Text']; const topics=['Humour','Community','Crime','News','Lifestyle']; const emotions=['Joy','Anger','Surprise','Sadness','Love']; const rows=[]; for(let i=0;i<30;i++){ const d=new Date(2026,3,1+i); const date=d.toISOString().slice(0,10); const page=pages[Math.floor(Math.random()*pages.length)]; const fmt=formats[Math.floor(Math.random()*formats.length)]; const reach=Math.round(5000+Math.random()*20000); const imp=Math.round(reach*2.5); const eng=Math.round(reach*(0.02+Math.random()*0.06)); const rate=(eng/reach*100).toFixed(2); const likes=Math.round(eng*0.6);const comments=Math.round(eng*0.25);const shares=Math.round(eng*0.1);const saves=Math.round(eng*0.05); const sent=(0.5+Math.random()*0.45).toFixed(2); const vir=(0.3+Math.random()*0.65).toFixed(2); const hr=[6,9,12,15,18,21][Math.floor(Math.random()*6)]; const row=[date,page,fmt,`${hr<10?'0':''}${hr}:00`,Math.round(5+Math.random()*30),Math.round(Math.random()*5),reach,imp,eng,rate,likes,comments,shares,saves,sent,emotions[Math.floor(Math.random()*emotions.length)],topics[Math.floor(Math.random()*topics.length)],vir,Math.random()>0.7?'Yes':'No']; rows.push(row); tbody.innerHTML+=`${row.map((v,ci)=>`${v}`).join('')}`; } window._CHART_DATA['rawDataTable']=[ ['Date','Page','Format','Posted At','Caption Words','Emojis','Reach','Impressions','Engagements','Eng Rate %','Likes','Comments','Shares','Saves','Sentiment','Emotion','Topic','Virality','Super Sharer Triggered'], ...rows]; }); }