<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tali Adler</title>
    <description>The latest articles on DEV Community by Tali Adler (@tali_from_portali).</description>
    <link>https://dev.to/tali_from_portali</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4114360%2F3f3da069-178f-4b41-a0e8-55d6035e593c.jpg</url>
      <title>DEV Community: Tali Adler</title>
      <link>https://dev.to/tali_from_portali</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tali_from_portali"/>
    <language>en</language>
    <item>
      <title>The Automation Gap Is a Finance Workflow Problem, Not a Spreadsheet Problem</title>
      <dc:creator>Tali Adler</dc:creator>
      <pubDate>Sat, 19 Sep 2026 03:02:23 +0000</pubDate>
      <link>https://dev.to/tali_from_portali/the-automation-gap-is-a-finance-workflow-problem-not-a-spreadsheet-problem-55n6</link>
      <guid>https://dev.to/tali_from_portali/the-automation-gap-is-a-finance-workflow-problem-not-a-spreadsheet-problem-55n6</guid>
      <description>&lt;p&gt;Recent fintech research has put a useful number on an old frustration: UK businesses are still losing several days a month to manual finance administration. The headline is easy to interpret as a spreadsheet indictment. In practice, spreadsheets are rarely the root cause. The deeper problem is that finance work is a chain of handoffs, exceptions, approvals, and evidence checks that no single system models well.&lt;/p&gt;

&lt;p&gt;That distinction matters to engineers building financial products. Replacing a spreadsheet with a dashboard does not remove the work. It often just moves the same reconciliation, chasing, and review tasks into a prettier interface. The better target is the workflow around the number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden cost is coordination
&lt;/h2&gt;

&lt;p&gt;Consider a routine supplier payment review. Someone downloads a bank statement, someone else checks an invoice, a third person asks whether the purchase was approved, and a manager reviews an exception in a chat thread. The final accounting entry may take seconds. The surrounding coordination can consume hours.&lt;/p&gt;

&lt;p&gt;This is why “automation rate” is a weak metric on its own. A process can automatically import 98% of transactions and still feel manual if the remaining 2% are ambiguous, high-value, or impossible to explain later. Those cases create queues, duplicate questions, and last-minute close pressure.&lt;/p&gt;

&lt;p&gt;A useful finance workflow should answer four questions for every material decision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What source records were considered?&lt;/li&gt;
&lt;li&gt;What rule or model produced the proposal?&lt;/li&gt;
&lt;li&gt;Who reviewed or changed it?&lt;/li&gt;
&lt;li&gt;What should happen if the same event arrives again?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The fourth question is the engineering detail that gets missed most often. Financial integrations retry. Webhooks arrive out of order. A bank feed may restate a transaction. Without idempotency and a stable event identity, “automation” can create duplicate work or duplicate entries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the exception path first
&lt;/h2&gt;

&lt;p&gt;A common implementation pattern is to optimize the happy path and add an exception screen later. For finance, reverse that order. Start by defining what an operator needs when the system is uncertain.&lt;/p&gt;

&lt;p&gt;An exception record might contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bank_2026_09_19_004821"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1840.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GBP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"candidate_account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software_expense"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bank:004821"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invoice:INV-8821"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Vendor changed legal name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"needs_review"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important fields are not decorative metadata. &lt;code&gt;event_id&lt;/code&gt; supports deduplication. &lt;code&gt;evidence&lt;/code&gt; lets a reviewer inspect the underlying facts. &lt;code&gt;reason&lt;/code&gt; tells the next person why the system stopped. &lt;code&gt;state&lt;/code&gt; makes ownership and queue behavior explicit.&lt;/p&gt;

&lt;p&gt;A reviewer should be able to accept the proposal, edit it, reject it, or request more evidence. Each action should append an event rather than silently overwrite history. That gives the finance team a usable audit trail and gives engineers a reproducible way to debug production behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep automation proposals separate from accounting decisions
&lt;/h2&gt;

