Aannemers CRM
Five tools and a WhatsApp group, replaced by one system that runs quote to invoice.
- Client — a contractor group in the Netherlands running several specialist brands
- Status — in build
- Scope — brand sites, CRM, quote funnels
- Team — 99six
01 — What it replaces
The work was fine. Finding it was not. Every enquiry arrived somewhere different, every quote was written from scratch, and nobody could say what was in play this week.
- Quoting by hand, every time. No two quotes came out the same, and the price lived in whoever wrote it.
- The customer conversation split across several mailboxes, a WhatsApp group and phone calls. No thread anyone could follow.
- No central customer view. What was agreed, when, and by whom meant asking around.
- Every enquiry treated equally. Someone comparing prices and someone ready to start looked identical on arrival.
- No pipeline, so no view of which deals sat at which stage, or what the week was worth.
- Form data re-keyed into the administration by hand — the step that quietly loses details.
02 — How it works
One road from first click to finished job. Each brand site carries a short funnel. The funnel prices the job, asks for a confirmation, and hands a filled-in customer and deal to the CRM. Nothing is typed over.
- The funnel asks about the job — type of work, surface, finish, substrate, preparation, start date. Buttons and icons, not a wall of form fields.
- A pricing engine returns a range rather than a fixed number, with the honest caveat that the real price follows a survey.
- The confirmation step is the qualification. No confirmation, no CRM workflow, so an orienting visitor never becomes somebody’s task.
- A confirmed enquiry creates a customer and a deal in the first stage, labelled with the brand it came from and carrying every answer given.
The customer card
One screen holds the whole relationship, so nobody has to reconstruct it from four places before picking up the phone.
- Contact details, and the brand the lead came from
- Qualified or orienting
- Every funnel answer, plus the calculated price range
- The quote PDFs already sent
- One timeline: email, WhatsApp, call notes and video calls, in order
- The current deal stage
- Follow-up tasks, open and completed
What the system does on its own
- Confirms receipt to the customer by email
- Generates the brand-styled PDF quote and sends it
- Notifies the advisor the moment a qualified lead lands
- Opens a follow-up task with a deadline, and reminds before it expires
- Labels the lead with the brand it originated from
03 — The pipeline
Stages that match how building actually goes. Not a generic sales funnel: the survey is its own stage, because in construction it is the appointment everything else depends on. A lost deal records why.
- Nieuw — the enquiry has landed
- Contact — someone has spoken to them
- Opname — the survey on site
- Offerte — the quote is out
- Uitvoering — the job is running
- Afgerond — delivered
- Verloren — lost, with a reason attached
The dashboard
Pipeline value per stage split by brand, the follow-ups due today, what each brand brought in and won this week, and twelve weeks of enquiries behind it. One screen that answers what is this week worth, and what have I forgotten.
04 — What it plugs into
Nothing here asks the team to abandon a habit. The mail they already send and the WhatsApp they already answer land on the customer card by themselves.
- Email — two-way sync with the team mailbox. Incoming and outgoing mail attaches itself to the right customer card, and notifications and quote PDFs go out the same way.
- Calendar — reads availability, and puts scheduled video calls in the agenda.
- Video calls — a meeting link generated when a call is booked, with reminders before it.
- WhatsApp Business — messages centralised on the customer card instead of living in one person’s phone.
- Bookkeeping — customer and invoice data sync to the accounting package the business already runs on. The CRM does not replace it.
Who sees what
- Management — everything: pipeline configuration, price parameters, site content, reporting, users.
- Sales advisor — leads, customer cards, the conversation timeline, tasks, agenda, pipeline, notifications.
- Content manager — website content in both languages and the calculator parameters, without a developer.
- Subcontractor — the projects they are assigned to, and nothing else.
Access is enforced in the database, not only in the interface: every row carries its brand, and row-level policies decide who may read it.
05 — Where it stands
In build. The lead brand’s site and the CRM are the work in hand; the funnels, the shared pricing engine and the automations follow once both are live. The screens on this page are the working design of the system, running on invented data — no customer of theirs is on it.
06 — The stack
Boring where it should be.
- Front end — Next.js and TypeScript for the brand sites and the CRM, so there is one mental model across every app in the repo.
- Backend — one shared service on Node for the work that must not live in a browser: form submissions, integration secrets, mail and WhatsApp sending, PDF orchestration. One service with brands as configuration, not five copies of the same logic.
- Data — Postgres with authentication, row-level security, realtime and storage. Multi-brand isolation is row-level, not a filter in the interface.
- Documents — a separate PDF renderer running headless Chrome with JavaScript disabled inside it and external requests blocked. Brand as theme, so a fifth brand is a set of tokens rather than a fifth template.
- Hosting — containers on a single-node Kubernetes cluster, with Cloudflare in front for DNS, TLS, CDN and DDoS.
- Tests — pricing rules, access policies and integration glue are written test-first. Full flows run in a browser, and every smoke run includes an accessibility check.
- Privacy — Dutch market, EU rules. Lead data is personal data: a lawful basis, documented retention, and schemas that support real deletion rather than a soft flag.
If that is your week too, thirty minutes is enough to find out.
Book 30 minutes →