Client portal for a marketing agency
leveraged.cz
- Next.js 16 (App Router, Server Actions)
- PostgreSQL (Supabase) + Prisma 7
- Custom JWT authentication (jose + bcrypt)
- Tailwind CSS v4 + shadcn/ui
- Recharts
- @dnd-kit (accessible drag-and-drop kanban)

What it changed
- No per-client license
- Instead of paying about CZK 2,500 per month for every SwipeScale client, the agency has its own portal. Another client does not mean another software fee.
- Clients have their own overview
- Leads, stages, campaign statistics, and guides are in one place. They do not need to ask for status by email.
- No manual client reports
- The agency admin sees every client at once and can open exactly their view. There is no need to report separately to each client by email.
Audit
leveraged.cz is a marketing agency that acquires clients for financial and insurance advisers through Meta Ads (Facebook, Instagram). Campaign results previously lived in a shared Google Sheet, and the agency paid the SwipeScale platform for client dashboards - about CZK 2,500 a month for each of its clients. The status of leads in progress was tracked manually, and each client got a separate report by email.
Optimization
A custom client portal instead of SwipeScale, spreadsheets, and email reporting, with no fee per client. Meta Ads leads flow in automatically, clients maintain their own status, and the agency manages more clients without manual reports.
No fee per client
SwipeScale (swipescale.cz) is a Czech all-in-one platform with CRM, funnels, and a client portal. It cost the agency about CZK 2,500 per month for each client, so the software bill grew with every new client. A custom portal has no per-client license. For illustration: with 10 clients, that is CZK 25,000 per month, or CZK 300,000 per year, which the agency does not have to pay for dashboards.
What the agency's client gets
The adviser for whom the agency acquires leads signs in and immediately sees their leads, their stages, and campaign performance, without writing to the agency. They drag a card to the next stage, find a short video for a common question in Guides, and write to support directly from the portal when something does not work.
One-way lead intake
Meta Ads leads arrive through Google Sheets and Apps Script/Make into a secure ingestion API (HMAC request signature), not through manual import. Deduplication by Meta lead ID runs within a specific client, so a foreign or forged ID cannot suppress a real lead for another client. The flow is one way: the client changes status in the portal, but the source spreadsheet is never overwritten from the portal.
Kanban with 6 stages
A lead passes through six stages, from New lead through Contact in progress and Meeting arranged to Client acquired, with Unqualified as a dead end outside the main flow. Dragging a card by mouse or keyboard (@dnd-kit) changes its stage, while a separate Processed YES/NO switch runs independently of the stage. Filtering by campaign and status, full-text search, CSV export, and a trash bin with deleted leads automatically cleared after 30 days.
Statistics and performance overview
The client sees lead quality, the number of arranged meetings and attendance at them as percentages, a breakdown by day of the week and hour, and trends over time: charts through Recharts instead of waiting for a monthly report from the agency.

Admin across multiple clients at once
The agency admin sees an overview across all clients and can open exactly the view a specific client sees, including a visible banner that this is impersonation mode. Support therefore handles the client's real state, not debates over screenshots in email.
Support and guides in the portal
A support question is sent directly from the portal and sorted by category (request, advice, not working, other), not by unstructured email. Short video guides in the Guides section answer recurring questions without involving the agency.
Custom authentication and secure data
Sign-in uses a custom JWT session (jose + bcrypt) without a heavy library such as Auth.js. Data is stored in PostgreSQL on Supabase through Prisma 7 with a driver adapter: a transaction pooler for normal operation and a session pooler for migrations. A deleted lead remains in the trash for 30 days before a scheduled database task (pg_cron) permanently removes it.
Measurement
The scores come from Lighthouse measurements on the live leveraged.cz. The portal runs in production and the agency really manages its clients' leads through it, but aggregate business figures (number of leads processed, conversion) are not yet available for publication - so the before/after compares the process (spreadsheet and email vs. portal), not measured conversion.
Technical quality
Performance
96
Accessibility
96
Best Practices
100
SEO
100
Agentic browsing
2/2
Website readiness for AI assistants.
We paid SwipeScale about CZK 2,500 per month for each client and still assembled reports manually from a spreadsheet. Now every client has their own portal, and another client costs us nothing extra. Clients have a better overview of their leads and see statistics directly in charts.
Want a similar result?
I want an audit of my website