Aiki Client Portal
The client portal and admin platform we run our own agency on
Stylized preview. The live portal carries client data, so we drew it instead of screenshotting it.
The Challenge
Agency work tends to hide behind email. Clients ask what got done this week, someone assembles a status update by hand, invoices arrive as PDF attachments with no context, and scope questions turn into archaeology through old threads. We wanted the opposite: one system where the work, the hours, and the money stay visible to both sides. And we refused to run our own operations in a different tool from the one clients look at, because then the portal rots the moment it stops being convenient for us.
What We Built
- Admin app covering the full delivery cycle: clients, projects, drag-and-drop agile boards with sprints and epics, time tracking, and Austrian-compliant invoicing with PDF generation and email sending
- Client portal on the same database, so clients see their projects, boards, budget burn, sprint timelines, files, and invoices with zero sync lag
- Live budget meters computed from logged billable time, not from estimates someone typed into a slide
- Notification engine: database triggers record every event, scheduled edge functions email the right people, and each client gets a weekly digest
- Row-level security in Postgres isolates every client organization on shared tables, verified by role simulation
- Jira bridge for clients who already live in Jira: their boards render inside the portal through a secured edge function
- Deliverables hub for staging links, repositories, design files, and document exchange in both directions
- Invitation-based onboarding: the client gets an email, sets a password, and lands in a portal scoped to their organization
The Result
We run Aiki Labs on this system every day: hours, sprints, invoices, client communication. Clients log in and see what we see, minus internal noise. The question "what got done and what did it cost" is answered by the portal before anyone has to ask it. And because this is the same codebase we build client portals from, every improvement we ship for ourselves lands in client projects too.
Operational Impact
2 apps, 1 database
admin and client portal in lockstep
Both apps read and write the same Postgres tables. Row-level security decides who sees what, so there is no sync job to break.
Live
budget burn for every project
Burn meters derive from logged billable minutes and snapshot hourly rates. Clients see spend against budget in real time.
Minutes, not meetings
for routine status questions
Boards, timelines, and activity feeds answer day-to-day progress questions that previously needed a call or a written summary.
Every event
logged and notified
Database triggers write an activity log; cron-driven edge functions turn it into targeted emails and a weekly per-client digest.
- One Postgres database, two apps: admin operations and the client portal never drift apart
- Clients watch budget burn computed from real logged time, updated the moment work is logged
- Ticket moves, comments, sprints, and invoices trigger targeted email notifications automatically
- Invoicing meets Austrian legal requirements: sequential numbering, snapshot immutability after issue
Under the Hood
Frontend
Backend & data
Infrastructure
Connected services
What's Connected
Jira Cloud. Clients who track work in Jira see their live boards inside the portal. An edge function holds the API token; the browser never touches it.
Resend. Delivers issued invoices, event notifications, and the weekly digest from our own domain.
Supabase Auth. Handles the invitation flow, password setup, and sessions for both apps against one user base.
Payload CMS. Runs the content behind this website from the same admin deployment, so marketing and operations share infrastructure.
Want something like this?
Book a free consultation — we'll map your workflows and tell you exactly what to build.