Workflow · June 23, 2026
Run a pre-close anomaly sweep on your journal entries before your controller signs off
Tested on synthetic data. We ran both prompts end-to-end against the sample ledger below; the actual output is shown under "What we got when we ran it". Validate against your own GL before relying on it — risk scores are triage signals, not conclusions.
The task
If you are a controller or senior accountant, the manual journal entries posted during the close are where misstatement and fraud actually hide, and sampling a handful of them is the standard, weak defense. This workflow risk-scores the whole manual-JE population before your sign-off review, so your time goes to the entries that earn scrutiny. It is tool-agnostic: it works whether you own a risk engine like the one described in MindBridge's journal-entry testing memo or just have a CSV export and an AI assistant.
Before AI
Today most teams pull the manual JEs, sort by amount, eyeball the top few, and pick a judgmental or random sample to test. A reviewer spends the better part of a day on it, coverage is a fraction of the population, and the risky entry that happens to be small — a round-dollar top-side adjustment posted late on a Saturday — sails through because it never made the sample.
The workflow
The red flags below are standard audit risk indicators, not invented ones: round or repeated amounts, postings outside business hours or in the last days of the period, entries by users who rarely post or who shouldn't (segregation-of-duties breaks), entries to suspense or rarely-used accounts, and blank or generic descriptions.
1. Export the period's manual journal entries to CSV. One row per entry line — the lines of one entry share a single entry ID — with these columns: entry ID, line number, post date, post timestamp, account, account name, debit, credit, user, and description. Strip anything that isn't needed; keep it to manual/top-side entries (exclude system-generated postings) so the signal isn't drowned out.
2. Risk-score the full population. Paste the export into this prompt. It scores every entry and returns a ranked table — highest risk first — with a short reason per flag.
You are a forensic-accounting assistant helping a controller triage manual journal entries before close sign-off. You will be given a CSV of manual journal-entry LINES (columns: entry_id, line, post_date, post_time, account, account_name, debit, credit, user, description). A single entry spans multiple lines that share an entry_id; treat each unique entry_id as ONE entry and score at the entry level. Infer the period end as the latest post_date in the data. Score EVERY entry from 0 (clean) to 100 (high risk). Apply these risk indicators and name each one that fires: - Round-dollar or repeated/duplicated amounts - Posted on a weekend, outside 07:00-19:00, or within the last 2 days of the period - Posted by a user who appears rarely in the population (possible segregation-of-duties issue) - Posted to a suspense, clearing, equity, or rarely-used account - Blank, vague, or boilerplate description - Large relative to the population (top decile by absolute amount) Return a markdown table sorted by risk score descending, columns: risk_score | entry_id | amount | user | accounts | flags_fired | one_line_reason. Below the table, list the 3 entries you would review first and exactly what to ask about each. Do not invent data; score only what is in the input. If a column is missing, say so and score on what remains.
entry_id,line,post_date,post_time,account,account_name,debit,credit,user,description JE-1041,1,2026-06-30,14:22,5100,COGS,12480.55,0,a.mensah,Inventory adjustment Q2 JE-1041,2,2026-06-30,14:22,2000,Accounts Payable,0,12480.55,a.mensah,Inventory adjustment Q2 JE-1057,1,2026-06-28,23:51,1999,Suspense,50000.00,0,t.vance, JE-1057,2,2026-06-28,23:51,4000,Revenue,0,50000.00,t.vance, JE-1063,1,2026-06-30,17:40,6200,Consulting Expense,9000.00,0,a.mensah,Accrual JE-1063,2,2026-06-30,17:40,2100,Accrued Liabilities,0,9000.00,a.mensah,Accrual JE-1071,1,2026-06-27,09:14,1200,Accounts Receivable,3175.20,0,s.okafor,Reclass per AR aging JE-1071,2,2026-06-27,09:14,4000,Revenue,0,3175.20,s.okafor,Reclass per AR aging JE-1088,1,2026-06-28,02:11,7000,Misc Expense,25000.00,0,j.reyes,Adjustment JE-1088,2,2026-06-28,02:11,2000,Accounts Payable,0,25000.00,j.reyes,Adjustment JE-1090,1,2026-06-30,18:55,1999,Suspense,100000.00,0,t.vance,True-up JE-1090,2,2026-06-30,18:55,3000,Retained Earnings,0,100000.00,t.vance,True-up
3. Turn the top flags into a one-page reviewer note. Feed the ranked table into this prompt so your controller walks into sign-off with the questions already framed.
Using the ranked risk table above, write a one-page review note for the controller. For the top 5 entries only: state the entry, the amount, why it was flagged, and the single question to put to the preparer. Keep each to two sentences. Add a one-line caveat that recurring, legitimate entries (e.g. standing intercompany true-ups) may flag every period and should be whitelisted once verified. Plain English, no jargon.
What we got when we ran it
We ran both prompts against the synthetic sample above. Step 2 returned this ranked table:
| risk_score | entry_id | amount | user | accounts | flags_fired | one_line_reason | |---|---|---|---|---|---|---| | 96 | JE-1090 | $100,000.00 | t.vance | Suspense → Retained Earnings | round amount; last 2 days of period; suspense + equity account; boilerplate "True-up"; largest in population | A six-figure round "True-up" routed through Suspense into Retained Earnings on the final day. | | 94 | JE-1057 | $50,000.00 | t.vance | Suspense → Revenue | round amount; weekend; after-hours; suspense account; blank description; large | A $50k revenue entry through Suspense, posted 23:51 on a Sunday with no description. | | 82 | JE-1088 | $25,000.00 | j.reyes | Misc Expense → Accounts Payable | round amount; weekend; after-hours; boilerplate "Adjustment"; catch-all account | A $25k "Adjustment" to Misc Expense posted at 02:11 on a Sunday. | | 48 | JE-1063 | $9,000.00 | a.mensah | Consulting Expense → Accrued Liabilities | round amount; last 2 days of period; boilerplate "Accrual" | A round period-end accrual — plausible, but confirm the supporting calculation. | | 34 | JE-1071 | $3,175.20 | s.okafor | Accounts Receivable → Revenue | weekend | Saturday posting, but non-round and clearly described as an AR-aging reclass. | | 22 | JE-1041 | $12,480.55 | a.mensah | COGS → Accounts Payable | last 2 days of period | Period-end inventory adjustment, non-round and clearly described — low risk. |
Three to review first: JE-1090, JE-1057, JE-1088.
Step 3 turned those into the controller note. The top three questions it produced:
- JE-1090 ($100,000): What is the business basis for pushing a $100k "true-up" through Suspense into Retained Earnings, and who approved a direct equity adjustment on the last day of the period?
- JE-1057 ($50,000): What does this revenue entry represent, why is the description blank, and why was it posted just before midnight on a Sunday?
- JE-1088 ($25,000): What supports the $25k "Adjustment" to Misc Expense, and why was it posted at 2:11 a.m. on a weekend?
It closed with the standing caveat: recurring legitimate entries (e.g. a standing intercompany true-up) will flag every period and should be whitelisted once verified.
What testing changed. The first draft gave each debit and credit its own entry ID, so the model scored half-entries and double-counted the population. We fixed the sample so an entry's lines share one entry_id, and told the prompt to score per entry_id and infer the period end from the latest post date. After that the ranking came out stable and matched a manual read of the data.
Gotchas
- The tool scores statistics, not intent. A legitimate, recurring true-up will flag every close until you whitelist it. Build that whitelist after the first run.
- Synthetic data only above. The sample is fabricated. Before you paste a real GL into any AI tool, confirm it meets your firm's data-handling and confidentiality rules — an export of your ledger is sensitive.
- Exclude system-generated entries first, or the manual-entry signal drowns in volume.
- This narrows the review; it does not replace it. Every flag is a question for a human, not a conclusion. Nothing here signs off the close.
Time saved
Conservatively, a day of manual sampling per close becomes a focused review of a ranked shortlist — and your coverage goes from a sample to the full manual-JE population. Treat the day-saved figure as an estimate until you have run it against your own ledger and timed it.
---
This content is for informational purposes only and is not financial, investment, or accounting advice. Verify outputs against authoritative sources before use.
Source: mindbridge.ai