Create ANALYTICS.md
This commit is contained in:
329
ANALYTICS.md
Normal file
329
ANALYTICS.md
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
# Analytics System Documentation
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The analytics system provides comprehensive insights into store performance, sales trends, customer behavior, and order management. It supports both vendors and staff users (sub-users) with appropriate access controls and server-side rendering for optimal performance.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### 🔐 Multi-User Support
|
||||||
|
- **Vendors**: Access their own store analytics automatically
|
||||||
|
- **Staff/Sub-Users**: Access store analytics by providing a `storeId` parameter via URL or cookies
|
||||||
|
- **Role-based Access**: Different permissions for different user types
|
||||||
|
- **Server-side Rendering**: Initial data fetched server-side for better performance
|
||||||
|
|
||||||
|
### 📊 Analytics Dashboard
|
||||||
|
- **Overview Metrics**: Total revenue, orders, customers, and products
|
||||||
|
- **Revenue Trends**: Time-based revenue analysis with interactive charts
|
||||||
|
- **Product Performance**: Top-selling products with stock status
|
||||||
|
- **Customer Insights**: Customer segmentation and behavior analysis
|
||||||
|
- **Order Analytics**: Order status distribution and processing times
|
||||||
|
|
||||||
|
### 🎯 Key Metrics
|
||||||
|
- Total and monthly revenue
|
||||||
|
- Order completion rates
|
||||||
|
- Customer acquisition and retention
|
||||||
|
- Product performance rankings
|
||||||
|
- Average order processing times
|
||||||
|
|
||||||
|
## API Endpoints
|
||||||
|
|
||||||
|
### Authentication
|
||||||
|
All endpoints require authentication using the new `protectStore` middleware:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// For vendors (automatic store access)
|
||||||
|
GET /api/analytics/overview
|
||||||
|
|
||||||
|
// For staff users (requires storeId parameter)
|
||||||
|
GET /api/analytics/overview?storeId=store_id_here
|
||||||
|
```
|
||||||
|
|
||||||
|
### Available Endpoints
|
||||||
|
|
||||||
|
#### 1. Analytics Overview
|
||||||
|
```http
|
||||||
|
GET /api/analytics/overview
|
||||||
|
```
|
||||||
|
Returns comprehensive overview metrics including:
|
||||||
|
- Order statistics (total, completed, pending, completion rate)
|
||||||
|
- Revenue data (total, monthly, weekly, average order value)
|
||||||
|
- Product count
|
||||||
|
- Unique customer count
|
||||||
|
- User type (vendor/staff)
|
||||||
|
|
||||||
|
#### 2. Revenue Trends
|
||||||
|
```http
|
||||||
|
GET /api/analytics/revenue-trends?period=30&storeId=optional
|
||||||
|
```
|
||||||
|
Returns daily revenue and order trends for the specified period.
|
||||||
|
|
||||||
|
#### 3. Product Performance
|
||||||
|
```http
|
||||||
|
GET /api/analytics/product-performance?storeId=optional
|
||||||
|
```
|
||||||
|
Returns top-performing products with sales metrics and stock status.
|
||||||
|
|
||||||
|
#### 4. Customer Insights
|
||||||
|
```http
|
||||||
|
GET /api/analytics/customer-insights?storeId=optional
|
||||||
|
```
|
||||||
|
Returns customer segmentation and top customer analysis.
|
||||||
|
|
||||||
|
#### 5. Order Analytics
|
||||||
|
```http
|
||||||
|
GET /api/analytics/order-analytics?period=30&storeId=optional
|
||||||
|
```
|
||||||
|
Returns order status distribution and processing time analysis.
|
||||||
|
|
||||||
|
## Frontend Implementation
|
||||||
|
|
||||||
|
### Server-Side Rendering
|
||||||
|
The analytics page uses server-side rendering for optimal performance:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// app/dashboard/analytics/page.tsx
|
||||||
|
export default async function AnalyticsPage({
|
||||||
|
searchParams,
|
||||||
|
}: {
|
||||||
|
searchParams: { storeId?: string };
|
||||||
|
}) {
|
||||||
|
const storeId = searchParams.storeId;
|
||||||
|
const initialData = await getAnalyticsOverviewServer(storeId);
|
||||||
|
|
||||||
|
return <AnalyticsDashboard initialData={initialData} />;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Store Selection for Staff Users
|
||||||
|
Staff users can select which store to view analytics for:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// URL-based store selection
|
||||||
|
/dashboard/analytics?storeId=store_id_here
|
||||||
|
|
||||||
|
// StoreSelector component for easy store switching
|
||||||
|
<StoreSelector />
|
||||||
|
```
|
||||||
|
|
||||||
|
### Components
|
||||||
|
|
||||||
|
#### AnalyticsDashboard
|
||||||
|
Main dashboard component with tabs for different analytics views.
|
||||||
|
|
||||||
|
**Props:**
|
||||||
|
- `initialData`: Initial analytics overview data (server-side fetched)
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Key metrics cards with trend indicators
|
||||||
|
- Tabbed interface for different analytics views
|
||||||
|
- Refresh functionality
|
||||||
|
- User type indicator (Vendor/Staff View)
|
||||||
|
|
||||||
|
#### StoreSelector
|
||||||
|
Client-side component for staff users to select stores.
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Input field for store ID
|
||||||
|
- URL-based navigation
|
||||||
|
- Current store display
|
||||||
|
- Error handling and validation
|
||||||
|
|
||||||
|
#### RevenueChart
|
||||||
|
Displays revenue trends over time with interactive charts.
|
||||||
|
|
||||||
|
**Props:**
|
||||||
|
- `timeRange`: Time period for analysis (7, 30, 90 days)
|
||||||
|
|
||||||
|
#### ProductPerformanceChart
|
||||||
|
Shows top-performing products in a table format.
|
||||||
|
|
||||||
|
#### CustomerInsightsChart
|
||||||
|
Displays customer segmentation and top customers.
|
||||||
|
|
||||||
|
#### OrderAnalyticsChart
|
||||||
|
Shows order status distribution and daily trends.
|
||||||
|
|
||||||
|
**Props:**
|
||||||
|
- `timeRange`: Time period for analysis
|
||||||
|
|
||||||
|
#### MetricsCard
|
||||||
|
Reusable component for displaying individual metrics.
|
||||||
|
|
||||||
|
**Props:**
|
||||||
|
- `title`: Metric title
|
||||||
|
- `value`: Metric value
|
||||||
|
- `description`: Metric description
|
||||||
|
- `icon`: Lucide icon component
|
||||||
|
- `trend`: Trend direction ("up", "down", "neutral")
|
||||||
|
- `trendValue`: Trend description
|
||||||
|
|
||||||
|
## Sub-User (Staff) Support
|
||||||
|
|
||||||
|
### Authentication Flow
|
||||||
|
1. Staff users authenticate using their staff credentials
|
||||||
|
2. When accessing analytics, they must provide a `storeId` parameter
|
||||||
|
3. The system verifies the store exists and grants access
|
||||||
|
4. All analytics data is filtered by the specified store
|
||||||
|
|
||||||
|
### Access Methods
|
||||||
|
Staff users can access store analytics in multiple ways:
|
||||||
|
|
||||||
|
1. **URL Parameter**: `/dashboard/analytics?storeId=store_id_here`
|
||||||
|
2. **Store Selector**: Use the StoreSelector component to choose a store
|
||||||
|
3. **Cookies**: Store ID can be stored in cookies for persistence
|
||||||
|
|
||||||
|
### Frontend Integration
|
||||||
|
The analytics service automatically handles both user types:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Server-side (for initial load)
|
||||||
|
const data = await getAnalyticsOverviewServer(storeId);
|
||||||
|
|
||||||
|
// Client-side (for refreshes and updates)
|
||||||
|
const data = await getAnalyticsOverviewWithStore();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
### Basic Analytics Access
|
||||||
|
```typescript
|
||||||
|
// Server-side rendering
|
||||||
|
import { getAnalyticsOverviewServer } from '@/lib/server-api';
|
||||||
|
const overview = await getAnalyticsOverviewServer(storeId);
|
||||||
|
|
||||||
|
// Client-side updates
|
||||||
|
import { getAnalyticsOverviewWithStore } from '@/lib/services/analytics-service';
|
||||||
|
const overview = await getAnalyticsOverviewWithStore();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Staff User with Specific Store
|
||||||
|
```typescript
|
||||||
|
// Navigate to analytics with store ID
|
||||||
|
router.push(`/dashboard/analytics?storeId=${storeId}`);
|
||||||
|
|
||||||
|
// Or use the store selector component
|
||||||
|
<StoreSelector />
|
||||||
|
```
|
||||||
|
|
||||||
|
### Revenue Trends with Time Range
|
||||||
|
```typescript
|
||||||
|
import { getRevenueTrendsWithStore } from '@/lib/services/analytics-service';
|
||||||
|
|
||||||
|
// Get 30-day revenue trends
|
||||||
|
const trends = await getRevenueTrendsWithStore('30');
|
||||||
|
```
|
||||||
|
|
||||||
|
## Data Structure
|
||||||
|
|
||||||
|
### AnalyticsOverview
|
||||||
|
```typescript
|
||||||
|
interface AnalyticsOverview {
|
||||||
|
orders: {
|
||||||
|
total: number;
|
||||||
|
completed: number;
|
||||||
|
pending: number;
|
||||||
|
completionRate: string;
|
||||||
|
};
|
||||||
|
revenue: {
|
||||||
|
total: number;
|
||||||
|
monthly: number;
|
||||||
|
weekly: number;
|
||||||
|
averageOrderValue: number;
|
||||||
|
};
|
||||||
|
products: {
|
||||||
|
total: number;
|
||||||
|
};
|
||||||
|
customers: {
|
||||||
|
unique: number;
|
||||||
|
};
|
||||||
|
userType?: 'vendor' | 'staff';
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### RevenueData
|
||||||
|
```typescript
|
||||||
|
interface RevenueData {
|
||||||
|
_id: {
|
||||||
|
year: number;
|
||||||
|
month: number;
|
||||||
|
day: number;
|
||||||
|
};
|
||||||
|
revenue: number;
|
||||||
|
orders: number;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### ProductPerformance
|
||||||
|
```typescript
|
||||||
|
interface ProductPerformance {
|
||||||
|
productId: string;
|
||||||
|
name: string;
|
||||||
|
image: string;
|
||||||
|
unitType: string;
|
||||||
|
currentStock: number;
|
||||||
|
stockStatus: string;
|
||||||
|
totalSold: number;
|
||||||
|
totalRevenue: number;
|
||||||
|
orderCount: number;
|
||||||
|
averagePrice: number;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
### Access Control
|
||||||
|
- Vendors can only access their own store data
|
||||||
|
- Staff users must provide valid storeId parameter
|
||||||
|
- All requests are authenticated and authorized
|
||||||
|
- Store ownership is verified for staff access
|
||||||
|
|
||||||
|
### Data Privacy
|
||||||
|
- Customer data is anonymized in analytics
|
||||||
|
- No sensitive information is exposed
|
||||||
|
- All data is filtered by store ownership
|
||||||
|
|
||||||
|
## Error Handling
|
||||||
|
|
||||||
|
The system provides comprehensive error handling:
|
||||||
|
|
||||||
|
- **401 Unauthorized**: Invalid or missing authentication → Redirect to login
|
||||||
|
- **400 Bad Request**: Missing storeId for staff users → Show store selector
|
||||||
|
- **403 Forbidden**: Access denied to specific store
|
||||||
|
- **404 Not Found**: Store not found
|
||||||
|
- **500 Server Error**: Internal server errors
|
||||||
|
|
||||||
|
All errors are displayed to users via toast notifications in the frontend.
|
||||||
|
|
||||||
|
## Performance Optimization
|
||||||
|
|
||||||
|
- **Server-side data fetching** for initial load
|
||||||
|
- **Client-side caching** for subsequent requests
|
||||||
|
- **Efficient database queries** with proper indexing
|
||||||
|
- **Pagination** for large datasets
|
||||||
|
- **Real-time data refresh** capabilities
|
||||||
|
- **Optimized rendering** with React Suspense
|
||||||
|
|
||||||
|
## Backend Implementation
|
||||||
|
|
||||||
|
### Middleware
|
||||||
|
- `protectStore`: Handles both vendors and staff users
|
||||||
|
- `protectVendorOnly`: Vendor-specific routes
|
||||||
|
- `protectStaffOnly`: Staff-specific routes
|
||||||
|
|
||||||
|
### Database Queries
|
||||||
|
- Uses `storeId` for consistent data filtering
|
||||||
|
- Aggregation pipelines for complex analytics
|
||||||
|
- Proper indexing for performance
|
||||||
|
- Time-based filtering for trends
|
||||||
|
|
||||||
|
## Future Enhancements
|
||||||
|
|
||||||
|
- Real-time analytics updates
|
||||||
|
- Export functionality for reports
|
||||||
|
- Advanced filtering and date range selection
|
||||||
|
- Custom dashboard configurations
|
||||||
|
- Email reports and notifications
|
||||||
|
- Comparative analytics (period-over-period)
|
||||||
|
- Predictive analytics and forecasting
|
||||||
|
- Multi-store comparison for staff users
|
||||||
Reference in New Issue
Block a user