Dashboard
What AutoCash has done for you
The home screen: the headline results, a summary strip (the ribbon) worked out from the latest run, and the history of every run.
Touchless rate = payments posted on their own, divided by all payments in the run (hard payments are counted, not hidden). Unapplied cash = the total of leftover amounts across the run's matches. Latency = the average solver time stored on each match.
If the unapplied-cash figure grows from run to run, money is arriving faster than the agent can explain it. That points to poor remittance data, not a weak solver.
Run the demo, upload your own files in the Upload Center, or open any past run in the table to see its evidence.
Run history
Upload Center
inv_no, bill_no and document_no all mean invoice_id. The mapping used is shown to you after import. The file also gets a fingerprint (a hash of its column names) so the same layout is recognised next time. Rows that fail are returned in a quarantine list with the row number and the exact error. Payments are matched immediately, using the current policy, and references are pulled out of the remittance text automatically.Where real work enters: your invoice list and your bank payments, as CSV files, with automatic column matching and a list of any rows that failed.
Column names are matched to our fields using a synonym list; the mapping used is shown to you. The file is fingerprinted (a hash of its column names) so the same layout is recognised next time. Payments are matched as soon as they are imported, using the current policy.
An import with no failed rows means your bank and ERP files already line up with our fields. Most first files do not - the quarantine list is exactly the list of what to fix.
Drop a file, paste the CSV text, or start from the samples and templates. Fix failed rows in your source file and import again.
1. Open invoices (AR ledger)
2. Payments (bank / lockbox)
Remittance and wire input - the Capture Agent
Tip: this sample references INV-1001 and INV-1002 from the demo case - load the demo case first, or paste your own buyer's email.
AI extraction layer
Staged in this workspace
Run Reconciliation
The agent team on this run
| Agent | Algorithm | Judged on |
|---|---|---|
| Capture Agent | LLM extraction (Gemini when keyed) + deterministic fallback, then a ledger verifier | References verified, zero invented |
| Linking Agent | Exact references, PO match, OCR repair, Jaro-Winkler fuzzy fallback (0.88) | Payments linked to the right customer |
| Matching Agent | MILP under a cash conservation equation (HiGHS), Rust subset-sum kernel | Exact-match rate, residual zero |
| Deduction Agent | Reason-code classification + z-score anomaly detection | Spikes caught, codes assigned |
| Policy Agent | Expected-value dispute rule, maker-checker thresholds, tolerance write-off | Nothing posts past policy |
| Briefing Agent | Grounded generation over run records (Gemini when keyed) | Every run ends with a brief and next actions |
Staged payments - the active case
Matches
Exceptions
Approvals waiting
One full pass of the real engine over a set of payments: narrow the candidates, solve the matches, judge deductions, and raise exceptions for the rest.
For each payment: the candidate list narrows by reference, then PO, then payer name. The solver then finds the invoice set that equals the payment exactly, preferring older invoices. The confidence rule and the auto-post rule are on the Methodology page, and every match shows its own worked calculation (its derivation).
AUTO_POSTED rows are finished work. PROPOSED rows are the agent asking a person to approve. Exceptions are the agent refusing to guess - each one says what to do next.
Open any match to read its worked calculation and to test why another invoice was not picked. To change behaviour, edit the rules in Policy Studio and run again.
Use Cases
Custom Case Builder
Open Ledger
Forecast and Collections
30-day cash-in bands
Collections priority queue
Evaluations
Agent Health
Audit trail
Copilot
Policy Studio
Methodology - how every number is computed
Architecture
Built against the Agent Product Builder JD
| What the JD asks | Where it lives here | The tech, in one line |
|---|---|---|
| Build autonomous agents for the CFO's office, aiming at 90%+ automation | Run Reconciliation, Dashboard | A pipeline of named steps matches payments on its own; people only see what policy holds back. The automation rate is measured on every run, not claimed. |
| Transform big finance data, LiveCube-style | Upload Center | Files in any layout are mapped to one clean format. Bad rows are listed with the reason, never dropped in silence. |
| Process unstructured data: parsing, matching, reconciliation | Remittance Parser, Run Reconciliation | AI reads the email, a checker verifies every reference against the ledger, then the solver matches the money. |
| Forecasting, work prioritisation, anomaly identification | Forecast and Collections, match evidence | Trained models predict pay dates and build cash-in ranges; z-scores flag strange deductions; every queue is sorted by money at risk. |
| Algo-first thinking: NP-hard problems (Knapsack, MILP) | Methodology, every match's derivation | Matching is written as a MILP with one cash conservation equation and solved exactly with HiGHS, in whole cents. |
| Functional programming, preferably Rust | Architecture (components) | The subset-sum kernel is pure Rust functions, proven equal to the Python solver on 203 shared test cases. |
| OOP in Python | Architecture (components) | The backend is typed domain models, a repository layer and small services, served by FastAPI. |
| System design and distributed systems | Agent Health, this page | One database per tenant, hashed API keys, role-based access, rate limits and health gates. The API keeps no state in memory, so it can scale out. |
| Agent health dashboards that prove automation | Agent Health, Dashboard, Evaluations | Every number comes from stored runs and live model checks - the proof and the product are the same numbers. |
| Full-lifecycle ownership, PRD to deployment | Product Thinking | PRD, architecture, code, tests, Docker packaging and this live deployment on AWS - all in one repository. |
One JD line is not in this table: the academic record. Software cannot manufacture that, so it is not claimed anywhere in this product. It is answered by the application itself.
Request path of one payment
| Step | Stage | What happens |
|---|---|---|
| 1 | Ingestion + transform | CSV or API payload is normalised to the canonical schema: synonym header mapping, source fingerprinting, row quarantine with reasons. Remittance text goes to the parser (Gemini when configured, deterministic otherwise) and every extracted reference is verified against the open ledger. |
| 2 | Candidate resolution | The ledger narrows in order: explicit references, purchase order, payer alias, subsidiary. Duplicates are fingerprinted and stopped before matching. |
| 3 | MILP solver (HiGHS via scipy) | Subset selection under the cash conservation equality with the age-weighted, penalty-priced objective from the Methodology page. A Rust subset-sum kernel mirrors the combinatorics and is equivalence-tested against the Python path on 203 shared cases. |
| 4 | Deduction intelligence | Claims are classified to the ERP reason taxonomy, z-scored against history, and decided by the expected-value dispute rule. |
| 5 | Posting + exceptions | Exact, confident matches auto-post (simulated posting in this build, labelled as such); everything else becomes a proposed match or a tracked exception with counterfactuals. All of it lands in the audit log with the run's policy snapshot. |
| 6 | Insight layer | Delay and validity models (scikit-learn, time-ordered holdout) feed the forecast bands and the collections queue; the copilot answers only from these stored records, with citations. |
Platform components
| Component | Technology |
|---|---|
| API + product UI | FastAPI (Python 3.12), single-file web UI, OpenAPI at /docs |
| Solvers | scipy.optimize.milp (HiGHS) + Rust kernel (optional, equivalence-tested) |
| Data | SQLite (WAL), database-per-tenant isolation; Postgres-compatible schema discipline |
| Tenancy + security | Hashed API keys (shown once), RBAC viewer / analyst / approver / admin, per-key rate limiting |
| Observability | Request IDs, structured JSON logs, Prometheus /metrics, /health and /ready gates |
| Packaging | Multi-stage Docker (Rust stage + slim runtime), non-root, $PORT-aware; deploys to Cloud Run or ECS |
Design rules that hold the system together
1. AI proposes, math decides. No LLM output can post cash; it can only propose fields that deterministic components verify.
2. Money is integer cents. No floats anywhere near a posting; residuals are exact, never rounding artefacts.
3. Every decision carries its derivation. If a number cannot be recomputed from records the product shows, it is not shown.
4. Exceptions are a workflow, not a failure. The tail is where analysts earn their keep, so it is designed first-class: counterfactuals, recommended actions, audit trail.
5. Policy is configuration. Thresholds that change behaviour live in tenant policy, versioned with each run - never buried in code.
Deployment topology - this exact demo
| Hop | What happens |
|---|---|
| Browser → AWS Application Load Balancer (HTTPS) | The single-file UI and the JSON API are served by the same container; the ALB terminates TLS on the *.ecs.ap-south-1.on.aws hostname. |
| ALB → ECS Express task (Fargate, 0.25 vCPU / 1 GB, ap-south-1) | Auto-scaling is capped at 3 tasks as a credit guard. The health-check path is /health; /ready gates traffic on the control database, data directory and models. |
| Container → per-tenant SQLite stores | One database file per tenant under the data directory (container-local in this demo posture, so data resets on redeploy and is re-seeded in one click; the schema discipline is Postgres-compatible for the production path). |
| CI: GitHub push → Actions → ECR → Update service | Every push to main builds the multi-stage image (Rust stage, slim non-root runtime) and pushes it to ECR; the service update rolls it out. Logs stream to CloudWatch; /metrics exposes Prometheus counters. |
Data model
| Table | What it holds |
|---|---|
| tenants / api_keys (control DB) | Tenant registry and SHA-256-hashed API keys with roles. Raw keys are shown once at issue and never stored. |
| invoices / payments (per tenant) | The canonical ledger and the staged payments of the active case - the shared workspace every view reads. |
| runs / run_steps / matches / exceptions | Every batch, its streamed step log, the solver's decisions with full derivations, and the payments the agent refused to settle alone. |
| audit_log | Append-only record of consequential actions: runs, approvals, policy changes, case loads. |
| aliases / column_mappings | Learned payer aliases and remembered CSV header mappings per source fingerprint - the transform layer's memory. |
| workspace_meta | The active case: its identity, source, staged expectations for grading, and any case policy override - the record that keeps every page on the same case. |
Scaling the solver
| Question | Answer |
|---|---|
| Why doesn't the MILP explode? | The solver never sees the ledger. Candidate resolution prunes each payment to a payer-scoped shortlist first (references, PO, alias, payer), so the NP-hard core runs on a handful of invoices per payment, not thousands. |
| Raw vs pruned | A 20-invoice pool has 2^20 (about a million) raw subsets; resolution typically prunes to under 10 candidates, and HiGHS branch-and-bound closes the rest. The Rust subset-sum kernel mirrors the same combinatorics for the fast path. |
| Latency evidence | Solver time is stored on every match; the Dashboard ribbon averages it for the latest run. The live run streams each payment's solve time as it happens. |
| Equivalence | The Rust kernel and the Python solver are proven identical on 203 shared cases; neither is trusted on its own say-so. |
Where AI plugs in - and where it never does
| Component | Role of AI |
|---|---|
| Remittance parser | Gemini extraction with schema-bound JSON when a server key is configured; deterministic extractor otherwise. Either way, a verifier checks every reference against the ledger before anything is trusted. |
| Copilot | Answers only from the product's own records, with citations. Questions outside the records are refused, not improvised. |
| Delay and validity models | Trained ML (holdout-graded) predicts payment timing and deduction validity; it informs forecasts and triage. It decides nothing about posting. |
| Solver and policy | No AI. Posting decisions are exact mathematics under policy. That separation - AI proposes, math decides - is the product's core safety property. |
| Current status | This deployment runs the deterministic parser: no Gemini key is configured on the server. Agent Health reports the live mode; adding the key switches extraction to Gemini with no other change. |
Product Thinking
Success criteria this product would contract on
| Criterion | Target | Where it is measured |
|---|---|---|
| Invoice-line touchless rate | Above 80% (top third of the market) | Dashboard impact panel, from stored runs |
| Median market band (Hackett 2025) | 70% auto-match is the market median - the line to beat | Shown beside our measured rate, never blended with it |
| Exception ageing | Every exception carries an owner action the day it appears | Run view exception panel + agent brief |
| Deduction net recovery | Dispute only when expected value is positive | Dispute desk, expected recovery per claim |
| Cost per remittance | Vendor claim for manual processing is up to $7.82 - automation must cost a fraction | Impact panel hours-returned estimate |
Product thesis
Cash application is a conservation problem with an information problem on top: every cent received must land somewhere auditable, but the evidence arrives as messy remittance text, short pays and silent deductions. Incumbent platforms advertise 85 to 99 percent auto-match, yet implementations run for months and the exception tail still eats the analyst day. The tail is the product opportunity.
AI proposes, math decides. Probabilistic components (LLM parsing, ML delay and validity models) extract and score; deterministic components (the MILP solver under a cash conservation equation, the policy engine, the expected-value dispute rule) make every posting decision. Anything unreconciled becomes a tracked exception with counterfactuals - never a silent write-off.
A pilot called the replay: send us your last 90 days of payments and open invoices as CSV. AutoCash replays them and shows, cent by cent, what would have auto-posted, what would have been disputed, and what your team touched that it should not have had to. Proof before platform.
Touchless cash rate at $0 residual. Supporting: match accuracy on labelled evaluations, residual dollars, exception ageing, dispute recovery value, solver latency.
Roadmap, honestly labelled. Live ERP write-back (SAP, Oracle, NetSuite), bank-file ingestion (BAI2, MT940, lockbox formats), persistent multi-tenant storage, and SOC 2 are the known table-stakes gaps for enterprise sale. This build covers the decision core those integrations feed: matching, deductions, forecast, collections, evaluation and audit.
Honesty labels. All data in this workspace is synthetic and labelled as such. Market figures quoted anywhere in this product are vendor claims used as context, never this product's results. Win probabilities in deduction intelligence are transparent heuristics, and the UI says so where they appear.