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)
Lead kanban overview in the leveraged.cz client portal - columns by pipeline stage, KPI tiles at the top

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.

Client portal statistics - KPI cards, lead quality, meeting count and attendance, trend charts

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.

Tomáš Heligman - founder, leveraged.cz

Want a similar result?

I want an audit of my website
Next case studyFotobazoš.cz →Marketing and customer inbox on autopilot

Get in touch.

Tell us what is bothering you - the website, manual work, or both. Within 24 hours we will get back to you with a concrete proposal.

Prefer email? business@kypyx.cz