fix: credit tracking, voice clone TTL, avatar upload ui, asset serving fallback, OAuth encryption, free plan video renders, backlink outreach sprint

This commit is contained in:
ajaysi
2026-05-25 17:07:35 +05:30
parent 090d69761f
commit 9b3bec698b
99 changed files with 15892 additions and 1278 deletions

View File

@@ -0,0 +1,181 @@
# Analytics
Track campaign performance with built-in analytics including send volume trends, conversion funnels, reply classification breakdowns, and CSV exports.
## Dashboard Overview
The analytics tab provides a comprehensive view of your outreach performance:
```mermaid
flowchart LR
A[Campaign Analytics] --> B[Volume Trends]
A --> C[Conversion Funnel]
A --> D[Reply Classification]
A --> E[Response Rate]
A --> F[Placement Rate]
A --> G[CSV Exports]
style A fill:#e3f2fd
style B fill:#e8f5e8
style G fill:#fff3e0
```
## Metrics
### Send Volume Trends
A line chart showing daily email send volume over a configurable time window (7, 14, 30, or 90 days).
- **X-axis**: Date.
- **Y-axis**: Number of emails sent.
- **Use case**: Spot trends, ensure consistent outreach cadence, stay within daily caps.
### Conversion Funnel
A bar chart showing lead counts at each status stage:
| Stage | Description |
|---|---|
| Discovered | Total leads found. |
| Contacted | Leads that received an outreach email. |
| Replied | Leads that responded (interested or neutral). |
| Placed | Leads that resulted in a published backlink. |
- **Use case**: Identify bottlenecks in your outreach pipeline.
### Reply Classification
A breakdown of auto-classified replies:
| Classification | Color | Meaning |
|---|---|---|
| Interested | Green | Positive response — follow up! |
| Not interested | Red | Declined — auto-suppressed. |
| Out of office | Yellow | Auto-responder — schedule follow-up. |
| Replied | Blue | General response — needs review. |
### Response Rate
Percentage of sent emails that received any reply:
```
Response Rate = (Total Replies / Total Sent) × 100
```
### Placement Rate
Percentage of contacted leads that resulted in a published backlink:
```
Placement Rate = (Placed Leads / Contacted Leads) × 100
```
## Analytics API
### Campaign Analytics
**API:** `GET /api/v1/backlink-outreach/campaigns/{campaign_id}/analytics`
**Query parameters:**
| Parameter | Type | Default | Description |
|---|---|---|---|
| `days` | int | `30` | Number of days to include in trends. |
**Response:**
```json
{
"total_leads": 150,
"leads_by_status": {
"discovered": 80,
"contacted": 45,
"replied": 18,
"placed": 7,
"bounced": 5
},
"total_attempts": 52,
"total_replies": 23,
"replies_by_classification": {
"interested": 12,
"not_interested": 5,
"out_of_office": 3,
"replied": 3
},
"response_rate": 0.44,
"placement_rate": 0.16,
"daily_send_volume": [
{"date": "2025-01-15", "count": 8},
{"date": "2025-01-16", "count": 12}
]
}
```
### Reporting Snapshot
Cross-campaign analytics across all campaigns for the authenticated user.
**API:** `GET /api/v1/backlink-outreach/reporting/snapshot`
**Response:**
```json
{
"total_campaigns": 5,
"total_sends": 342,
"total_replies": 87,
"total_placements": 14,
"overall_response_rate": 0.25,
"overall_placement_rate": 0.04
}
```
!!! note "Reply counting"
The reporting snapshot counts `OutreachReply` records (not `status == "replied"` on attempts). This ensures accuracy — a lead marked "replied" manually without an actual reply record won't inflate the count.
## CSV Exports
Export campaign data as CSV files for CRM import, spreadsheet analysis, or client reporting.
### Export Leads
**API:** `GET /api/v1/backlink-outreach/campaigns/{campaign_id}/export/leads`
### Export Attempts
**API:** `GET /api/v1/backlink-outreach/campaigns/{campaign_id}/export/attempts`
### Export Replies
**API:** `GET /api/v1/backlink-outreach/campaigns/{campaign_id}/export/replies`
### CSV Safety
All exports include these safety measures:
| Measure | Purpose |
|---|---|
| Explicit fieldnames | Only expected columns are included. |
| `extrasaction="ignore"` | Unexpected fields are silently dropped. |
| Formula injection sanitization | Cells starting with `=`, `+`, `-`, `@` are prefixed with a single quote to prevent formula injection in spreadsheets. |
!!! warning "Export loading"
Exports may take a few seconds for large campaigns. The UI shows an "Exporting..." state with a disabled button while the download is in progress.
## UI Features
### Time Window Selector
Choose from 7, 14, 30, or 90 days for trend charts. The analytics data is re-fetched when the window changes.
### Separate Loading States
Each data section (attempts, replies, analytics) has its own loading indicator, so slow analytics queries don't block the entire page.
### Error Handling
If analytics or export requests fail, a toast notification shows the error message. On 5xx server errors, the store automatically retries read operations once with exponential backoff.
---
*Next: [API Reference](api-reference.md) — full endpoint documentation.*