&lt;p&gt;AI and rules engines are good at producing candidates. They are less useful when their suggestions are treated as invisible truth. A practical architecture separates three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Observed facts:&lt;/strong&gt; imported transactions, invoices, contracts, and timestamps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proposed interpretation:&lt;/strong&gt; a suggested match, category, accrual, or anomaly flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accepted decision:&lt;/strong&gt; the reviewed result that affects the ledger or reporting output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation makes it possible to improve a model without rewriting the company’s history. It also lets a controller ask a precise question: “What did the system suggest on Tuesday, and why did we override it?”&lt;/p&gt;

&lt;p&gt;Products such as Portali are interesting in this context because the valuable feature is not merely importing finance data. The useful capability is tying a proposed action to its source evidence and its review state, so an operator can move from “something needs attention” to “here is the decision and why it is safe.” That is a workflow improvement, not a sales promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure minutes returned to the team
&lt;/h2&gt;

&lt;p&gt;If a finance automation project is working, measure more than straight-through processing. Track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;median time from exception creation to resolution&lt;/li&gt;
&lt;li&gt;percentage of exceptions with complete source evidence&lt;/li&gt;
&lt;li&gt;duplicate events prevented by idempotency&lt;/li&gt;
&lt;li&gt;number of follow-up messages per close item&lt;/li&gt;
&lt;li&gt;percentage of accepted proposals later reversed&lt;/li&gt;
&lt;li&gt;time spent preparing explanations for reviewers or auditors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics expose whether the system is actually reducing coordination. A lower message count and faster exception resolution may be more valuable than another percentage point of automatic categorization.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;p&gt;The current automation gap is not proof that finance teams need one more generic dashboard. It is evidence that financial work needs better representations of uncertainty, ownership, evidence, and decisions.&lt;/p&gt;

&lt;p&gt;For engineers, that means treating the exception queue as a first-class product surface, designing for retries from day one, and preserving the difference between a machine proposal and a human-approved accounting outcome. For finance teams, it means asking vendors to demonstrate the review path, not just the import flow.&lt;/p&gt;

&lt;p&gt;The spreadsheet is often where the symptoms become visible. The real opportunity is to build a system where every important number has a source, every uncertain interpretation has an owner, and every decision can be explained without reconstructing a week of chat history.&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>accounting</category>
      <category>automation</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Better Month-End Starts With Evidence, Not More Checklists</title>
      <dc:creator>Tali Adler</dc:creator>
      <pubDate>Fri, 18 Sep 2026 23:01:34 +0000</pubDate>
      <link>https://dev.to/tali_from_portali/a-better-month-end-starts-with-evidence-not-more-checklists-3d91</link>
      <guid>https://dev.to/tali_from_portali/a-better-month-end-starts-with-evidence-not-more-checklists-3d91</guid>
      <description>&lt;h1&gt;
  
  
  A Better Month-End Starts With Evidence, Not More Checklists
&lt;/h1&gt;

&lt;p&gt;Month-end close rarely breaks because a team forgot that reconciliation exists. It breaks because the team cannot answer a smaller, more important question quickly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What evidence supports this number, and what decision did we make about it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question is where accounting practice, workflow design, and product engineering meet. A close process can have a hundred checklist items and still leave reviewers hunting through email, spreadsheets, exports, and chat threads. The problem is not a lack of tasks. It is a lack of context attached to each task.&lt;/p&gt;

&lt;p&gt;This article walks through a practical pattern for building an evidence-first close workflow. The example is a recurring bank reconciliation, but the same design works for accruals, prepaid expenses, revenue cutoffs, and intercompany balances.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checklist is not the unit of work
&lt;/h2&gt;

&lt;p&gt;A typical close checklist might say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reconcile operating account&lt;/li&gt;
&lt;li&gt;Review outstanding items&lt;/li&gt;
&lt;li&gt;Post adjusting entries&lt;/li&gt;
&lt;li&gt;Obtain approval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are useful milestones, but they are poor data structures. They do not tell the next person which statement was used, which period was covered, why an item was left open, or whether the proposed journal entry is still valid.&lt;/p&gt;

