July 5, 2026
Audit Firms Don't Need Custom Queries to Access Client Data
If your firm serves more than a handful of clients, you already know the real cost of an audit engagement isn’t the accounting work — it’s the data-access work that happens before the accounting work can start. Client A is on QuickBooks Desktop with a export-to-CSV workflow. Client B is on a custom-built internal tool with a database someone on their team has to run a one-off SQL query against. Client C’s “export” is a screenshot of a report, emailed. Every engagement starts by re-solving the same problem: how do we get the data out, in a shape we can actually work with.
That’s not audit work. It’s data plumbing, and it’s billable time your firm spends before any actual review begins.
The Custom-Query Problem Is a Symptom, Not a Requirement
Custom queries exist because every client’s system is a black box with its own internal shape. Even when a system technically has an API or an export feature, there’s no guarantee two clients’ exports mean the same thing — a “trial balance” export from one system might not map cleanly onto another’s, and someone has to reconcile the difference by hand before the actual audit evidence is trustworthy.
None of that is inherent to auditing. It’s inherent to auditing clients on systems that were never designed to be queried the same way twice.
What Changes When Every Client Is on the Same API Shape
Every LedgerWriter tenant — regardless of industry, chart-of-accounts complexity, or company
size — exposes the identical resource and report shapes: the same journal-entries endpoint,
the same trial-balance and consolidated-statement projections, the same event history behind
any posted entry. A query built against one client’s LedgerWriter tenant works against any
other client’s tenant, unmodified, because the shape isn’t client-specific — it’s the product.
That means the “custom query” work collapses to a one-time cost for your firm, not a recurring
cost per client. Build the trial-balance pull once. Build the journal-entry-history pull once.
Point it at a new client’s company_id and it works, the same way it worked for the last one.
Read-Scoped, Not “Give Us Your Admin Login”
The other half of the current process is uncomfortable in a different way: getting audit access to a client’s system usually means either a shared login, a temporary admin account, or a data dump handed over out of band — all of which are worse for security than they need to be, and all of which auditors have to work around rather than rely on.
RBAC in LedgerWriter is enforced at the command layer for every role, which means read access can be granted narrowly — a role that can query reports and event history without being able to post, approve, or reverse anything. Your firm gets exactly the access an audit requires, nothing more, and the client isn’t handing over credentials that outlive the engagement.
The Upshot
None of this changes what your firm actually does during an audit — the review, the judgment, the sign-off are still the job. What it removes is the tax you currently pay before that job can start: the per-client data-access negotiation, the bespoke export script, the reconciling of two systems’ different definitions of “trial balance.” One API shape, queried the same way for every client, is what turns evidence-gathering from a project into a formality.