The Cerno client system
The portal, CRM, and lead pipeline behind this agency - built in-house and running in production. If we build a system for you, this is the standard it is held to.
Sign in and use itThe problem
Most small agencies run on five subscriptions glued together: leads in an inbox, work in a spreadsheet, invoices in a billing tool, files in a drive, and updates over messages. The client never sees where their project actually stands, and a month later nobody can answer where a particular lead came from. Every answer starts with 'let me check and get back to you.'
The approach
One application. The public marketing site and the private client portal share a codebase, a design system, and a database. Supabase handles identity and storage; a role gate in middleware decides what each account can reach before a page is ever rendered. An admin sees everything, a provider sees the client area without billing, and a client sees only their own record. Nothing is protected by simply not linking to it.
How it flows
One lead. One record. From the first form to the final invoice.
- 01
A visitor answers the qualifier on the homepage or sends an application.
- 02
The submission hits an API route, is stored, and triggers a notification.
- 03
If it fits, the application becomes a client record with a project attached.
- 04
The client signs in and sees their own tasks, milestones, files, and invoices.
- 05
Reporting and email campaigns run off the same data - no export, no second tool.
No spreadsheet in the middle, and no waiting on someone to check.
Decisions
- Why put the role check in middleware instead of in each page?
- Because a forgotten check is invisible. The gate runs before any dashboard route renders and denies by default, so an unrecognised path is refused rather than allowed. Hiding a link in the navigation is not access control - anyone can type a URL.
- Why one application instead of a website plus an off-the-shelf CRM?
- Two systems mean two sources of truth and a reconciliation every month. Here the form on the public page writes to the same database the portal reads from, so a lead is never re-entered by hand and never quietly diverges between tools.
- Why is the language chosen by location rather than by browser?
- A Croatian studio owner browsing with an English browser still wants the Croatian page; a foreign visitor sitting in a Croatian office does not. Location is the more reliable signal. The result is stored in a cookie, so a visitor can override it once and have that remembered.
- Why build this at all instead of buying it?
- Honestly, because it is the work. An agency that sells custom systems while running on someone else's template is asking you to take its word for it. You can sign in to this one.
In progress
Next: the monthly number, inside the portal.
The monthly number is currently delivered as a one-page report. It is moving into the portal so a client can open it on any day of the month instead of waiting for it to arrive. In progress.