Case Study

From Excel spreadsheets to a client analytics dashboard

A contract build for Mercury Marketing, through Cabro Insight LLC · live at mercurymediatools.us

Years of campaign data trapped in Excel

Mercury Marketing runs advertising campaigns for its client businesses across eight channels, print, e-blasts, e-newsletters, banner ads, sponsored content, webinars, social media, and continuing-education placements. The complete record of that work lived in Excel workbooks: thousands of campaign line items spanning multiple years.

Spreadsheets are where this story starts for most small organizations, and they carry the same costs everywhere. Answering a client question means opening workbooks, clients can't see their own results, and nobody gets a live view across the whole portfolio.

The fix, a multi-tenant dashboard that meets the spreadsheet where it is

Instead of forcing a new workflow, the platform ingests the workbooks the agency already produces. An admin uploads a workbook; each client logs in and sees live dashboards of their own campaigns, nothing else. The spreadsheet stays the source of truth; the platform makes it queryable, visual, and shareable.

Under the hood, a Flask and PostgreSQL backend, a Next.js/TypeScript frontend, deployed on Railway behind Cloudflare with database migrations applied automatically on every deploy, so every environment heals itself instead of drifting.

Client data isolation, enforced by the server

Every campaign record belongs to a company, and every data route checks that boundary on the server before returning a byte.

  • Client users see only their own company's campaigns.
  • The agency's users get cross-brand visibility over the whole portfolio, each brand stays sealed off from the others.
  • Admins alone can upload data, create companies, or grant access. Self-registration can only join an existing company and can never grant admin.

The frontend mirrors the same rule, but only to decide what to show. The server is the enforcement point, client-side checks are advice, never security.

Spreadsheet ingestion that doesn't trust the spreadsheet

Real client workbooks are messy, so the Pandas pipeline is strict at the border. A nineteen-column contract is validated up front, and a workbook missing a column is rejected whole rather than half-imported. Rows are cleaned, de-duplicated, and type-coerced, then routed by ad type and upserted on the insertion-order number, re-uploading a corrected workbook updates records instead of duplicating them. Each batch commits in a single transaction with rollback on failure, so the database never holds a partial import. The test suite runs the agency's actual workbooks end to end, including a test asserting that a malformed file fails loudly.

Dashboards clients actually open

The reporting layer answers the questions clients were emailing about. Financial time-series with monthly, quarterly, and yearly views; spend-by-channel and cost-per-lead breakdowns; year-over-year comparisons; an engagement funnel; publication-level share charts. Derived metrics, open rate, click-through, CPM, CPC, cost per lead , are computed from the ingested records, with the heavy aggregation done in SQL rather than application loops. Admins can attach proof-of-run images to any campaign, so a client reviewing a line item sees the actual ad that ran.

The result

The platform is in production on the agency's own domain, serving the agency and its client businesses, with over two hundred automated tests guarding the access rules, the ingestion contract, and the financial math.

Is this your organization?

Most small organizations, non-profits very much included, run on spreadsheets that one person understands. You don't need an eighteen-month "digital transformation" to fix that. Meeting your spreadsheet where it is, and putting a validated, access-controlled window in front of it, is often the highest-leverage software you can buy.

Not sure if you're there yet? Check the seven signs you've outgrown your spreadsheet, and what a build like this costs, published openly, sliding scale included.

Common questions

Do we have to stop using our spreadsheets?

No. The spreadsheet stays the source of truth, the platform ingests, validates, and visualizes it. Corrected re-uploads update records instead of duplicating them.

Can clients see each other's data?

No. Every record belongs to a company and the server enforces that boundary on every request. Only the agency's own users see across brands.

What happens when someone uploads a bad file?

It's rejected whole, with the reason. Nothing half-imports, ever.

If your organization's story also starts with a spreadsheet, tell me about it, the first conversation is free, and so is an honest opinion on whether you need a build at all.