AWRA OpsHub Search
Double-entry, by construction

Nobody in your organisation has to write a journal entry. The ledger writes itself.

A sale rings up. A payment clears. Stock leaves the store on an approved invoice. Payroll posts. In every one of those moments AWRA OpsHub writes both halves of the accounting entry — debit and credit, in the same breath as the operation — into a general ledger you can browse, drill into and trial-balance the same afternoon.

Journal entries · General ledger with running balances · Trial balance · Automatic posting from every module · Manual journals tagged by department, branch and project · Period lock · Mirrored on the API

Both legswritten in one operation, so a half-entry is not a state the ledger can reach
3 tagsdepartment, branch and project on a journal line, read by the income statement
Every rowcarries the running balance after it, labelled DR or CR
0 exportsthe trial balance reads the same rows your operations wrote
The month-end reconstruction

Most organisations do their accounting twice.

Once in real life — a customer pays, a supplier is settled, stock moves, someone is paid — and then again, weeks later, when a bookkeeper opens a bank statement and tries to work out what all of it was. The second pass is where the errors live, because it is done from evidence rather than from the event: a reference on a statement line, a receipt in a drawer, somebody's memory of a Tuesday.

That gap has a cost you can measure. Margins look fine until the reconstruction finishes and discovers cost of sales was never relieved. Receivables look healthy because a credit sale increased cash the day the goods left. Output tax on a fulfilled invoice quietly never reaches a tax account, which is a filing problem rather than a presentation one. None of these announce themselves. Every one of them is invisible in an operational report and only ever visible in a ledger.

AWRA OpsHub removes the second pass by making the first pass accounting. There is exactly one service in the platform that is allowed to write to the ledger, and it physically cannot write one side of an entry on its own. Every operational routine that touches money calls it, hands it a debit account and a credit account, and gets a balanced pair back. The general ledger is therefore not a report assembled from your operations. It is your operations, expressed in accounts.

The roads into the ledger

Every one of these writes its own journal.

No queue to run, no "post to accounting" button, no nightly batch that can fail silently. Each of these operational events posts at the moment it completes, with the account pair its own logic determines.

Point-of-sale sale

Rings revenue and relieves inventory at cost in two balanced pairs, so gross margin is a ledger fact on the day of the sale rather than a month-end derivation.

DRAccounts Receivable  /  CR Sales Revenue
DRCost of Sales  /  CR Inventory Assets
Point-of-sale return

Reverses in three conditional legs rather than one blunt one. Revenue always comes back. Cost only returns if the goods did — a written-off return leaves the cost consumed. And the refund only debits cash where a tender actually moved money.

DRSales Revenue  /  CR Accounts Receivable
DRInventory  /  CR Cost of Sales  if restocked
Invoiced stock issue

When an approved issue is backed by a customer invoice, the invoice is the authority on all three figures — the agreed total, the discount already applied, and the tax split out. Receivables take the gross; revenue is credited net; tax gets its own line.

DRAccounts Receivable  gross
CRSales Revenue  net  +  CR Taxes Payable
Customer payment

Clears the receivable the sale created and lands the money in the right account by tender: cash and mobile money settle to Cash, everything else to Bank. Refunds reverse into whichever one the original payment used.

DRCash or Bank  /  CR Accounts Receivable
Operating expense

Rent, utilities, subscriptions, bank charges. Posts the expense against Payables or straight to settlement depending on whether you pay now or hold it, and posts a second matching journal when the payable is later cleared.

DROperating Expense  /  CR Accounts Payable
DRAccounts Payable  /  CR Cash or Bank  on settlement
Stock adjustment

Check-ins, check-outs and reason-coded adjustments move value between inventory and the account their reason implies, so a write-off and a receipt are different postings rather than the same one with a different note.

DRInventory Assets  /  CR Accounts Payable
Payroll run

Posting an approved run recognises the cost and then settles it, in two pairs, referenced to the run and its period so the ledger line and the payslip batch point at each other.

DRPayroll Expenses  /  CR Payroll Payable
DRPayroll Payable  /  CR Bank
Vendor payment

Every outbound supplier settlement — bank transfer, mobile money, cheque — reduces payables and the settlement account together, from the same register that reconciles the payment itself.

DRAccounts Payable  /  CR Cash or Bank
Project payout

Payments to people working on a project post to the same payroll expense account as the payroll engine, so project labour cost and payroll cost never disagree about what was spent.