&lt;p&gt;A more useful unit is an &lt;strong&gt;accounting decision&lt;/strong&gt; with four parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scope:&lt;/strong&gt; account, entity, and period.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence:&lt;/strong&gt; the source document, transaction set, or report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decision:&lt;/strong&gt; cleared, accrued, reclassified, deferred, or left open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reason:&lt;/strong&gt; a short explanation that another reviewer can understand.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once those fields exist, the checklist becomes a view over structured work instead of the place where all context goes to disappear.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete workflow for one reconciliation
&lt;/h2&gt;

&lt;p&gt;Suppose the bank statement shows a $12,400 difference from the general ledger. An evidence-first workflow should not jump directly to “investigate variance.” It should create a review item containing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1010 Operating Cash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"difference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bank_statement_2026_08.pdf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gl_detail_2026_08.csv"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proposed_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system can then group likely causes: deposits in transit, outstanding checks, bank fees, timing differences, or coding errors. Automation is helpful here, but it should produce a proposal, not pretend that a pattern match is an accounting conclusion.&lt;/p&gt;

&lt;p&gt;A reviewer might accept a $9,800 deposit in transit, identify a $2,400 bank fee, and reject a suggested reclassification for the remaining $200. Each outcome should remain attached to the same evidence bundle. That gives the close a durable trail: what was observed, what was proposed, what changed, and who accepted the decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the exception path first
&lt;/h2&gt;

&lt;p&gt;The happy path is easy to demo. The exception path is what determines whether a finance workflow earns trust.&lt;/p&gt;

&lt;p&gt;For every automated suggestion, define at least three outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accept:&lt;/strong&gt; the evidence is sufficient and the proposed treatment is correct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edit:&lt;/strong&gt; the suggestion is useful, but an amount, account, or explanation needs changing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reject and explain:&lt;/strong&gt; the suggestion is not appropriate, with a reason that improves future review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is more useful than a binary approved/rejected flag. It also makes metrics meaningful. You can measure how often proposals are accepted unchanged, how often they need edits, and which source types create the most review work. Those measurements tell you where to improve mappings and controls.&lt;/p&gt;

&lt;p&gt;In a tool such as portali.tech, the valuable feature is not simply that a document can be uploaded or a task can be assigned. It is the connection between source evidence, proposed treatment, and explicit human review. That connection reduces the time spent reconstructing history when a controller asks, “Why did we book this?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep automation idempotent
&lt;/h2&gt;

&lt;p&gt;Close workflows are often rerun. A bank feed may refresh, a file may be uploaded twice, or a reviewer may reopen a period after a correction. If each run creates a new journal proposal, the system quickly becomes noisy and unsafe.&lt;/p&gt;

&lt;p&gt;Use a stable key for each proposed item, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;company + account + period + source_transaction_id + rule_version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On rerun:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;update an existing open proposal when the source is unchanged;&lt;/li&gt;
&lt;li&gt;create a new revision when the source or rule version changes;&lt;/li&gt;
&lt;li&gt;never silently overwrite an accepted decision;&lt;/li&gt;
&lt;li&gt;preserve the previous explanation when a new reviewer takes over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is ordinary application engineering, but it has an accounting consequence: reproducibility. A reviewer should be able to see why the system showed a different proposal yesterday without guessing which process ran in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the review queue useful
&lt;/h2&gt;

&lt;p&gt;A queue sorted only by creation time is not a close workflow. Prioritize by risk and aging. A simple score can combine materiality, days outstanding, account sensitivity, and confidence in the proposed match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;priority = materiality_weight
         + aging_weight
         + sensitivity_weight
         - confidence_weight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact formula is less important than making it visible and adjustable. A $200 item in a high-risk revenue account may deserve attention before a $5,000 routine timing difference in cash.&lt;/p&gt;

&lt;p&gt;The queue should also show the reviewer what they need without another search: the evidence links, the proposed entry, the matching transactions, prior decisions for similar items, and the next action. Good workflow design removes navigation, not judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  A close that can explain itself
&lt;/h2&gt;

