The model layer
The model proposes. The platform verifies.
A private model on your own hardware turns plain language into semantic plans and categorization suggestions. It never posts an entry: core-api validates every plan, the engine computes the numbers, a human approves the postings.
Plain language in
Ask like a founder. Get the finished work.
Type the request the way you would ask your controller. The model plans against your governed vocabulary; the platform computes the figures and hands back the analysis, the scenario or the commentary — with the rows behind every number. Demo data.
Reads the request as a margin bridge, Q1 → Q2
Pulls revenue, COGS and landed cost by product line
Writes the analysis with the rows behind it
| Freight per unit | +$0.42 | −2.6 pts |
| Capsules mix | +9% of sales | −1.1 pts |
| Espresso price increase | +3% | +0.6 pts |
Most of the drop is inbound freight: two air shipments in May carried 38% of the quarter's landed cost.
Illustration with sample figures: the request and output shapes show what the model produces; the numbers are not a real company's.
In development · the finance-tuned model
Tuned on the work of finance, not the whole internet.
Today the gateway serves an open-weights general model, privately, on your hardware. Finanly's own finance-tuned model is in development on these four corpora and will drop into the same gateway — the plan-validate-execute contract around it does not change.
- 01
Ledgers & journals
Double-entry structure, postings, periods and closing entries — the grammar of a general ledger, not generic text.
- 02
Chart-of-accounts vocabulary
Account types, cost centers, supplier and customer groups, so 'freight' and 'inbound shipping' land on the same account.
- 03
Reconciliation patterns
Bank-to-ledger matches, payout decomposition, internal transfers, fees and refunds — how real books actually tie out.
- 04
Statements & reporting
Balance sheet, P&L, trial balance, cash flow and variance — how finance teams read, explain and present them.
What it produces
From one sentence to the work product.
Six things the model layer does today, each labelled with its key in the platform registry.
- 01
Analysis
Ask why a number moved; get the measures, the drivers and the rows behind them — from a governed plan.
ai_bi_query - 02
Scenario narrative
Run-rate, receivables and payables projected forward in plain words. A narrative over governed figures, not a certified forecasting engine.
ai_bi_query - 03
Report commentary
Commentary around statements and saved reports drafted in your format, every figure linked to the ledger.
bi_report_builder - 04
AI Match categorization
Three tiers: exact, then similarity against lines you approved, and the model only to disambiguate.
auto_categorizer - 05
Vendor enrichment
Bare bank descriptors become named counterparties through self-hosted web search. The model reads snippets, not your rows.
ai_vendor_enrichment - 06
Statement & compliance narrative
The model writes the narrative around numbers the deterministic engines already computed. It explains; it does not calculate.
compliance_reports
Most 'AI for finance' sends your ledger to someone else's model. Finanly does not: the model stays home.
How a request becomes an answer
Four steps. The model plans; the ledger answers.
Scroll through the pipeline. Every frame is the real shape of the data at that step.
1 · The request
You type in plain English on the Business Intelligence page. Suggestion chips cover the questions founders ask most; anything else is fair game.
2 · The model plans
The private model receives the request and the governed vocabulary — measure names, dimensions, your chart of accounts — and returns a semantic plan. Three tools stop it inventing accounts, fields or dates.
3 · core-api validates
Every measure, dimension and period is checked against the semantic registry: 26 cubes, 124 measures, 756 dimensions. Unknown fields fail closed. The tenant comes from your session, never from the model.
4 · The ledger answers
Cube executes the plan on the canonical store and returns rows, a chart and the number. Save it, schedule it every 15 minutes, or pin it to a dashboard.
AI Match
It learns from what you approve.
Categorization is three tiers, and the model is the last resort, not the first guess. Every accepted line becomes history the next two tiers match against — your ledger vocabulary, tenant by tenant.
The normalized description matches a line you categorized before. Amount-aware: if two histories match, the closest amount wins.
Weighted token similarity against your tenant's history, with an amount tie-break when two candidates are near-equal.
Only when tiers 1–2 are unsure: the description plus the top 5 candidates go to the Finanly model to disambiguate. It picks; it does not invent accounts.
Private by architecture
Runs on your hardware. Sees one tenant.
The model is served on your own machine behind an internal-only gateway. Each call carries a short-lived token bound to one company; nothing is sent to a public AI service.
What the model sees
- Your question, in plain English
- The governed vocabulary: measure and dimension names, your chart of accounts, supplier groups
- Up to 5 candidate categories from your own history (categorization only)
- A counterparty name and public web snippets (vendor enrichment only)
- A short-lived JWT scoped to one tenant
What it never sees
- Raw transaction rows, balances or invoices
- Any other company's data
- Database credentials or SQL
- The public internet as an inference endpoint — the model runs on your box
- Permission to post, export or delete anything
Model card
One model, built for one job.
What serves today, what is in development, what it takes in, what it produces — and where it runs.

