2026-08-29 · Tutorial
Flag Bookkeeping Exceptions, Never Post a Journal Entry
Nadia finds a 48,000 INR software charge with no receipt, a vendor name that changed spelling, and a category copied from last month. A fast automation could make the row look tidy by filling the gaps and posting an entry. A useful auditor does the opposite. It preserves the ambiguity, gathers evidence, and puts the unresolved decision in front of the accountant.
This grok bot bookkeeping audit produces exception packets. It may read approved exports, compare fields, quote source evidence, and move an internal review row. It never creates, edits, approves, or posts a journal entry. It never changes a vendor record or treats a plausible category as accounting truth.
The tutorial uses 16 synthetic transactions and four exception types. Those are declared test choices, not product performance claims.
Define an exception as a failed evidence rule
Avoid the instruction "find suspicious transactions." Suspicious is subjective and invites an unbounded search. Write observable rules: receipt absent, amount differs across sources, vendor identifier is unknown, required tax field is blank, or proposed category lacks support.
| Exception code | Evidence rule | Packet requirement | Human decision |
|---|---|---|---|
| RECEIPT_MISSING | No approved receipt linked | Transaction and search locations | Obtain or document evidence |
| AMOUNT_MISMATCH | Source totals differ | Quote both amounts and currencies | Resolve authoritative amount |
| VENDOR_UNKNOWN | No exact vendor ID match | Observed name and candidates | Select or create vendor |
| CATEGORY_UNSUPPORTED | No policy evidence | Current category and source | Choose accounting treatment |
The code says what failed. It does not accuse a person, label fraud, or decide materiality. Those judgments remain with qualified reviewers.
Keep source records read-only during the audit
Nadia exports the approved transaction set to a review workspace. The bot reads the export and linked evidence. It does not work in a screen where a mistaken click can post, reconcile, delete, or edit the ledger.
Use Bookkeeping Auditor for the primary pattern, Expense Reconciler for evidence matching, Source Verifier for traceable claims, and Agent Inbox for exception routing. None of these names changes the underlying authority. Tool and account configuration must support the written boundary.
Least Privilege for Bots explains why read access should be granted before write. If the source cannot provide a read-only route, keep it outside this design and use a controlled export.
Write a boundary that covers every ledger-changing synonym
"Never post" is necessary but not complete. Accounting interfaces may use Save, Add, Match, Reconcile, Approve, Categorize, Create rule, or Update vendor. Name the consequences and route the proposed change as text.
ROLE: Bookkeeping exception preparer
INPUT: Approved transaction export, receipt index, vendor index, policy excerpts
CHECK: Required fields, exact amount and currency, receipt link, vendor ID,
duplicate key, and category evidence
OUTPUT: One immutable exception packet per failed rule
ALLOWED STATUS: no_exception, needs_accountant, source_missing
BOUNDARY: Never create, edit, approve, reconcile, categorize, match, delete,
or post a journal entry, transaction, vendor, bank rule, or payment.
HANDOFF: Name the accountant who must decide and act in the ledger.
How to Write a Boundary Line provides the reusable pattern. The accountant should be able to reject the packet without touching production records.
Build a transaction key before comparing evidence
Use stable fields such as source account, source transaction ID, amount, currency, and date. Do not let a model invent the identity key from a merchant description. A retry must update the same audit packet rather than emit a second exception.
Nadia keeps raw observed values beside normalized proposals. "ACME*SOFT" remains visible even if a candidate vendor is Acme Software. Normalization can help search, but it must not erase the source string that a reviewer needs.
If the export lacks stable IDs, label that as a source limitation. Do not manufacture certainty by concatenating changeable descriptions and calling the result authoritative.
Compare fields without deciding accounting treatment
The bot can compare 48,000 INR in the bank export with 48,000 INR on a receipt. It can report a match. It cannot conclude that the expense belongs in a particular account merely because the same vendor used that account last month.
| Check | Deterministic result | Prohibited inference |
|---|---|---|
| Amount and currency equal | Match or mismatch | Expense is valid |
| Receipt link exists | Present or absent | Receipt proves business purpose |
| Vendor ID exact match | Found or missing | Vendor terms are acceptable |
| Duplicate key repeats | Possible duplicate | Which record to delete |
| Policy phrase found | Quote available | Final accounting treatment |
This line keeps audit preparation useful. The bot reduces search and assembly effort without becoming an unqualified posting engine.
Preserve quoted evidence and source locations
Every exception packet includes the raw transaction fields, evidence source, a short quote or exact value, checked time, exception code, and unresolved question. A reviewer can open the source without repeating the search.
Do not copy secrets or full account exports into the packet. Include only the fields needed for the review under the organization's data policy. If evidence contains personal or regulated data, this tutorial stops and the applicable control owner decides handling.
What a Pasted Prompt Inherits explains that a narrow charter does not erase existing access. Keep the audit workspace intentionally smaller than the accounting workspace.
Route every unresolved case to a named accountant
Nadia assigns each packet to Arun, the reviewer for the practice run. The bot may set needs_accountant. It may not set approved, posted, reconciled, or resolved. Arun records his decision in the accounting process, and the audit packet stores only a reference to that decision.
The distinction matters on day thirty. A closed packet means a person handled the exception. It does not mean the bot's proposed category was correct. Record actor, time, and destination reference so the handoff is auditable in the ordinary operational sense, without claiming the product supplies a special audit view.
Use Grok Bot QuickBooks for product-specific integration cautions. This tutorial remains ledger-neutral.
Treat shared state as a reason to minimize the workspace
State the architecture once: bots on one account share a persistent computer, including files and sessions, so use Screens Are Not Boundaries for isolation details.
Nadia uses synthetic data first and a dedicated approved export for live review. She removes exports according to policy after preserving the required business record elsewhere. Deleting the bot is not the cleanup step; Why Deleting a Bot Leaves the Files explains why files and sessions require direct teardown.
Do not place bank credentials, payment tokens, or unrestricted accounting sessions in the audit workspace merely for convenience.
Answer the bookkeeper who says auto-posting is the whole payoff
The strongest objection is that exception packets leave the expensive final click with a person. If every clean transaction still needs review, automation may not reduce enough work.
That objection can justify a separate auto-posting project for a tightly controlled transaction class, using qualified accounting design, deterministic rules, approval, and reconciliation. It does not justify smuggling posting authority into an auditor charter. Discovery and posting have different failure consequences.
Begin by measuring how many transactions pass deterministic checks and how much packet preparation saves. If the remaining human action is still the bottleneck, make a new decision with its own controls and owner.
Walk Nadia's software charge through the packet
At 09:20, transaction TX-044 enters the synthetic export. The amount and currency match the bank source. The receipt index has no link. The vendor index contains Acme Software, but the observed descriptor is ACME*SOFT and no exact source ID connects them. Last month's category appears in a note without policy evidence.
The bot emits RECEIPT_MISSING, VENDOR_UNKNOWN, and CATEGORY_UNSUPPORTED in one packet. It quotes the observed descriptor and records where it searched. It does not merge the vendor, copy the old category, or create an entry.
At 11:00, Arun obtains the receipt, verifies the vendor through the approved process, decides the treatment, and posts through the ledger controls. The packet links to Arun's decision reference. The bot receives no posting capability.
Diagnose false confidence by its source
| Symptom | Cause | Immediate response | Durable repair |
|---|---|---|---|
| Packet says receipt found but link fails | Stale index | Reopen exception | Verify artifact existence |
| Vendor candidate shown as exact | Normalization erased source | Reject packet | Preserve raw and match type |
| Old category copied as fact | Historical pattern treated as policy | Remove proposal | Require current evidence |
| Duplicate packets | Missing transaction key | Merge and pause | Enforce stable ID |
| Journal entry appears | Authority crossed boundary | Escalate and stop | Remove all ledger writes |
The final row is an incident, not a content-quality issue. Preserve evidence and follow the organization's financial and security response procedures.
Verify the auditor with sixteen synthetic transactions
Create four clean cases and three cases for each of the four exception codes. Add one pair sharing a duplicate key among the set. Write expected codes before running. The arithmetic is a test design choice.
A passing run produces source-linked packets, preserves raw values, routes uncertainty to needs_accountant, and creates no ledger changes. Independently inspect the accounting system, vendor list, bank rules, and payment channels. The bot's statement that it did not post is not sufficient evidence.
Have a second reviewer trace five packet claims back to source. Fail the test if any claim lacks a location or if a proposal is presented as a decided fact.
Store business evidence outside the recent run list
Verified facts say each routine belongs to one bot, each bot supports at most 50 routines, and the app keeps the 20 most recent run records per routine. The recent list is therefore not a long-term accounting retention system.
Preserve the transaction key, source references, exception codes, packet version, reviewer, decision reference, and required timestamps in an approved system of record. Do not export more sensitive data than policy requires. Bot Data Retention separates runtime convenience from records you must keep yourself.
How to Schedule a Grok Bot Routine covers routine mechanics. Schedule only when an owner will review exceptions promptly.
Change rules through review and a replay fixture
A new vendor alias or category policy changes what the auditor flags. Treat that edit as production logic. Nadia proposes the change, Arun reviews the exact diff, and the team replays the sixteen-case fixture before release.
Do not add an example that silently converts a candidate into an exact match. Record match type explicitly: exact source ID, approved alias, or candidate only. Roll back when known exceptions disappear or clean cases acquire unsupported claims.
Bot Change Management covers charter edits with consequential scope. Even though this auditor cannot post, a bad rule can still hide an exception from the reviewer.
Stop this tutorial before tax, fraud, and posting decisions
This page does not provide accounting, tax, audit, or legal advice. It does not determine materiality, business purpose, fraud, tax treatment, journal structure, or reconciliation policy. Qualified people and the organization's controls own those decisions.
The design ends with an evidence packet and human handoff. Use A Boundary Is Not a Permission to align the charter with actual capabilities, and What an Approval Actually Governs to place approval before consequential action.
Reconcile the exception queue without turning closure into approval
An exception needs a lifecycle after handoff. Nadia uses Open, Waiting for source, Assigned to accountant, and Closed by accountant. The bot may create Open and add source evidence. It may not choose Closed. Closure records the human actor, time, decision reference, and whether the source defect was corrected.
This avoids a misleading metric. A falling open count can mean issues were resolved, hidden, duplicated, or closed without evidence. Nadia reviews closure reasons as well as queue size. She samples four closed synthetic cases and traces each to the accountant's recorded decision.
Keep the audit packet immutable after handoff. New evidence becomes an appended version with a timestamp and source, not a rewrite of the original observation. The reviewer can then see that the receipt was absent at 09:20 and supplied at 10:40. Overwriting "missing" with "found" erases the control event.
| Queue transition | Bot may request | Human requirement | Evidence preserved |
|---|---|---|---|
| New -> Open | Yes | None | Initial rules and sources |
| Open -> Waiting for source | Yes | Named missing item | Search locations |
| Open -> Assigned | Yes | Accountant identity | Handoff time |
| Assigned -> Closed | No | Accountant decision | Decision reference |
| Closed -> Reopened | No | Reviewer reason | Prior closure remains |
Use aging bands that match the organization's close process. Nadia chooses same day, two business days, and older than two business days for the practice queue. These bands are arbitrary operating choices, not accounting guidance. The owner decides which age triggers escalation.
Reconcile counts by transaction key. The number of packets opened, packets closed, packets waiting, and clean transactions should tie back to the input set after accounting for explicit duplicates. If 16 inputs produce 17 unique outcomes, the pipeline has an identity defect even when every packet reads well.
Test late evidence. Add a receipt after the initial packet and rerun. The process should append evidence to the same key, preserve the original exception, and return it to the accountant. It must not post, recategorize, or silently close.
Test reviewer disagreement too. Two accountants may classify the same synthetic case differently under an incomplete policy. The bot should preserve both review references and route the policy gap to the owner. It must not select the majority answer and turn it into a new rule without a reviewed change.
The queue report uses factual labels: evidence missing, awaiting decision, decision recorded. Avoid "books cleaned" or "audit passed." This preparation routine cannot support those broader claims.
At period end, export the required exception record to the approved destination, verify retrieval by transaction key, and remove temporary source copies according to policy. Recent run history remains useful for immediate diagnosis, but it is not the accounting record. This lifecycle lets the bot do repeatable evidence work while every ledger consequence stays attached to a qualified human action.
Nadia adds a completeness reconciliation after every batch. The input export contains a declared row count and a stable batch ID. The output report lists clean rows, exception rows, duplicate references, and source failures. Their accounted total must equal the input count without counting one transaction twice.
Completeness is different from correctness. A batch can tie numerically while assigning the wrong exception code. Nadia therefore pairs reconciliation with the known synthetic fixture and a human sample from live work. One test catches missing rows; the other catches misleading packets.
The auditor also records negative evidence carefully. "Receipt not found" means the approved locations were searched at a stated time and no matching artifact appeared. It does not prove no receipt exists anywhere. The packet lists search locations so the accountant knows the scope of the finding.
When a source is unavailable, every affected rule becomes source_missing. The process does not label those transactions clean. Nadia pauses the batch if the unavailable source is required for all rows, preventing a quiet collapse in exception counts from looking like improvement.
Access reviews use the same inventory. The owner confirms which exports, indexes, and temporary folders remain necessary. Any ledger write, vendor edit, reconciliation, bank rule, or payment capability is out of scope and removed. The review records observed access rather than trusting the charter alone.
For period handoff, Nadia gives the accountant a one-page control note: batch ID, row count, exception count by code, source failures, duplicates, charter version, reviewer, and evidence destination. It avoids a sweeping statement that the books are correct. The note describes exactly what the preparation routine checked.
If a policy owner later approves a new exception rule, add it as a code with a source requirement and synthetic cases. Do not hide it inside a general instruction to use judgment. Named rules allow the team to measure false positives, missed cases, and reviewer disagreement without giving the bot posting authority.
Retire rules explicitly too. Preserve the version where the code stopped applying, rerun historical synthetic cases, and confirm old packets remain interpretable. Removing a rule from the charter should not erase why an earlier transaction was flagged or who resolved it. Keep that evidence retrievable.
Keep reading: approval gates for bots, the bot runbook, and bot failure modes.
Frequently Asked Questions
Can a bookkeeping bot categorize transactions?
It can propose a category when the packet clearly labels the proposal and quotes supporting evidence. It should not present a historical pattern as policy or write the category into the ledger. A qualified reviewer decides the accounting treatment through the approved process. If auto-categorization is required, design it as a separate controlled project with explicit transaction classes, validation, approval, and reconciliation.
Why must the auditor never post a journal entry?
Auditing and posting have different purposes and consequences. The auditor should expose missing or conflicting evidence. Posting changes the financial record and may require accounting judgment, authorization, and reconciliation. Combining them lets the same automation identify an ambiguity and resolve it in its own favor. Keep posting capability out of the audit workspace and route a source-linked packet to a named accountant.
What belongs in an exception packet?
Include the stable transaction key, raw observed fields, exact exception codes, evidence locations, short quoted values, checked time, unresolved question, charter version, and named reviewer. Preserve raw values beside normalized candidates. Exclude unnecessary secrets and full exports. The packet should let another reviewer reproduce the finding without treating the bot's proposal as a final accounting decision.
How do I prove no ledger changes occurred?
Run synthetic cases in a read-only or export-based workspace, then inspect the accounting system, journal list, vendor records, bank rules, and payment channels independently. Compare before and after state using the organization's approved controls. A conversational statement is not proof. Fail the test if any record changes, any packet lacks a source, or any known exception is silently marked clean.