Skip to content
Live in production CMA's own product

CMA Client Portal

Multi-tenant operations platform

“Tenant isolation belongs in the database, not in the application code that happens to be asking.”

We didn’t integrate a few tools — we built the platform. The CMA Client Portal is the system our own clients log into: it runs scheduling and booking, automates lead intake and routing, syncs invoicing and payments with QuickBooks, and gives every client a live view of their engagement. Built, run, and improved entirely in-house — the same execution we bring to your business.

Request a demo
Next.jsSupabaseQuickBooks APIVercel

Private client application — we walk you through it live rather than handing out a sign-in.

CMA Client Portal — Multi-tenant operations platform

184 pages

client, admin and finance surfaces

358 policies

row-level security, across 207 migrations

3,167 tests

across 217 files

37 jobs

scheduled work, running every day

The Problem

The firm ran on a stack of separate tools — scheduling in one, invoicing in another, documents in email — and every client question meant reassembling the answer by hand from three of them. Rather than integrate five products and inherit five roadmaps, CMA built the platform it now runs on.

How It Works

Start to finish.

  1. 01

    Tenancy and access

    Row-level security from the first migration. 358 policies decide what a row is allowed to show before any application code runs, so one client cannot read another’s data even if the query asked for it.

  2. 02

    The client workspace

    One private workspace per client: documents, real-time messaging with their advisor, engagements and deliverables, invoices, meeting requests, announcements, and their own team.

  3. 03

    The firm side

    A cross-client admin view CMA staff can switch into any workspace from, alongside the finance, pipeline and reporting surfaces the firm actually runs on.

  4. 04

    The automation layer

    Thirty-seven scheduled jobs carry the recurring work — QuickBooks sync, retainer billing, pipeline aging, follow-up autoclose, weekly digests and monthly executive reporting.

Inside The Product

QuickBooks-synced billing

Invoices and payments reconcile against QuickBooks on a daily sync instead of being re-keyed, so the figure a client sees is the figure in the books.

Real-time messaging

Client and advisor threads update live over Postgres realtime — no email round-trip, and no wondering whether a file arrived.

Separated storage

Private per-tenant document storage is a different bucket from the public asset one, so an uploaded contract cannot end up behind a shareable URL.

Scheduling inside the engagement

Booking, rescheduling and cancellation happen in the portal, which keeps the calendar attached to the engagement it belongs to.

Deliverables clients can see

Every deliverable is tracked against its engagement with status visible to the client, rather than reported when someone asks.

A brief a person signs off

A drafted narrative over the month’s revenue, margin, pipeline and receivables — automated to write, never automated to publish.

Screens

Inside CMA Client Portal.

Real screens from the running product. Open any one to inspect it full size.

The dashboard every engagement reports into — revenue, margin, pipeline and receivables in one view.
Open deals, pipeline value and this month’s wins, at a glance.
Invoicing and payments, synced with QuickBooks rather than re-keyed.
The day at a glance: time billed, utilization against target, and what is due.
Contracts and signature status, so nothing waits on an unanswered email.
A written brief over the month’s numbers — drafted, then read by a human.

Under The Hood

How it’s built.

The decisions that are load-bearing — the ones that decide whether this still works in three years, and the reason each was made.

01 The tenant boundary is in Postgres
358 row-level policies across 207 migrations. What a row is allowed to show is decided by the database before any application code asks, so a missing WHERE clause cannot leak one client into another.
02 Realtime rather than polling
Client and advisor threads update over Postgres realtime. No refresh, no email round-trip, and no wondering whether a file arrived.
03 Two buckets, deliberately
Private per-tenant documents live in a different storage bucket from public assets, so an uploaded contract cannot end up behind a shareable URL by configuration accident.
04 QuickBooks stays the book of record
The portal reconciles to QBO on a daily cron instead of becoming a second ledger that disagrees with the first.
05 Automation is scheduled, not triggered by memory
Thirty-seven cron jobs run the recurring work — QuickBooks sync, retainer billing, follow-up autoclose, weekly digests, monthly executive reporting.
06 3,167 tests across 217 files
A platform the firm bills from cannot be verified by clicking around. The suite runs on every change, alongside types and lint.

What Changed

Before, and after.

Before

A client question answered by reassembling it from several tools.

After

One workspace per client, with the live view of their engagement already in it.

Before

Invoices re-keyed between the billing tool and the books.

After

A daily QuickBooks sync, so the figure a client sees is the figure in the books.

Before

Files, approvals and signatures living in email threads.

After

Per-tenant document storage with contracts and signature status attached to the engagement.

Before

Recurring work that happened when somebody remembered it.

After

Thirty-seven scheduled jobs carrying retainers, digests, pipeline aging and reporting.

Want us to build something like this for you?

A 30-minute call on the product or platform in front of you — and how we'd ship it.

or call (573) 747-5573

Search CMA