&lt;p&gt;The strongest month-end process is not the one with the most automation. It is the one that can explain each material number with less manual archaeology.&lt;/p&gt;

&lt;p&gt;Start small: choose one account, capture the evidence and decision fields, add accept/edit/reject outcomes, and make reruns safe. Then measure review time and recurring exception types before expanding to another account.&lt;/p&gt;

&lt;p&gt;Checklists still matter. They tell the team what should happen. Evidence-linked decisions tell the team what actually happened. That distinction is the difference between a close that merely reaches a deadline and a close that remains understandable after the people who performed it have moved on.&lt;/p&gt;

</description>
      <category>accounting</category>
      <category>automation</category>
      <category>fintech</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Close Starts With a Question: Building Source-Linked Accounting Workflows</title>
      <dc:creator>Tali Adler</dc:creator>
      <pubDate>Fri, 18 Sep 2026 21:05:27 +0000</pubDate>
      <link>https://dev.to/tali_from_portali/the-close-starts-with-a-question-building-source-linked-accounting-workflows-13f0</link>
      <guid>https://dev.to/tali_from_portali/the-close-starts-with-a-question-building-source-linked-accounting-workflows-13f0</guid>
      <description>&lt;h1&gt;
  
  
  The close starts with a question: building source-linked accounting workflows
&lt;/h1&gt;

&lt;p&gt;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: &lt;strong&gt;what evidence supports this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The hidden cost of an unlinked reconciliation
&lt;/h2&gt;

&lt;p&gt;Imagine a reconciliation ending with this row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Account: Operating cash
Period: August 2026
Difference: $18,420.00
Status: Resolved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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?&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;A better design treats every material accounting decision as an object with a small audit trail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Operating cash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"period"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18420.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_refs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bank:stmt-2026-08-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"erp:batch-8841"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proposed_reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Timing difference"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important fields are not fancy. They make the work inspectable.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical pattern: source, proposal, decision
&lt;/h2&gt;

&lt;p&gt;The most useful workflow I have seen separates three stages.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Source
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Proposal
&lt;/h3&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;amount matches within a defined tolerance&lt;/li&gt;
&lt;li&gt;transaction dates are within five business days&lt;/li&gt;
&lt;li&gt;counterparty names normalize to the same vendor&lt;/li&gt;
&lt;li&gt;a related invoice is already approved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Decision
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;This model also makes idempotency easier. A retry can safely regenerate a proposal because the decision is a separate state transition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Portali fits
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation details that prevent future pain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use stable identifiers
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make transitions append-only
&lt;/h3&gt;

&lt;p&gt;Instead of changing &lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;approved&lt;/code&gt; with no history, append a decision event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"work_item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recon-18420"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approved"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"actor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"j.smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-01T14:32:11Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bank settlement posted one day after period end"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Append-only history is easier to audit and easier to debug than a single mutable status field.&lt;/p&gt;

&lt;h3&gt;
  
  
  Put limits around automation
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measure review quality, not only speed
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payoff
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>accounting</category>
      <category>automation</category>
      <category>fintech</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Fed Just Moved Rates. Your Finance Automation Needs a Better Event Model.</title>
      <dc:creator>Tali Adler</dc:creator>
      <pubDate>Fri, 18 Sep 2026 19:01:00 +0000</pubDate>
      <link>https://dev.to/tali_from_portali/the-fed-just-moved-rates-your-finance-automation-needs-a-better-event-model-4f5f</link>
      <guid>https://dev.to/tali_from_portali/the-fed-just-moved-rates-your-finance-automation-needs-a-better-event-model-4f5f</guid>
      <description>&lt;h1&gt;
  
  
  The Fed Just Moved Rates. Your Finance Automation Needs a Better Event Model.
&lt;/h1&gt;

&lt;p&gt;A rate decision is usually discussed as a macroeconomic event: the central bank changes its target range, markets reprice, and businesses revisit forecasts.&lt;/p&gt;

&lt;p&gt;For finance and accounting systems, it is also an operational event.&lt;/p&gt;

