Skip to main content

Greeen Building By Design, California, USA

Construction Project Management Platform

A project, time and billing system for a design-build studio: phases, tasks, file notes, tracked hours and billable items that assemble themselves into an invoice.

Status
Completed
Industry
Construction & Design
Year
2024
Categories
Web Applications, Automation, Business Systems
Project dashboard showing phase completion against start and target dates, recent tasks with completion dates, active users, hours logged by role and upcoming milestones, with actions to create an invoice or generate a report.

Building the smallest project tool that could still produce the invoice

A custom project, time and materials tracker for a design-build studio, scoped down to what the team would actually use and ending at a generated invoice.

A design-build studio running several jobs at once has a bookkeeping problem disguised as a project management problem. Who worked on what, for how long, at which rate, using which materials — and can any of that be turned into an invoice without someone rebuilding it by hand from notes and memory?

The off-the-shelf tools they had tried failed in the usual two directions. Either the tool did not model how a build actually runs — phases with payment schedules, materials consumed per task — or it did everything, at a price and a complexity the team would not absorb.

What we built

We started narrow and grew it: projects and project types, then tasks with dated notes and file attachments, then time tracking per person per task, then a catalogue of billable items, then clients, users and company details — and finally the piece that made the rest pay off, invoice generation that assembles a phase payment, the materials used and the billable hours into one printable document.

Invoice source
Derived, not stored
Time tracking
Per user, per task
Project types & phases
Client-editable

The problem

Tracking several simultaneous builds across a team is tedious in a specific way: the data that matters for billing is generated in the field, in small pieces, by people who are not thinking about billing. Hours worked, materials consumed, a photo of a wall before it was closed up.

By the time an invoice is due, that information is spread across notebooks, texts and memory, and someone spends an evening reassembling it — badly, because anything forgotten is simply never billed.

Generic project management tools did not fit. They model tickets and sprints, not phases with payment schedules and a materials list, and the ones that could be bent into shape carried far more product than the team wanted to learn.

Requirements

  • Track multiple concurrent projects, each with a type and a current phase
  • Record tasks against a project with dates, free-text notes and file attachments
  • Log time per user, per task, with a duration and an hourly rate
  • Maintain a catalogue of billable items with unit costs
  • Keep clients, team members and company details in the same system
  • Generate an invoice from a phase, its items and its billable hours
  • Stay small enough that the team would actually use it

The solution

The design decision that shaped everything else was to make the invoice the endpoint of the data model rather than a separate document. A phase payment, the items consumed and the hours logged are not gathered for the invoice — the invoice is a view over records that already exist because the team captured them while working.

The project detail screen is deliberately one screen. Tasks, notes, attachments and the time-tracking table are stacked in a single panel with inline entry rows, so logging an hour against a task is one interaction rather than a navigation.

Notes and files hang off individual tasks rather than the project, which is what makes them findable later. "The photo of the piping" is attached to the piping task, not buried in a project-wide folder.

Billable items are a maintained catalogue rather than free text. A line on an invoice points at an item definition with a unit cost, so the same material is priced the same way twice.

Project types and phases are data the studio edits themselves, because the vocabulary of a build — as-built, design AD, landscaping — belongs to the client, not to us.

Architecture

A straightforward Laravel application on MySQL, with jQuery and DataTables handling the table interactions and inline editing. No single-page front end, because the interaction model is forms and tables and a page load is not the bottleneck.

Invoices are rendered server-side to PDF from the same records the application already holds. There is no invoice document stored as a blob of copied values — regenerate it and you get the current truth.

Attachments are stored outside the database against the task they belong to.

Implementation

We built it progressively, in the order the client could use it. Projects and tasks first, which was immediately better than notebooks; then time tracking, which was the piece that made billing possible; then items and invoicing.

That order mattered. Each stage was usable on its own, so the studio was working in the system months before the invoicing existed, and the invoicing was designed against real recorded data rather than an assumption about what people would enter.

Tables throughout use search, pagination and column visibility, and export to CSV. The studio's own accountant does not need a login to get numbers out.

Results

The studio runs its projects, team, tracked hours and billing in the system, and the invoice that used to be reassembled by hand is generated from records captured during the work.

We have not published a time-saved figure because we did not measure the manual process it replaced, and a number we did not measure is not a result.

What we learned

Starting simple and growing was not a compromise, it was the reason the tool fits. Every feature was added in response to the team hitting its absence in real work, which is a much better filter than a requirements workshop.

Making the invoice a derived view rather than a document removed an entire class of reconciliation bugs. There is no second copy of the numbers to drift.

Letting the client own their own vocabulary — project types, phases — stopped a steady drip of change requests that would otherwise have needed a developer each time.

Gallery

Project types administration screen listing each type with its phases, phase descriptions and a billable-time toggle per phase.
Project types are data, not code — the studio adds its own types and phases, and marks which of them bill time, without a release.
User administration table listing each team member with role, assigned projects, active status and last activity, alongside edit, delete and password-reset actions.
Team members carry a role and the projects they are assigned to, which is what makes an hour logged against a task attributable to a person.
Operations overview linking one project's phase progress, recent tasks and active users to a cross-project user assignment matrix and role distribution charts.
The operations view reads across projects: progress and logged hours on one job, set against the people assigned to every other.
Generated PDF invoice showing project phase payment, itemised materials with quantities and unit costs, and a billable time section. Client contact details are blurred.
The generated invoice: phase payment, materials and billable hours assembled from records already captured against the project. Client contact details blurred here.

Have something you want built?

Tell us what you are trying to ship. We will come back with an approach, a plan and an honest view of what it takes.