◆ SHIPPEDFintech analytics

Invoices in. Reconciled operating intelligence out.

A full-stack financial analytics platform, built solo: Logic Apps and Python Azure Functions move invoice PDFs from email and blob storage into Azure Document Intelligence, SQL Server turns OCR output into validated financial records, and a Next.js dashboard turns that governed data into C-suite views, reconciliation workflows, client/provider intelligence, and risk signals. The hard part is not the chart — it is making the number behind the chart trustworthy.

TypeScriptReactPrismaTailwindAzureSQL Server
Next.js 15React 19Azure FunctionsDocument IntelligenceLogic AppsBlob / Queue / Table StorageTanStack TableRechartsExcelJSPython 3.13pyodbc
◆ Under NDA — architecture and engineering approach only. No client names, no real figures; the dashboard graphic below is illustrative.
1000s
invoices processed / month
61
Prisma-modeled SQL views in repo
50+
production stored procedures
5
blob-triggered processing paths
fintech · conceptual system view
Conceptual executive analytics view — KPIs, revenue trend, monthly invoices, and portfolio risk mix
// The problem

The numbers leadership wanted were split across PDFs, bank files, and manual review.

The data that mattered most — finance rate, margin, payment velocity, unmatched deposits, provider performance, client concentration, and low-confidence OCR cases — was buried in invoice PDFs, bank transaction imports, ACH files, and one-off manual checks. A single executive answer could require stitching together several systems and trusting that nobody had re-keyed a value wrong.

The goal was a platform where documents, payments, and exceptions share one governed model. Raw files land in storage, OCR output is preserved, SQL Server owns the business definitions, and the dashboard can move from an executive KPI to the invoice, transaction, or review queue behind it. That meant treating extraction, reconciliation, validation, and analytics as one system.

// How it works

Documents in, SQL-governed analytics out.

The function app belongs here: it is the ingestion and OCR engine behind the analytics platform.

01 CAPTURE
Logic Apps watch the invoice inboxes, filter the relevant attachments, and drop PDFs into Azure Blob containers. Provider and client flows stay separate so routing, naming, and review rules can differ without branching the whole pipeline.
02 NORMALIZE
Python Azure Functions process blob arrivals: multi-page provider PDFs are split, client PDFs are standardized, source files are archived, and failed inputs move to review/error paths instead of disappearing into logs.
03 EXTRACT
Azure Document Intelligence runs the OCR/custom model pass once, preserving the raw JSON alongside the PDF and processing log. The code extracts invoice numbers, names, dates, confidence signals, and validation fields from that durable OCR artifact.
04 MODEL
SQL Server owns the business layer: 50+ production stored procedures handle extraction, invoice linking, ACH/bank matching, and reprocessing; 61 checked-in SQL views expose client intelligence, provider intelligence, banking, operations, and risk/compliance metrics to Prisma.
05 PRESENT
Next.js 15 + React 19 renders the operating surface: App Router pages, server actions, Prisma-backed queries, cache tags/revalidation, TanStack Table grids, Recharts visuals, CSV/Excel exports, and drill-downs from KPI to underlying invoice or transaction.
// The interesting part

The semantic layer, not the dashboard chrome.

Where the platform earns trust: matching, exception handling, and metric definitions close to the data.

OCR OPS

One OCR pass, many downstream guarantees

The function app keeps the PDF, OCR JSON, processing log, renamed blob path, and database row tied together. Revised invoices can update existing records, low-confidence fields can surface as review work, and reprocessing does not require guessing what the AI saw.

MATCHING

Payments are matched, not assumed

ACH batches, bank deposits, provider invoices, and client invoices are correlated through SQL procedures and views. The dashboard can show collection trends, unmatched deposits, payment velocity, reconciliation status, and manual-review queues from the same source of truth.

RISK

Risk is modeled as an operations signal

Client concentration, margin movement, aging, low-confidence OCR, unmatched transactions, and audit-timeline events become queryable signals. The UI simply exposes them; SQL Server defines them so the numbers stay consistent across every page.

The deliberate choice throughout was to compute financial truth in SQL, close to the validated data, instead of scattering business logic across React components. Prisma maps the view layer, Next caches the read paths with short revalidation windows where needed, and mutations invalidate named tags so the dashboard can stay fast without serving stale operational state.

◆ Architecture only — this one's under NDA

Because the platform is under NDA, this write-up stays at the level of architecture and engineering approach: the document pipeline, the human-in-the-loop validation, and how the risk metrics are derived. No real client names, figures, or screenshots — the dashboard above is an illustrative mock. Want to talk through the approach? Reach out →