Analytics dashboard on top of an ERP
A dashboard that ingests the ERP export, cleans it, and lets people assemble a new report without a developer. Deployed at two distribution companies.
- 2
- deployments
- 291
- commits
- 338
- source files
- 0
- manual Excel reports
Problem
The ERP only ever produced a raw export. Management spent hours each week assembling a report by hand in Excel, every department wanted its own cut, and every new cut meant another request to a developer. Formulas were copied from file to file until the numbers stopped agreeing.
Solution
I built an import pipeline that loads the export file, validates it and keeps the history. On top of it sits a drag-and-drop report builder: the user drags dimensions and measures, assembles a new cut and exports it to a styled Excel file. Once built, the product was adapted to the second company at configuration level.
Key capabilities
- Import of .xlsx and .csv — validation, duplicate detection, and a retained upload history
- Drag-and-drop report builder: a new cut is created and saved without a developer
- Styled Excel export — the report reaches management ready to read
- Interactive charts and KPI panels
- Staff attendance check-in via QR code
- Two authentication paths: a session for the web, a separate JWT API for the mobile app
- Dark and light themes with full mobile layout
- CI/CD: push to `main` → GitHub Actions → automated build and restart on the server, with a parallel Vercel deploy
- One product running at two companies — cosmetics and toy distribution
Architecture
Everything lives inside the Next.js App Router: pages, route handlers and the database through Prisma. The mobile app reaches the same data through a separate JWT API; the web uses a session.
Data sources
Import pipeline
Validated against Zod schemas
Application
Access
Data
Stack
Web
Backend
Data tooling
Infrastructure
My role
The whole product: data model, import pipeline, report builder, authentication, mobile API and CI/CD.
Client names, domains and server addresses are withheld for confidentiality.