AWRA OpsHub Search
Profit & loss

Profit is not a spreadsheet. It is what the ledger says.

Your income statement in AWRA OpsHub is not typed up from anywhere. Revenue accounts on one side, five named groups of cost on the other, both read straight out of the postings your sales, stock, expenses and payroll already made — with the recognition rule written down instead of assumed.

Read from the general ledger · Explicit revenue recognition · Five named cost groups · Mirrored on the API

The statement

Two sides, and a rule for each account.

There is no clever inference here, and that is on purpose. Every account carries a system key, and the statement's revenue and expense sections are defined as lists of those keys — so you can point at any line and say precisely which accounts produced it.

Income Statement All activity to date
Revenue
Sales Revenue sales_revenue 7,904,118.40
Total revenue 7,904,118.40
Expenses
Purchases purchases 1,204,660.00
Cost of Sales expenses 4,182,900.10
Payroll Expenses payroll_expenses 2,884,300.00
Operating Expenses operating_expenses 918,340.00
Depreciation depreciation 0.00
Total expenses 9,190,200.10
Net result (1,286,081.70)
The key beside each line is the point

Accounts are grouped by system key, not by matching words in their names. Rename "Operating Expenses" to "Overheads" and the line keeps working, because the statement follows the key rather than the label. That is also why a new account you create appears on the statement the moment you give it a grouped key — and stays off it if you do not.

Depreciation has a line and no engine

The group exists and any posting to a depreciation account rolls into it. What we have not built yet is the thing that writes those postings — a schedule that walks your asset register monthly. So the line reads zero until something puts a figure there.

Net result, not always net income

The statement labels its bottom line honestly. Where there is revenue it reads as a net income figure; where a workspace is recording cost before it records any sales, it reads as operational expenses instead of pretending a loss is a profit with a minus sign.

Revenue recognition

When does a movement of stock become revenue?

Most systems answer this question implicitly and leave you to reverse-engineer it from the numbers. AWRA answers it with a flag you control, on the reason codes you already use to describe why stock moved.

1
Stock leaves against a reason

Every issue, check-out and adjustment carries a reason — sold, sample, damaged, internal transfer, written off. That reason is the business meaning of the movement, and you maintain the list yourself.

The reason carries a revenue flag

Each reason has a generates revenue switch. "Sold to customer" has it on. "Damaged in transit" does not. This is the whole recognition policy, expressed once, in the vocabulary your storekeepers already use rather than in an accounting setting nobody opens.

2
Fulfilling an approved invoice sets it for you

Check out an approved customer invoice and the platform reaches for a system reason called Approved customer invoice, creating it with the revenue flag already on if it does not exist. So the ordinary invoice-to-delivery path recognises revenue correctly on day one with nothing configured.

3
The invoice prices it, not the price list

Where an invoice is behind the movement, the invoice is the authority on all three figures: the agreed total including any negotiated discount, and the tax split out. Receivables take the gross the customer owes, revenue is credited net, and tax lands in its own account. The item's list price never overrides what you actually billed.

4
An ad-hoc issue with no invoice still recognises

Give something away for value against a revenue-flagged reason without raising an invoice, and there is no tax basis and no document to price against — so the fallback total is credited gross to revenue and receivables are debited, because something left for value and nobody has recorded payment for it.

Worth knowing before you rename a reason

The revenue flag is resolved by the reason's name rather than by an internal identifier. That makes the policy readable — you can see it in the reason list — but it also means renaming a revenue-generating reason needs the flag set again on the new name. If your reason list is settled, this never comes up; if you are still shaping it, set the flag last.

The cost side

Five groups, each one filled by a different part of the business.

The value of naming them is that you can trace any figure back to the operation that produced it, without a drill-down and without asking anyone.

Purchases purchases

Goods bought in. Filled by receiving against purchase orders and by stock check-ins.

Cost of sales expenses

The buying cost of what left the shelf, posted by every point-of-sale sale and every invoiced issue at the moment it happens.

Payroll payroll_expenses

Filled by posting an approved payroll run, and by project payouts — which deliberately use the same account so labour cost never disagrees with itself.

Operating expenses operating_expenses

Rent, utilities, subscriptions, bank charges — the standalone spend recorded through expense management.

Depreciation depreciation

Reserved and grouped, ready for a depreciation schedule to post into. See the ledger below for what that involves.

Notice what is happening with cost of sales. In a business running on a spreadsheet, gross margin is a month-end calculation: total the sales, total the purchases, subtract, hope the stock count agrees. Here the cost of each sale is posted at the sale, out of the same item cost the inventory module uses. That means the cost side of your statement moves in step with the revenue side rather than lagging it by a stock take — which is the difference between knowing your margin and estimating it.

