DEV Community

Tali Adler
Tali Adler

Posted on

The Close Starts With a Question: Building Source-Linked Accounting Workflows

The close starts with a question: building source-linked accounting workflows

Month-end close rarely breaks because someone cannot add two numbers. It breaks because a number arrives without enough context. A balance changed, a payment was matched, or an accrual was posted, and three days later nobody can answer a simple question: what evidence supports this?

That question is where accounting software and engineering software increasingly meet. The useful automation is not just a bot that creates journal entries. It is a workflow that keeps the source, decision, reviewer, and final output connected.

This article walks through that pattern using a common pain point: reconciling a high-volume account when the underlying transactions come from several systems.

The hidden cost of an unlinked reconciliation

Imagine a reconciliation ending with this row:

Account: Operating cash
Period: August 2026
Difference: $18,420.00
Status: Resolved
Enter fullscreen mode Exit fullscreen mode

The row looks finished, but it is not very useful. Resolved by whom? Which bank statement line was involved? Was the difference a timing item, a duplicate, or a manual adjustment? Is there a supporting document? Can another reviewer reproduce the conclusion?

When that context lives in email, spreadsheets, and chat, every review becomes archaeology. The team may still close on time, but the process gets slower and riskier each month.

A better design treats every material accounting decision as an object with a small audit trail:

{
  "account": "Operating cash",
  "period": "2026-08",
  "amount": 18420.00,
  "source_refs": ["bank:stmt-2026-08-31", "erp:batch-8841"],
  "proposed_reason": "Timing difference",
  "confidence": 0.87,
  "reviewer": null,
  "decision": "pending"
}
Enter fullscreen mode Exit fullscreen mode

The important fields are not fancy. They make the work inspectable.

A practical pattern: source, proposal, decision

The most useful workflow I have seen separates three stages.

1. Source

First, preserve the inputs exactly as received. Store the statement line, ledger transaction, invoice, payment record, or API response with a stable reference. Do not overwrite the original value when normalizing it. Keep both the raw representation and the fields used for matching.

This is the accounting equivalent of immutable event data. If a parser improves next month, you can reprocess the original input rather than trying to reconstruct it from a spreadsheet.

2. Proposal

Next, let rules or an AI-assisted process propose a match or explanation. A proposal should include the reasoning signals, not just a label. For example:

  • amount matches within a defined tolerance
  • transaction dates are within five business days
  • counterparty names normalize to the same vendor
  • a related invoice is already approved

A proposal is not a posting. That distinction matters. It gives the system permission to be helpful without giving it permission to silently change the books.

3. Decision

Finally, a person or an explicit policy makes the decision. Record who approved it, when, what changed, and which evidence they reviewed. If the proposal was rejected, preserve that rejection too. Negative decisions are valuable training data and valuable audit evidence.

This model also makes idempotency easier. A retry can safely regenerate a proposal because the decision is a separate state transition.

Where Portali fits

A feature spotlight for portali.tech is its source-linked way of organizing accounting work around the item that needs a decision, rather than around a collection of disconnected files. The practical benefit is small but important: a reviewer can move from a flagged transaction to the supporting context without asking someone to find an attachment or explain which spreadsheet tab is current.

That is especially useful for teams that have outgrown manual checklists but are not ready to replace every system of record. The accounting platform can remain the place where entries are posted. The workflow layer can make the path to that entry visible and reviewable.

The design principle is worth borrowing even if you build the tooling yourself: automate the gathering and comparison of evidence, but keep the accounting decision explicit.

Implementation details that prevent future pain

Use stable identifiers

Display names change. Vendor names are corrected. Bank descriptions are inconsistent. Match on stable source IDs whenever possible, and keep a human-readable label only for display.

Make transitions append-only

Instead of changing pending to approved with no history, append a decision event:

{
  "work_item": "recon-18420",
  "from": "pending",
  "to": "approved",
  "actor": "j.smith",
  "at": "2026-09-01T14:32:11Z",
  "note": "Bank settlement posted one day after period end"
}
Enter fullscreen mode Exit fullscreen mode

Append-only history is easier to audit and easier to debug than a single mutable status field.

Put limits around automation

Define thresholds before turning on auto-approval. For example, auto-match only when the amount, currency, source account, and counterparty all agree. Route anything outside that policy to review. An AI suggestion can improve prioritization, but it should not quietly expand the policy.

Measure review quality, not only speed

Track the percentage of items resolved without rework, the age of open exceptions, the number of proposals rejected, and the time from source arrival to approved decision. A faster close with more unexplained adjustments is not an improvement.

The payoff

Source-linked workflows change the close from a race to collect screenshots into a sequence of explainable decisions. Engineers get clear state transitions and retry behavior. Accountants get evidence in the place where the question is being answered. Managers get a better view of what is truly complete.

The best accounting automation is not the system that removes every human touch. It is the system that makes each remaining human touch focused, informed, and easy to verify.

Top comments (0)