Skip to content

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

  1. System NetSuite
  2. Step Generate tasks
  3. Step Model dependencies
  4. Step Pull data early
  5. Step Critical path
  6. 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. 1

    Tasks are generated from a template per entity and period

    With owners, dependencies and estimated durations, not a copied spreadsheet.

  2. 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. 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. 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. 5

    Reconciliations that ran all month are already done

    Only the exceptions arrive at close.

  6. 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. 1

    Set up and model the close as a graph

    A checklist cannot show you what is blocking.

    Headless skills build-workflow

    Use 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. 2

    Pull the data before anybody asks

    Most close delay is waiting on something a system could have sent.

    Headless skills build-workflow

    Use 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. 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. 4

    Reconcile all month, not at close

    A break found on day two of close was there for three weeks.

    Headless skills tray-gotchas

    Use 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. 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. 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

Coupa

Read open purchase orders and accruals, which are a common source of late adjustments.

Reads

Brex

Pull the card feed for the period so expense accruals are not waiting on a person.

Reads

Gusto

Pull the payroll file for the period, which is frequently the last input to arrive.

Reads

Slack

Publish the critical path daily and alert when the projected close date moves.

Writes

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)

Last reviewed September 2026.