Inspiration

Small finance teams spend hours every week copying invoice emails into QuickBooks, and the few invoices that are wrong are the ones that cost money. A forwarded invoice gets paid twice, a bill comes in above its PO, or a look-alike vendor slips through. Reading invoices isn’t the hard part. Knowing which 10% need a human is.

What it does

Billify is an AI accounts-payable agent that sits between the AP inbox and QuickBooks. For each invoice email, it extracts the bill fields, then checks them against approved vendors, open POs and already-logged bills. It either logs a QuickBooks-ready bill automatically or flags it for review with a one-sentence reason a bookkeeper can act on, such as “Possible duplicate of INV-0042 logged on Oct 3, same vendor and amount.”

It catches duplicates, overbilling against a PO, unknown or look-alike vendors, missing PO numbers, and currency mismatches. A review dashboard shows each email next to its extracted bill, the flag reason and the step that caught it. A Chrome extension extracts invoice data from any page and prefills a bill form.

How we built it Agent: a Python pipeline of 8 steps per email: read, extract, vendor lookup, PO lookup, amount compare, duplicate check, decide, write. Extraction and the final decision are model calls through Nicrron. The amount and duplicate checks are plain code, so they’re cheap, predictable and easy to explain. Observability: every run is traced in PRISM, and we ran X+ batch runs over a synthetic inbox of invoice emails. Data: synthetic inbox, vendor, PO and ledger files, plus an answer key, generated with Claude Code. Front end: a plain HTML/CSS/JS dashboard with a v1/v2 toggle, and a Manifest V3 Chrome extension backed by a local extraction endpoint. Challenges we ran into

Our v1 agent logged forwarded and re-sent invoices twice. The subject, the sender and the invoice-number format all changed (“INV-0042” vs “Invoice #42”), and v1 compared invoice numbers exactly. We also had to identify the vendor from the invoice body rather than the sender, because a forward from a colleague otherwise looks like an unknown vendor. Finally, re-running batches without resetting the ledger made every invoice look like its own duplicate.

Accomplishments that we’re proud of

We used PRISM’s Root Cause view to cluster the duplicate failures, explained the cause in one sentence, and proved the fix: v2 on the same inputs flags every duplicate. A PRISM Alert fires on the v1 failure, which is exactly what would catch it in production. We built the whole thing in four hours with a clean split of roles.

What we learned

Most of an AP agent’s value comes from the deterministic checks around the model, not the model itself. Keep the AI out of the arithmetic. Tracing every step turns “the agent got it wrong” into “this step passed when it shouldn’t have,” and that’s what makes a fix provable.

What’s next for Billify Real Gmail and QuickBooks Online integrations PDF and scanned invoice parsing Learning vendor-specific invoice formats over time Multi-invoice POs and partial billing Approval routing by amount Scheduling payments around due dates and early-pay discounts

Built With

Share this project:

Updates

Submission history