- Serving today
- An open-weights language model, hosted privately on your hardware behind the internal gateway
- In development
- Finanly's own finance-tuned model (ledgers, chart-of-accounts vocabulary, reconciliation patterns, statements); drops into the same gateway
- Input
- Natural language — ask the way you would ask your controller — plus the governed vocabulary as tools
- Output
- Semantic plans (validated by core-api), categorization suggestions, narrative over computed figures
- Runtime
- Your own hardware; internal network only
- Reachability
- Called by core-api with a short-lived, tenant-scoped JWT
- Tools
- get_chart_of_accounts · get_cube_measures · resolve_period
- Web
- Self-hosted search for vendor enrichment lookups — search, not inference
Compared
Cloud AI bolted on vs a model layer you control.
Typical 'AI bookkeeping' feature
- Ledger rows sent to a public API
- Same model, every customer's data
- Confident answers with no plan to check
- AI can post, pay or delete
Finanly model layer
- Runs on your machine; internal-only gateway
- Tenant-scoped token on every call; RLS underneath
- Plan, rows and number returned together
- No irreversible action without a human
FAQ
Straight answers
Which model serves production today?
An open-weights general-purpose language model, hosted privately on your own hardware behind the internal gateway. We don't name vendors in marketing; ask us and we'll tell you exactly what runs. Finanly's own finance-tuned model is in development and will replace it behind the same gateway contract.
What can I ask it for?
Anything you would ask a controller, in plain language: why a number moved, a run-rate scenario in plain words, commentary on a statement, or help categorizing the month's transactions. Answers come from governed measures; the model supplies the plan and the words.
Does anything go to a public AI service?
No. Inference runs on your hardware. The only outbound calls are connector syncs (your bank, Shopify, Flexport…) and self-hosted web searches for vendor enrichment, which carry a counterparty name, not your ledger.
How does it avoid making numbers up?
It never reads the ledger directly. It returns a semantic plan; core-api validates every measure, dimension and period against the governed model, and Cube computes the figures. Unknown fields fail closed.
What happens when the model is wrong?
For analysis, a wrong plan fails validation and you get a refusal or a governed fallback (cash, AR, AP, balance sheet, P&L) instead of a wrong number. For categorization, a suggestion is a suggestion until a human accepts it, and every acceptance is undoable.
Can one company's data reach another?
No. Every call carries a short-lived token bound to one tenant, and Postgres row-level security enforces the same boundary underneath the application.
Does it work for Personal mode?
Yes. Personal mode has its own semantic tables (15) and endpoints (personal/bi/ask), isolated by tenant and product mode.
What does 65 / 86 mean?
We keep a catalogue of 86 questions founders actually ask (cash, AR/AP, margin, inventory, growth). 65 are answerable end-to-end today through the governed layer; the remaining 21 need cube measures that are scheduled, not promised.
Put a private model next to your ledger.
Private beta. Runs on your hardware or a VPS you control.
