Ongoing AI Solution

BizzMate — AI Job Management for Trades & Construction

Turn the inbox into the job board: incoming email becomes an extracted, assigned, scheduled job, with quotes, invoices and a field app behind it.

BizzMate — AI Job Management for Trades & Construction
01 — THE PROBLEM

A trades business runs on its inbox. Quote requests, complaints, supplier notices, and callback bookings all arrive as email, and someone has to read each one, decide whether it's work, retype it into a job, chase the tradie, then rebuild the same information again as a quote and again as an invoice. The office does this transcription all day, and it's where jobs get lost. General-purpose CRMs don't help — they assume someone is already entering structured data. And the obvious AI fix carries a compliance trap most builders walk straight into: Google's Limited Use terms forbid passing Workspace data, raw or derived, to a vendor that trains on it, which rules out the cheapest models for anything touching a connected Gmail account.

02 — OUR SOLUTION

A multi-tenant Django SaaS that reads the mailbox and does the transcription. Gmail, Outlook, and IMAP connectors poll on a per-connector interval, credentials encrypted at rest, deduplicated on RFC 2822 Message-ID. Each message goes to an AI agent tuned for Australian trades — it understands "arvo", DD/MM dates, and Australian suburbs — which decides whether the email is actionable at all, then extracts a title, description, due date, priority, job type, client, and estimated value into a real job on the board. The compliance problem is solved structurally rather than by policy: two model providers, routed by feature label, with Workspace-derived data pinned to the paid Gemini API and chat-channel text on DeepSeek, and a test that fails the build if a Workspace feature is ever repointed. From the job, the office raises quotes with GST breakdown and ABN formatting, sends them for public token-based customer approval, converts accepted quotes into invoices — copied, never a status flip, because an invoice is a legal record and a quote is an offer. Field technicians work from a separate phone surface and a Flutter app with an offline queue for the van-with-no-signal case. Two Celery queues keep mailbox polling, which is free and IO-bound, from being blocked by model calls, which are slow and cost money per email.

Outcome

Live in production at bizzmate.xyz with a companion Flutter app at v1.1.0. 57 models, 354 routes, and 2,379 tests across the Django codebase. Real inbound email has run end to end against real models to produce real jobs, and Gmail OAuth intake is proven fully — SMTP delivery through Gmail, API fetch, extraction, job created. The project maintains an explicit standard that a green suite is not proof: every provider is mocked in tests, and integrations count as working only when they've been watched running against the deployed stack. Went through Google OAuth verification and Meta app review for the messaging channels.

Key features

  • Email-to-job AI extraction that decides actionability first, then fills every field on the job
  • Gmail, Outlook, and IMAP connectors with OAuth, encrypted credentials, and per-connector poll intervals
  • Two-provider AI routing enforced in code, keeping Workspace-derived data off models that train on it
  • Per-call AI cost ledger with peak/off-peak and cached-input rates, computed per request rather than from period totals
  • Kanban job board with HTMX drag-and-drop, plus filterable list and calendar views
  • Capability-based permissions from a single dictionary that drives the guard, the sidebar, and the team-management table together
  • An AST test that fails the build on any new view writing state without a capability gate
  • Dispatch map on real Leaflet/OSM with geocoded jobs — never a pin without real coordinates
  • Route optimisation against the OSRM router, exact to 8 stops and nearest-neighbour plus 2-opt beyond, with honest fallback when routing is unavailable
  • Recurring maintenance contracts that spawn real jobs ahead of schedule, idempotently, and retire themselves at contract end
  • Quotes with line items, variations, GST, and a public token-based customer approval page
  • Invoices with payments and supplier bills tracked separately as money-out
  • Purchase orders emailed to suppliers with PDF attached
  • WeasyPrint PDF generation shared between browser preview and print, with protected media serving
  • Customer records, shared inbox, and a token-authenticated customer self-service portal
  • AI Business Coach answering from the org's own data through six bounded query tools, with a visible "Checked:" trace under every reply
  • Morning brief, dashboard analytics, and a reports centre exporting to CSV and xlsx from one registry
  • Supplier role with a whitelist detail page that shows the work and their bills but never customer contacts or business money
  • Messenger and WhatsApp inbound via Meta webhooks, with source branding carried through cards and notifications
  • Field technician phone screens plus a Flutter app with offline queue, photo capture, checklist, and native turn-by-turn hand-off
  • Cross-tenant platform console for revenue, retention, engagement, and support
  • Tenant billing with plans and an MRR ledger
  • Strict multi-tenancy — organisation taken from middleware, never from a URL or form field

Build something similar?

Tell us about your project. We'll share how we'd approach it.

Start a project