47 Audit AI · Year-end statements

From trial balance to an approved report.

I built 47 Audit AI to take the mechanical part out of year-end preparation. It reads a trial balance and last year's signed report, maps every account to a statement heading, checks the arithmetic, and only then assembles the report from the figures a reviewer approved. AI understands, code calculates, rules ask, humans approve.

The app sits behind a sign-in and is invite only for now.

My role
Designed and built it
Started
September 2026
Status
Live, invite only
Built on
Next.js · TypeScript

Why I built it

The problem.

Before I built software I worked as a financial auditor. A large share of every engagement was the same mechanical work: mapping a trial balance to statement headings, carrying last year's figures across by hand, and re-checking totals that should never have been typed twice. I wanted a tool that does that part, shows its working, and refuses to finish until the numbers agree.

The application

The main screens, in the order you meet them.

Redrawn live from the application’s own layout with sample figures, not customer records.

Every engagement on one line: client, year end, the stage it has reached and whether it is approved.

auditai.fortysevenlab.com

47 Audit AI

Audit workspace

+ New Audit Project

Audit projects

4

Created from real source files

Approved statements

1

Explicit reviewer approvals

Reports ready

1

Approved in-app audit reports

CompanyYear endStatusSourcesUpdated
Al Noor Trading W.L.L.QAR · 31 Dec 2025FS approved2 / 22 hours ago
Gulf Facilities ServicesAED · 31 Dec 2025Mapping2 / 2Yesterday
Doha Interiors Co.QAR · 31 Dec 2025Professional input2 / 23 days ago
Pearl Logistics W.L.L.QAR · 30 Jun 2026Step 1 of 71 / 2Last week

How it works

Four stages. Each one has to clear before the next.

  1. 01

    Import

    A trial balance in .xlsx, .xls or .csv, and last year's signed report as PDF or DOCX. The reviewer chooses the worksheet, the header row and the amount columns; nothing is picked silently.

  2. 02

    Map

    Rules and last year's report suggest a heading for every account, and each suggestion keeps its source and confidence. Capital, related parties, loans and tax are never auto-confirmed.

  3. 03

    Check

    The statements are built together and must agree: balance, profit or loss, cross-foots. A failed control blocks approval, and changing a mapping afterwards voids it.

  4. 04

    Report

    Approval releases the report stage: a versioned DOCX and PDF with the financial tables locked to the approved figures.

AI understands. Code calculates. Rules ask. Humans approve.

The model
Reads documents and suggests classifications. Its output is schema-validated and never enters a calculation.
The arithmetic
Every figure is exact decimal arithmetic. Rules raise the questions; a person approves.

What I decided

Four calls I made, and why.

01

The model reads; it never counts

A language model reads documents and suggests classifications through schema-validated structured output. Every figure is exact decimal arithmetic (decimal.js, never floating point), and AI output never enters a calculation.

02

The opinion is the reviewer's, not the software's

The audit opinion is an explicit choice a person records: unqualified, qualified, adverse, disclaimer or emphasis of matter. Export is refused until it is made. The tool prepares; it does not audit.

03

Source rows are immutable

The original trial-balance rows are never edited. Adjustments are separate records, so every statement line can be traced back to what the client actually sent.

04

Scanned reports are read in the browser

OCR is slow enough to outrun a serverless function, so a scanned prior-year report is read page by page in the visitor's browser with Web Workers, and the OCR files are served from the app's own origin. A client's document never touches a third-party CDN.

Built withNext.jsTypeScriptSupabase (Postgres, RLS, storage)OpenAI structured outputsdecimal.jsdocx + PDF exportTesseract OCRVitest