It also means a mistake shows up somewhere you will see it. If cost of sales looks impossibly small next to revenue, the item costs behind it are wrong, and that is a fixable data problem with a name. In the spreadsheet version, the same error is a slightly optimistic margin that nobody questions for a year.

Straight answers

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

A profit figure is the last place for a vague claim, so here is exactly what this statement is, and exactly what we would build onto it for you.

The straight answer

What AWRA OpsHub does today

  • A profit and loss read straight from the general ledger, with no export, no import and no second set of books
  • Revenue and expense sections defined as explicit lists of account system keys, so every line names the accounts behind it and survives an account being renamed
  • A revenue-recognition rule you control, carried on the reason codes your storekeepers already use
  • Approved customer invoices recognising revenue automatically through a system reason created with the flag already set
  • The invoice as the authority on price — negotiated totals and discounts respected, tax split off to its own account rather than inflating revenue
  • Cost of sales posted at the moment of sale from the same item cost the inventory module uses, so margin moves with revenue instead of waiting for a stock count
  • Five named cost groups — purchases, cost of sales, payroll, operating expenses and depreciation
  • An honest bottom line that reads as operational expenses rather than a negative profit where a workspace has costs and no sales yet
  • Payroll and project payouts posting to one shared expense account, so labour cost cannot disagree with itself
  • The whole statement mirrored on the API for the mobile app and your own integrations

More we can add to your workspace

  • A date range with comparative periods — this month against last, this year against last year, and a year-to-date column
  • Point-of-sale takings carried into this statement's revenue line alongside invoiced sales, so a counter-heavy business reads its whole top line here
  • A gross profit subtotal drawn between cost of sales and operating expenses, with a margin percentage beside it
  • A depreciation schedule that walks your asset register monthly and posts into the depreciation group that is already waiting for it
  • Budget-versus-actual columns and variance percentages, drawing on the budgets you already keep
  • Revenue and cost segmented by department, location, project or customer, so the statement can be read a slice at a time
  • A PDF and Excel statement pack, and scheduled delivery of it to your accountant on a monthly cadence
  • Accrual adjustments and prepayment amortisation posted on a schedule you define
  • A per-line drill-through from a statement figure to the individual postings behind it

Where we point you to a specialist

  • Which accounting standard your statements are prepared under is a decision for you and your auditor. We will build the statement to the basis they specify; we will not choose it on your behalf.
  • Whether a cost is capital or revenue in nature is a judgement with tax consequences, so it stays with your accountant. Tell us the rule and we will build the posting that follows it every time.
  • We will not tell you whether a charge is deductible. That is advice, and a software vendor giving it in a sales meeting is selling you a liability.
  • Your filed accounts carry your auditor's sign-off. We hand over every posting behind the statement and stay out of the signature block.

The first two items in the middle column are the ones customers ask for most, and both are scoped work on figures that already exist rather than new plumbing. 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 thing to plan around rather than discover: this statement and the retained earnings figure on the balance sheet compute profit on different bases today — this one applies the revenue-recognition rule above, while retained earnings totals the revenue and expense accounts directly. Bringing both onto a single basis is on the list above and we will quote it.

Questions, answered

Income statement FAQ.

Is this generated from my operations or do I have to prepare it?
Generated. It reads the general ledger, which your sales, stock movements, expenses, payroll runs and vendor payments wrote as they happened. There is no preparation step and nothing to import.
How do I control what counts as revenue?
Through the revenue flag on your reason codes. A reason like "Sold to customer" carries it; "Damaged in transit" does not. Fulfilling an approved customer invoice uses a system reason that already has the flag set, so the standard sales path works with nothing configured.
Can I see last quarter on its own?
Not today — the statement reads all activity to date. A date range with comparative and year-to-date columns is the first item in the middle column above, and it is scoped work on figures that already exist rather than a rebuild.
Where is gross profit?
Cost of sales is posted and appears in the cost side, so the components are all there — but the statement does not yet draw a formal gross-profit subtotal with a margin percentage between cost of sales and operating expenses. That is on the list above.
Why does the depreciation line read zero?
Because the group is ready and nothing writes to it yet. A depreciation engine — per-class rates, residual values, a monthly posting — is work we can add, and the asset register it would read from already exists.
Can I split the statement by branch or project?
Not yet. Costs can already be attributed to a project and surface in that project's own profitability view, so the attribution exists at the record level; carrying it up into a segmented income statement is scoped work.
Does my accountant have to work in AWRA to use this?
No. The statement is available over the API under a key you issue, the QuickBooks integration syncs with its own health and exception reporting, and every figure drills back to postings they can inspect.
Ready when you are

Find out what you earned without asking anyone.

The revenue is already recognised. The cost of sales is already posted. Payroll is already in. Your income statement is a page you open, not a task somebody owes you.