Security & trust

Security and data residency, in plain English.

You are handing us your workers' personal details and your clients' commercial information. Here is how it is kept, who can reach it, and — just as usefully — what we do not claim.

Security pages usually read like a certification list. We do not have certifications yet, so this one is the other thing: a plain account of how the product is actually built. We are pre-launch, which is the most useful security fact here — every control below went in before anyone's data was in it, rather than after an incident.

01 / RESIDENCY

Where your data lives

One region, and we can tell you which. The application runs on Fly in Sydney and the database sits in the same city on AWS ap-southeast-2 — the closest region to New Zealand that a managed Postgres exists in. Nothing is quietly replicated offshore; adding an overseas processor would be a decision with a paper trail, not a config change.

  • Application and database both in Sydney (AWS ap-southeast-2)
  • HTTPS forced on every request, with strict transport security preloaded
  • Documents held in private storage and served by time-limited signed links, never a public URL
Data residency
ApplicationFly.io, Sydney
DatabaseSupabase, Sydney
In transitTLS, HTTPS forced
DocumentsPrivate, signed links
RegionsOne. Sydney.
02 / ISOLATION

Two boundaries, not one

Every agency is a separate tenant, and there are two independent things keeping them apart — which is deliberate, because a single control is a single point of failure. Inside the application, every query is scoped to your organisation in code and behind a permission check. Underneath, row-level security is switched on across the database, so the data API a browser can reach refuses to answer for anyone else's rows even if the application were bypassed entirely.

  • Row-level security enabled on 353 of the 354 tables — the exception is a mapping system table with no tenant data in it
  • Every application query scoped to your organisation, and re-checked against a live membership rather than trusting the login token
  • Cross-tenant tests run on every pull request, each proving both halves: the rival is refused, and your own staff still get through
  • Rival client companies inside one agency are separated too — a supervisor sees their own sites, not the competitor down the road
Tenant isolation
Tables with row-level security353 of 354
App-path scopingPer-query, permission-gated
Cross-tenant testsEvery pull request
Client-to-clientSeparated inside a tenant
03 / ACCESS

People see only what their job needs

Access follows the role, and the roles are yours to change. Thirty-three named permissions across twelve areas — candidates, pay and bill, compliance, settings and the rest — with fifteen roles seeded ready for a labour-hire desk. A consultant does not see payroll. A worker sees their own shifts, not your margins.

  • 33 permissions in 12 groups; 15 seeded roles you can edit or replace
  • Staff, client and worker are separate portals with separate rules, not one app with things hidden
  • Workers can register a passkey — a fingerprint, face or device PIN — and it proves it is really them when they clock in on site
  • Staff can sign in with their Microsoft account, or with email and password
  • Two-factor sign-in is available for anyone who turns it on
04 / AUDIT

A record that cannot be quietly edited

Sensitive actions are written to an append-only audit log, and each entry is hash-chained to the one before it within your tenant. The chaining is done by the database itself as the row is written, not by the application asking nicely, so changing what an old entry recorded breaks every hash after it. A scheduled job re-walks the chain nightly and shouts if it does not add up.

  • Chained per tenant, in the database, at write time
  • Append-only: no path in the product updates or deletes an entry
  • Re-verified nightly, end to end
  • Answers who did what, to which record, and when
The audit chain
ScopePer tenant
Written byThe database
HashedThe event payload
Outside the hashTimestamp, IP, user agent
VerifiedNightly
DeletableNo
05 / RETENTION

Keeping things, and getting rid of things

New Zealand privacy law says personal information should not be kept longer than it is needed, and employment and health-and-safety law says some of it must be kept for years. Those pull in opposite directions, so retention is a setting you control per tenant rather than a number we chose for you — and a legal hold beats it.

  • Retention periods set per record type, in your own settings
  • An hourly sweep applies them; it is not a promise that runs once a year
  • A legal hold stops deletion at the database itself, on 25 record types, so even a cascading delete cannot get past it
  • Holds are checked again in the application before any erasure runs
Retention and holds
Retention rulesYours, per record type
SweepHourly
Legal holds25 record types
Enforced atDatabase and app
06 / AI

The AI does nothing you have not allowed

Workhr has an assistant that can read your data and take actions. Because that is a genuine risk surface, it ships with the switches on the outside: turn it off for the whole organisation, put it in read-only mode so it can answer but never change anything, or leave it on and choose action by action what it may do.

  • One switch turns the assistant off for the entire organisation
  • Read-only mode blocks every write, regardless of the individual settings
  • Per-action switches for everything that changes data
  • Tool calls that change data are written to the audit log like any other action
07 / THE BUILD

Controls that run before the code ships

Most breaches are not clever. They are a leaked key, a stale dependency or a header nobody set. Those are checked mechanically, on every change, rather than being somebody's job to remember.

  • Ten checks run on every pull request, including a secrets scan of the whole repository
  • Dependencies are scanned against public advisories, and a critical vulnerability blocks the merge
  • A strict content security policy with a per-request nonce, framing denied, and HSTS preloaded
  • Sign-in and sign-up are rate limited
08 / HONESTY

What we do not claim

