Reports — Screens
R1 · Reports List
Dashboard: apps/dashboard/src/app/(dashboard)/reports/page.tsx + ReportsClient.tsx
DM Portal: apps/dm/src/app/(dm)/reports/page.tsx + DmReportsClient.tsx
Reports
Monthly performance reports for this tenant. [Generate with AI ✦] [+ Upload]
REPORT NAME DATE RANGE STATUS
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 📊 Monthly performance report — April 2026 │
│ Generated by Report Agent · 25 Apr 2026 31 Mar 2026 – 29 Apr 2026 Published › │
└─────────────────────────────────────────────────────────────────────────────────────┘Columns
| Column | Source |
|---|---|
| Report name | Activity.title (agent) or Report.label (dm_upload / ai_generated) |
| Icon | Bar-chart icon for agent; upload icon for dm_upload; sparkle for ai_generated |
| Sub-line | ”Generated by [createdBy] · [date]“ |
| Date range | Activity.period or Report.period (formatted as “DD Mon YYYY – DD Mon YYYY”) |
| Status | Published (agent/ready), Generating… (ai_generated in progress), Failed |
Actions
| Action | Portal | Behaviour |
|---|---|---|
| Row click | Both | Navigates to detail page |
| Generate with AI | Both | Opens GenerateReportModal — prompt + date range → POST /api/reports/generate (Dashboard) or POST /dm/v1/reports/generate (DM) |
| + Upload | DM only | Opens UploadReportModal — label + date range + file (PDF or Markdown) → POST /dm/v1/reports |
R2 · Report Detail
Dashboard: apps/dashboard/src/app/(dashboard)/reports/detail/[id]/page.tsx + ReportDetailClient.tsx
DM Portal: apps/dm/src/app/(dm)/reports/[id]/page.tsx + ReportDetailClient.tsx
← Back 📊 Monthly performance report — April 2026 [⬇ Download PDF]
┌─────────────────────────────────────────────────────────────────────────────────┐
│ MONTHLY PERFORMANCE REPORT │
│ Monthly performance report — April 2026 │
│ Leadmetrics · March 2026 · 31 Mar 2026 – 29 Apr 2026 │
│ 🗓 Generated by Report Agent · 25 Apr 2026 │
└─────────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────────┐
│ [Report body rendered as Markdown] │
│ │
│ Reporting Period: 31 March – 29 April 2026 │
│ Prepared: 25 April 2026 │
│ Distribution: Jithin Sreedhar (CEO) · Moble Joseph (CTO) │
│ Classification: Internal — Leadership Only │
│ │
│ ## Executive Summary │
│ ## Goal Progress │
│ ## SEO Performance │
│ ## Content Performance │
│ ## Paid Advertising │
│ ## Social Media │
│ ## Email Marketing │
│ ## Key Wins This Month │
│ ## Issues & Risks │
│ ## Next Month Focus │
└─────────────────────────────────────────────────────────────────────────────────┘Header card fields
| Field | Source |
|---|---|
| Badge label | ”Monthly Performance Report” (static) or Report.source label |
| Title | Activity.title or Report.label |
| Tenant · Period · Date range | Tenant name, Report.period, formatted date range |
| Generated-by line | createdBy + createdAt date |
AI-generated report structure (Markdown body)
The custom-report-writer worker produces a report with these sections:
| Section | Content |
|---|---|
| Cover block | Reporting period, prepared date, distribution list, classification |
| Executive Summary | Narrative overview — competitive landscape, top wins, data notes |
| Goal Progress | Target vs. actual KPI table; qualitative pipeline commentary per region |
| SEO Performance | Blog cadence, keyword ranking progress, technical SEO, organic traffic |
| Content Performance | Publish cadence, deliverable completion rate, content gaps |
| Paid Advertising | Campaign status, spend vs. target, recommendations |
| Social Media | LinkedIn impressions, platform gaps, growth commentary |
| Email Marketing | Open rate, CTR, conversion data |
| Key Wins This Month | Bulleted achievements with context |
| Issues & Risks | Numbered risk items with recommended actions |
| Next Month Focus | Prioritised action list for the next reporting period |
Actions
| Action | When shown | Behaviour |
|---|---|---|
| Download PDF | contentType=markdown and status=ready | Renders Markdown → branded HTML → window.print() |
| Direct Spaces link | contentType=pdf | Opens Report.fileUrl (DigitalOcean Spaces) in new tab |
| Back arrow | Always | Navigates to /reports list |
Generating state
When status=generating, the body area shows a loading indicator instead of content. The page polls or refreshes until the worker sets status=ready.