GuardCore · Quoting & billing
Price the guarding, then bill the hours it actually took
Nine security calculators over one build-up — base rate, productive-hours uplift, on-costs, overhead, margin, GST — and an accepted estimate that writes the contract rather than being retyped into it.
The problem this solves
A guarding bid is usually priced in a spreadsheet nobody else can open, from an hourly rate and an optimistic view of how many hours the post really needs. It prices last year’s contract, and when the margin turns out wrong there is no way to find which line was wrong.
GuardCore prices the work. Guard hours split by day type, a static post, a mobile patrol run whose cost is allocated across the sites it covers, alarm response, event crowd control, control-room monitoring, equipment and vehicles, mobilisation, and a premium for a licence class — nine calculators, each with its own unit, all through one build-up: the base rate, the divisor that turns paid hours into productive ones, the on-costs, the overhead, the margin and the GST.
It is not an award engine, and that is a decision rather than a shortfall. Penalty rates arrive as your own effective-dated rows, minimum engagements arrive as your own bands, and a crowd ratio arrives with the label its provenance is written on. Nothing is ever priced at zero: an unresolvable rate produces no unit cost and a named warning instead of a line that quietly costs nothing.
Then the commercial record is continuous. An accepted security estimate writes a static-guard contract on the security service line, with its rates. Approved hours are priced against those rates — site, then contract, then organisation — into invoice lines that keep the hours they were built from, so an attempt to bill the same hour twice is refused and told to raise a credit note instead. The month leaves as a Xero or MYOB import file, column for column.
Worked example
A tender for two static posts, a nightly mobile patrol over four sites, and alarm response.
- 1
Each line has its own calculator
Posts priced per hour by day type, the patrol run priced per event and allocated across its four sites, alarm response priced per period — rather than everything converted to hours first.
- 2
One build-up, applied the same way
Base rate, productive-hours divisor, on-costs, overhead, margin and GST, with the realised margin checked against the profile’s floor.
- 3
Accepting it writes the contract
A static-guard contract on the security service line, with its rates — so the price that won is the price that bills.
- 4
The hours bill once
Priced by rate type against those contract rates, with each invoice line keeping the hours behind it. A second attempt is refused and pointed at a credit note.
The bid can be defended line by line six months later, and nothing between winning it and invoicing it was retyped.
Capabilities
What quoting & billing gives you
All 7 of these are in the product today. Each one names what it is built on.
GuardCore Estimator
LiveNine security calculators over one build-up — guard hours by day type, a static post, a mobile patrol run allocated across its sites, alarm response, event crowd control, control-room monitoring, equipment, mobilisation and a licence-class premium.
A security estimate is not a cleaning one
LiveOne engine, two domains, and an estimate must declare which — the line types differ, and an accepted security estimate writes a static-guard contract on the security service line rather than something a person retypes.
Rates that know a static post from a patrol
LiveContract rates typed by service — static guard, mobile patrol, alarm response, event — and by rate type, effective-dated and overridable per site, so a rate rise is a new row rather than an edit to history.
Invoices built from approved hours
LiveApproved hours priced by rate type, one line per rate, with the rate resolved site, then contract, then organisation — and an unresolvable rate producing a named refusal rather than a line that quietly costs nothing.
An hour bills once
LiveEach invoice line keeps the hours it was built from, and an attempt to bill them again is refused with the instruction to raise a credit note against the earlier invoice — which is the difference between a billing system and a spreadsheet.
Recurring billing on the contract
LiveOne schedule per contract, in the same cadence vocabulary the report schedules use, drafted by the background worker — so a monthly invoice is not a recurring diary entry for a person.
Export to Xero, MYOB or plain CSV
LiveThe import layouts those two products actually accept, column for column, with the account and tax codes resolved from your own mapping — a file you upload, not a connection we do not have credentials for.
What backs these claims
Each capability names the decision record, module, route or table it is built on. Ask us for any of them in an evaluation and we will walk you through the code.
- GuardCore Estimator
- ADR 0051 · src/lib/imss-estimator-security.ts priceGuardHours priceMobilePatrolRun · /imss/guardcore-estimator · imss_estimates
- A security estimate is not a cleaning one
- ADR 0051 · src/server/imss-estimating.ts ESTIMATE_DOMAINS · src/lib/imss-estimator-core.ts computeEstimate
- Rates that know a static post from a patrol
- imss_contract_rates · /imss/contracts · GET /api/imss/contracts
- Invoices built from approved hours
- src/server/imss-invoice.ts buildInvoice resolveRate · POST /api/imss/invoices/generate · imss_invoice_lines
- An hour bills once
- ADR 0027 · ADR 0029 · src/server/imss-invoice-payments.ts · src/server/imss-invoice-credit-notes.ts
- Recurring billing on the contract
- ADR 0019 · src/server/imss-billing-schedule.ts · imss_billing_schedules
- Export to Xero, MYOB or plain CSV
- ADR 0028 · src/server/imss-invoice-export.ts xeroRow myobRow · /imss/accounting-export
Where this sits
Back to
GuardCore — every capability in one place
The whole module: what is live, and what is only on the roadmap.
Read next
Rostering that refuses the guard it ought to refuse
Eligibility worked out live for the shift date from the licences on file — never from a stored score that has gone stale — and the licence class the shift asks for checked, not just that a licence exists.
Twenty minutes on a real contract.
Real data, four logins, nothing typed on the day — including the parts we have not built, which we will point out ourselves.