A security page that only lists strengths is not a security page. These are the things a careful buyer will ask about, and the true answer to each. We would rather you hear them here than find them in month three.

  • No SOC 2 and no ISO 27001. Neither has been started, and we will not imply otherwise.
  • No penetration test has been carried out yet.
  • We quote no recovery-time or recovery-point objective and describe no backup guarantee. Backups are whatever our managed database provider's plan holds; ask, and we will tell you what that is on the day rather than print a number here we have not tested.
  • Two-factor sign-in is available but not enforced, so it is only as strong as your team's uptake.
  • Passkeys are not a way to sign in, for anyone. The worker portal uses them to prove identity at site clock-in; every account still signs in with a password or a Microsoft account.
  • There is no SAML or SCIM provisioning — signing in with a Microsoft account is not the same thing, and we do not call it that.
  • One region means one region: there is no second-region failover, and we publish no uptime figure because we do not yet measure one.
  • The cross-tenant test suite proves the highest-risk tables directly and names the rest; it does not yet carry an executing assertion for every table in the schema. We will show you the coverage report.
  • No customer references, case studies or logos. We are pre-launch. Everything above is a description of the build, not of someone else's experience.
Certification status
SOC 2Not started
ISO 27001Not started
Penetration testNot yet conducted
Published uptime SLANone
FAQ

The questions your buyer will ask.

Where exactly is our data stored?
Sydney, Australia. The application runs on Fly in the syd region and the database is a managed Supabase Postgres in AWS ap-southeast-2. There is no New Zealand region for either, so Sydney is the nearest place your data can sit; we describe that as regional Australia and New Zealand residency rather than New Zealand residency, because Sydney is in Australia and the distinction matters if your client asks.
Two of our clients compete with each other. Can they see each other's information?
No, and this is designed for rather than assumed. Client supervisors reach Workhr through a separate portal from your staff, and each is scoped to the companies and sites your agency has granted them. Cross-tenant and cross-client access is tested on every code change, and each test has to prove both directions: that the rival is refused, and that legitimate access still works — a test that only proves refusal would also pass if the whole page were broken.
Is our data isolated at the database, or just in the application?
Both, and they are independent. Row-level security is enabled on 353 of 354 tables and is what stops the data API a browser can reach from returning another tenant's rows. Separately, every query the application makes is scoped to your organisation in code and gated by a permission check, with membership re-read from the database rather than trusted from the login token. We call that out rather than saying 'the database enforces it', because the two controls cover different paths and a buyer's security team will want to know which is which.
Can someone edit the audit log to cover their tracks?
Not without it showing. Each entry's hash is computed from what the entry recorded and the hash of the previous entry in your tenant, and the database does that as the row is written. Change what an old entry says and every hash after it stops matching, which a nightly verification pass reports. Nothing in the product updates or deletes an entry. Then the boundary, because your reviewer will ask for it: the hash covers the event payload, not every column beside it. Who did what, to which record, is written into that payload as well, and the nightly pass cross-checks that the two still agree. The row's timestamp, IP address and user agent sit outside both. So the honest guarantee is that the recorded history cannot be silently rewritten — not that every byte of the table is sealed.
Do you have SOC 2 or ISO 27001?
No. Neither is started, there is no auditor engaged, and we have never been penetration tested. We are a pre-launch company and we would rather tell you that than let you assume otherwise and find out during procurement. What we can give you is the detail above, a walkthrough with whoever needs to sign off, and straight answers to a security questionnaire.
Do you enforce multi-factor authentication?
It is available, not enforced. Anyone can turn on a time-based one-time code from their profile. Workers can also register a passkey, and it is worth being exact about what that does: it proves identity when they clock in on site, not when they sign in. Nothing in Workhr authenticates a login with a passkey today. What does not yet exist is a policy that requires it for an admin or finance role, so today it is as strong as your team's uptake. If mandatory MFA is a condition of your sign-off, say so early — it is a known gap with a known shape, not a surprise.
Do you support single sign-on with our identity provider?
Staff can sign in with a Microsoft account, and that works today. What we do not have is enterprise SSO in the sense your IT team means it: no SAML, no automatic provisioning or deprovisioning of users from your directory. If that is a requirement, treat it as not built.
Does your AI read our data, and can we stop it?
It can read what the person asking is allowed to see, and it can take actions you have permitted. You control that from your own settings: an organisation-wide off switch, a read-only mode that blocks every write regardless of anything else, and per-action switches for everything that changes data. Every tool call that changes something lands in the same audit log as any other action.
What happens to a worker's personal information when we no longer need it?
You set the retention period per record type, and an hourly sweep applies it. A legal hold overrides it: while a hold is on, deletion is refused by the database itself across 25 record types, and checked again in the application — so a hold placed for a dispute or an investigation cannot be undone by a routine tidy-up.
Who at Workhr can see our data?
Operationally, the people who run the platform can reach the database — that is true of every hosted SaaS, and any vendor telling you otherwise is describing a product that could not be supported. What we can say specifically is that support access is not a separate unlogged back door: the same audit log records privileged actions, and the tenant separation described above applies to the product itself, not just to your users.

Why it matters for your desk

In one region

Sydney for the app and the database. No offshore replication.

Two boundaries

Tenant scoping in the app, row-level security under it.

Accountable

A hash-chained record of sensitive actions, verified nightly.

Straight answers

No certifications yet, and this page says so.

Ask us the hard security questions.

Send us your questionnaire, or book a walkthrough — we will answer with the same specificity as this page.

Security & data residency — Workhr