← All work

Web app · 2026

Fenwick Plant Hire

A plant hire yard with genuine fleet availability across date ranges, hire-rate pricing that matches how yards actually charge, and a yard office running contracts from booked to back on the yard.

Try it, live

This isn’t a mock-up. It’s the real application, running on this server with its own database. You get a private copy. Change the hire dates and watch availability move, then take a machine off the road in the yard office.

Open the live demo →

A shop asks "is there one left?". A hire yard asks something much harder: "is one free on every single day between the 4th and the 18th, given everything already out, and the machine booked in for its LOLER inspection?" Getting that wrong means promising a digger you have not got.

One availability engine

The centre of this build is a single function. It takes a fleet, a date range and the entire order book, spreads every commitment across the days it covers, and returns how many of each machine are free on the worst day of the range, because a machine free on four days out of five is no use for a five-day hire.

The public fleet page calls it. So does the individual machine page, the basket, the checkout and the yard calendar. There is no second implementation to drift, which is why the website and the yard can never tell a customer different things.

Machines in the workshop come out of the same sum. Take three cement mixers off the road in the yard office and the public site offers three fewer, immediately.

Pricing the way yards actually charge

Hire pricing is not quantity times price. Whole weeks bill at the week rate, left-over days at the day rate, and the remainder is capped at a week, so a thirteen-day hire costs exactly the same as a fourteen-day one. Transport is charged per machine and vanishes if you collect. The damage waiver is a percentage of the hire charge, not of the total, and it can be declined.

Every one of those is a rule that gets hard-coded wrong in a spreadsheet and quietly overcharges people for years.

The yard office

A fortnight-wide fleet calendar, one row per machine, showing how many are free each day. A contract board that moves a hire from booked to out to back on the yard, with a damage note on return. Overdue hires, still out past their return date, are flagged for chasing, because that is the yard's actual daily problem. Fleet utilisation over the last thirty days, counting machine-days hired against machine-days owned.

Live, without a page reload

Change the dates on the fleet page and every availability count and price updates in place. The browser is not doing the arithmetic: it asks the same availability endpoint the server-rendered pages use and paints the answer, so the live figures and the printed ones cannot drift apart. Turn JavaScript off and the form still submits and the server still renders the same numbers.

Why it is worth trying

Change the dates at the top of the fleet page and watch every number on the site move. Then try to book more than the yard has, and get turned down with the real figure rather than a shrug.

What it does

  • Date-range availability across a fleet with quantities and service windows
  • Availability computed on the worst day of the range, not the average
  • Week-rate hire pricing with the remainder capped at a week
  • Transport per machine, optional damage waiver, VAT shown separately
  • Fortnight fleet calendar and a contract board: booked, out, back
  • Overdue flagging and 30-day fleet utilisation
  • The fleet page re-prices and re-counts itself live as the dates change
  • Hire dates exported to Google or Apple Calendar
  • Yard office behind a session login
  • Search across the fleet by name, code or category
  • Two staff accounts: the driver never receives the takings
  • Hire confirmation email, rendered exactly as the customer would get it