Custom Reports
Feature Detail
Description
Custom Reports gives organization administrators the ability to build ad hoc reports by selecting dimensions (activity type, date range, peer mentor, contact category, organizational unit) and metrics (count, hours, unique contacts, completion rate) through a report builder interface in the Admin Web Portal. The resulting report is displayed inline and can be exported as CSV or Excel. This feature addresses the long tail of reporting needs that fall outside the fixed structure of Team Reports and Bufdir Export - for example, an org admin who needs to compare activity volume across local chapters for a specific month, or a coordinator preparing a custom summary for a board presentation. It is explicitly a phase 1.1 feature, meaning core reporting must be solid before this layer is added.
Analysis
While Team Reports and Bufdir Export address the two highest-frequency reporting needs, organizations regularly encounter one-off information requests from boards, funders, or internal management that the fixed report templates cannot satisfy. Without a custom report builder, these requests either go unanswered or require manual database queries by Norse support staff, neither of which scales. Custom Reports shifts this capability to the organization admin, reducing Norse's support burden and increasing each organization's autonomy. From a competitive standpoint, a flexible report builder is a standard expectation in organizational management software and will be a factor in procurement decisions when Meander is sold to new organizations through the sales website. Deferring to v1.1 is deliberate - shipping a fragile report builder before the data model is stable would create maintenance debt.
The report builder is a client-side form that constructs a query descriptor (selected dimensions, metrics, filters, date range) and POSTs it to `/api/v1/reports/custom`. The backend validates the descriptor against a whitelist of permitted dimensions and metrics - never accepting raw SQL or arbitrary field names - and executes a parameterized PostgreSQL query. Tenant isolation is enforced server-side regardless of what the client sends. The response is paginated JSON rendered into a dynamic table on the frontend. Export uses the same data with a CSV or Excel serializer. The query whitelist approach trades flexibility for security and maintainability; if more complex aggregations are needed later, a dedicated analytics layer (e.g. a read replica with a thin query API) is preferable to expanding raw SQL surface. The Custom Report Builder Page and Custom Report Service map directly to the components defined in the blueprint.
Components (43)
Shared Components
These components are reused across multiple features
User Interface (9)
Service Layer (15)
Data Layer (8)
Infrastructure (7)
User Stories
No user stories have been generated for this feature yet.