# Analytics & Telemetry System (v0.5.0)
## Overview
nChat v0.5.0 introduces a comprehensive analytics and telemetry system for tracking usage, performance, and engagement metrics. Built on **TimescaleDB** for efficient time-series data storage and querying.
## Table of Contents
1. [Architecture](#architecture)
2. [Features](#features)
3. [Database Schema](#database-schema)
4. [Configuration](#configuration)
5. [Usage](#usage)
6. [API Endpoints](#api-endpoints)
7. [Dashboard](#dashboard)
8. [Privacy & Compliance](#privacy--compliance)
9. [Performance](#performance)
10. [Troubleshooting](#troubleshooting)
---
## Architecture
### Components
```
┌─────────────────┐
│ React Client │ ──track()──▶ Analytics Client
└─────────────────┘ │
│ batch
▼
┌────────────────────┐
│ Analytics API │
│ /api/analytics/* │
└────────────────────┘
│
▼
┌────────────────────┐
│ PostgreSQL + │
│ TimescaleDB │
│ (Hypertables) │
└────────────────────┘
│
▼
┌────────────────────┐
│ Hasura GraphQL │
│ (Queries/Subs) │
└────────────────────┘
│
▼
┌────────────────────┐
│ Analytics │
│ Dashboard │
└────────────────────┘
```
### Technology Stack
- **Database**: PostgreSQL 15+ with TimescaleDB extension
- **Time-Series Storage**: TimescaleDB hypertables with automatic partitioning
- **API**: Next.js API routes
- **GraphQL**: Hasura for real-time queries and subscriptions
- **Client**: React hooks + Zustand for state management
- **Visualization**: Recharts (lightweight, customizable)
- **Export**: CSV, JSON, PDF support
---
## Features
### 1. Usage Analytics
- **User Activity**
- Daily/Weekly/Monthly Active Users (DAU/WAU/MAU)
- User retention cohorts
- Session duration tracking
- Feature adoption rates
- **Message Analytics**
- Message volume by channel/user/time
- Average message length
- Attachments vs text-only
- Thread participation rates
- **Channel Analytics**
- Channel growth over time
- Active vs inactive channels
- Engagement rates by channel
- Member participation
### 2. Performance Analytics
- **API Performance**
- Response times (p50/p95/p99)
- Error rates by endpoint
- Request volume by endpoint
- Database query performance
- **WebSocket Metrics**
- Connection health
- Message latency
- Packet loss rates
- Concurrent connections
### 3. Engagement Metrics
- **Reaction Analytics**
- Most used reactions
- Reaction diversity
- Top reactors
- **File Analytics**
- Upload volume and size
- File type breakdown
- Storage usage per user
- **Search Analytics**
- Popular search queries
- No-results searches
- Click-through rates
### 4. Business Metrics
- User growth rate
- Storage usage trends
- Feature usage by tier
- API call volume
---
## Database Schema
### Core Tables
#### 1. `nchat_analytics_events` (Hypertable)
Primary time-series table for all analytics events.
```sql
CREATE TABLE nchat_analytics_events (
id UUID PRIMARY KEY,
timestamp TIMESTAMPTZ NOT NULL,
event_name VARCHAR(100) NOT NULL,
event_category VARCHAR(50) NOT NULL,
user_id UUID REFERENCES nchat_users(id),
session_id VARCHAR(100) NOT NULL,
platform VARCHAR(20),
properties JSONB DEFAULT '{}'
);
-- Convert to hypertable (1 day chunks)
SELECT create_hypertable('nchat_analytics_events', 'timestamp',
chunk_time_interval => INTERVAL '1 day');
-- Retention: 90 days
SELECT add_retention_policy('nchat_analytics_events', INTERVAL '90 days');
```
#### 2. `nchat_analytics_user_activity` (Hypertable)
Aggregated hourly user activity metrics.
```sql
CREATE TABLE nchat_analytics_user_activity (
timestamp TIMESTAMPTZ NOT NULL,
user_id UUID NOT NULL,
messages_sent INTEGER DEFAULT 0,
reactions_given INTEGER DEFAULT 0,
files_uploaded INTEGER DEFAULT 0,
engagement_score FLOAT DEFAULT 0,
session_duration_seconds INTEGER DEFAULT 0,
UNIQUE(user_id, timestamp)
);
SELECT create_hypertable('nchat_analytics_user_activity', 'timestamp',
chunk_time_interval => INTERVAL '7 days');
```
#### 3. `nchat_analytics_channel_activity` (Hypertable)
Aggregated hourly channel activity metrics.
```sql
CREATE TABLE nchat_analytics_channel_activity (
timestamp TIMESTAMPTZ NOT NULL,
channel_id UUID NOT NULL,
messages_count INTEGER DEFAULT 0,
active_users_count INTEGER DEFAULT 0,
reactions_count INTEGER DEFAULT 0,
average_response_time_seconds FLOAT DEFAULT 0,
UNIQUE(channel_id, timestamp)
);
```
#### 4. Continuous Aggregates (Materialized Views)
Automatically maintained aggregated views for fast queries:
```sql
-- Daily user summary
CREATE MATERIALIZED VIEW nchat_analytics_daily_user_summary
WITH (timescaledb.continuous) AS
SELECT
time_bucket('1 day', timestamp) AS day,
user_id,
SUM(messages_sent) AS total_messages,
AVG(engagement_score) AS avg_engagement_score
FROM nchat_analytics_user_activity
GROUP BY day, user_id;
-- Refresh every hour
SELECT add_continuous_aggregate_policy(
'nchat_analytics_daily_user_summary',
start_offset => INTERVAL '7 days',
end_offset => INTERVAL '1 hour',
schedule_interval => INTERVAL '1 hour'
);
```
### Helper Functions
```sql
-- Get Daily Active Users
CREATE FUNCTION nchat_analytics_get_dau(start_date DATE, end_date DATE)
RETURNS TABLE (date DATE, active_users BIGINT);
-- Get Monthly Active Users
CREATE FUNCTION nchat_analytics_get_mau(start_date DATE)
RETURNS BIGINT;
-- Calculate Engagement Score
CREATE FUNCTION nchat_analytics_calculate_engagement_score(
p_messages INT, p_reactions INT, p_files INT, p_threads INT
)
RETURNS FLOAT;
```
---
## Configuration
### AppConfig
Add to `src/config/app-config.ts`:
```typescript
analytics: {
enabled: boolean // Master toggle
trackingMode: 'full' | 'privacy' | 'minimal'
retentionDays: number // Data retention (default: 90)
enableRealtime: boolean // Real-time dashboard updates
enableExports: boolean // Allow CSV/PDF exports
anonymizeUserData: boolean // Anonymize PII
excludeTestUsers: boolean // Exclude test users from stats
trackPerformance: boolean // Track API performance
trackWebSocket: boolean // Track WebSocket metrics
trackFeatureUsage: boolean // Track feature adoption
trackErrors: boolean // Track errors (Sentry integration)
allowUserOptOut: boolean // Allow users to opt-out
}
```
### Environment Variables
```bash
# Required
NEXT_PUBLIC_ANALYTICS_ENABLED=true
# Optional
ANALYTICS_RETENTION_DAYS=90
TIMESCALEDB_ENABLED=true
ANALYTICS_BATCH_SIZE=10
ANALYTICS_FLUSH_INTERVAL=30000
```
---
## Usage
### Client-Side Tracking
#### Basic Event Tracking
```typescript
import { useAnalytics } from '@/hooks/use-analytics';
function MyComponent() {
const { track } = useAnalytics();
const handleClick = () => {
track('button_clicked', {
buttonName: 'Submit',
location: 'chat-input',
});
};
return ;
}
```
#### User Identification
```typescript
import { useAnalytics } from '@/hooks/use-analytics'
function AuthComponent() {
const { identify } = useAnalytics()
useEffect(() => {
if (user) {
identify(user.id, {
email: user.email,
displayName: user.displayName,
role: user.role,
plan: 'free',
})
}
}, [user])
}
```
#### Page View Tracking
```typescript
import { useAnalytics } from '@/hooks/use-analytics'
function Page() {
const { page } = useAnalytics()
useEffect(() => {
page('/chat', 'Chat - nChat')
}, [])
}
```
#### Convenience Methods
```typescript
const {
trackMessageSent,
trackMessageEdited,
trackReactionAdded,
trackFileUploaded,
trackSearchPerformed,
trackFeatureUsed,
trackError,
} = useAnalytics()
// Track message sent
trackMessageSent(channelId, messageLength, hasAttachments)
// Track reaction
trackReactionAdded(messageId, '👍')
// Track file upload
trackFileUploaded(fileId, fileName, fileSize, mimeType)
// Track search
trackSearchPerformed(query, resultCount)
// Track feature usage
trackFeatureUsed('voice-call', { duration: 120 })
// Track error
trackError('api_error', 'Failed to send message', { code: 500 })
```
### Dashboard Consumption
#### useAnalyticsDashboard Hook
```typescript
import { useAnalyticsDashboard } from '@/hooks/use-analytics-dashboard';
function AnalyticsDashboard() {
const {
summary,
messageVolume,
userActivity,
isLoading,
error,
setDateRange,
refresh,
} = useAnalyticsDashboard();
if (isLoading) return