Security

Your quotes hold your customers' names, their addresses and your prices. This is what protects them, written so you can check it rather than take it on faith — including the parts we have not built yet.

Last reviewed 5 October 2026 Checked against the code by automated tests

The short version

If you read nothing else, read this.

Signing in

Hashed passwords, signed sessions that expire — and no MFA yet.

There is no multi-factor sign-in today. If someone has a user's password, they have that user's RoofMap. That is the gap we would most like to close, and saying so is more use to you than a paragraph that talks around it.

What sits on a phone on site

A working copy so the app survives no signal — protected by the phone, not by us.

RoofMap keeps working on a roof with no coverage, which means the job you are on is held in the browser's own storage on that device until it syncs. That copy includes the drawing, the measurements and any photos you have taken, plus your sign-in token and your layout preferences. Once the work reaches our servers the local copy is deleted.

RoofMap does not add its own layer of encryption on top of that. It relies on the device's own disk encryption and lock screen — which on any current iPhone or Android is on by default and is genuinely strong, but is the phone's protection rather than ours. This is the same position as every other browser-based field tool, and we would rather you knew it than assume we had done something extra.

What follows from that is practical: put a PIN or biometric lock on any device that opens RoofMap, and sign out on a shared or borrowed one — signing out clears the local copy.

Keeping one business out of another's

Every query is filtered by the business that asked, and a test tries to break it.

Every job, drawing, photo, quote, price book and setting belongs to exactly one business. Every read and every write the server makes is filtered by that business before it reaches the database, so there is no screen and no API call that can return another company's rows.

Saying that is easy, so it is tested rather than asserted. One suite signs in as one business and tries to reach another's job, quote and backup by putting their ids in the URL — the way a real attempt would look — and the build fails if any of it comes back. Another feeds a job full of customer names, addresses and prices through every one of the admin screens we use to run the service, and fails if a single field of it appears: those screens show accounts, not anybody's work.

RoofMap is built and run by a working roofer, and that deserves a straight answer rather than a reassuring one. The founder's own roofing business holds an ordinary account with exactly the same walls around it as yours. The full version of that answer — including what one or two people can reach in order to keep the service running, which is not nothing — is in the privacy policy.

Your price book

The question roofers ask first, answered one worry at a time.

Your rates are the most sensitive thing you will put into RoofMap — more than the jobs, more than the customers. You are typing them into software owned by another roofing company, and the only answer worth anything is a specific one. So here is each worry on its own.

"Can you see my rates?"

Not through RoofMap. Your price book belongs to one business, and every read and every write is filtered to the business that asked before it reaches the database, exactly as described above. The admin screens we use to run the service show accounts — business name, plan, how many people, whether the trial has run out. There is no screen that shows a price.

That is tested rather than promised. One suite builds a company whose job carries a deliberately odd material rate and a note about a thin margin, pushes it through every one of those admin screens, and fails the build if either string comes back out. The day somebody adds a "just show me their price book" screen to chase a bug, the build stops.

What is also true, and we will not dress it up: one or two people at RoofMap can reach the database itself, because somebody has to be able to restore a backup or fix a save that broke. That access exists to run RoofMap and for nothing else, we do not look at a subscriber's prices, and the longer version of that answer is in the privacy policy. If what you need is a technical impossibility, no company of this size can honestly sell you one — including this one.

"Will it be used to work out what anyone else charges?"

No. Your rates are never shown to another subscriber, never sent to a supplier, and never pooled into an average, a benchmark or a "typical price in your region". RoofMap ships default prices taken from published retail figures, the same for everybody, and they sit there until you type your own over them. Nothing in the software reads your book to price somebody else's job, and nothing will without asking you first.

"Can my own customer see my margin?"

No — and this one is worth describing, because it is how a margin leaks quietly. The customer's quote page used to be handed the whole quote so it could work out option prices in the browser, which meant the cost basis sat in that page's data for anyone who opened the browser's developer tools. The office prices the options before sending now and the page only adds up sell prices: material cost, the mark-up percentages, the scaffold cost and your labour cost rates never leave the office. A test sends a quote carrying all four and fails the build if any of them turns up in the customer's copy.

"What happens to the price list file I upload?"

A supplier CSV or PDF is read in your own browser. It goes to an AI service in exactly one case — you pressing Read it with AI on a PDF that could not be read on its own — and then it is the file's text, to Anthropic's Claude, which does not use data submitted through its API to train models. Nothing about your price book is ever sent for AI in the background. The number of places in the app that can make that call is counted by a test, so a third one cannot be added quietly.

"Can I get it back out again?"

Yes, and check it on day one rather than taking our word for it: Settings → Pricing → Custom Price Book → Download as CSV gives you your own list back, whenever you like, without asking us. Your book is also versioned — previous copies are kept and any of them can be restored — so an upload that lands on the wrong thing is a nuisance rather than a disaster.

"So what actually guards it?"

Your password, today. There is no multi-factor sign-in yet, and on a page about your price book that is the sentence that matters most: it is in the gaps list, it is the gap we care most about closing, and until it is closed the honest advice is a password you use nowhere else. Inside your own business, everyone you invite can see the price book — there is no way yet to let a crew member use the job pack without seeing your rates.

The Fergus connection

Your own key, used only for you, and you can kill it from the Fergus end.

This is not an OAuth integration and we do not describe it as one. Each company pastes in its own Fergus personal API key. There is no shared RoofMap key and no fallback: if your key is not there, nothing of yours talks to Fergus.

The same shape applies to any job-system key: it is yours, it is per-company, and you can end it from the other end without asking us.

The team inbox

Mail passwords encrypted with AES-256-GCM, and never handed back out.

The Business plan can pull your real email into RoofMap, which means we hold a credential for a mailbox. That is the most sensitive thing in the system and it is treated that way.

Where it runs

Managed infrastructure, outside New Zealand, encrypted in transit.

WhoWhat it doesWhat it holds
SupabaseDatabase & sign-in Stores the data and handles passwords. All of it, encrypted at rest by the provider.
RailwayBackend hosting Runs the server the app talks to. Everything, in transit. Server logs.
VercelWebsite hosting Serves the app and the customer quote pages. Request logs and IP addresses. No job data is stored there.

All three run outside New Zealand, and there is no NZ-resident option today. Traffic between your browser and our servers, and between our servers and every provider, is encrypted with HTTPS/TLS, with HSTS set so a browser will not fall back to an unencrypted connection. The API refuses to be framed by another site, and the pages set the headers that stop content-type guessing and limit what is leaked in a referrer.

The full list of every company your data passes through, what each one gets and how long anything is kept is in the privacy policy, and it is checked against the code — a new outbound call to a third party fails the build until that page names it.

What we have not done yet

The list every security page should have and almost none do.

RoofMap is built by a small team inside a roofing company. Some things are not built yet, and you are better served by a list than by silence.

If one of these is blocking you, say so — knowing which of them a real roofing business actually stops at is how we decide what to build next.

Reporting a problem

Tell us and we will fix it. No lawyers, no runaround.

If you think you have found a security problem in RoofMap, email support@roofmap.co.nz with enough detail to reproduce it. We would far rather hear it from you than from a customer.

If there is ever a breach likely to cause serious harm, we will notify the people affected and the Office of the Privacy Commissioner, as the Privacy Act 2020 requires. That commitment is in the privacy policy too.