Work / Waste broker app

Case study · CRMs & integrations

Waste broker app.

The broker app behind Undisputed Waste Services. Every enquiry lands in one inbox, gets priced by sending a brief to suppliers, and is booked, tracked and costed through to a paid, profitable job.

React + ViteTypeScriptNode.js / ExpressPostgreSQL (Drizzle)Vercel + Railway
Waste broker app
The problem

What needed solving.

Undisputed sells clearance and skip jobs and has them done by a network of suppliers. Enquiries came in on several channels, supplier prices were chased by phone, and nobody could see in one place what each job was quoted, what the supplier charged and what was left as profit.

Who uses it
  • The office team, who reply to customers, brief suppliers and book jobs
  • Suppliers, who open a private brief link and send their price
  • The owner, who watches the pipeline, ad spend and profit per job
Walkthrough

The software, screen by screen.

Every screen here is the real software, run on its own throwaway local database with made-up demo records (Demo Buyer Ltd, Demo Skips Ltd, Test Lead 01 and so on, example.com emails, ZZ postcodes and reserved 07700 900 test numbers). All outside services were blocked. Every figure is demo data, not a real price, spend or invoice.

Desktop · 1440pxInbox and pipeline at desktop width
Mobile · 390pxInbox and pipeline at mobile width
Demo data Inbox and pipeline. Every enquiry as one thread across website, phone, WhatsApp, SMS and email. The rail across the top is the eight-stage pipeline, from New Lead to Job Complete, and every lead shows its next action.
Desktop · 1440pxSupplier briefs and quotes at desktop width
Mobile · 390pxSupplier briefs and quotes at mobile width
Demo data Supplier briefs and quotes. Staff send a private brief link to one or more suppliers by email or WhatsApp. Supplier prices come back into the lead, the cheapest is flagged, and one click accepts a quote. The brief never shows the customer price or margin.
Desktop · 1440pxThe supplier's brief at desktop width
Mobile · 390pxThe supplier's brief at mobile width
Demo data The supplier's brief. What the supplier sees: job type, description, location, contact details and photos, with a form to submit a price, VAT basis and earliest date. Links expire and can be revoked or regenerated.
Desktop · 1440pxQuote submitted at desktop width
Mobile · 390pxQuote submitted at mobile width
Demo data Quote submitted. Once a supplier has priced the job, their link shows the active quote, so they can check or update it.
Desktop · 1440pxJob and profit at desktop width
Mobile · 390pxJob and profit at mobile width
Demo data Job and profit. For booked jobs: the price won, supplier cost, VAT and profit ex VAT, live as the figures are entered, with the supplier recorded against the job.
Desktop · 1440pxAll leads at desktop width
Mobile · 390pxAll leads at mobile width
Demo data All leads. Every lead as a table, with quick filters for Needs action, Call overdue, Quoted, Unpaid jobs and Unread WhatsApp, an attribution report and CSV export. On a phone the table becomes cards.
Desktop · 1440pxDashboard at desktop width
Mobile · 390pxDashboard at mobile width
Demo data Dashboard. Pipeline overview, won vs lost, quoted and won value, supplier cost and gross profit per job, plus a daily performance and ads tab with spend, cost per lead and bookings.
Desktop · 1440pxJob bookings calendar at desktop width
Mobile · 390pxJob bookings calendar at mobile width
Demo data Job bookings calendar. Booked jobs by day, week or list, filtered by supplier, with job value, profit and paid or unpaid status.
Desktop · 1440pxCall-backs calendar at desktop width
Mobile · 390pxCall-backs calendar at mobile width
Demo data Call-backs calendar. Every promised call-back, split into overdue, today and upcoming, for one person or the whole team.
How it works

Workflows, integrations and stack.

Workflows & automations

  • Website enquiries arrive through a signed intake API and become leads, with the ad source recorded
  • Supplier briefs: private, expiring links per supplier, with quotes collected and compared in the lead
  • Accepting a quote sets the supplier and cost on the job
  • Won price and supplier cost give live profit per job, and payments are marked paid or unpaid
  • Call-backs and bookings feed their own calendars
  • Calls can be transcribed, with job details pulled out for staff to check
  • Lead and booking events go to Meta from the server

Integrations

  • WhatsApp and SMS through Twilio
  • Calls and call logging through Aircall
  • Email through Resend
  • Meta Conversions API
  • Google Ads API for daily spend
  • The Undisputed website and Leadform as lead sources

Tech stack

  • React, Vite and TypeScript on the front end
  • Node.js and Express API
  • PostgreSQL with Drizzle ORM and versioned migrations
  • Front end on Vercel, API on Railway

How it was built and tested

  • Built in small pull requests, each reviewed before merge
  • Automated tests with Vitest plus Playwright end-to-end tests
  • Every change gets a UX check on desktop and mobile, in Chromium and WebKit, against a throwaway database with fake data and all outside services stubbed
  • Production is checked after every deploy, with a rollback ready
Results

Outcomes

Results for this project will be published once the figures have been checked against our own data.

Next case study

Lead generation Stato portal

Read it →

Got a project in mind?

Tell us what you need to run better. We'll come back with how we'd build it.

Start a project →