I Built a Client Profitability Dashboard for Freelancers
The Problem That Wouldn't Leave Me Alone
61% of freelancers lose 10-30% of project revenue to scope creep and time leaks, according to PMI research. But here's the scarier stat: most freelancers can't tell you which of their clients is actually profitable.
Your highest-paying client might be your least profitable one when you account for all the hidden time: the extra revision rounds, the 45-minute calls about a 5-minute task, the scope creep that "won't take long."
QuickBooks makes this worse, not better. Per-project P&L requires Plus at $115/month or Advanced at $235/month. And the October 2025 interface redesign increased clicks required for basic tasks "by at least five times" (direct quote from G2 reviews).
What I Built: ClientPulse
ClientPulse is a single-screen dashboard that answers one question: "Which clients are making me money and which are costing me money?"
Core Features
Per-Client Profitability Dashboard
- Syncs with QuickBooks or Xero via OAuth
- Shows true effective hourly rate (total revenue / ALL hours including admin, meetings, revisions)
- Color-coded: Green = profitable, Yellow = breakeven, Red = losing money
Real-Time Scope Creep Alerts
- Alerts at 20%, 50%, 80%, 100% over estimated hours
- Catches scope creep while you can still have the conversation
- Not after the project ends when it's too late
The Wow Moment
Connect QuickBooks → See client profitability ranked in 30 seconds.
Tech Stack
- Next.js 15 (App Router, TypeScript)
- Prisma v7 + PostgreSQL (Neon)
- NextAuth.js v5 (Google OAuth + Magic Link)
- Stripe for subscriptions ($29/mo Solo, $49/mo Team)
- Tailwind CSS with custom dark theme (Electric Indigo + profit/scope/loss colors)
Interesting Technical Decisions
Prisma v7 Breaking Change: Prisma v7 completely removed the url field from the datasource block in schema.prisma. You now configure the adapter in prisma.config.ts. This caught me off guard during the Vercel build.
Lightweight Middleware: Using NextAuth's auth() helper in Next.js middleware caused Edge Function size to exceed 1MB (Vercel free plan limit). Fixed by doing a simple cookie check instead of importing the full auth bundle.
Effective Rate Calculation: totalRevenue / totalHours where totalHours includes ALL time categories (BILLABLE, ADMIN, REVISIONS, MEETINGS, UNBILLABLE). This is the real number, not the flattering one.
What's Next
- Set up real Neon database (currently using placeholder)
- QuickBooks and Xero OAuth integration testing
- Scope creep detection algorithm refinement
- Weekly profit pulse emails via Resend
Try It
Live: https://clientpulse-beta.vercel.app
If you're a freelancer who's ever suspected one of your "best" clients was actually costing you money - this is for you.
Built using the One-Shot Pipeline methodology: market research → SEO strategy → design system → tech spec → construction → E2E testing → deployment, all in one afternoon.
Top comments (0)