Download it first
Daily progress report template — CSV, 15 columns
No email address. No sign-up. It opens in Excel, Google Sheets and Numbers, because it is a CSV and a CSV has never needed a plugin or a particular version of anything. Save it, rename it, delete the columns you do not want, put your own site codes in. It is yours now and nothing on this page depends on you reading further.
It has fifteen columns and ten example rows. The examples are from a fiber build — 1,150 m of trench, a crew that hits rock at the 205 m mark — and every one of them is labelled Example - delete this row so you do not accidentally ship our numbers as yours. Delete them.
| Column | Allowed values | Notes |
|---|---|---|
date | YYYY-MM-DD | The day the work happened, not the day you typed it. |
site | your own site codes | Whatever your crews say out loud: SITE-03, Bahnhof, Cab 14. |
crew | your own crew names | The crew is the unit that gets assigned work and the unit that goes silent. |
entry_type | progress | cost | blocker | blocker_resolved | nothing | One row per thing that happened. A day with metres and a cost is two rows. |
activity | survey | permitting | mobilisation | trenching | directional_drilling | duct_laying | chamber_install | cable_blowing | splicing | testing | home_connection | reinstatement | restoration | demobilisation | other | Leave blank on a cost that belongs to the site rather than one activity. |
quantity | a number | Metres, each, hours, days. On entry_type=nothing put 0. |
unit | m | each | hour | day | lump | |
amount | a number, no currency symbol | Put the currency in the filename or a column of your own. Mixed currencies in one column is how a total goes wrong. |
cost_category | labour | plant_hire | materials | subcontract | permits_fees | traffic_management | reinstatement | disposal | rework | standby_downtime | other | rework and standby_downtime are separate on purpose. They are pure waste and they are invisible in most invoices. |
commitment | incurred | committed | committed = booked and owed but not yet invoiced. A 4-day hire counts the day it is booked, not the day the bill arrives. |
blocker_type | permit | access | ground_conditions | utility_strike | third_party | material_shortage | plant_breakdown | weather | design_error | safety | other | |
severity | low | medium | high | Any utility_strike or safety blocker is high, whatever it looks like. |
description | free text | What you would have said in a message. Write it that way. |
reported_by | a name | Who saw it. Not who typed it in. |
evidence | a filename or a link | The photo, the voice note, the hire docket. A number nobody can open is a number that gets argued about. |
Three things in it are deliberate, and they are the three things most daily-report templates get wrong.
One row per thing that happened, not one row per day. A day where the crew trenched 110 m and paid for traffic plates is two rows, not one row with two facts crushed into a notes cell. This is the only decision on this page that costs you nothing and buys you everything: a day-shaped row can never be added up, and a fact-shaped row can.
A row for the day nothing happened. entry_type accepts the value nothing, and the blank-day example in the file uses it. A day on standby waiting for a breaker is not an absence of data. It is the most expensive data you will collect this month. A missing row looks identical to a forgotten row, so you will never know which one you are looking at — whereas a zero is a fact with a date on it.
A committed column, not just an incurred one. commitment takes incurred or committed. A four-day breaker hire at $1,450 a day is a real $5,800 obligation the moment somebody says yes on the phone. If your report only records money that has been invoiced, then your report tells you at invoicing, which is the problem you downloaded a template to solve.
There is also an evidence column, which is just a filename or a link. Put the photo in it. A number nobody can open is a number that gets argued about in a meeting three weeks later, and the meeting costs more than the number.
Now the part the template farms leave out
I have read a lot of daily progress report templates in the last month. Some of them are genuinely well made. All of them share one assumption, and the assumption is the reason your last three attempts at this did not survive a busy fortnight.
The assumption is that the failure is discipline.
Look at how the advice is phrased. Make it a habit. Set a reminder. Keep it to five minutes. Get buy-in from the crew. Follow up when it’s not filled in. Every one of those is aimed at a person who is choosing not to do a thing they could do. So the fix is always a fix to the person: more reminders, more follow-up, a shorter form, a talk about why this matters.
Here is what is actually in front of that person.
It is 17:40. They have been on site since seven. It is raining, because it is always raining in this story and it is always raining on the actual site too. Their hands are wet and inside gloves they do not want to take off, because taking them off is the start of a two-minute sequence involving a phone that does not respond to wet fingers. The van is loading. Somebody is asking them about tomorrow’s plates. And the thing waiting for them is a spreadsheet with fifteen columns, some of which require them to remember a code, and one of which asks for a figure they will have to think about.
That person is not undisciplined. That person is being asked to be a data-entry clerk at the end of a ten-hour shift, for free, on equipment that is wrong for the job, in weather that is wrong for the equipment. And they are being asked to do it every single day, including the days when nothing interesting happened, which is most days.
So they do the rational thing. They do it on Friday for the whole week, from memory. Or they do it on the dramatic days — the rock, the strike, the accident — and skip the ordinary ones. Or the site supervisor does it for them, from a phone call, in round numbers.
And notice which data you lose. You keep the dramatic days, because those are memorable and someone is asking about them anyway. You lose the ordinary ones. But the ordinary days are the ones that tell you what a metre actually costs in this ground with this crew and this machine — they are your entire basis for forecasting anything. The exceptions you keep are the ones you already knew about.
The form does not fail at random. It fails selectively, in exactly the direction that destroys its own usefulness. And it fails hardest in the weeks when you are busiest, which are the weeks the numbers would have been worth the most.
Nine cells against one word
Here is the comparison that decided how we built our product, and you can check it against the file you just downloaded.
A normal progress day in that template is nine filled cells: date, site, crew, entry type, activity, quantity, unit, a description, and who reported it. Nine acts of typing, several of which require recall of a code, to record one fact — that the crew did 110 m of trench today.
The same fact, sent as a message, is one word:
110
Both of those produce the same row. The nine-cell version asks a human to supply nine things. The one-word version asks a human for the one thing only they know, and derives the rest from context the system already holds: who sent it tells you the worker and the crew; the crew’s active site tells you the site; the site’s in-progress trenching task tells you the activity; the bid line tells you the unit; the clock tells you the date — and if the message arrives after 22:00, it belongs to the shift that just ended, because crews report late.
Six of the nine cells were never information. They were re-keying. You have been paying a wet, tired person to retype things you already knew, and then wondering why they stopped.
That is the whole argument. It is not that spreadsheets are bad. The template above is a good spreadsheet and I would rather you use it than nothing. It is that the data-entry step is manual, so it is optional, so it is skipped exactly when it matters — and the only durable fix is to make the reporting act small enough that a person with gloves on will complete it without deciding to.
What replacing the form actually costs you
If the reporting act has to survive wet gloves, four constraints follow. These are the design rules in our own specification, and I am listing them because they are the interesting part — they are what makes this hard, and any vendor who will not state them is selling you a form with a nicer font.
Never block on a parse. If the system cannot understand a message, it stores the message anyway, flags it for a human, and tells the worker someone will look at it. It never replies invalid format, please resend. A worker who gets rejected once goes back to the group thread and stays there forever, and you have lost the site. This rule is expensive: it means you must accept and store input you cannot yet use, and then have a person clean it up. It is also non-negotiable, because a silent parse failure is worse than having no system at all — the worker believes they reported it, so nobody goes looking.
At most one clarifying question. If a message is still ambiguous after a single round trip, store it for review and move on. Two questions is an interrogation, and interrogating a crew lead at 18:00 is how adoption dies in week two. This constraint is what makes the previous one necessary: if you may only ask once, you must be able to keep what you did not understand.
Always echo what was stored, in their words, with an undo. Logged for SITE-03: 110 m trench, $1,400 traffic management, no blockers. Fifteen minutes to undo it. People trust a system that shows its work, and a correction has to be a new row rather than an edit, so that the audit trail stays true.
Voice notes and photos are first-class inputs, not attachments. Speaking is what a person with wet gloves actually does. If voice is a second-class path, the primary path is still typing, and you are back where you started.
And one thing that is not a design choice but a constraint you inherit: on WhatsApp, a business cannot open a conversation outside 24 hours of the customer’s last message without an approved message template. So the daily prompt has to be a registered template. That is a real piece of setup work, not a footnote.
What it looks like when the form is gone
Ours fires at 17:30 local, every working day, to every worker on an active crew. It asks three questions.
Metres. Money. Blockers.
That is the whole flow. How far did you get, anything extra it cost, anything blocking you tomorrow. Buttons for the common answers, free text accepted for all of them, a voice note accepted instead of any of them. Adding a fourth question is a scope change rather than a tweak, because every question you add costs response rate, and response rate is the only thing the flow is for.
Two details in it matter more than they look.
Nothing today is a real, tappable answer, and it stores a zero-progress report. Standby days, weather days and quiet stalls become visible instead of looking like somebody forgot.
And a worker who already mentioned their metres conversationally that afternoon gets the question pre-filled: I’ve got 110 m already — is that the final number? Asking someone to tell you twice is the same insult as asking them to type nine cells.
Silence still gets noticed, but by the system rather than by you. One reminder at 21:00, never a third prompt, and a crew with no progress report for two consecutive working days raises a flag on the manager’s side. The unfilled form used to be invisible; now the absence is itself an event.
What the spreadsheet still does better
Three things, honestly, because a page that only argued one way would not be worth citing.
A spreadsheet is yours. It has no vendor, no login, no renewal and no export problem. That is a real property and nothing on this page beats it. If you are running two sites and you already have a system that works, the correct action after reading this is to download the CSV and close the tab.
A spreadsheet is instantly auditable. You can see every row at once, which is genuinely harder in any system with a database behind it. The compensating requirement is traceability: every number has to open the message, photo or voice note it came from, or a PM who distrusts a figure will go and re-check it in Excel — and then you own two systems and have no single truth.
And a form is unambiguous. This is the one people underrate. A column called cost_category with eleven allowed values cannot be misread, whereas “breaker hire 1450 a day for 4 days” has to be interpreted, and interpretation is where the errors move to. The honest trade is this: a form pushes the cost of precision onto the person least able to pay it, and gets you precise data about a fraction of the days. Free text pushes that cost onto the system, and gets you approximate data about nearly all of them. For forecasting a build, nearly all the days wins — but it is a trade, not a free lunch.
What this does not fix
It does not make the first bid right. Your rate per metre in this ground is an observation you do not have yet, and no reporting change creates it retroactively. What it does is make the next bid in that ground an observation rather than an opinion.
It does not remove the office work. Somebody still reviews what the system could not parse, approves the large costs, and asks the awkward question about the 40 m that went in short on depth. The reporting burden moves off the person in the rain and onto a desk, where there is a keyboard and a dry hand. That is the actual claim — not that the work disappears.
And it does not make free-text parsing a solved problem. The nearest published work I can point at is Deza, Ihshaish and Mahdjoubi, who built what they describe as the first automated models classifying Bills of Quantities descriptions into the International Construction Measurement Standard, learning from more than 50,000 item descriptions across 24 large UK infrastructure projects, and report above 90% F1 on average. Their documents are considerably tidier than a voice note from a trench, so that is precedent for the category of problem, not proof of our case. It is tractable. It is not free.
The one thing to take away
Your daily report is not empty because your crews lack discipline. It is empty because a form is a tax, taxes get avoided, and this one falls due at the worst moment of the worst-weather day on a person whose hands are wet.
Ask for the one number only they have, in the place they already are, and derive the other eight. That is the whole design. The spreadsheet above is a good spreadsheet and you should take it. Just do not mistake it for the answer to the question you actually have, which is not what should the form look like but why is there a form.
Frequently asked
What do my crews have to install? Nothing. No app, no login, no training session. They send a message in the thread they already use, in the language they already speak, and a voice note counts. Any system that requires an install has re-created the form with extra steps.
Where do the numbers come from, and can I check one? Every stored fact keeps the id of the message it came from. So a figure on a dashboard opens the photo, voice note or text it came from. A number you cannot trace is a number you will re-check by hand.
Can I keep using my spreadsheet? Yes, and the template above is built so that you can. It uses the same activity and cost categories our own data model uses, so the columns line up if you ever move. That is deliberate and it is not a trick — a template that only works as a funnel step is the thing this page is arguing against.
Is this just WhatsApp with extra steps? The opposite. The point is that WhatsApp is already where the facts are, and that today they arrive there and then stop. What is missing is not a better channel; it is the step that turns “breaker hire 1450 a day for 4 days” into a $5,800 committed cost on a bid line, on the day it is said.
What happens on the days a crew sends nothing at all? Two consecutive working days with no progress report from an assigned crew raises a flag. Silence is treated as a finding rather than as a gap in a spreadsheet, which is the only way an unfilled report ever becomes visible.
Do you have results from customers using this? No. Harmis is pre-pilot: no customers, no published results, nothing from the field. The fiber example in the template and on this page is the scenario in our own specification — seed data we build and test against, labelled as illustrative. The 17:30 flow described above is our specified design, not a measured outcome. When we have a pilot’s numbers they will be that pilot’s numbers and we will say whose they are.
Why a CSV and not an Excel file?
Because a CSV opens in Excel, Sheets and Numbers with no version problem, no macro warning and no library on our side. An .xlsx would let us add dropdowns and a locked header row, which is a real loss. It would also be a file some people cannot open, and this page is not the place to be clever.
Sources
- Deza, J. I., Ihshaish, H., & Mahdjoubi, L. (2022). A Machine Learning Approach to Classifying Construction Cost Documents into the International Construction Measurement Standard. arXiv:2211.07705 — 50,000+ item descriptions, 24 UK infrastructure projects, above 90% F1 average. Preprint; no journal reference on the abstract page.
- Sadeghi, S. (2024). Enhancing Project Performance Forecasting using Machine Learning Techniques. arXiv:2411.17914 — traditional methods “rely on static baseline plans” and “fail to consider the dynamic nature of project progress.” Preprint.
A note on what is not cited here. I looked for published measurement of daily-report completion rates in construction — how many get filled in, how late, how accurately — and did not find any I would stand behind. So there is no completion-rate statistic on this page. The argument above is a mechanism argument from the design constraints in our own specification, and it is labelled as one. If a study measuring this exists, I would like to read it: [email protected].