Reports
Overview
The Reports module assembles donor-ready reports from your indicator data, narratives, budget summaries, and evidence attachments. Reports can be shared via a public link or exported as a binary PDF — no copy-paste, no email attachments.
Project data → Report Assembly → PDF / Public Link → DonorReport Types
| Type | Description |
|---|---|
quarterly | Standard 3-month period report |
annual | Full-year review |
ad_hoc | Custom date range (any start/end) |
All types support the same assembly and sharing features.
Report Sections
An assembled report contains:
| Section | Content |
|---|---|
| Cover | Project name, donor, period, org logo |
| Executive Summary | Narrative intro (editable) |
| Progress Against Results | Indicator values grouped by result node, with traffic-light scoring |
| Activities | List of completed activities in the period |
| Budget Summary | Spent vs. budgeted, burn rate, budget lines |
| Challenges & Lessons | Narrative section (editable) |
| Attachments | Linked documents (photos, surveys) |
Creating a Report
Via UI
- Navigate to Reports in the sidebar
- Click New Report
- Select the project
- Choose report type:
- Select from existing reporting periods, or
- Enter a custom start/end date for ad-hoc date range
- Click Generate — the system assembles the report from approved indicator data
- Edit narrative sections inline
- Click Publish when ready to share
Via API
POST /orgs/:orgId/reports
{
"projectId": "uuid",
"title": "Q1 2026 Donor Report — WASH Program",
"reportType": "quarterly",
"periodIds": ["uuid1"], // OR use custom dates:
"startDate": "2026-01-01",
"endDate": "2026-03-31"
}The service:
- Finds all
ReportingPeriodrecords overlapping the date range - Loads
approvedandsubmittedIndicatorReportrecords within those periods - Aggregates values by each indicator's
aggregationMethod - Fetches activities, budget lines, and attachments
- Assembles into a structured
Reportobject with sections
Sharing a Report
Generate a share link
PATCH /orgs/:orgId/reports/:id/shareResponse: { "shareToken": "uuid", "shareUrl": "https://app.impactmel.com/r/:token" }
The link is accessible by anyone with the URL — no login required. Donors can bookmark it.
Regenerate the link
PATCH /orgs/:orgId/reports/:id/share/regenerateGenerates a new token. The old URL becomes invalid immediately.
Revoke sharing
DELETE /orgs/:orgId/reports/:id/shareSets shareToken = null — all existing share links return 404.
PDF Export
From the report view page or the public share page, click Download PDF.
The PDF is generated client-side using html2pdf.js:
- Captures the DOM report layout as a true binary PDF
- Multi-page support with proper breaks
- Org logo and header preserved
- No browser print dialog
Public Report Page (/r/:token)
Donors open the share link in any browser:
- Full report rendered in read-only mode
- "Download PDF" button for offline use
- No login required
- Org branding displayed
API Reference
| Method | Path | Description |
|---|---|---|
| GET | /orgs/:orgId/reports | List reports |
| POST | /orgs/:orgId/reports | Create and assemble report |
| GET | /orgs/:orgId/reports/:id | Get report with sections |
| PATCH | /orgs/:orgId/reports/:id | Update narrative sections |
| DELETE | /orgs/:orgId/reports/:id | Delete report |
| PATCH | /orgs/:orgId/reports/:id/share | Generate share link |
| PATCH | /orgs/:orgId/reports/:id/share/regenerate | Regenerate share link |
| DELETE | /orgs/:orgId/reports/:id/share | Revoke share link |
| GET | /reports/share/:token | Get public report (no auth) |