&lt;p&gt;On September 16, 2026, the Federal Reserve raised its benchmark target range by 25 basis points to 3.75%–4%, according to reporting from CNBC. The interesting engineering question is not whether a company should predict the next move. It is how software should turn a public rate change into a controlled, reviewable set of accounting and finance actions.&lt;/p&gt;

&lt;p&gt;That distinction matters. A spreadsheet can absorb a new assumption in seconds. A production finance workflow has to answer harder questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which instruments and schedules are actually affected?&lt;/li&gt;
&lt;li&gt;Which rate source was used, and when was it retrieved?&lt;/li&gt;
&lt;li&gt;Is the new value an observed fact, an approved assumption, or a forecast?&lt;/li&gt;
&lt;li&gt;Which journal entries, disclosures, and cash forecasts need review?&lt;/li&gt;
&lt;li&gt;Can another person reconstruct the decision three months later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where event-driven design meets accounting discipline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat the announcement as an immutable event
&lt;/h2&gt;

&lt;p&gt;The first mistake is overwriting a setting such as &lt;code&gt;base_rate = 4.00&lt;/code&gt;. That destroys context. Instead, store the announcement as an immutable event with enough metadata to reproduce the calculation.&lt;/p&gt;

&lt;p&gt;A minimal event might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"central_bank_rate_decision"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"effective_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"announced_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-16T18:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target_lower_bound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target_upper_bound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"percent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.federalreserve.gov/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_retrieved_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-18T08:15:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The event is a fact. A company’s selected discount rate, borrowing forecast, or cash-planning assumption is a separate object derived from that fact. Keeping those layers separate prevents an automation from presenting a judgment call as if it came directly from the Fed.&lt;/p&gt;

&lt;p&gt;It also makes corrections safer. If the source parser was wrong, you can invalidate or supersede one event without rewriting every downstream record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a dependency graph, not a giant “recalculate” button
&lt;/h2&gt;

&lt;p&gt;A rate change rarely affects everything. It affects specific contracts, accounts, models, and reporting outputs.&lt;/p&gt;

&lt;p&gt;Model those relationships explicitly. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rate decision
  -&amp;gt; variable-rate credit facility
      -&amp;gt; next interest accrual
      -&amp;gt; cash forecast
      -&amp;gt; covenant dashboard
  -&amp;gt; lease or valuation model
      -&amp;gt; discount-rate review task
  -&amp;gt; treasury report
      -&amp;gt; management commentary draft
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each edge should carry a rule and an owner. A variable-rate loan may be eligible for automatic recalculation because its contract says SOFR plus a fixed spread. A valuation model may only create a review task because the discount rate is a policy decision, not a mechanical pass-through.&lt;/p&gt;

&lt;p&gt;This design gives you a useful middle ground between manual work and reckless automation: calculate what is deterministic, route what requires judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate calculation from approval
&lt;/h2&gt;

&lt;p&gt;A reliable workflow should produce a proposed result before it posts anything consequential.&lt;/p&gt;

&lt;p&gt;For an interest accrual, the calculation service can produce:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;principal: 2,000,000
spread: 2.25%
reference rate: 4.00%
annualized rate: 6.25%
days in period: 30
proposed interest: 10,274.00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The approval layer then checks the contract, day-count convention, effective date, and materiality threshold. If the result passes policy, it can be posted automatically. If not, the system creates an exception with the inputs attached.&lt;/p&gt;

&lt;p&gt;This is more than a control requirement. It is a debugging strategy. When finance users question a number, they need the exact inputs and rule version that produced it, not a black-box statement that “the system recalculated.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Make freshness and provenance visible
&lt;/h2&gt;

&lt;p&gt;Public financial data has a lifecycle. A source may publish a decision, revise a page, or expose the same number through several feeds. Your workflow should record:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The canonical source URL.&lt;/li&gt;
&lt;li&gt;Retrieval timestamp.&lt;/li&gt;
&lt;li&gt;Effective timestamp.&lt;/li&gt;
&lt;li&gt;Parser or connector version.&lt;/li&gt;
&lt;li&gt;Normalized value and original text.&lt;/li&gt;
&lt;li&gt;The downstream jobs triggered by the event.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A small provenance record can prevent a large reconciliation problem. It also lets an engineer distinguish a stale input from a broken calculation.&lt;/p&gt;

