What Breaks When Finance Gets Natural-Language Access

The pitch is irresistible. A finance analyst types a question, gets a number, and skips the two-week BI request. Every vendor has a version of it now. Databricks Genie, Snowflake Cortex, Claude for Financial Services, Copilot on top of whatever you already own.

Most of these pilots fail in the same four places, and none of them are the model.

It answers questions it should not

The first failure is access. A natural-language layer bolted onto a warehouse inherits whatever access the service account has, which is usually everything. An analyst in one region asks about margins and gets the global view, including the entities they are not cleared to see.

The fix is boring and non-negotiable: the user's entitlements are applied before the model sees the data, not after. Row and column level, enforced by the catalog, not by a prompt telling the model to behave. If the platform cannot do that, the pilot should not start.

It answers with a number nobody can trace

The second failure is lineage. The model returns a figure. Finance asks where it came from. The answer is a generated SQL statement over a table someone joined last quarter. That is not a source. That is a guess with a decimal point.

Every answer needs to resolve to an approved view: a curated table finance has already signed off on, with a name, an owner, and a reconciliation status. The model is allowed to query those and only those. If a question cannot be answered from an approved view, the right response is to say so, not to improvise.

It cannot be challenged

The third failure is the interface. The number appears in a chat bubble with nothing around it. The user cannot see the filters applied, the period, the entity scope, or the supporting rows. They either trust it or they do not, and a finance person who cannot inspect a number will not trust it. Correctly.

The answer has to arrive with its context: the view it came from, the filters, and a path to the detail. Then the user can challenge it, and the challenge is itself useful signal about which questions need a verified answer instead of a fresh generation.

It drifts

The fourth failure is time. The pilot works in month one. In month four, someone renames a column, the curated view changes shape, and the model starts answering confidently over the wrong field. Nobody notices for a while because the interface still looks fine.

Recurring questions need verified answers: a fixed set of questions finance asks every cycle, with the query reviewed and locked, so the model retrieves rather than regenerates. Everything else gets logged, question, view, user, and result, so a reviewer can audit a month of answers the way they would audit a month of journal entries.

The order that works

Curate the views first. Apply access at the catalog. Put the natural-language layer on top, restricted to the curated views. Show source and filters with every answer. Log everything. Add verified answers for the recurring questions.

Teams that do it in this order ship something finance uses. Teams that start with the model ship a demo.