DRPayroll Expenses  /  CR Cash or Bank
Customer credit note

Reduces what the customer owes without touching the original invoice: revenue comes back net, receivables come down gross, and the tax that was charged comes back off Taxes Payable on its own line.

DRSales Revenue  +  DR Taxes Payable
CRAccounts Receivable  gross
Supplier bill without an order

Rent, utilities, services. Approving the bill books each line to its own expense account and the input tax separately. A bill against a purchase order posts nothing on approval, because the payable already exists from the goods receipt — a second credit would double it.

DRExpense per line  +  DR Input Tax
CRAccounts Payable
Withholding tax

Deducted from a supplier bill and booked in step with each confirmed payment, each one taking its share, so the supplier is paid the net and the tax sits in a liability until it is remitted.

DRAccounts Payable  /  CR Withholding Tax Payable
Petty cash and staff advances

A petty cash float is its own ledger account: a voucher spends from it, a top-up refills it. An advance issued to a staff member sits as a receivable until it is retired against receipts, with any change returned and any overspend owed back to them.

DRExpense  /  CR Petty Cash Float
DRStaff Advances  /  CR Bank, Cash or a float
Bank line, entered from the statement

A bank charge or a receipt that is on the statement but not yet in the books is entered from the reconciliation screen against the account you choose, dated on the statement date, and matched to that line in the same step.

DRBank Charges  /  CR Bank  money out
The same routes, from the app

Field adjustments, mobile POS and mobile invoice payments call the identical posting service as the browser. There is no second, looser accounting path for mobile work — which is the usual place a parallel ledger appears.

=one posting service, one ledger, two clients
Journal entries

Every posting, newest first, with the balance it produced.

The journal is the flat chronological record: one row per leg, each carrying its account, its amount, the document that caused it, and the running balance of that account immediately after it. Page sizes run from 25 to 200 rows.

Journal entries · 3,412 rows · debits 41,208,660.00 · credits 41,208,660.00 Balanced
Date Account Source Amount Running balance
24 Aug 14:06 Taxes Payable Output tax on INV-2098 CR 2,206.90 318,442.15 CR
24 Aug 14:06 Sales Revenue Revenue for invoice INV-2098 CR 13,793.10 7,904,118.40 CR
24 Aug 14:06 Accounts Receivable Revenue for invoice INV-2098 DR 16,000.00 1,244,905.60 DR
24 Aug 11:52 Bank Payroll run 2026-08 (settled) CR 2,884,300.00 6,118,772.05 DR
24 Aug 09:14 Inventory Assets COGS for POS sale POS-4471 CR 11,265.00 3,470,881.25 DR
Notice the third row. The invoice was 16,000 gross with 2,206.90 of tax — so receivables took the full sixteen thousand the customer owes, revenue was credited 13,793.10 net, and the tax went to its own account. Three rows, one document, and a tax balance that is ready to be filed rather than reverse-engineered.
Date range from & to Debits only or credits only Large entries — anything above 1.5× your own average 25 to 200 rows a page Linked to its source adjustment or item

The large-entries filter deserves a sentence of its own, because it is the one filter here you could not have configured yourself. It does not compare postings to a number you typed. It computes the average entry amount across your own ledger and then shows you everything more than half again above it. A business posting thousands of small retail lines and a business posting a handful of large equipment purchases get a different threshold from the same control, and neither had to guess what "large" means in their books.

When no operation made the entry

Manual journals, tagged by who, where and what for, into a month that is still open.

An accrual, an opening balance, a reclassification, a correction: some entries are made by an accountant rather than by an operation. They go in as a manual journal — balanced lines, a memo, a date chosen by the person posting it, and on every line an optional department, branch and project, so the cost lands where it belongs on the income statement.

Manual journal · MJ-0031 Posted
Date30 Sep 2026
MemoAudit fee accrual, Q3
MonthSeptember · open
AccountTagsDebitCredit
Audit & Professional Fees Finance Nairobi HQ 120,000.00—
Audit & Professional Fees Programmes WASH Kilifi 60,000.00—
Accrued Expenses —180,000.00
Debits 180,000.00 · Credits 180,000.00Balanced — refused otherwise

The tags are what make the income statement answer a second question. Run it for a date range and break it down by department, by branch or by project, and each line above lands in its own column. The donor asking what the Kilifi programme cost gets a figure the ledger produced, not one a spreadsheet assembled.

