Halrock is for contractors who want three things: price the job right, win it, and know they made money when it's done. Everything in the app hangs on one thread:
Customer → Job → Budget → Estimate → Invoice.
You'll meet that thread in every section below. Words in bold are the exact buttons and labels you'll see on screen.
You need an account, and your company needs a name. That's the whole setup — the first budget takes about ten minutes from here.
Create your account. Go to www.halrock.com and press Get started.
One thing worth knowing before you press anything. Every action that costs money or leaves the building — sending an estimate, creating an invoice, emailing a client, voiding something — opens a window first that says, in full sentences, exactly what will happen and what will not. Read it and press the dark button, or press Never mind. Nothing consequential in Halrock happens on a single click you didn't mean.
Set up your company. Right after your first sign-in, Halrock asks for one thing that matters and one that doesn't:
Press Open my ledger. You're in.
Put it on your phone. Halrock works in any browser, but in the field you'll want it on the home screen: open www.halrock.com in your phone's browser and use Add to Home Screen (Safari: Share button; Chrome: browser menu). It then opens full-screen like any app, and it's the only way an iPhone can receive Halrock notifications.
Where things live. On a computer, the bar across the top has the everyday places — Dashboard, Jobs, Documents, Customers — and a More menu with everything else (Costs, Catalog, Suppliers, Reports, History, Team, Subscription, Export, Settings, your own account, and this manual). On a phone, three tabs sit at the bottom — Home, Jobs, Docs — with More as the last tab; Customers and everything else live under More.
Dashboard is the first thing you see when you sign in. At the top, Money in — what has actually reached your account, counted from confirmed payments only, since what a client says they sent is a claim rather than cash. Choose the window beside it: This month, Last 3 months (where it starts), This year or All time. A payment counts on the day the money moved, not the day you got round to confirming it, so confirming in September a payment received in August still belongs to August. Press the figure for Reports, which breaks the same money down job by job.
That window covers Money in and nothing else. Under it, Where things stand · right now holds three amounts — Out for approval (with clients, unanswered), Says they paid (a client told you the money is sent and it is waiting on you to confirm) and Unpaid (billed and still owed). Those are never filtered by a date, on purpose: an invoice unpaid for five months is the one you most need to see, and a three-month window would be exactly what hid it. Says they paid is the only one of the three that waits on you — the other two wait on a client — so it also appears as a card above, with Check and confirm. How many jobs are active and how many customers you have sit on the small line underneath; both open their own page.
Hide figures, beside + New job, blurs every amount on the screen — for when a client is leaning over the desk or you hand the phone to someone. The choice sticks on that device until you press Show figures. It is a courtesy rather than a lock: anyone signed in can turn it straight back on.
Under those, only if there is anything to do, Needs your attention: up to three estimates awaiting a client (with how long they have been waiting), up to three approved estimates you have not invoiced yet, and up to three unpaid invoices with what is still owed on each. Nothing appears there for the sake of appearing; an empty Needs your attention means there is nothing waiting. Press the job name on any card to open the job itself — the buttons under it act on the document (copy its link, open it, mark it paid), so the name is the way to the work. It shows three of each at most — the oldest first, since those are the ones that have been waiting longest — and when there are more it says so and links to Documents, which opens on the same list in full. Each card leads with the job, because that is what tells two of them apart at a glance; the customer, the document number and how long it has been sitting are on the line underneath. Activity at the bottom is the last few things that happened, with Full history → for the rest. A brand-new company sees a short list of first steps instead.
Documents — in the top bar on a computer, Docs on a phone — is every estimate and invoice you have ever made, across all jobs, newest first. Four tabs: Needs action (the default: awaiting a client, or approved and not billed yet, or unpaid), Estimates, Invoices, All. Each row carries its document number, its job, its total and where it stands — Awaiting client, Approved, Declined, Replaced, Paid ✓, Payment reported, Unpaid, or how much is left when part of it arrived. It is the same set of documents you see inside a job, gathered in one place for when you are working across jobs rather than in one.
Ten minutes here saves an explanation on every job. These details print on every estimate and invoice you send — set them once and stop thinking about them.
Open More → Settings. The page is called Company settings, and it has one Save settings button at the bottom — fill in what you want, save once. When it takes, you'll see: Saved ✓ New documents will use these details.
Company logo. Upload it once and it appears on your documents. No logo is fine too — your company name in plain type looks professional, not empty.
On your documents. Your Company name, Email, Phone, and Address — exactly as you want a client to see them at the top of an estimate. These print on every document: the estimate and the invoice, on screen and in the PDF.
Fill in the address. It is the one a client uses to know who they are dealing with and where to send a cheque, and a document without it makes them ask. Address takes more than one line — write it the way you would on an envelope, and it prints that way:
115 Brentwood Dr Yarmouth Port, MA 02675
Leave it blank and this page says so, in orange, until you fill it in.
Numbering & pricing.
Sales tax. Off until you turn it on — many contractors never need it. If you do: set the Rate, choose What it applies to (every line, or only lines you mark — typically materials yes, labor no), and What the client sees it called on the document. The tax a document was created with stays frozen on that document; changing settings later never rewrites paperwork you already sent.
How you get paid. Type in whatever you accept — Zelle, Venmo, who to make checks out to. These print on your invoices so the client knows how to pay you without calling to ask.
Split a job's billing into installments — a deposit when the client approves, the rest as the work reaches each stage.
Setting it up. Open More → Settings → Payment schedule and fill in up to six rows — a name and a percent each, adding up to 100. Something like Deposit 20 / Progress 40 / Final 40. Leave every row blank and jobs bill in one invoice, exactly as before.
It freezes onto each estimate. Like tax and terms, the schedule an estimate goes out with is the schedule it keeps. Want a different split for the next client? Change Settings, then generate their estimate — the earlier client's document doesn't move.
What the client sees. The estimate shows the schedule — each installment's name, percent and dollar amount — before they sign. The moment they Approve, the first installment becomes an invoice by itself, and the approved page hands them the link: Your deposit invoice →. If the customer has an email on file, that invoice is also emailed to them on the spot, and you get a notification saying whether it went — if it says no email went out, open the invoice and send or share the link yourself.
Billing the rest. On the job's Documents tab, each scheduled estimate lists its installments and where they stand. One button offers the next installment; press it when the work gets there. The Documents page in the top bar offers the same next installment — the button names it (Invoice Progress) and the window says what it will bill, so you are never guessing which one you are about to send. The final installment is always billed as the balance — everything the finished job comes to, minus what was already invoiced, shown on the invoice as the full job with a Less prior installments line.
Jobs with hourly lines. The earlier installments stay exactly as printed; the final one settles at the hours actually worked — the same hours box you already know, on the final installment's button. If the hours come in so low that the job finishes below what was already collected, Halrock refuses to create a negative invoice and shows the difference — that's a refund conversation, not a bill. On the Documents page that last installment shows as Final: on the job → instead of a button, because the hours are only asked for on the job.
Deposit cap. If your state limits deposits (Massachusetts caps them at one third of the price), set the cap in Settings and Halrock will refuse to send any estimate whose first installment breaks it.
Voiding an installment works like voiding any invoice: the amount returns to "not yet billed", and the final balance grows to match.
The reason teams exist in Halrock: your crew sees the work, never your numbers. A crew lead needs the job — the address, the tasks, the hours. They never see your costs, your markup, or what the client pays. You decide who sees money by choosing a role.
The two roles.
(You're the owner — an Admin that can never be locked out. Halrock refuses to demote or remove the last manager of a company, so there is always someone holding the keys.)
Inviting someone. Open More → Team. Under Invite someone, type their email, pick the Role, and press Send invite.
Deactivating someone asks first, and says what it costs: they stop being able to sign in, but every hour, photo and cost they entered stays exactly where it is, and their seat stops counting toward the bill. Reactivate them any time.
The hourly cost next to each member. That small $ …/h field is what an hour of that person actually costs you — wages, taxes, insurance included. It's the number Halrock uses to turn their tracked hours into job costs. Leave it blank and their hours show as "not priced yet" instead of silently counting as zero. Nobody sees this number but managers.
It is what the hour COSTS you, not what they are handed. If your crew are on a payroll, the wage is only part of it — payroll taxes, workers' compensation, liability and the truck usually add 15% to 35% on top, and your accountant knows your figure. Press work it out beside the box, type the wage and the percent, and it fills in the answer. Pay your crew as subcontractors and the two numbers are the same: put the wage in and leave the percent at zero. The percent is never saved anywhere — it is asked, used, and gone; what Halrock keeps is the one figure it produced.
A raise counts from today. Give someone a raise — change 35 to 55 — and the new cost prices the hours logged from today on. Every hour already logged keeps what it cost on the day it was worked, so the profit on a job you finished last month never moves under you. Clearing the field works the same way: their hours stop being priced from today, and the ones before it stay as they were. There's no way to change what a past hour cost, which is the point — that number is history.
Who's on which job. Open a job and scroll to Who's on this job — tick the crew who are on it and press Save who's on it. From then on that job appears only on their lists, and only they can log hours against it. The people you tick get a notification saying they're on it.
Leave every box unticked and the job is open to the whole crew, which is how every job behaves until you decide otherwise — so nothing changes for your existing jobs until you start using this. Untick everyone later and it opens up again.
(Admins always see every job. This is about the crew.)
Leaving, from their side. Anyone can remove themselves from a company under Your account → Companies → Leave. The one person who can't is the last owner while other people are still there — Halrock asks them to make somebody else an owner first, so a company is never left with work in it and nobody holding the keys.
When someone leaves. Deactivate them on the Team page — they lose access, but every hour they logged and every job they touched stays in your history. History is the point of this app; people leaving doesn't erase it.
Every job belongs to a customer, so this is where work begins. It also decides something practical: a customer with an email on file can be sent estimates and invoices with one button. Without one, you'll be copying links by hand.
Open Customers in the top bar (on a phone: More → Customers).
Add one. Under New customer:
Press Add customer.
If you already have them, Halrock says so. As you type the name, a line appears underneath naming the customer you already have and linking to them. It's a warning, not a wall — two of your customers are allowed to share a name. But adding the same one twice splits their jobs, documents and payments across two records, and every total on their page is then wrong for both, so it's worth a second look.
When your client is a company. The customer is whoever gets billed — put the company in Name, with its office line and billing address. The people who work there are contacts, each with their own mobile. Add the first one right in the form you create the customer with, or later from their page. Give them a Role if it helps — Project manager, Accounts payable.
The first contact you add is the one your documents address: estimates and invoices print Attn: [their name] under the company. To move that to somebody else, press Use on documents on their row. A customer who is a person needs none of this — leave contacts empty and nothing changes.
Their page. Click any customer to open it. Everything about that relationship is on one screen:
Find one later. The search box takes a name, an email or a phone number — the customer's or a contact's. Searching for the person you always call finds their company, and finds their jobs on the Jobs page too. Whatever matched is highlighted, including the contact's name, so a result always says why it is there.
What you'll notice. Each row shows their current job, or {n} jobs · all done when everything is finished. An address becomes a link that opens in Maps. Nothing here can be deleted — Halrock keeps history rather than losing it.
Done with a customer? Open their page and press Archive customer, at the very bottom. They leave the list and the new-job picker; their jobs, documents and payments stay exactly where they are, and an Archived shelf appears on the customers page whenever it has anyone on it. Unarchive is one click on the same spot.
The job is the container for everything: the budget, the estimate, the invoice, the photos, the hours and the costs all hang off it. There is no such thing as a loose estimate in Halrock. That is the whole design — a year later you can open one job and see what you quoted, what it cost, and what you kept.
The site address lives on the job's own header. Created a job before you had the address? Open the job and press Add site address right under its name — no need to go hunting for Edit on the jobs list. Once set, it becomes the tap-to-navigate Maps link your crew drives with, with a small Edit beside it.
Picking the customer. The customer field is a search box, not a list: type two or three letters and the matches appear — by company name and by the people on it, so typing Jean finds the company Jean works at. Arrow keys and Enter pick one; pressing Enter never submits the form by accident.
Create one. Press + New job on the Dashboard, or fill the New job form on Jobs:
Press Create job. If you have no customers yet, Halrock says Add a customer first. and sends you there — it takes under a minute.
If that customer already has a job by the same name, a line appears saying so, with a link to the one you have. Different customers having a job with the same name is normal and never flagged; the same customer having two is usually a second job created because the first couldn't be found — and afterwards nobody can tell them apart on a document or in History. Rename this one, or carry on if it really is separate work.
The tabs across the top of the list.
Narrowing the list. Beside the search box, All customers filters the list to one customer's work. It combines with everything else: pick the customer, stay on the tab you want, type in the search, and you get jobs matching all three. A line under the controls says what you are looking at — Showing 3 jobs for Maria Johnson — with Clear to drop the filter and the search in one press. The tab counts follow the customer too, so Active 3 always means three jobs you can actually see. Everything sits in the address, so the back button undoes one step and a narrowed list can be bookmarked or sent to someone.
Ordering it. On a computer, click a column heading — Job, Status or Added — and click again to reverse it. On a phone there are no headings to click, so a Newest first menu sits with the search: newest, oldest, or by name in either direction.
The Status column tells you where a job stands, and it is worked out from the documents rather than set by you:
Row actions. Edit changes the name and site address. Mark done files it (and becomes Reopen if you were early); both ask first, because marking a job done sends your crew a notification that the work is finished — reopening it doesn't tell them anything, so the mistake would travel further than the fix. Duplicate starts a new job for the same customer with the same budget lines — handy for repeat work; it copies the lines only, not documents, costs, photos or hours.
Deleting a job. Delete appears on a job only while nothing about it has been sent to anyone — no estimate, no invoice, no supplier request. Those exist outside your office the moment they are made: they carry a number, a link somebody may be holding, and sometimes a signature, and deleting a row here cannot unmake them. A job that carries any of them is marked done instead.
Where it is offered, it takes everything inside with it — budget lines, costs and their receipts, hours, photos, who was assigned — and it cannot be undone. History keeps one line saying the job existed and was deleted. It is there for the job you created to try something out, which otherwise sits in your list for ever.
One thing to know: you cannot move a job to a different customer. If it's on the wrong one, Duplicate it under the right customer and mark the original done.
The customer's name is a door. Wherever you see it — at the top of a job, on the jobs list, beside a document — press it and you land on their page: every job you have ever done for them, every estimate and invoice they have been sent, their contacts, and what they have paid against what they owe. It is the quickest answer to "what else have we done for these people?".
Inside a job there are six tabs: Budget, Documents, Costs, Hours, Suppliers and Photos. Your crew sees only Photos and Hours. Costs and Hours sit side by side on purpose — hours are a cost, usually the biggest one.
Work dates. On the Budget tab, under the job's name, set the planned start and expected completion dates (some states — Massachusetts among them — require both in a home improvement contract). They print on the estimate under the project name and freeze with it: if the plan slips later, documents already sent keep the dates the client agreed to, and the next estimate you generate carries the new ones.
This is where you decide whether the job is worth doing. You enter what things cost you and what you're adding on top; Halrock works out the price. Your client never sees this page — only the prices that come out of it.
Open a job and you're on the Budget tab, reading it: every line with its quantity, what it costs you, your markup and the price — and the Job totals underneath (cost, price, profit, margin). Your client never sees this page.
To change anything, press Edit budget (just Edit on a phone, in the bar at the bottom). That is what opens the fields. Press Save and you are back to reading it, with the new numbers in place — which is how you know it saved. A brand-new job with an empty budget skips straight to editing, because there is nothing to read yet.
A line at a time. In edit mode, press + Add line, then fill the row:
Markup or margin — the difference matters. Both are percentages, but they mean different things:
Pick one per line. The Price column shows the line total immediately, and the unit price underneath when the quantity isn't 1.
Deleting a line. The ✕ on the right removes it straight away — no window, because trimming a budget usually means removing several in a row. Instead a black bar appears saying which line went, with Undo: press it and the line comes back exactly where it was. The bar stays until you undo it, dismiss it with its own ✕, or press Save — after a save the line really is gone, so the offer goes with it. Nothing is written to the budget until you Save either way.
Labour, apart from the rest. A client reading nine lines in a row cannot tell what is work and what is hardware. So an estimate that has no sections of its own is grouped for you: Labor at the top with its subtotal, then Materials & equipment with theirs. Nothing is hidden and no number changes — the same lines, in two named groups.
That only happens when you have not grouped the document yourself. If you use sections (by room, by phase), those stay exactly as you wrote them, and the split is stated in one quiet line next to the total instead: Labor $6,504.30 · Materials & equipment $907.80.
Either way it comes from the Kind on each line, so a line with no kind counts as not labour. A subcontractor counts as labour — it is work done on the job, not something bought, which is also why it starts untaxed like your own labour. When there is one in there the heading says Labor & subcontractors, so the word over the group is never wrong.
Sections. Press + Add section to group lines by room or by phase. Each section gets its own name and its own subtotal, and the client sees the same grouping on the estimate. Delete a section header and its lines survive — they simply join the section above.
Putting them in order. Two ways, and they're good at different things.
Drag — on a computer, grab the ⠿ handle at the right of a line and pull it where you want. Only lines drag, and only by that handle, so selecting a word inside a description never picks the row up by mistake. It works from the keyboard too: tab to a handle, press Space to lift, arrow up or down, Space to drop.
The arrows ˄ ˅ — next to the handle. These move a row one step at a time, which is what you want for the fiddly cases:
The arrows grey out at the top and bottom rather than doing nothing.
Order is part of the budget, so it takes effect when you press Save budget — and the estimate you send next prints the lines in that order.
Reuse what you price often. The star on a line saves it to your catalog; next time it comes up as you type. Catalog items are copied into the budget, never linked — editing an item later never changes a budget you already built.
Your numbers, at the bottom. Job totals · only you see this shows Cost, Price, Profit and Margin for the whole job. On a phone the bar at the bottom shows Price and Margin.
Press Save budget when you're done. If you try to leave with unsaved work, Halrock stops you and says so.
The estimate is the version of your budget the client is allowed to see: descriptions, quantities and prices. Your costs and your margin never appear on it — not in the page, not in the PDF.
Send one. From the Budget tab, press Generate client estimate →. A window opens saying exactly what will happen — the total that freezes onto the document, that your costs and margin stay out of it, and that the client is not emailed automatically — and the send happens when you press Create the estimate there.
Changed your mind before they answered? Edit the budget and press the button again — it now reads Update client estimate →. (From the job's Documents tab, the Edit link on an awaiting client row takes you straight there.) The estimate they are holding is updated in place: same number, same link, so nothing you already sent goes dead and their document simply shows the new figures with a Revised date under Issued. Every version is written to History (search it by the number, e.g. EST-0010) — you never collect a pile of half-dead estimates again.
Two things this never does. It never touches a document the client has already answered — approved is your contract, declined is their answer on the record, and both are frozen for good (that is what change orders are for). And if a client happens to be reading the estimate at the very moment you update it, their approval is refused with "This estimate was updated while you had it open" — nobody ever signs numbers that moved out from under them.
Halrock saves the budget first, then gives you Client estimate ready ✓ with three things: Open share link →, Copy link, and Download PDF.
Getting it to the client. Copy the link into a text or an email, or use the Email button on the job's Documents tab if the customer has an email on file. The email carries a View and approve button and replies go straight to your company address.
Halrock remembers every send. Once a document has been emailed, its row says Emailed to who · when — the exact address it went to at that moment, kept even if you change the customer's email later. Send it again and the row counts the earlier ones (hover to see them all), and the Email window warns you it was already sent before you send a second copy. No more wondering whether the first one went.
The Email button asks first. Press it and a window opens naming exactly who is about to receive it — Send to jean@theircompany.com — along with what the email contains and where replies go. Nothing sends until you confirm there; Never mind closes it with nothing sent. Afterwards a green bar at the top of the page names the address it went to. (Every consequential button in Halrock works this way now: it opens a window that spells out what is about to happen, in full sentences with the real numbers, before anything happens.)
What the client sees. A clean document with your logo, their name, the job, the lines and the total. At the bottom: Ready to move forward?, a signature box reading Sign here — finger, stylus or mouse, and a name field, headed with their own name — the document says who is expected to sign. Approving takes both: draw the signature (finger on a phone or tablet, mouse on a computer) and type the name. Declining needs only the name — nobody signs a refusal. No account, no password, no app. On a phone there's a single button at the bottom reading Approve $12,480.00.
How the approval is recorded. The approved document — page and PDF — carries the drawn signature, the typed name, and a signature record: the exact date and time (UTC), the network address (IP) and the browser it was approved from. All of it is stored the moment they press Approve and printed on the document, so if an approval is ever disputed the evidence is already on the contract itself.
### A note on one estimate
Some things are true of this job only — "the Microsoft licences are billed separately, direct with Microsoft", "the dumpster is on you", "price assumes the power is already run". Those do not belong in your terms, which go out on every estimate you will ever send, and they do not belong in a budget line, which would follow the job into the invoice for good.
On the Budget tab, under the totals, there is Note on the estimate. Write it and press Generate client estimate (or Update client estimate). It prints for the client under the lines and above your terms, on the page and on the PDF, headed Please note.
It does not have to be one sentence. The box holds as much as your terms do — enough to write out the stages of a project if that is what a client asked for — and it prints as you wrote it: leave a blank line between blocks and each becomes its own paragraph. A long note runs onto a second page rather than being squeezed.
You do not have to send anything to keep it: type the sentence and a Save note button appears under the box. Editing the budget already has a Save, and that one carries the note too — one Save either way. Until you press it the page says Unsaved changes, and trying to leave the job asks first, from any link on the screen.
It belongs to the document, not to the job. Once an estimate is out, editing the box changes what the next one carries and never rewrites the one your client is already holding — the same rule as the terms and the prices. Re-open the job and the box still shows what you last saved, so updating the estimate keeps the sentence instead of dropping it. Clear the box, save, and the note comes off the next version.
### Terms & conditions
In Settings → Terms & conditions you can write the fine print your approval binds the client to — payment terms, change-order policy, warranty, whatever your lawyer gives you.
Starting from a template. Press Start from a template above the box and Halrock fills it with a skeleton covering the clauses a job actually turns on: price, change orders, concealed conditions, schedule, warranty, termination, liability, disputes. It is a starting point, not a contract. Every place that depends on where you work is left as a blank in `[BRACKETS]` — your state, your county, your licence number, your warranty period — plus one final blank for the disclosures your state requires by law.
Terms are frozen onto each estimate when you send it. Editing this box changes what your next estimates carry — never a document already sitting in a client's inbox, because the fine print somebody read on Tuesday must not be different on Thursday. To put new terms on an estimate that is already out, issue it again from its budget: the new one carries the terms, and the old link tells the client it was replaced.
Halrock will not send an estimate while any bracket is left, and Settings lists the ones still open. That is deliberate: a contract that reaches a homeowner with `[STATE]` printed on it says nobody read it. Have a construction lawyer in your state read the whole thing before you rely on it — home improvement contracts are regulated state by state, and one missing a required disclosure can be unenforceable, which is worse than having no terms at all. It prints above the signature on every new estimate, and the approval line says the client agrees to it. Documents already sent keep whatever terms they went out with — the fine print a client signed can never change under them, same as the tax rate and the validity date. Leave the box blank and estimates print without a terms section.
What happens next. You get a notification — Jane Doe approved your estimate — and the job's status changes. An approved estimate unlocks invoicing. A declined one moves the job to the Lost tab, where it stays as history.
Replacing an estimate. Changed the price? Edit the budget and generate again. The new estimate replaces the old one, and the old link stops accepting answers — it tells the client it was replaced and to ask you for the current one. That's deliberate: a client should never be able to approve a price you've moved on from. Estimates the client already answered are history and are never touched.
### When the client signs on paper
Some clients do not want to click anything. The PDF has always offered them the other way — sign below and return this page — and Approved on paper is where that comes back in.
On the job's Documents tab, on an estimate still waiting for an answer, press Approved on paper. Type who signed it and the date written on the paper, and attach a photo or PDF of the signed page if you have one — up to 25 MB, which is room for a multi-page contract scanned with a phone. A large scan takes a moment to send and shows its progress; wait for Attached before pressing Record the approval. Picked the wrong page? Remove puts it back.
The scan is then kept with the document instead of in a drawer: Signed copy → appears on that estimate's row and opens it.
From there it behaves exactly like an approval made online: the job becomes work you can invoice, a deposit invoice is created if the estimate has a payment schedule, and the whole thing is in History. It cannot be undone — if you record the wrong one, the fix is a new estimate.
The client's copy tells the truth about how it happened. Instead of an address and a browser it says Signed on paper, dated the day they signed rather than the day you typed it in, with the date you recorded it underneath.
A decision is final. Once approved or declined, that estimate keeps that answer. If something changes, send a new one. Because it is final, declining takes the client two steps on their page: Decline this estimate opens a short note saying it closes the document for good and that you would have to send a brand-new one, and the button to go through with it sits inside. Approve is one press, as it should be — a mis-tap there costs nobody anything.
Prices can expire. Set Estimates valid for (days) in Settings and every new estimate prints “Valid until …” next to its issue date. After that day the page says the price has expired and approval closes — material costs move, and a six-month-old quote should not be signable. Blank means estimates never expire, and documents already sent keep whatever validity they went out with.
Sales tax, if you turned it on in Settings, is calculated when you generate the estimate and frozen onto that document. Change your rate next year and old paperwork keeps the rate the client agreed to.
### Charging by the hour
Some work is a price. Some is a rate: "$150 an hour, about 30 hours." Both belong in the same budget.
Put the line in with the unit hr and the hours you expect, priced so the rate comes out where you want it. Then click the clock beside that line to mark it billed at the hours actually worked. The clock only appears on lines measured in hours, and marking it is always your decision — the app never assumes it from the unit.
Your client's estimate then says what you actually agreed:
> Estimated 30 hr at $150.00/hr. The final bill follows the hours actually worked — it > may be more or fewer.
and the total says it may end up higher or lower rather than reading as a price. That sentence is the whole point: without it, "30 hr at $150.00" reads as $4,500, and the conversation when the job takes 34 hours is one nobody wins. It says both directions on purpose — a client warned only about overruns still feels ambushed by one.
### Change orders — work agreed after the contract
Once your client has approved an estimate, that is the contract. Extra work agreed afterwards is a change order, not a new estimate: it adds to the contract instead of replacing it.
In the budget, add the new lines and click + Change order (it only appears once something is approved — without a contract there is nothing to add to). Tick the lines the extra work covers and send it. Your client approves it on its own, and it arrives as its own document, numbered CO-0008, headed CHANGE ORDER.
Tick only the new lines. The contract already covers the rest — and Halrock now enforces this both ways: once a change order is approved, its budget lines are marked Sold · CO-0008. A sold line cannot be ticked onto another change order, and it stays off any estimate you generate later, so the same work can never be billed twice. (Really selling the same thing again — a second camera — is a new line in the budget.)
What your client sees. The change order does the arithmetic in front of them, the way the standard construction forms do: Original contract · EST-0010 … Change orders already approved … This change order … Your contract would become — dollars on every row, on the page and on the PDF. Nobody reads "$1,274.00" and wonders whether that is the new price of the whole job.
What the job earned is now the approved estimate plus every approved change order. Send a whole new estimate instead and it replaces the contract figure rather than adding to it — which is what "estimate" should mean. If you do re-issue, the window says which sold lines are staying off it and why.
An invoice can only come from an estimate the client approved. That rule is the point: you bill exactly what they said yes to, at the price they said yes to.
Work billed by the hour is the one thing an invoice may change, and only because you agreed it that way. When you create the invoice, each hourly line asks for the hours actually worked — pre-filled with your estimate, with the hours your crew logged on the job shown beside it so you can compare. The rate never moves; only the hours do.
The bill then shows both numbers:
> Billed at the 34 hr actually worked — more than the 30 hr estimated.
A bill that silently says 34 where the estimate said 30 invites the question. One that shows both answers it first.
Create one. Open the job → Documents tab. Under the approved estimate, press Create invoice; a window states the amount about to be billed, that the invoice gets its own number and client link, and that nothing is emailed automatically — confirm there and it exists. The invoice copies the approved lines and totals, tax included, and gets its own number (INV-0001).
Send it the same three ways as an estimate: Copy link, Open →, or Email.
What the client sees. The document, the Amount due, and how to pay you — the Zelle, Venmo, Cash App, PayPal, check and bank details you filled into Settings, as buttons where the app supports a link. They also get Already paid?, a short form where they tell you the amount, how they sent it, their name, the date, and optionally a screenshot. The button reads Tell them I paid.
Read this twice: a client saying they paid is not a payment. That form records a claim. It moves the invoice to Payment reported and does nothing else. Halrock cannot see your bank account, and a screenshot is not money. The client's own screen says so: They'll confirm it once the money shows up in their account.
You confirm it. On the job's Documents tab, open Payments (it reads Confirm payment → when someone is waiting on you). Press Confirm received — a window restates the amount and reminds you to look at your bank first, because your confirmation is what makes the money real in Halrock — and settle it there.
Recording a payment yourself. Cash, a check in the mail, a deposit? Use the same panel:
Press Record payment. Anything you record yourself is confirmed immediately — you saw the money.
Sent one by mistake? Press Void on its row. The invoice stays on the record — struck through, marked Voided — but stops counting everywhere: it leaves Outstanding, the reports, and the customer's page, and its estimate can be invoiced again. The client's link keeps working and says, in large letters, that nothing is owed. If money was already confirmed against it, the void is refused until you move that payment — cash never disappears by accident. And once it's voided it stays voided: a payment the client had already reported can no longer be confirmed against it, however you get back to that screen.
Where an invoice stands, from the Documents page:
### Looking at a photo
Tap any photo to open it full screen. Pinch or double-tap to zoom on a phone, scroll or double-click at a desk, and drag to move around once you are zoomed in. Swipe — or use the arrow keys — to move between photos, and Esc or the ✕ closes.
A sub opening a price request you sent them gets the same viewer, showing only the photos you picked for them — and only ones marked Can be shared.
Your crew needs the address, the hours and the camera. They do not need your margins. So a crew member signs into the same app and sees a different one: Jobs, and inside a job only Photos and Hours. Prices, budgets, documents and settings aren't hidden behind a warning — they simply aren't there.
Photos. Open a job → Photos. On a phone, Take photo opens the camera straight away; From gallery picks ones already taken. Photos are resized automatically, so a full day of shots won't eat someone's data plan.
Each photo is Team only by default. The badge on it says which it is — and the office decides: a manager taps the badge to make a photo Can be shared, and that doesn't send it anywhere; it means a manager is allowed to include it in a price request to a sub (see Asking suppliers for a price). Team only photos can never be sent, full stop. Your client never sees this page.
Deleting one. The ✕ appears on photos you can remove: your own if you are crew, any of them if you run the place. A deleted photo comes off the job and out of every price request that included it at the same moment, and there is no trash — deleted is gone.
If a photo fails to upload — dead spot, no signal — Halrock says so and keeps it: photos didn't send — still on your phone, not lost, with Try again on each one. Nothing is lost because the signal was.
Hours. Open a job → Hours, then Log hours:
Press Save. A crew member sees their own entries and their own total. A manager sees everyone's, priced with each person's hourly cost from the Team page — at the rate that was in force on the day the work happened, so later raises leave old jobs alone.
Where the money stands, on the Costs tab. Above the spending, Money in says what is in the bank, what is billed and waiting, and what is still to bill — and underneath, the installments the client agreed to: Deposit paid Aug 14, Progress not billed yet, and so on. An installment that has been billed shows what the invoice actually says, which for the final one is the balance rather than the percentage frozen months earlier. Money somebody says they sent shows as says they paid — confirm it, and is not counted as paid until you confirm it. Anything billed outside the schedule — a change order's invoice — is listed under its own number. There are no buttons here: to bill, email or confirm, go to Documents, one tab away.
Where the money went, on the Costs tab. Under the four figures, the job's real spend is split into the lines that make it: Labor (the hours), Subcontractors if you paid any, and Materials & equipment — with Actual so far at the bottom, the same figure as the tile above. A subcontractor counts as work, not as a thing bought, which is how your client's estimate splits it too.
What each person cost. When more than one person has logged hours, the labour total on this tab breaks out by name — hours, the rate behind them, and what that person cost this job. It lives here rather than on Costs: that tab answers what the job spent, this one answers who. If a raise landed in the middle of the job the rate column says two rates rather than quote one of them over days it didn't apply to, and anyone whose hours have no rate yet says so on their own line. Managers only — the crew never see it.
The day can be any day. It defaults to today, but nothing stops you entering last week one day at a time; that's how you get a job you've already worked into the numbers.
Asking suppliers for a price (managers). Open a job → Suppliers. This is where you ask subs and suppliers what they'd charge, and where their answers land. (The Photos tab is just photos; the only thing it decides about suppliers is whether a photo is allowed to be shared at all.)
One request per supplier, each with its own link. In Who, start typing: your suppliers appear as you type — pick one, then another, as many as you like (each becomes a chip you can ✕ away). Type a name that isn't on the list and the same box offers New supplier: add "…" — fill in their email or phone if you have them, and they're on your Suppliers list for next time. Write what you need priced the way you'd text it: "Quote the full bathroom — water and drain. Photos and measurements below. Visit the site if you need to." Tick the photos to include — the job's photos are all shown, and the greyed-out ones are Team only: they can't be ticked and never leave the company. Change that on the Photos tab if one of them should go. Then choose what else they may see: the job address (on by default), the customer's name (off by default), the work dates.
Picked two or more? Different brief for some of them opens one box per supplier — the plumber gets "water and drain", the carpenter gets "vanity, 2 doors 3 drawers, wall measurements in the photo". Leave a box empty and that supplier gets the main brief; the photos and switches are the same for everyone in that batch.
Press Send the requests. A window spells out exactly what each supplier will and won't see. Then you get one link per supplier with Copy and, on a phone, Share — straight into WhatsApp, Messages, whatever you use with that supplier. The same buttons stay on each row of the Requests list, plus Email when the supplier has an address on file: it sends their link with your brief, from your company, replies coming to you, and the row then reads Emailed Aug 18 to mario@… so nobody sends twice wondering. Those buttons stay on the row until you turn that supplier's link off.
What the supplier sees. Their link opens with "Hi, Mario — Northside would like a price from you", your message, the photos you picked, and only what you switched on. Never your prices, never your budget, never another supplier. They send a price and a note, with their phone and email prefilled if you have them on file. If they come back later, their own price is shown — from any phone or computer, because the link is theirs — and sending another replaces it. There's also I won't be quoting this, so silence stops meaning "maybe": you're told, and it shows in the list.
Where each one stands is the Requests list: sent when, opened when (or not opened yet), and Quoted $X, Won't quote, or Turned off. Turn off shuts one supplier's link — theirs only; the others keep working, anything they already sent stays, and Turn back on reopens the same link.
Prices received lists the live price from each supplier, with tap-to-call and tap-to-write links, and Replaced $X from Aug 12 under one that superseded an earlier number. Like a price? Press Use as my cost — a window explains what happens: the amount becomes a budget line's cost on this job, you put your markup on top in the Budget tab, and nothing is sent to anyone. The row then reads In the budget ✓, and the same price can't land in the budget twice. A price you already used is never replaced by a later one from the same supplier — you built on it, so a later quote is new information, not a correction.
### Logging what you paid
Reading a receipt back works like the photos: View receipt opens the full-screen viewer with zoom and pan, so a total or a line item is readable on a phone. A receipt saved as a PDF opens in its own tab instead — a browser reads PDFs better than any viewer.
Your catalogue holds what a thing costs you. Costs holds what you actually paid. They are not the same number, and the difference between them is your real margin.
When logging an expense, Fill from catalog saves the typing: pick the item you already priced, say how many, and the description, amount and category fill in. Then change the amount to what the supplier actually charged — that is the number that matters, and the gap from your catalogued cost is exactly what you want to see.
The things you price over and over — a labor hour, a permit, an allowance — kept once so you stop re-typing them. Open More → Catalog.
Adding one. Under New item: Item name, Your cost, and Markup (with the same % markup / % margin choice a budget line has). Unit is how you sell it — ea, hr, sq ft. Kind is Material, Labor, Subcontractor, Equipment or Other, and you can leave it Not set. It costs nothing today, and if you ever turn sales tax on it decides how each line starts: everything is ticked taxable except Labor and Subcontractor, which is how most states work — and it is only a starting position, because the box on the line stays yours to change. Press Add to catalog.
Nothing in it yet? The empty page offers Add starter items — a neutral set (Labor hour, Materials allowance, Disposal / haul away, Permit) you rename and reprice into your own trade rather than starting from a blank page.
From a job. Faster than typing it twice: the ☆ on a budget line saves that line to the catalog, priced exactly as you just priced it.
Changing one. Edit on the row opens it in place. Hide takes an item out of the list that comes up as you type without deleting it — the price you stopped using stops suggesting itself, and Show brings it back. Nothing is ever really deleted, so an old budget always still makes sense.
Items are copied, never linked. Dropping an item into a budget takes a copy of the numbers. Re-pricing it here changes what the NEXT budget suggests and never touches a budget, estimate or invoice you already made. Your cost and markup live only here and on the budget — the client sees the price.
Long lists page ten at a time, and Search your catalog finds by name.
Every cost you log can name who you paid. Do that and one question finally has an answer: how much have I spent with each supplier.
Open More → Suppliers.
Two places carry that name, and they answer different questions. This page is money already spent. The Suppliers tab inside a job is the other direction — asking them what they would charge before you spend anything.
You don't have to set anyone up first. When you log a cost on a job there is a Supplier box — type "ABC Supply" and they're added. Next time the name is offered as you type, so it stays one supplier instead of four spellings of one. Capitals and extra spaces don't matter; "Home Depot — Orlando" and "Home Depot — Kissimmee" are correctly kept apart, because to you they are different accounts.
The page. Each supplier shows what you've spent with them, across how many jobs, and when the last one was — biggest spender first. At the top is the total, and next to it the honest gap: how much of your logged costs name nobody yet. Put a name on those and they move into the figures.
Add one by hand when you want the phone number, the account number or the rep's name on file. That's what Add a supplier is for.
Retire, never delete. Retire stops offering someone in the Supplier box while keeping every number they explain — last year's biggest line item still has to make sense. Restore brings them back.
On a job. The job's Costs tab shows the supplier on each row, and a Who it went to summary next to Where it went — the same question asked about one address.
Prices from subs join up automatically. A supplier you asked for a price is already on your Suppliers list — you picked them (or added them) when you sent the request. So once you start paying them, the job's Suppliers tab shows their price with Paid so far on this job underneath it — and says plainly when the money has passed the price they gave you. A price keeps the name the supplier had on the day, even if you rename them later: that is who quoted you.
These are your own records of money already spent, not bills waiting to be paid. Halrock doesn't do accounts payable, and none of this is ever shown to a client.
Where the money is. The top of Profit by job splits everything in play into the four stages it really moves through, counting each amount once:
Each job's row is tagged with the furthest stage it has reached, so an amount is never read as something it is not.
In the table, every job shows five numbers side by side: Price (the signed contract, or the budget while nothing is signed), Planned cost, Cost so far (a dash until a receipt or an hour is logged — then the real spending, and profit follows it), Profit and Margin. A job that has been invoiced also says so on its row: invoiced, paid, and what is still waiting.
The budget says what you should make. This is where you find out what you did.
Log costs as they happen. Open More → Costs, pick the job, and fill Log an expense:
Press Add cost. Doing this from the truck, at the counter, takes ten seconds and is the difference between knowing your numbers and guessing them.
What a job actually made. Open a job → Costs. Four figures across the top:
Below that, Where it went breaks the spend down by category, and labor appears once your crew logs hours.
Labor needs one thing from you. Hours are priced with each person's cost per hour from the Team page. Hours from someone without a rate are counted and flagged — not priced yet — never valued at zero. A free hour would inflate your profit, and that is the one number this app will not lie about.
Across every job. More → Reports gives you Profit by job: Job, Revenue, Cost, Profit, Margin, with a total row. A job whose real costs passed its price gets called out at the top by name — worth seeing before you price the next one the same way. The table counts logged expenses and logged hours at each person's cost per hour — the same numbers as each job's Costs tab. Hours logged by someone with no hourly cost are called out above the table rather than silently counted as free.
Getting it out. More → Export downloads everything — Download everything (JSON) for a complete backup, or one spreadsheet per table for Excel or Google Sheets. Your data is yours, with no request to make and nobody to ask. That includes your History, who was assigned to each job, and the record of every document you emailed. Two things are deliberately left out: your subscription details with Halrock, which are not your business records, and pending team invites — each of those still carries a live joining link, and a downloaded file is the wrong place for one. Invites live on the Team page, where you can re-send or cancel them.
The reason this exists: a client approves an estimate at 9pm on a Friday and you find out Monday. Notifications close that gap.
The bell in the top bar carries a count and holds the last thing that happened. It refreshes on its own and the moment you come back to the tab. See all opens the full list; What reaches me takes you to your switches.
If you run more than one company on the same account, the bell shows the company you are currently in — switch companies and the bell switches with it, and Mark all read clears only the company on screen. Your phone still buzzes for both: a phone in your pocket has no "current company". Tapping that notification opens Halrock in the company the event belongs to, so you never land on a job that isn't visible from where you were.
On your phone, with the app closed. Halrock invites you once: Know the moment a client says yes. Press Turn it on and accept your browser's prompt. Ignore it and it comes back in a week — it never asks twice in a row, because a reflexive "no" to the browser prompt is permanent and nothing in the app can undo it.
On an iPhone you must add Halrock to your Home Screen first and open it from there. That's Apple's rule, not ours: iPhones only allow notifications for installed apps. The switch tells you when this is what's blocking it.
Choose what reaches you. On Your account, under Notifications, each item is a switch that saves the moment you flip it — no Save button:
The last two are the only ones that aren't about something that just happened — they're about something that didn't. Each document reminds you once, never again, so this can't turn into nagging.
You only see the switches that apply to you. Turning one off silences the bell and the phone for it — but History still records everything, so nothing is lost by going quiet.
The ones about money always come by email too. A client approving or declining an estimate, a client saying they paid, a price from a sub, and the reminder that an estimate has had no answer — the five where missing one costs money. Those land in your inbox whether or not your phone buzzed.
That is deliberate. A notification sent to a phone is one nobody can prove arrived: turn Halrock off in your phone's settings, or change phones, and the app has no way to know its messages are being thrown away. For the everyday items that is a small thing. For a client saying they paid, it isn't — so those go to the inbox as well, where they wait.
Everything else stays on the phone and the bell, so your inbox doesn't fill up. And switching an item off above still stops it everywhere at once — phone, bell and email.
Send a test fires a real notification at your own devices right now — the way to know it works without waiting for a client. Devices getting notifications lists each phone and computer you turned on, e.g. Safari on iPhone. Forget stops Halrock notifying that one — useful for a phone you no longer carry. Each line says when the device was added and when it was last used, which is how you tell two Apple devices apart: an iPad describes itself to the web as a Mac, so both show up under the same name.
This page is you, not your company — it travels with you if you work for more than one. Find it under More → Your account.
Photo. Choose a photo (or Take a photo) and it uploads immediately; there's no Save for this one. Your crew sees it on the Team page. Clients never do — your documents carry the company logo, not your face.
About you. Your name (how the app greets you) and Phone (so your crew can reach you; never shown to clients). Press Save.
Change sign-in email. Changing the address you sign in with needs your password and a link in the new inbox. Type the New email and your Current password, press Send confirmation link, then open the link that arrives at the new address. Until you do, nothing changes and you keep signing in with your old address — a typo cannot lock you out. While a change is waiting, the box shows which address the link went to, with Send it again in case it never arrived — look in spam first. If a confirmation also arrives at the old address, open both.
Password. We ask for your current one first, because a signed-in session is what an unlocked laptop hands a passer-by. Current password, New password (at least 8 characters), Repeat it, then Change password.
Changing it signs out every other device — the phone in the van, the office computer, anywhere you were still signed in. You stay signed in where you changed it. That is the point: if you are changing your password because somebody else might have got in, the password alone would not have shut the door — their signed-in session would still be open. It also means an ordinary password change asks everyone else to sign in again, so pick a moment when that is not in the way.
Signing out. More → Sign out ends the session on the device you press it on. Your other phones, tablets and computers stay signed in — signing out of the tablet in the van does not sign you out of the office computer. Halrock also stops sending notifications to that device while nobody is signed in on it, and picks them up again by itself when you sign back in — you never have to switch them on twice.
Notifications and Devices getting notifications are covered in the section above.
One plan, your whole crew, no per-person math — and completely separate from anything you bill your own clients. Open More → Subscription.
The free trial runs 30 days from the day the company is created — long enough to price a real job, win it, and see what you kept when it is done. No card, nothing to cancel. A banner counts the days down for managers, and turns urgent in the last three.
The plans. Halrock Pro, with everything in it — budgets, estimates clients approve online, invoices, payments, job costs, crew hours and photos, and unlimited team members. The price never changes as the crew grows.
Checkout and card handling run on Stripe; Halrock never sees your card.
When the trial ends without a subscription, the app locks. Nothing is deleted — every job, photo, estimate and hour is exactly where you left it, and Export keeps working so you can always take your data out. Your crew sees a page explaining that an owner or admin needs to subscribe. Subscribe and everything opens again, untouched.
Once you're subscribed, the page shows your plan and its renewal date, plus:
One account can run more than one company — two trades, two partnerships, a side business. Open Your account → Companies → Start another company.
The new one starts empty: its own customers, jobs, document numbering, settings and its own 30-day trial. Nothing is shared with the company you already have, and neither can see the other's numbers. Once you have two, your company's name in the top bar becomes a menu — tap it to switch. Everything you see, including the bell, follows that choice.
Under Your account → Close your account. Halrock asks you to type CLOSE and then asks once more, because this cannot be undone and support cannot bring it back.
What goes: your sign-in, your profile and photo, your notification settings, every device you set up.
What stays: everything the companies own — jobs, estimates, invoices, payments, photos, and the hours you logged with your name on them. Those are the company's records, not yours to take with you: a client's signed estimate can't vanish because somebody closed an account.
Halrock will refuse while you are the only owner of a company that other people still work in — hand it over first. And take your data from More → Export before you go; afterwards you can't open any of it.
If you only want to step away from one company, use Leave instead — that keeps your account and everything else in it.
Most of what looks broken has a plain explanation. Here are the ones people actually hit.
You can't sign in. On the sign-in page use Forgot your password? — the reset link works once and for one hour: open it, set the password, done. If you open it and don't finish — or click it again later — it will say it was already used, and you just ask for another. It also lands in spam more often than you'd think.
It says to confirm your email first. The link from the day you signed up was never opened, and it doesn't wait forever. The sign-in page offers to send a fresh one — press that, then open the new email.
It says too many attempts. Wait ten minutes. Halrock counts tries at the front door so nobody can sit there guessing passwords, and the count is generous enough that ordinary use — a whole crew signing in from the same office — never reaches it.
You got signed out in the middle of something. Sign in again and Halrock puts you back on the page you were on. What you had typed but not saved is gone — that part no app can rescue — but you won't have to go hunting for the job again.
You signed up with Google and there's no password. Then there's nothing to change here: your password lives in your Google account. Your account will say so rather than telling you the password is wrong.
A client says your link doesn't work. Almost always it's an old link. Generating a new estimate retires the previous one on purpose, and the old page tells them so. Send them the current link from the job's Documents tab.
The email button isn't there. It only appears when the customer has an email on file. Add it on the Customers page and it comes back.
A price shows as —. A dash means a number in that line can't produce a price — nearly always a margin of 100% or more, which has no answer. Lower it, or switch that line to markup.
Your profit looks too good. Check whether everyone who logged hours has a cost per hour on the Team page. Unpriced hours are flagged rather than counted as free, and until you set the rate they're missing from the cost.
A job vanished from Active. If the client declined the estimate, it moved to Lost. That tab only appears once you have something in it.
You changed a setting and old paperwork didn't change. That's the design. Tax rates, totals and terms are frozen onto each document when you send it, so what a client agreed to stays what they agreed to.
You think something got deleted. Almost nothing can be. Open More → History — everything anyone changed, newest first, with who and when. Nothing there can be edited or removed, including by us. Client actions from a share link show as coming from the link, because they have no account here. Every line names what it touched — the job, or the document number — so searching for Kitchen remodel or INV-0012 brings back everything that ever happened to it.
You want out. More → Export, any time, no request and nobody to ask.
Something here doesn't match your screen. The app is the truth and this manual is a description of it. Tell us and we'll fix the manual.
The fine print about Halrock itself — what we store, who else touches it, and the terms of using the service — is at [Privacy](https://www.halrock.com/privacy) and [Terms](https://www.halrock.com/terms).
Something here doesn't match what you see on screen? The app is the truth — tell us and we'll fix the manual.