From inbox to ledger: accounting automation across four companies

Till takings, supplier invoices, payroll journals and month-end accruals were all keyed by hand, and every company did it a little differently. We built a chain that carries documents and point-of-sale data through to the ledger, with a person approving every post.

Locality
UK
Disciplines
Systems integration, AI with guardrails
Stack
  • Python
  • Model Context Protocol
  • QuickBooks Online
  • Microsoft Graph
  • Agent skills

At a glance

  • 4

    companies' books

  • 7

    posting tools and skills

  • 579

    lines in one product-to-ledger map

  • 0

    payments made automatically

The challenge

Each company had its own tills, its own suppliers and its own VAT position. The recurring work was the same everywhere though: read a document or a day's sales, decide where it goes, key it in and hope it ties.

We wanted that work prepared by software and agents, decided by a person, and posted in a way that can never produce a duplicate.

Architecture

Inbox to ledger architectureArchitecture diagram with 9 components. Supplier email to Mailbox server. Mailbox server to Company inbox folder. Company inbox folder to Agent skill. Agent skill to Human approval. Human approval to Accounting server (approved). Point-of-sale data to Takings poster. Takings poster to Accounting server. Accounting server to Ledger.approvedSupplier emailMailbox serverRules per senderCompany inbox folderSaved documentsAgent skillReads PDF + precedentHuman approvalPer item or per runPoint-of-sale dataTakings posterPosts only the gapAccounting serverDry run, then commitLedgerSource document attached

Swipe to explore the diagram

Two routes into the ledger, one gate. Documents arrive through mail rules and agent skills, takings through scheduled posters, and both commit through the fenced accounting server.

What we built

Daily takings

  • Posters that read point-of-sale data, map items and tenders, and post a sales receipt plus bank transfers
  • They refuse unmapped products rather than guess, and run as a dry run unless told otherwise
  • Gap-driven: compare finished trading days with days already in the ledger, and post only what's missing

Supplier documents

  • Written per-sender mail rules that save supplier documents into per-company folders
  • An agent skill that reads each PDF, looks up how that supplier was posted before, attaches the document and asks for an OK
  • A recipe per supplier that builds up from ledger history

Payroll and month end

  • Payroll journals including holiday accrual, and the employment allowance timing pair with its reversal
  • Month-end accruals with next-month reversals, which refuse to run on the last day of the month

Engineering decisions

A person approves every post

Agents prepare and people commit. Suppliers are never created automatically either.

Business rules live outside the connector

The accounting server knows only QuickBooks. Timing, mappings and supplier recipes belong to each company's own layer, which is how one server serves very different businesses.

No posting during trading hours

The connector has no clock, so each company layer enforces its own posting window.

The inbox stays the owner's to-do list

Automation never permanently deletes mail, and an item is filed only once it has been dealt with.

Outcome

Daily takings, a backlog of transfers, supplier bills and month-end journals are posted and reconciled on live books, each with its source document attached and a receipt printed for audit.