Security at Hunter
Hunter separates one business’s data from another’s in the database itself. Every tenant table carries an organisation id and has Postgres row-level security enabled on it, and every policy is keyed to a signed claim in your session token rather than to anything a browser can send. On top of that sit a role model, a service layer that filters by organisation a second time, an audit log of significant changes, and an AI agent that must ask a person before it messages a customer or moves money. Hunter does not hold a SOC 2 or ISO 27001 certification, and this page says so plainly rather than implying otherwise.
Last reviewed
Tenant isolation
- Row-level security on every tenant table
- Every table holding customer data carries an organisation id and has Postgres row-level security enabled, with policies of a single shape: a row is visible only when its organisation id matches the one on the current session. Isolation is enforced by the database, not by remembering to add a filter in application code.
- The organisation id comes from a signed token
- Your organisation and role are minted into your session token by a Supabase access-token hook at sign-in, and the policies read that claim. It is signed, it is not settable from the browser, and the function that issues it cannot be called by any client role.
- A second filter in the service layer
- All business logic lives in one service layer, and those functions filter explicitly by organisation as well — deliberate duplication, so that the paths which must bypass row-level security (webhooks, scheduled jobs, public portal pages) are still scoped by the same rule.
- Files are scoped the same way
- Uploaded documents, photos and safety data sheets live in a private storage bucket whose access policies key on the organisation that owns the path, so a file is no more reachable across tenants than a database row is.
Access control
- Four roles, checked before anything happens
- Owner, admin, office and technician, checked in the service layer before a mutation runs rather than by hiding a button. A technician who reaches an office-only action by any route is refused by the same check the screen was hiding.
- Technicians are scoped to their own work
- Technician accounts are read-mostly and write only against their own jobs. Their schedule and timesheet reads are rewritten to their own records regardless of what is asked for, including through the AI agent, and settings other than their own email signature are closed to them.
- Billing and configuration are gated separately
- Billing, plan changes and payout setup require an owner or admin. Integration connections, org settings and AI configuration require office and above.
- Sign-in
- Email and password, or Google sign-in, on Supabase Auth. Sessions are short-lived tokens with rotating refresh, verified locally on each request. Multi-factor authentication and enterprise SSO are not available yet — see "what we don’t claim yet" below.
Customer-facing links and payments
- Card details never reach Hunter
- Invoice payments are taken on Stripe’s own hosted checkout page. Hunter stores Stripe’s references — a payment id, an amount, a fee — and has nowhere to put a card number. There is no screen in the product that displays one.
- Portal links are tokenised bearer credentials
- Quotes, invoices and reports are shared as links carrying a 192-bit random token, scoped to one record and one purpose so an invoice token cannot open a quote. A link can be rotated, which invalidates the old one immediately.
- Signed, deduplicated webhooks
- Every inbound webhook — Stripe, Xero, QuickBooks, telephony, email — is signature-verified with a constant-time comparison before it is processed, fails closed in production when the secret is absent, and is deduplicated so a retried delivery cannot record the same event twice.
- Connected-system credentials are encrypted at rest
- When you connect Xero, QuickBooks or your mailbox, the access and refresh tokens are encrypted with AES-256-GCM before they are stored, and decrypted only in the moment a call to that provider is made. They are stripped from every read the rest of the application performs, so a credential cannot reach a screen, a log, or the AI agent's context. Connecting an integration fails rather than storing a token unencrypted.
The AI agent
- Nothing reaches a customer without approval
- Outbound messaging tools pause for a human, showing the resolved recipient, channel and exact body for approval or editing before anything is sent. Reading, drafting and planning are unrestricted; sending is not.
- Per-routine tool policy and dollar guardrails
- Automated routines carry an explicit policy of which tools they may use and a monetary ceiling on money-bearing actions. A routine that exceeds its ceiling degrades into a proposal for a person rather than executing.
- The phone agent verifies who it is talking to
- Caller ID is treated as a hint, not an identity. Before disclosing or changing customer information, the voice agent can require a one-time code sent to the number on file and read back, and codes are stored hashed rather than in the clear.
- Call transcript retention is yours to set
- Voice transcripts and recordings are purged on a per-organisation retention window, defaulted to 90 days rather than to forever.
Accountability
- An audit log of significant changes
- Significant mutations write an activity entry recording who acted — a named user, the agent, a routine or the system — what changed field by field, and when. It is queryable by you, per record and across the workspace, and it is what job and customer diaries are built from.
- Support access is allowlisted, time-boxed and visible
- A Hunter support person can only enter a workspace if they hold an explicit platform grant and an internal email address. The session is capped at two hours, shows a persistent banner the entire time, grants no ongoing membership, and writes an entry into your own activity log naming the person and the reason.
- Secrets stay on the server
- Service-role database credentials and provider keys are server-side only and never shipped to the browser; the client receives only public keys. Provider credentials that belong to your workspace are stored per organisation rather than in shared configuration.
How tenant isolation actually works
Hunter is multi-tenant, and the isolation between tenants is enforced by PostgreSQL rather than by application code being careful. Every table that holds customer data carries an organisation id and has row-level security enabled on it, with policies that resolve to one comparison: does this row’s organisation match the organisation on the current session?
The important part is where that organisation comes from. It is not a parameter, a header or a value the browser supplies. When you sign in, a Supabase access-token hook resolves your active membership and mints your organisation and role into the signed session token, and the database policies read the claim out of that token. The function that mints it can only be executed by the authentication service; it is revoked from every client-facing role. So the worst case for a compromised or malicious client is that it asks for data belonging to its own organisation, because that is the only organisation its token can name.
There is a second layer, and it exists because of the paths that cannot use your session at all. A Stripe webhook, a nightly job and a public quote link have no signed-in user, so they run with a privileged database connection that bypasses row-level security. Every one of those paths is entered through the same service functions as the rest of the app, and those functions filter by organisation explicitly regardless of which connection they are on. The duplication is the point: one mechanism protects against a query that forgot, the other protects against a context that has no session to check.
Roles, and what a technician cannot do
Hunter has four roles — owner, admin, office and technician — and they are checked in the service layer before a mutation runs, not by hiding a button in the interface. Reaching an office-only action by any other route hits the same refusal the screen was hiding.
Technicians are the role most worth describing, because their accounts are on phones that get lost. A technician account is read-mostly and writes only against its own work: their jobs, their chemical applications, their checklists, their timesheet. Requests for schedule or timesheet data are rewritten to their own records regardless of what was asked for, including when the request comes through the AI agent. Settings are closed to them apart from their own email signature, billing is closed entirely, and customer editing, archiving and call history are not available to them.
It is worth being precise about the layering rather than overselling it: tenant isolation is enforced in the database, and the role restrictions above are enforced in the service layer on top of it. Both run on every request, and the service layer is the only way into the data — but they are two mechanisms, not one, and a security page that blurs them is not being straight with you.
Portal links are bearer credentials, and behave like it
Hunter sends quotes, invoices, reports and booking pages to your customers as tokenised links: a long random string that opens exactly one record, with no account and no password. That is what makes them work — a customer standing at their front door will open an SMS link and will not create an account.
It also means the link is a bearer credential. Anyone holding it can see that record, so it deserves the same care as anything else you send a customer. Tokens are 192 bits of cryptographically random data and are scoped to both a record and a purpose, so an invoice token cannot be pointed at a quote. If a link ends up somewhere it shouldn’t, rotating it invalidates the old one immediately.
One honest detail: most portal links do not expire on a timer by default, which is the deliberate trade for a customer being able to open an invoice from an email three weeks old. Referral links are the exception and do carry an expiry.
What the AI agent may do on its own
Hunter’s agent has tools over your whole business, which makes the boundary on those tools the most consequential security control in the product. The boundary is drawn at the edge of your business: reading, analysing, drafting and preparing happen freely, and anything that reaches a customer or moves money stops and asks.
Approval means you see the artefact, not a description of it. For a message, that is the resolved recipient, the channel and the exact words, editable before you approve. The same gate sits in front of refunds, charging a card on file, issuing a credit note and committing a ledger import. Automated routines carry an explicit policy of which tools they may use, plus a dollar ceiling on money-bearing actions, and a routine that would exceed its ceiling turns into a proposal rather than acting.
On the model itself: the agent runs on Claude from Anthropic, and voice calls are carried by ElevenLabs. Both process data outside Australia, which the privacy policy discloses as an overseas transfer rather than leaving it implied. Where the providers’ own terms govern how they handle that data, we say so and point at their terms — we don’t restate a provider’s policy as though it were a control we built.
When Hunter support needs to look at your workspace
Sometimes the fastest way to fix something is to see it. Hunter’s support impersonation is built so that this is possible without anyone quietly acquiring standing access to your business.
A support person can only enter a workspace if they hold an explicit grant in a platform allowlist and carry an internal email address — the domain alone is necessary but not sufficient. The session is scoped through the same token mechanism as everything else, so every access rule that applies to a normal user applies to them; they gain no membership in your organisation and nothing persists when the session ends. It is capped at two hours so a forgotten session closes itself, a red banner is visible for the whole of it, and starting and ending it both write entries into your own activity log naming the person and the reason.
Hunter staff are also excluded from your team list and from your billable seat count, so a support visit never shows up on your invoice.
Where your data is hosted
Hunter runs on Supabase (PostgreSQL, authentication and file storage) and Vercel. All traffic is served over HTTPS, and the database is a managed Postgres instance with the platform’s encryption and backups.
We will tell you the deployed hosting region in writing on request rather than asserting one on a marketing page, because the honest answer has two parts. Your operational data — customers, jobs, invoices, compliance records, documents — lives in the primary database. Separately, AI features send data to Anthropic and, for phone calls, ElevenLabs, both of which process outside Australia. Our privacy policy discloses that overseas processing under Australian Privacy Principle 8. If data residency is a procurement requirement for you, ask before you buy and we will answer it specifically.
What we don’t claim yet
Hunter is an early-stage product, and a security page is worth nothing if it is written to survive skimming rather than reading. So here is the list of things we are not, stated as plainly as the list of things we are.
None of these is a reason not to buy. Each is a reason to ask us where it stands before you do, and to hold us to the answer.
- Hunter does not hold SOC 2 Type I or Type II certification.
- Hunter does not hold ISO 27001 certification, and has not been IRAP assessed.
- No independent penetration test has been commissioned to date.
- Multi-factor authentication is not yet available, and there is no SAML or enterprise SSO — sign-in is email and password, or Google.
- There is no self-service export of your entire workspace. Reports and timesheets export as CSV; a full extract is a request to us.
- There is no self-service account deletion. Deletion is handled on request, under the retention terms in the privacy policy.
- OAuth credentials for connected systems (Xero, QuickBooks, mailboxes) are encrypted at rest, but the key that opens them lives in the deployment environment rather than a dedicated key-management service or HSM. Moving it behind one is planned work, not finished work.
- We publish no recovery time or recovery point objective. Backups are the managed platform’s; we won’t quote a number we don’t run ourselves.
- The activity log records changes to business records. It is not a security event log, and does not record sign-ins or IP addresses.
Reporting a security issue
If you believe you have found a vulnerability in Hunter, email vish@usehunter.ai with enough detail to reproduce it. We will acknowledge you, tell you what we found, and tell you when it is fixed.
We do not run a paid bug bounty and we make no promises about payment. We do commit to not pursuing anyone who reports a genuine issue in good faith, who does not access or modify data belonging to another organisation, and who gives us a reasonable window to fix it before publishing. If you are a customer with a security question rather than a finding — a procurement questionnaire, a residency question, a question about a control on this page — the same address reaches us.
Common questions
- Is Hunter SOC 2 or ISO 27001 certified?
- No. Hunter holds neither certification, has not been IRAP assessed, and has not commissioned an independent penetration test. Rather than imply otherwise, this page describes the architecture in detail — per-tenant row-level security in Postgres keyed to a signed session claim, role-based access checked in the service layer, audit logging of significant changes, and a human approval gate on anything the AI agent sends or charges — so you can assess it on what it actually is.
- How is my data kept separate from other Hunter customers?
- By the database, not by application code being careful. Every table holding customer data carries an organisation id and has Postgres row-level security enabled, with policies keyed to a signed claim in your session token that the browser cannot set. The service layer then filters by organisation a second time, which is what keeps the paths that have no session — webhooks, scheduled jobs, public portal links — scoped to the right tenant as well.
- Does Hunter store my customers’ credit card numbers?
- No. Card details are entered on Stripe’s own hosted checkout page and held by Stripe. Hunter stores only Stripe’s references to a payment, and there is no screen anywhere in the product that displays a card number. Saved cards for autopay are held by Stripe too — Hunter keeps the customer reference, not the card.
- Can the AI agent email my customers without me seeing it first?
- No. Every outbound messaging tool pauses for a human and shows the resolved recipient, the channel and the exact message body for approval or editing before anything is sent. The same gate covers refunds, charging a saved card, issuing a credit note and committing a ledger import, and automated routines carry a dollar ceiling above which they produce a proposal instead of acting.
- Where is my data hosted, and is it in Australia?
- Hunter runs on Supabase and Vercel, and we confirm the deployed hosting region in writing on request rather than asserting one here. Note that AI features send data to Anthropic, and phone calls to ElevenLabs, both of which process outside Australia — our privacy policy discloses that as an overseas transfer. If residency is a procurement requirement, ask us at vish@usehunter.ai before you buy.

Get started
Run your whole pest business from one place
Book a walkthrough or start a free trial today. Live in under a week, with no lock-in — and your data is always yours.
14-day free trial · No lock-in contracts · Built for NSW, VIC, QLD, WA, SA, TAS, ACT & NT