Planzia is a project management tool I built to handle the full loop a small team lives in. A workspace holds projects, a project holds tasks, and everything around that, billing, invites, calendars, stays out of the way.
It's a Next.js app with Postgres and Prisma behind it. These are the parts that were actually interesting to build.
The hierarchy everything hangs off
Workspace, then project, then task. Getting this model right early saved me a lot of pain later. A user can belong to several workspaces, each workspace has its own projects and members, and a task carries the detail: type, status, priority, assignee, due date, and a budget. Once that shape was solid, features like the calendars and analytics were mostly just views onto the same data.
Billing through Paystack, confirmed by webhook
Planzia has a paywall, and the lesson I keep relearning shows up here too: I never upgrade someone's plan from the browser. The frontend sends them to Paystack, and the subscription only changes after Paystack calls my webhook to confirm the money moved. Invoices and plan changes go out by email from that same handler.
Trust the webhook, not the redirect. A user can close the tab on the success page; the webhook is the real source of truth.
Inviting a team without building an email system
Team management runs on a shareable invite link copied from the workspace settings. No invite-email infrastructure to maintain, no pending-invite edge cases to chase down. You send the link however you like, and roles get managed from one place once people join.
Two calendars, on purpose
There's a personal calendar that pulls events from every workspace you belong to, and a workspace calendar scoped to just one. I added the split after my own testing made the problem obvious: one giant merged calendar is pure noise when you're trying to focus on a single project's deadlines.
Analytics that answer "where did the budget go"
The analytics section uses bar and radar charts to show progress, budget spent per task, and how work is spread across the team. Because every task already carries a budget and an assignee, the charts are honest readings of real data, not numbers I had to build a separate pipeline to fake.