&lt;p&gt;When you display the result, show freshness next to the number. “4.00%, retrieved 08:15 UTC, effective Sept. 17” is much more useful than “current rate: 4.00%.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Use idempotency everywhere
&lt;/h2&gt;

&lt;p&gt;Central-bank announcements are likely to arrive through more than one path: an API poll, an email parser, a news feed, or a human upload. Your consumer must assume duplicates.&lt;/p&gt;

&lt;p&gt;Create a stable idempotency key from the jurisdiction, event type, effective date, and normalized decision identifier. Every downstream action should also have its own key, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interest-accrual:loan-1842:2026-09-17
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the event is delivered twice, the system should not double-create a journal entry or send two review requests. Store the processing status and the input event ID with each action so operators can inspect what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a practical close checklist looks like
&lt;/h2&gt;

&lt;p&gt;For the next month-end close, a rate-event workflow can create a focused checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refresh variable-rate debt schedules.&lt;/li&gt;
&lt;li&gt;Compare calculated interest with lender statements.&lt;/li&gt;
&lt;li&gt;Review cash forecast assumptions.&lt;/li&gt;
&lt;li&gt;Identify models using policy-controlled discount rates.&lt;/li&gt;
&lt;li&gt;Attach source and effective-date evidence to the close package.&lt;/li&gt;
&lt;li&gt;Route exceptions with a named owner and due date.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That checklist is small enough to operate and specific enough to audit. It avoids the common failure mode where “macro update” becomes an unbounded task assigned to the entire finance team.&lt;/p&gt;

&lt;p&gt;Tools such as portali.tech are useful in this layer when they connect operational data, accounting work, and review evidence in one workflow. The value is not a flashy prediction. It is giving the team a traceable path from external event to proposed action to approved result.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineering takeaway
&lt;/h2&gt;

&lt;p&gt;A rate decision is not just a number to copy into a dashboard. It is a time-stamped event with uncertain downstream scope.&lt;/p&gt;

&lt;p&gt;Design the system around that reality: preserve the source event, model dependencies, calculate deterministically, ask for approval where judgment is involved, expose provenance, and make every consumer idempotent.&lt;/p&gt;

&lt;p&gt;That approach works for central-bank rates, tax notices, payment-provider changes, and other external facts that quietly change accounting operations. Good finance automation does not erase the chain of reasoning. It makes the chain easier to follow.&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>accounting</category>
      <category>automation</category>
      <category>devops</category>
    </item>
    <item>
      <title>The Exception Queue Is the Real Product in Accounting Automation</title>
      <dc:creator>Tali Adler</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:00:50 +0000</pubDate>
      <link>https://dev.to/tali_from_portali/the-exception-queue-is-the-real-product-in-accounting-automation-20a3</link>
      <guid>https://dev.to/tali_from_portali/the-exception-queue-is-the-real-product-in-accounting-automation-20a3</guid>
      <description>&lt;h1&gt;
  
  
  The Exception Queue Is the Real Product in Accounting Automation
&lt;/h1&gt;

&lt;p&gt;Most accounting automation demos focus on the happy path: connect a bank feed, watch transactions get categorized, and admire a clean reconciliation screen. The interesting engineering problem starts after that demo. What happens when the confidence is low, the invoice is missing, or two source systems disagree?&lt;/p&gt;

&lt;p&gt;That is why an exception queue is more than a feature. It is the control surface that makes automation usable in a real accounting workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the happy path is not enough
&lt;/h2&gt;

&lt;p&gt;A transaction can look simple while carrying several possible meanings. A payment to a software vendor might be a subscription, a prepaid expense, a contractor charge, or a duplicate. A transfer may be a legitimate movement between accounts, or it may be an unexplained deposit. The ledger often does not contain enough context to decide safely from one row alone.&lt;/p&gt;