Postings the product makes carry tags where their source knows them: a stock movement carries its warehouse and project, an invoice and an expense carry their project, a petty cash voucher its float’s branch and its own department and project, a staff advance its department and project, and a depreciation charge the branch the asset sits in.

AprClosed
MayClosed
JunClosed
JulClosed
AugOpen
SepOpen
A manual journal dated 28 July is refused, with the month named. Date it in an open month, or reopen July in front of colleagues — who closed it, who reopened it and when are kept with their notes.
An entry already in a closed month cannot be edited or deleted, and an edit cannot move one into a closed month either. The lock sits on the ledger entry itself, so no screen can forget it.
A till sale on a day the month was closed early is not failed. A posting the product makes for you rolls forward to the first open day, and its date says so.
 Depreciation, posted monthly

Each asset gets a profile — cost, salvage, in-service date, straight line or reducing balance. Run a month and every active asset is charged once, to the cent, never below salvage, and never into a closed month or one that has not started.

DRDepreciation Expense  /  CR Accumulated Depreciation
 Disposal, with the gain or loss

Disposing of an asset takes its cost and accumulated depreciation off the books together, records the proceeds where they were received, and posts the difference as a gain or a loss on disposal.

DRAccumulated Depreciation  +  Proceeds
CRAsset  ±  Gain or Loss
 The journal over the API

The same endpoints the mobile app uses read the journal and the ledger, open one entry with the other legs that share its reference, take statements by date range and dimension, post a manual journal, and close or reopen a month.

GET /api/accounting/journal/{entry} · one entry + its legs GET /api/accounting/income-statement?from=&to=&by=project_id GET /api/accounting/balance-sheet?as_of= POST /api/accounting/manual-journals POST /api/accounting/period-close/close
General ledger

The same postings, gathered under the accounts they hit.

The ledger view walks the accounts that have actually been posted to — not every account you own, only the live ones — and shows each with its full entry history and a closing balance expressed in the sense that account naturally carries.

Normal balance is the idea that makes this readable. An asset or an expense account grows when you debit it; a liability, equity or income account grows when you credit it. AWRA knows which is which from the account's own type, and accumulates each account in its own direction — so Inventory Assets rising is a positive number, and Sales Revenue rising is also a positive number, even though one grew on a debit and the other on a credit.

The payoff is what happens when an account goes the wrong way. A cash account that has been overdrawn does not display as negative cash. The label flips instead: the number stays positive and the tag beside it changes from DR to CR, which is how an accountant would read it out loud and exactly what the trial balance needs. A negative number in a balance column is a presentation bug that hides a real condition. A flipped side is the real condition, stated.

Accounts with activity 14

Only accounts carrying at least one posting appear, so the ledger is never padded with empty rows from the chart of accounts.

Entries in the ledger 3,412

Every leg ever written, each one still attached to the operational document that caused it.

Last posting 2 min ago

Because the posting happens inside the operation, "how current are the books" and "how current is the business" are the same question.

Trial balance

It balances because a half-entry was never possible.

A trial balance in most systems is a test — you run it to find out whether something has gone wrong. Here it is closer to a statement of the obvious, and that is the point.

Trial balance · all activity to date Debits = Credits
Account Type Debit Credit
Accounts ReceivableAsset1,244,905.60—
Inventory AssetsAsset3,470,881.25—
BankAsset6,118,772.05—
Accounts PayableLiability—918,340.00
Taxes PayableLiability—318,442.15
Sales RevenueIncome—7,904,118.40
Cost of SalesExpense4,182,900.10—
Payroll ExpensesExpense2,884,300.00—
Accounts sitting at zero are left out, so what you read is the live shape of the business rather than a full inventory of account names. An account that has swung against its normal side appears in the opposite column — an overdrawn bank account shows as a credit, which is where it genuinely belongs.
Who sees the books

The ledger is not one permission.

Being allowed into accounting is not the same as being allowed to read the general ledger, and neither is the same as being allowed to change the chart of accounts. Each of those is its own grant, and they stack.

That granularity is what lets you give a branch manager the aging report without handing them the whole ledger, or give a bookkeeper the journal without giving them the power to rename a system account the statements depend on.

view_accounting

The floor. Without it none of the accounting screens exist for that role at all.

view_journal_entries

Required on top of the floor for every ledger-derived screen — the statements included.

view_general_ledger

The per-account drill-down specifically, so entry-level detail can be granted separately from summary reporting.

view_reports

