Analytics

Real-Time Dashboards: When You Actually Need Them (And When You Don't)

Not every metric needs to update every second. Learn when real-time dashboards add value and when they're just expensive distractions.

6 min read
Real-time analytics dashboard showing live data

Real-time dashboards are sexy. They're also expensive, complex, and often unnecessary.

Let's talk about when you actually need them.

The Real-Time Trap

Your CEO sees a competitor's dashboard updating every second and says: "We need that!"

But do you really?

The Hidden Costs

Real-time infrastructure requires:

  • Streaming data pipelines ($$$)
  • High-performance databases ($$$)
  • Constant monitoring (engineering time)
  • More bugs (complexity = problems)

Question: Will a 5-second delay vs 5-minute delay change any decision you make?

If the answer is no, you don't need real-time.

When You DO Need Real-Time

Operations & Monitoring

System Health Dashboards

┌─────────────────────┐
│ Server CPU: 87%     │ ← Need to know NOW
│ Error Rate: 2.3%    │ ← Need to act NOW
│ Response Time: 245ms│ ← Degrading NOW
└─────────────────────┘

If your servers are on fire, you need to know immediately.

Refresh Rate: 5-10 seconds

Customer Support

Live Queue Monitoring

Current Queue:
- 47 chats waiting
- Average wait: 8 minutes
- Available agents: 3

⚠️ Add more agents NOW

Can't wait 15 minutes for batch update.

Refresh Rate: 10-30 seconds

High-Frequency Trading

Obvious use case. Milliseconds matter.

Refresh Rate: Real-time streaming

Live Events

Running a webinar with 1,000 attendees?

Current Viewers: 873
Peak Viewers: 945
Engagement Rate: 67%
Q&A Questions: 23 pending

Need live feedback to adjust content.

Refresh Rate: 5-15 seconds

When You DON'T Need Real-Time

Strategic Metrics

Revenue Dashboards

Will your strategy change if you see revenue updated every second vs every hour?

Revenue Today: $45,234.56
              ↓
Revenue Today: $45,239.72
              ↓
Revenue Today: $45,241.88

This is noise, not signal.

Refresh Rate: Daily is fine. Hourly max.

Marketing Analytics

Campaign Performance

Checking conversion rates every 5 seconds won't make your ads perform better.

Statistical significance requires sample size.

Wait until you have meaningful data.

Refresh Rate: Hourly or daily

Financial Reporting

Monthly P&L

Do you need to see profit update live?

No. You need accurate end-of-month numbers.

Refresh Rate: Daily during month, final at month-end

HR Metrics

Employee Headcount

Employees: 247
          ↓
Employees: 248
          ↓
Employees: 247

People don't join/leave every minute.

Refresh Rate: Daily is plenty

The Refresh Rate Decision Matrix

| Use Case | Decision Speed | Refresh Rate | Infrastructure | |----------|---------------|--------------|----------------| | System alerts | Seconds | 5-10 sec | Real-time stream | | E-commerce | Minutes | 1-5 min | Near real-time | | Sales pipeline | Hours | 15-60 min | Batch jobs | | Finance | Days | Daily | Scheduled ETL | | Strategic | Weekly | Weekly | Data warehouse |

Building Real-Time (The Right Way)

If you truly need real-time, here's how:

1. Start With Architecture

Event Source (app, database, API)
      ↓
Message Queue (Kafka, RabbitMQ)
      ↓
Stream Processor (real-time aggregation)
      ↓
Fast Database (Redis, DynamoDB)
      ↓
Dashboard (WebSocket updates)

2. Handle Failures Gracefully

Real-time systems fail. Plan for it:

// Fallback to cached data
function getDashboardData() {
  try {
    return await fetchRealTimeData();
  } catch (error) {
    console.warn('Real-time failed, using cache');
    return getCachedData();
  }
}

Show stale data with timestamp rather than broken dashboard.

3. Optimize Queries

Real-time doesn't mean inefficient:

-- ❌ BAD: Scan full table every second
SELECT COUNT(*) FROM orders;

-- ✅ GOOD: Materialized view updated incrementally
SELECT total_count FROM orders_count_mv;

Pre-aggregate where possible.

4. Use WebSockets Wisely

Don't poll every second:

// ❌ BAD: Polling
setInterval(() => {
  fetchLatestData();
}, 1000); // 1000 requests per user per hour!

// ✅ GOOD: WebSocket push
websocket.on('data-update', (data) => {
  updateDashboard(data);
}); // Only updates when data changes

The Hybrid Approach

Best of both worlds:

Mixed Refresh Rates

Dashboard: Q4 Revenue
├─ Total Revenue: $2.4M (updates hourly)
├─ Today's Revenue: $47K (updates every 5 min)
└─ Live Orders: 3 (real-time)

Different metrics, different needs.

Progressive Enhancement

// Start with cached data (fast load)
displayCachedData();

// Then fetch recent data
const recentData = await fetchHourlyUpdate();
updateDashboard(recentData);

// Finally subscribe to real-time (if needed)
if (needsRealTime) {
  subscribeToLiveUpdates();
}

Fast initial load + fresh data + real-time where it matters.

User Experience Considerations

Don't Distract

Constant updates are exhausting:

❌ Numbers changing every second (can't read them)
✅ Smooth animations, readable updates

Show Freshness

Always display when data was last updated:

Revenue: $2.4M
Last updated: 2 minutes ago
↻ Refresh

Users need to trust the data.

Allow Manual Refresh

<button onClick={refreshDashboard}>
  Refresh Now
</button>

Let users pull fresh data when THEY want it.

Cost-Benefit Analysis

Example: E-commerce Dashboard

Real-time Option:

  • Cost: $5,000/month infrastructure
  • Benefit: See sales update every 5 seconds
  • Value: ???

Near Real-time Option:

  • Cost: $500/month infrastructure
  • Benefit: See sales update every 5 minutes
  • Value: Same business decisions

Winner: Near real-time (10x cheaper, same value)

Performance Optimization Tips

1. Cache Aggressively

const cache = new Map();
const CACHE_TTL = 60000; // 1 minute

function getData(query) {
  const cached = cache.get(query);
  if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
    return cached.data;
  }

  const fresh = fetchFromDatabase(query);
  cache.set(query, { data: fresh, timestamp: Date.now() });
  return fresh;
}

2. Aggregate Intelligently

-- Pre-aggregate common queries
CREATE MATERIALIZED VIEW hourly_revenue AS
SELECT
  DATE_TRUNC('hour', created_at) as hour,
  SUM(amount) as revenue,
  COUNT(*) as orders
FROM orders
GROUP BY hour;

-- Refresh every hour (not every second)
REFRESH MATERIALIZED VIEW hourly_revenue;

3. Limit Data Volume

// ❌ Send all 100,000 data points
socket.emit('update', allData);

// ✅ Send only changes
socket.emit('update', changedData);

4. Use Sampling for High Volume

-- For real-time trending, exact counts don't matter
SELECT approximate_count_distinct(user_id)
FROM page_views
WHERE timestamp > NOW() - INTERVAL '5 minutes';

99% accurate is good enough for trends.

Migration Strategy

Already have batch dashboards? Transition gradually:

Phase 1: Increase Frequency (Week 1-2)

Daily → Hourly

Phase 2: Near Real-time (Week 3-4)

Hourly → Every 5-15 minutes

Phase 3: Evaluate (Week 5)

Is 5-minute refresh good enough? If yes, STOP HERE.

Phase 4: True Real-time (Only if needed)

Build streaming infrastructure

Monitoring Your Real-Time System

Track these metrics:

- Update frequency achieved vs target
- Data freshness (lag time)
- Error rate
- System cost per update
- User engagement with real-time features

If nobody is using the real-time updates, turn them off.

Conclusion

Real-time is a feature, not a requirement.

Ask yourself:

  1. Will faster data change decisions?
  2. Can we act on the information immediately?
  3. Is the cost worth the benefit?

If all three are "yes," build real-time.

Otherwise, save your money and engineering time.

Near real-time (5-15 minute updates) satisfies 90% of use cases at 10% of the cost.

Be honest about what you need, not what looks cool.

Kevin Park
Kevin ParkPlatform Engineer
AnalyticsProductivityTips

Related articles

Continue reading with these related posts.


Start your free trial

Join over 4,000+ teams already creating better reports with Narrata.

Get started