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
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"
}
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"
}
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)