Gates the statements above the ledger: trial balance, income statement, balance sheet, cash flow, receivables and payables.

manage_accounts

The chart of accounts itself. System accounts the reports are keyed to stay locked even here.

The ledger as a trigger

A posting is an event you can build on.

Every journal posting raises an event inside the platform, which means your workflow rules can watch the ledger the same way they watch a purchase order or a ticket. Post a journal above a threshold and notify the finance lead. Post to a particular account and open a review task. Post anything at all on a weekend and put it in a queue somebody checks on Monday.

This is a small thing that turns out to matter, because the alternative is a person remembering to look. A control that depends on somebody opening a report is not a control — it is a hope with a screen attached. Wiring the rule to the posting itself is how the check happens on the entry nobody was expecting.

Straight answers

What the ledger does today — and what we can add to yours.

Finance software is the worst possible place for a vague answer, so here is the shape of it precisely, including the work we would take on if you need it.

The straight answer

What AWRA OpsHub does today

  • Every posting writes both legs in one operation, so total debits and total credits are equal by construction rather than by reconciliation
  • The operations that move money post automatically — POS sales and returns, invoices and credit notes, customer payments, expenses, supplier bills and withholding tax, stock adjustments, payroll runs, vendor payments, project payouts, petty cash and staff advances
  • Manual journals for accruals, opening balances and corrections — balanced, referenced, dated by the person posting, with an optional department, branch and project on every line, on the web and over the API
  • An income statement for any date range, broken down by department, branch or project, and a balance sheet at any as-at date, from one statement service shared by the web and the API
  • A period lock: a dated entry into a closed month is refused, an entry in one cannot be edited or deleted, and a posting the product makes for you rolls forward to the first open day
  • Monthly depreciation posted to the ledger from a profile per asset, straight line or reducing balance, with disposal posting the gain or loss
  • A running balance on every journal row, accumulated in that account's natural debit or credit sense, with the side label flipping rather than the number going negative
  • Output tax split off a customer invoice and credited to Taxes Payable on its own line, so a filing figure exists without being reverse-engineered
  • A large-entries filter measured against your own average posting, so outliers surface without you setting a threshold
  • Per-account drill-down across only the accounts that carry activity, with each entry still linked to the document that caused it
  • Trial balance, income statement, balance sheet, cash flow and receivables/payables all reading the same rows
  • System accounts the statements are keyed to are locked against rename and deletion, even for roles that manage the chart
  • Every posting raises a workflow event, so automation rules can watch the ledger directly
  • The whole ledger mirrored on the API — the mobile app and your integrations read identical figures

More we can add to your workspace

  • A date range on the trial balance, and comparative periods on all three statements, so a month or quarter is set beside the one before it — the income statement already takes a date range and the balance sheet an as-at date
  • A maker-checker approval step and a reversal action on manual journals, which today post directly when the person entering them saves
  • Account numbering and a parent-child account hierarchy, with subtotals rolling up through the tree
  • Year-end closing entries, so a closed year moves its profit into retained earnings by entry — the month-end close already refuses a backdated posting into a closed period
  • A journal header that groups both legs of a posting under one document number, with a per-document view
  • Multi-currency postings with a period-end revaluation and an FX gain/loss account
  • Zero-balance accounts carried onto the trial balance for completeness where an auditor asks for the full list
  • Budget-versus-actual columns on the statements, drawing on the budgets you already keep
  • Branch and department tags on till sales and payroll postings, which arrive as one total today and sit in the Unassigned column of a breakdown
  • A dimension filter on the journal and ledger screens, matching the one the income statement already has
  • Depreciation defaults per asset class, so a new asset picks up its method and useful life — the monthly depreciation journal is already posted from a profile per asset
  • Scheduled delivery of a signed statement pack to your accountant on a monthly cadence

Where we point you to a specialist

  • Your statutory accounts carry your auditor's sign-off. We will build the ledger they audit and hand over every posting behind it; we will not put our name where theirs belongs.
  • Which account a novel transaction belongs in is your accountant's judgement. Tell us the rule and we will build the posting that follows it every time — the decision itself stays with the person who is accountable for it.
  • A prior-period restatement is an accounting decision with consequences outside the software, so it stays in your hands and your auditor's rather than being a button we ship.
  • We will not tell you whether a charge is deductible or an input tax is recoverable. That is advice, and a vendor willing to give it in a sales meeting is selling you a liability.

