Automation · Finance
How to build financial close automation
Close takes nine days and nobody can say which task is holding it up. The shape of a close that shows its own critical path, the prompts that build it, and the production detail that decides whether it holds.
Built with Tray Headless
- System NetSuite
- Step Generate tasks
- Step Model dependencies
- Step Pull data early
- Step Critical path
- System Slack
Tasks carry dependencies rather than dates, so the critical path is computed rather than guessed at in a stand-up.
The short answer
What is financial close automation?
Four things make up financial close automation: tasks modelled as a dependency graph instead of a flat checklist, source data pulled before anybody asks for it, a computed critical path instead of a completion percentage, and reconciliations that run continuously rather than at close. Teams usually come unstuck on the checklist. A list of ninety tasks at 60% complete tells nobody whether close is on track, because the two tasks blocking everything else look identical to the eighty that block nothing.
What matters here
- Model dependencies, not a checklist. A percentage complete hides which task is actually blocking the close.
- Pull source data before it is asked for. Most close delay is waiting for a file somebody has to be chased for.
- Show the critical path. Two tasks usually decide the close date and eighty do not.
- Reconcile continuously through the month. A break found on day two of close was there for three weeks.
- Measure days to close and where they went, not tasks completed.
Who this is for
You run financial systems or the close. Nine days, a spreadsheet of tasks, and a daily stand-up to work out what is blocking what.
How it works in practice
What has to happen between period end and the books being closed.
- 1
Tasks are generated from a template per entity and period
With owners, dependencies and estimated durations, not a copied spreadsheet.
- 2
Source data is pulled before it is requested
Bank statements, subledger extracts, payroll files, and anything from a system instead of a person.
- 3
Dependencies decide the order, not the list
A task is available when its predecessors are done, and unavailable tasks are hidden rather than shown as pending.
- 4
The critical path is computed and published
So the daily question of what is blocking us is a screen instead of a meeting.
- 5
Reconciliations that ran all month are already done
Only the exceptions arrive at close.
- 6
Time is measured per task and per path
So next period improves the thing that actually cost days.
What close automation is made of
Four parts, though the first is what turns a list into a plan.
A dependency graph
Tasks with predecessors and durations. A flat checklist cannot tell you that two of ninety tasks decide the close date.
Data pulled early
Statements, extracts and files fetched automatically. Most close delay is waiting on something a system could have provided.
A computed critical path
The chain that determines the finish date, republished as things complete. Percentage complete is a comfort metric.
Continuous reconciliation
Running all month so close inherits exceptions rather than starting them. A break found at close was there for weeks.
The Tray Headless prompts
Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.
Once per project, run
/tray-workflows:set-workspace
to pick the workspace these build in. Point it at a sandbox first.
- 1
Set up and model the close as a graph
A checklist cannot show you what is blocking.
Headless skills
build-workflowUse build-workflow. The systems in play are NetSuite, or whatever we run in those seats. Build the close as a dependency graph rather than a checklist. Each task carries: name, owner, entity, estimated duration, predecessors, and whether it is automated or manual. Generate the tasks per entity per period from a template instead of copying last month's spreadsheet. The dependencies are the point. A flat list of ninety tasks at sixty percent complete tells nobody whether close is on track, because the two tasks blocking everything look exactly like the eighty that block nothing.
Getting the durations roughly right matters less than getting the dependencies right. The graph shape drives everything.
- 2
Pull the data before anybody asks
Most close delay is waiting on something a system could have sent.
Headless skills
build-workflowUse build-workflow. Before close opens, fetch everything that comes from a system rather than a person: Bank statements for every account Subledger extracts: AR, AP, fixed assets, inventory Payroll files for the period Expense and card feeds Revenue data from the billing system FX rates for the close date, from the agreed source Have all of it staged and validated before day one. Chasing a file is the most common single reason a close task starts late, and every one of these can be fetched instead of requested. Validate on arrival: expected file, expected period, expected format. A bank statement for the wrong month is better caught on arrival than during a reconciliation.
- 3
Compute the critical path and publish it
Two tasks decide the close date and eighty do not.
Compute the critical path through the dependency graph and republish it as tasks complete. Show, on one screen: which tasks are on the critical path right now, who owns each, how long each has been open, and the projected close date if nothing changes. Hide tasks that are not yet available. Showing somebody a task they cannot start is noise, and a list where most items are blocked trains people to ignore the list. That screen replaces the daily stand-up question. What is blocking us should be a glance instead of a meeting, and the projected date moving should be an alert, not a discovery.
- 4
Reconcile all month, not at close
A break found on day two of close was there for three weeks.
Headless skills
tray-gotchasUse tray-gotchas, then run reconciliations continuously through the period, not as close tasks: Bank to ledger, daily Subledger to general ledger, daily Intercompany balances, weekly, because those take longest to resolve and involve two teams Suspense and clearing accounts, weekly Alert on a break when it appears, not when close begins. A break found on day two of close has been there for three weeks and the person who caused it has forgotten. Then close inherits a list of known exceptions instead of discovering them, and the reconciliation tasks become a review rather than an investigation.
- 5
Measure where the days actually went
Tasks completed is a comfort metric.
Record start and finish per task, and which tasks were on the critical path each period. Report: days to close, trended; time on the critical path by task; tasks that were late and why; how often the same task is the blocker; and time spent waiting for data against time spent doing work. That last split is the one that tells you what to automate next. If half the close is waiting, the fix is upstream instead of in the close itself. Do not report tasks completed or percentage complete. Both rise steadily regardless of whether the close is on track.
- 6
Validate, then hand the template to finance
Because the close changes with every entity and system.
Run the per-step schema checks and the whole-workflow audit before this touches production. Run it alongside the existing close for one period, computing the critical path without anybody relying on it, and compare against what actually blocked. Then open the same workflow in Tray Build so the finance systems team can maintain the task template, the dependencies and the data pulls in the visual canvas.
What it connects to
Close pulls from every financial system and has to tell people what is blocking.
NetSuite
Read the ledger, subledgers and trial balance, and write close task status back where finance already looks.
Reads and writes
Brex
Pull the card feed for the period so expense accruals are not waiting on a person.
Reads
Google Drive
Collect supporting schedules and evidence against each task, which is what an auditor asks for.
Reads and writes
Snowflake
Land task timings and reconciliation breaks, so days to close is decomposable instead of a single number.
Writes
Same build, other stacks
The design does not change if you run something else in one of these seats. The same prompts build it against SAP S/4HANA, Google BigQuery, Microsoft Teams, SharePoint, Oracle or Databricks.
Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.
Running it in production
This runs on a deadline every period and produces the numbers the company reports.
This runs as infrastructure, not as a script
Data pulls, continuous reconciliation and critical path recomputation run on the period calendar, including over a weekend when period end falls on one.
Every task carries its evidence
What was done, by whom, when, with the supporting schedule attached. That set is what an auditor asks for and what usually takes a week to assemble.
Credentials are managed, never written into the build
Read access across every financial system plus bank statement retrieval. Each is an authentication in your workspace, scoped and separately rotatable.
Finance systems own the template
Tasks, dependencies and data pulls open in Tray Build, because the close changes with every new entity, system or reporting requirement.
Run it alongside for one period
Computing the critical path while nobody relies on it, compared against what actually blocked. The graph is always wrong the first time.
Questions people ask
Why a dependency graph instead of a checklist?
Because ninety tasks at sixty percent complete tells nobody whether close is on track. Two tasks usually decide the close date, and on a flat list they look identical to the eighty that block nothing.
Why pull data before close opens?
Because chasing a file is the single most common reason a close task starts late, and almost everything needed can be fetched from a system instead of requested from a person.
Why reconcile continuously?
Because a break discovered on day two of close has been there for three weeks and whoever caused it has forgotten. Close should inherit known exceptions, not start discovering them.
What should a close programme measure?
Days to close and where they went, split between waiting for data and doing work. If half the close is waiting, the fix is upstream instead of in the close itself.
Why hide unavailable tasks?
Because showing somebody a task they cannot start is noise, and a list where most items are blocked trains people to stop reading the list.
Vibe-coding app guides
Vibe-code an entire app with Helix
This moves the data between systems. It does not give anybody a screen to work in. Build that app in Claude Code, Codex or Cursor, then deploy and run it governed on Tray Helix. Same kind of guide, same kind of prompts.
How to build a budget vs actuals tracker (opens helix.tray.ai in a new tab)
Related guides
Finance
How to build bank reconciliation automation
Match on rules that learn, keep the unmatched visible and ageing, and never write a plug. The Headless prompts that build it.
Finance
How to build AP invoice processing
Take invoices from wherever they arrive, extract and verify instead of trust, match against the order, and never pay the same one twice. The prompts that build it.
Finance
How to build a revenue recognition feed
Carry performance obligations instead of invoice totals, keep the allocation reconstructable, and reconcile bookings to revenue every period. The prompts.
Last reviewed September 2026.