Francisco Meyo is Controller at Abridge, where he is building AI and data workflows across accounting, revenue and the company’s data warehouse. He has a master’s in data science and previously spent several years at PwC, where he developed much of his background working with data.
“The powerful part shows up when you stop asking the model to do the whole job and pair it with deterministic code instead.”
A lot of the work I’ve automated was never especially difficult. It just needed somebody to sit there and do it.
I’ve found it more useful to separate the parts of a workflow that require judgment from the parts that should produce the same result every time. The model can handle the first part, while deterministic code takes over once the inputs are known.
Lease accounting is a good example.1
Separate contract interpretation from the calculation
The traditional process starts with reading a lease and pulling out the payment schedule, free-rent periods, tenant improvement credits and renewal options. Then you get an incremental borrowing rate, discount the payments to present value, build the schedule, roll the liability and asset forward and create the journal entry in NetSuite.
“None of that second half needs a person. It needs a spreadsheet formula, executed correctly, every time. The only part that ever actually needed judgment was the first part — reading the contract.”
Every lease contains roughly the same information, but the language varies from one contract to another. Tenant improvement credits, for example, can appear under different names and aren’t necessarily sitting under a field labeled “allowance.”
I use Claude to read the PDF and return structured data with a citation for every figure it extracts, so whoever reviews it can trace a number back to the page and language it came from.
Before that data reaches the lease schedule, we run deterministic checks against it. If the contract gives us a total base-rent figure, for example, the monthly payments Claude extracted have to reconcile back to that total.
“Missing data comes back as null, never a guessed 0, so a silent gap is visible instead of absorbed.”
If something doesn’t reconcile, the workflow stops rather than carrying the error into the schedule.
Once the data passes those checks, the schedule is stored in a database rather than a spreadsheet, where changes can be tracked over time.
“A schedule that only exists in a spreadsheet is one accidental keystroke away from being wrong forever, with no record of what changed or when.”
From there, the monthly journal entries are generated and posted into NetSuite. That part of the workflow can run during close without reading the lease or calling the model again.
Curate the data before you query it
The work around our data warehouse has probably had the widest impact because it extends beyond finance.
We’ve centralized data from systems across the business in Snowflake and put a semantic layer on top of it so finance and other teams can query that information in plain English.
Instead of dumping full tables into Snowflake, I prefer to curate the data as it comes in: organize it around how the business actually uses it, give fields understandable names and clean up the structure before it reaches the warehouse.
“A simple rule: if a human analyst wouldn’t understand a column name, your AI won’t either.”2
We also preserve the relationships between systems. At Abridge, for example, Salesforce accounts are connected to their corresponding NetSuite records using an ID rather than trying to match customers by name.
The data itself also doesn’t tell a model what Abridge means by revenue or ARR.
“A semantic model is simply a translation layer between your tables and your business.”2
We define those metrics in the semantic layer so different versions of the same question map back to the same definition. If someone asks for ARR by customer, Claude knows which metric and underlying data that question should use.
Once that foundation is in place, Claude can connect to Snowflake and we can ask questions in plain English.
“You stop building dashboards as the primary way to access data. Instead, your data becomes conversational.”
The questions I care about often cross systems: payroll per engineer relative to ARR, the percentage of revenue being driven by AI inference costs or which departments are driving OpEx growth.
Those questions have historically been difficult to answer because the information needed to answer them lives in different systems.
“These aren’t edge cases — they’re the questions that matter. And they’re impossible to answer if your data remains siloed.”
Building a revenue review agent
I’m taking the same approach with an agent I’m building around revenue.
The workflow starts in Salesforce, where the agent finds Closed Won opportunities that haven’t been reviewed and lists them for finance. It uses an ID to find the corresponding contract in Ironclad, downloads the PDF and classifies the opportunity as an initial contract, pilot, expansion or churn.
That classification determines how the opportunity should be treated in NetSuite.
Eventually, I want the agent to combine the Salesforce data with what it extracts from the contract and update billing, with the workflow ultimately writing back into NetSuite.
We’re not there yet. Right now, we’re still working on the extraction stage, using previous contracts to tune the prompt and reviewing the data hygiene in Salesforce before the agent starts taking action downstream.
Buy first and build second
My default is to see whether somebody has already solved the workflow and buy first. Building comes second.
I had a head start because of my background in data science and the work I did with data at PwC. More recently, I’ve been learning Claude Code by using it against the finance problems I was already trying to solve.
“If your data is messy, AI amplifies the confusion. If your data is curated but lacks a semantic layer, AI guesses. But if both are in place, AI becomes a force multiplier.”2
Sources
- Agentic workflows: a case in automating end-to-end lease accounting.
- Query in plain English: curate your Snowflake data warehouse. (opens in new tab)