Everything in the middle column is scope rather than a ceiling — several of them are a few days of work on foundations that already exist. Tell us which you need and we will come back with a written spec, a timeline and a price to add it to your workspace.

One coupling worth knowing before you plan around it: revenue on an ad-hoc stock issue is recognised only where the movement's reason is flagged as revenue-generating, and that flag is matched on the reason's name. Rename a revenue reason and the postings that follow it need the flag set again on the new name.

Built on this ledger

Everything downstream reads these rows.

Income Statement Revenue and expense accounts grouped into a profit and loss, with the revenue-recognition rule spelled out. See the P&L → Balance Sheet Assets, liabilities and equity — including how retained earnings is computed rather than posted. See the position → Chart of Accounts The account list itself, the system keys the statements are wired to, and the receivables and payables accounts. See the structure → Accounting Overview Reconciliation, QuickBooks sync health and where the accounting module sits in the whole platform. Start at the top → Expense Management The capture path for costs that never touch a purchase order — and one of the ten posting routes above. Record the cost → Aging & AR/AP Per-customer and per-supplier detail behind the receivables and payables balances, with reminders. Chase the money → Bank Reconciliation Statement lines matched to the bank account’s ledger entries, the missing ones entered, and a completed statement locked. Tie out the bank → Bank Feeds The M-Pesa money moved through the app, and the statements your bank emails, arriving as statement lines ready to match. Stop uploading statements → Supplier Bills & Payables Bills against an order or without one, returns and debit notes, and payment runs — with what each one posts. Pay what is owed → Petty Cash & Staff Advances Floats as their own ledger accounts, vouchers and top-ups, and imprest issued, retired and reimbursed. Account for the cash box → Withholding Tax Deducted on supplier bills, booked as each payment lands, remitted against the liability, with a register and certificates. Withhold correctly → Departments, Branches & Projects The three tags a journal line can carry, and the records they come from before they reach the ledger. Set up the dimensions →
Questions, answered

General ledger FAQ.

Is this a real double-entry ledger or a transaction log with accounting words on it?
A real one. There is a single posting service in the platform, every operational routine goes through it, and it writes a debit and a matching credit together. Nothing in the application can write one side on its own, which is why the trial balance is a read rather than a test.
Do I have to post journals myself?
No — the routine postings are written by your operations rather than typed. For the entries no business document makes, such as an accrual, an opening balance or a correction, there are manual journals: balanced lines, a memo, an optional department, branch or project on each line, dated by the person posting, and refused for a closed month. An approval step and a reversal action on top of them are in the middle column above.
Can I see a trial balance for last month only?
Not the trial balance yet — it reads all activity to date. The income statement takes a date range and can be broken down by department, branch or project, and the balance sheet takes an as-at date. Cash flow has daily, weekly, monthly and yearly windows with a trend chart. A date range on the trial balance and comparative periods are scoped work on the same figures, not a rebuild.
What happens to an account that goes the wrong way?
Its side label flips and the number stays positive. An overdrawn bank account reads as a credit balance rather than as negative cash, both in the ledger and on the trial balance, because that is what it actually is.
How is tax handled when an invoice is fulfilled?
The invoice is treated as the authority. Receivables are debited with the gross the customer owes, revenue is credited net of tax, and the tax portion is credited to Taxes Payable on its own line. If an invoice's tax figure is impossible — negative, or larger than the total — the posting treats the whole amount as revenue and leaves the invoice to be corrected on its own terms rather than spreading a broken number into the ledger.
Does a point-of-sale refund reverse everything?
It reverses what actually happened, in three separate decisions. Revenue always comes back. Cost only returns to inventory if the goods did — a damaged return leaves the cost consumed. And cash is only credited where the tender genuinely moved money, so a refund still owed to a customer correctly leaves a credit sitting on their receivable.
Can our accountant get at the underlying data?
Yes. The journal, ledger and every statement are available over the API under a key you issue, and the QuickBooks integration syncs with its own health and exception reporting. Nothing about the ledger is trapped behind a screen.
Does the mobile app keep its own books?
No, and that is deliberate. Mobile adjustments, mobile POS and mobile invoice payments call the same posting service as the browser. A parallel accounting path for field work is the usual way two sets of numbers appear in one business.
Ready when you are

Close the books on the business you actually ran.

Not on a reconstruction of it, assembled weeks later from bank lines and memory. Every posting in AWRA OpsHub is written by the operation that caused it, both legs at once, the moment it happens.