&lt;p&gt;A production system should not hide that uncertainty behind a confident-looking category. It should preserve the evidence, state what it believes, and make the next human decision cheap.&lt;/p&gt;

&lt;p&gt;This is the difference between automating data entry and automating a workflow. The first moves values around. The second helps a team decide what is safe to approve.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape of a useful exception queue
&lt;/h2&gt;

&lt;p&gt;A useful queue answers five questions for every item:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What needs attention?&lt;/strong&gt; Show the transaction, amount, date, proposed account, and confidence or rule that caused the item to be routed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why was it flagged?&lt;/strong&gt; Explain the mismatch in plain language: missing invoice, conflicting vendor, unmatched amount, duplicate candidate, or policy violation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What evidence is available?&lt;/strong&gt; Put the bank line, invoice, statement, prior mappings, and related ledger entries in one review context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What decision can I make?&lt;/strong&gt; Offer a small set of explicit actions such as approve, change category, link evidence, split, or defer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happens next?&lt;/strong&gt; Make the downstream effect visible before the reviewer commits the change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last point matters. An approval should not feel like editing a spreadsheet cell. It is a controlled transition in an accounting process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portali's review-first approach
&lt;/h2&gt;

&lt;p&gt;Portali's workflow is built around this review-first model. It ingests bank feeds, statements, and uploaded documents, then uses accounting-aware categorization and three-way matching across statements, invoices, and ledger activity. Items that match cleanly can move through the workflow. Uncertain items are surfaced in an exception queue for review instead of being silently posted.&lt;/p&gt;

&lt;p&gt;The practical benefit is not simply fewer clicks. It is a better allocation of attention. A bookkeeper can spend time on the 12 transactions that require judgment instead of rechecking all 1,200 transactions because the system gives no clear boundary between automated work and reviewed work.&lt;/p&gt;

&lt;p&gt;The same design also helps teams scale. A shared queue makes ownership visible, while approval rules and internal controls keep a reviewer in the loop where the risk is material. The audit trail then records what was suggested, what changed, who approved it, and when. That context is valuable at month-end and even more valuable when someone asks about a transaction several months later.&lt;/p&gt;

&lt;h2&gt;
  
  
  A concrete implementation pattern
&lt;/h2&gt;

&lt;p&gt;If you are building a similar system, model an exception as a first-class object rather than a boolean on a transaction. At minimum, store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a stable transaction identifier&lt;/li&gt;
&lt;li&gt;the exception type and severity&lt;/li&gt;
&lt;li&gt;the proposed action and its evidence&lt;/li&gt;
&lt;li&gt;the rule, model result, or comparison that produced the flag&lt;/li&gt;
&lt;li&gt;an owner and review state&lt;/li&gt;
&lt;li&gt;a decision, reviewer, and timestamp&lt;/li&gt;
&lt;li&gt;links to related documents and ledger entries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep the original inputs immutable. Store new suggestions and decisions as events or revisions. This makes it possible to reconstruct the state of the books at a point in time and prevents a corrected value from erasing the reason a prior value was accepted.&lt;/p&gt;

&lt;p&gt;For ranking, start with risk and aging rather than model confidence alone. A low-value duplicate may be less urgent than a high-value unmatched payment close to the reporting deadline. A simple priority score can combine amount, close date, exception severity, client policy, and how long the item has waited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure the queue, not just the model
&lt;/h2&gt;

&lt;p&gt;Accuracy is necessary, but it is not the only useful metric. Track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;auto-clear rate by exception type&lt;/li&gt;
&lt;li&gt;reviewer minutes per resolved item&lt;/li&gt;
&lt;li&gt;first-pass approval rate&lt;/li&gt;
&lt;li&gt;aging of unresolved exceptions&lt;/li&gt;
&lt;li&gt;reversals after approval&lt;/li&gt;
&lt;li&gt;percentage of items with complete evidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These metrics expose whether automation is actually reducing operational load. A high auto-clear rate paired with a rising reversal rate is not a win. Neither is a queue that is technically small because uncertain items are being posted without review.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader lesson
&lt;/h2&gt;

