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.
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.
Documents in, SQL-governed analytics out.
The function app belongs here: it is the ingestion and OCR engine behind the analytics platform.
The semantic layer, not the dashboard chrome.
Where the platform earns trust: matching, exception handling, and metric definitions close to the data.
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.
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 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.
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 →