Skip to Content
ReportsReports — Screens

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

ColumnSource
Report nameActivity.title (agent) or Report.label (dm_upload / ai_generated)
IconBar-chart icon for agent; upload icon for dm_upload; sparkle for ai_generated
Sub-line”Generated by [createdBy] · [date]“
Date rangeActivity.period or Report.period (formatted as “DD Mon YYYY – DD Mon YYYY”)
StatusPublished (agent/ready), Generating… (ai_generated in progress), Failed

Actions

ActionPortalBehaviour
Row clickBothNavigates to detail page
Generate with AIBothOpens GenerateReportModal — prompt + date range → POST /api/reports/generate (Dashboard) or POST /dm/v1/reports/generate (DM)
+ UploadDM onlyOpens 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

FieldSource
Badge label”Monthly Performance Report” (static) or Report.source label
TitleActivity.title or Report.label
Tenant · Period · Date rangeTenant name, Report.period, formatted date range
Generated-by linecreatedBy + createdAt date

AI-generated report structure (Markdown body)

The custom-report-writer worker produces a report with these sections:

SectionContent
Cover blockReporting period, prepared date, distribution list, classification
Executive SummaryNarrative overview — competitive landscape, top wins, data notes
Goal ProgressTarget vs. actual KPI table; qualitative pipeline commentary per region
SEO PerformanceBlog cadence, keyword ranking progress, technical SEO, organic traffic
Content PerformancePublish cadence, deliverable completion rate, content gaps
Paid AdvertisingCampaign status, spend vs. target, recommendations
Social MediaLinkedIn impressions, platform gaps, growth commentary
Email MarketingOpen rate, CTR, conversion data
Key Wins This MonthBulleted achievements with context
Issues & RisksNumbered risk items with recommended actions
Next Month FocusPrioritised action list for the next reporting period

Actions

ActionWhen shownBehaviour
Download PDFcontentType=markdown and status=readyRenders Markdown → branded HTML → window.print()
Direct Spaces linkcontentType=pdfOpens Report.fileUrl (DigitalOcean Spaces) in new tab
Back arrowAlwaysNavigates 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.

© 2026 Leadmetrics — Internal use only