&lt;p&gt;Good accounting automation does not pretend judgment has disappeared. It separates repeatable work from consequential decisions, then gives people a focused place to handle the edge cases. That is a product principle, a data-modeling principle, and a trust principle at the same time.&lt;/p&gt;

&lt;p&gt;The exception queue is where an accounting system proves it understands the difference between a suggestion and a decision. Build that surface well, and automation becomes something a finance team can supervise. Build only the happy path, and every shortcut eventually returns as a manual cleanup project.&lt;/p&gt;

</description>
      <category>accounting</category>
      <category>automation</category>
      <category>fintech</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How AI Agents Are Quietly Taking Over Month-End Close</title>
      <dc:creator>Tali Adler</dc:creator>
      <pubDate>Fri, 18 Sep 2026 12:24:01 +0000</pubDate>
      <link>https://dev.to/tali_from_portali/how-ai-agents-are-quietly-taking-over-month-end-close-273g</link>
      <guid>https://dev.to/tali_from_portali/how-ai-agents-are-quietly-taking-over-month-end-close-273g</guid>
      <description>&lt;p&gt;Month-end close used to be a rite of passage: spreadsheets open on three monitors, a folder of bank PDFs, and that one transaction nobody can explain. In 2026, that ritual is being quietly automated — not by a single magic tool, but by AI agents doing the boring parts one at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the agents actually do
&lt;/h2&gt;

&lt;p&gt;The modern close pipeline looks less like data entry and more like a queue of specialized jobs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transaction matching.&lt;/strong&gt; Bank feed lines get matched to ledger entries using semantic similarity, not exact-string rules. An agent reads the memo text, the counterparty, the amount, and the date, then classifies the match as confident or needs-review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exception surfacing.&lt;/strong&gt; Instead of a human scanning 2,000 rows, the agent surfaces the 12 that actually need judgment: duplicate charges, unclassified merchants, timing gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categorization.&lt;/strong&gt; New vendors get bucketed into your chart of accounts based on how similar past spend was treated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report drafting.&lt;/strong&gt; Once the books reconcile, the same agent assembles the P&amp;amp;L and cash-flow summary with the variances already annotated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pattern is always the same: agents compress the mechanical middle, and humans keep the first and last mile — defining policy and making the judgment calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this works now, and didn't in 2020
&lt;/h2&gt;

&lt;p&gt;Bank feeds got reliable, LLMs got cheap enough to run against thousands of transactions per day, and the reconciliation problem itself turned out to be mostly a classification problem. That last point is underrated: once you frame 'does this bank line match this ledger entry' as a similarity-and-confidence question, it becomes an AI problem instead of a human-tolerance problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What good looks like
&lt;/h2&gt;

&lt;p&gt;A well-run agent-assisted close has three properties:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Everything is traceable.&lt;/strong&gt; Each automated match links back to its evidence. If your tool can't explain why a transaction was matched, that's a red flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Humans see the exceptions, not the whole ledger.&lt;/strong&gt; Review effort should scale with ambiguity, not volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The close gets faster every month.&lt;/strong&gt; Auto-match rates improve as the system learns your vendor history.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where this is heading
&lt;/h2&gt;

&lt;p&gt;The next step is agents that don't just close the books but continuously reconcile — daily, not monthly. Continuous reconciliation kills the month-end crunch entirely, because there's no pile to process if you never let the pile form.&lt;/p&gt;

&lt;p&gt;At Portali (portali.tech) we're building exactly this hybrid world: human accountants and CPAs get automation for their practice, and AI agents get an API to do accounting work on behalf of their users. If you're building in fintech, the interesting design question right now isn't 'can an agent do bookkeeping' — it's 'how do you make its work auditable enough that a human will sign it.'&lt;/p&gt;

&lt;p&gt;That question is where the next five years of this industry live.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>accounting</category>
      <category>fintech</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
