GraV-IT
← All work

2026 · Lead developer

Project Profitability Platform

A custom internal tool built for an agency that needed to turn project-management data into financial reality faster than glued-together SaaS products could. Earned revenue, cost projections, and schedule variance across eleven internal metrics — backed by a multi-dimensional reporting engine, immutable revenue journaling, an integrated browser extension for inline time-logging, and a deliberate decision to keep every calculation deterministic.

Stack
Next.js TypeScript React Postgres Prisma pg-boss NextAuth.js

The brief

The agency I built this for runs project-based engagements at scale — dozens of concurrent projects, dozens of contributors, shifting deadlines, and a finance team that needed to know in real time which projects were earning their keep and which were drifting out of budget. The existing tooling — generic project-management software for tracking work, generic accounting software for tracking dollars — left a real gap in between: nothing that turned PM data into financial reality fast enough to act on.

This tool fills that gap. Daily syncs from the PM platform feed an earned-revenue model, cost projections, and schedule variance across eleven internal metrics, exposed through a custom reporting engine the finance team uses to slice the picture however the question demands.

What I built

A multi-dimensional reporting engine. The core surface is a custom report builder — dimensions (project, contributor, client, period, status) × measures (earned revenue, billed amount, cost, variance, margin) × filters (date ranges, project tags, role). Composable enough to answer the next question finance asks without writing a new query each time.

Immutable revenue journaling. Revenue isn’t overwritten when it changes — it’s voided and re-posted as an adjustment, the way real bookkeeping does. Every revenue figure has a complete audit trail; no one can quietly rewrite history. The reporting engine reads the ledger, not a snapshot.

Asana API integration without an SDK. Direct fetch() calls, webhook subscriptions for change events, exponential backoff on rate limits, retry-with-jitter for transient failures. Five scheduled jobs on pg-boss keep the local picture in sync — user sync, project sync, financial reconciliation, auto-submit at period close, auto-lock when periods finalize.

A browser extension. A Manifest V3 extension built with Vite adds a thin time-logging surface inline inside the PM tool itself — leads can record time without bouncing to the reporting app. Same data store, same auth, same rules.

Role-based access control. Three roles — contributor, manager, admin — with NextAuth.js handling identity. Different views, different actions, different write permissions on the journal.

What’s notable about it

The deliberate absence of AI. This is a tool finance leans on for real money decisions — what got billed, what’s earned, what’s at risk — and the decision was to keep every calculation deterministic, auditable, and explainable. No LLMs, no probabilistic estimation, no “approximately” numbers. The kind of system where being right matters more than being clever.