Three tools in · one system out · five weeks
The challenge
The client — a family-owned industrial manufacturer in North Rhine-Westphalia — had scaled to €38M in revenue on the back of a sales team that cared deeply about their customers and tracked almost everything in their heads. The supporting stack had drifted into chaos:
- A Microsoft Access database from 2011 with the customer master.
- A shared Excel file for the quoting pipeline, guarded by one sales ops manager.
- A shared Outlook inbox where everything that mattered eventually lived.
Quotes took an average of 11 days. Senior sales reps left with customer history nobody else could reconstruct. Two enterprise-CRM rollouts had been tried in the previous three years. Both ended with the team quietly reverting to the spreadsheet.
They didn’t need Salesforce. They needed a tool that respected their actual process.
Our roadmap
-
01Phase 01 Week 1
Architecture & data model
Mapped the real quote-to-order flow with sales, migrated Access into a versioned schema.
-
02Phase 02 Week 2
Core flows
Customers, contacts, opportunities, quotes — built end-to-end with auth, audit log, SSO.
-
03Phase 03 Week 3
Quote engine
Their configurable pricing rules, versioned quote PDFs, email-send from within the app.
-
04Phase 04 Week 4
Integrations
DATEV, Outlook, the ERP (Sage), and a Zapier fallback for the long tail of legacy tools.
-
05Phase 05 Week 5
UAT & rollout
Two days of shoulder-to-shoulder UAT with every rep, then a staged rollout across 3 regional teams.
How we shipped it
Week 1 — Model the business, not your preferred framework
We blocked a full day with the sales director and the two most tenured reps. We whiteboarded the actual quote flow — with every weird exception (framework agreements, call-off orders, the one customer who insists on a fax confirmation). By lunch we had thrown away two of our default data-model assumptions. By evening we had a schema the team recognised as theirs.
The Access database was migrated into PostgreSQL the next day, with a versioned migration script and a deterministic diffing pass so we could re-run it right up to go-live.
Week 2 — Core flows, no half-finished screens
Customers → contacts → opportunities → quotes. Every entity had full CRUD, an audit trail, and role-based permissions from day one. SSO via the client’s existing Azure AD, so reps didn’t need a new password.
We shipped to a staging URL by end of week 2 with real migrated data. Reps could already log in and look up their own accounts.
Week 3 — The quote engine, which was the actual product
The client’s pricing rules were not arbitrary — they encoded years of margin learning. We didn’t try to reinvent them. We built a rule DSL that sales ops could edit without touching code, and we generated versioned quote PDFs straight from the database. Every quote the client ever sent is now reproducible byte-for-byte from its ID.
Week 4 — Integrations, the boring but necessary layer
- DATEV export for the accounting team — matched their existing workflow.
- Outlook add-in so reps could drag emails into a customer record without leaving their inbox.
- Sage ERP bridge — read-only for stock levels, write-on-accept for order creation.
- A thin Zapier escape hatch for the long tail of smaller tools we didn’t want to hard-wire.
Week 5 — UAT, rollout, and one very important party
Two days of structured UAT with every rep, one region at a time. We watched them work, fixed 23 small things on the spot, and rolled out to production on the following Monday. The client threw a small party. We drank the Kölsch.
The architecture
A stack their in-house IT team could maintain — and take over — from day one.
- Backend: TypeScript on Node, Fastify, PostgreSQL, Prisma. Versioned migrations, per-row audit log.
- Frontend: Astro + React islands for interactive screens, server-rendered for speed.
- Auth: Azure AD SSO, per-role permissions in Postgres, MFA enforced.
- PDFs: Deterministic rendering pipeline — same inputs, same bytes, forever.
- Integrations: DATEV, Sage ERP, Microsoft 365, a small Zapier bridge.
- Infra: Single-region Hetzner VMs + managed Postgres, on-prem backup to the client’s own NAS. No hyperscaler lock-in.
- Observability: Self-hosted Grafana, Loki logs, a simple error page that the ops manager can actually read.
Everything in a single git repository. One-command deploy. A README their IT lead could follow without calling us.
The results
Measured after the first full quarter in production:
- Quote cycle dropped from 11 days to 6.6 days — roughly 40% faster.
- Three tools retired on the same day we went live (Access, the spreadsheet, the shared inbox).
- New-rep onboarding from 6 weeks to 9 days. The CRM is now the training manual.
- ~€120k of recovered time per year — conservatively estimated on the minutes saved per quote across the team.
- Zero production incidents in the first 90 days. Two small bug fixes, both shipped the same day they were reported.
What’s next
The next phase adds a customer portal — letting large accounts place call-offs directly and see live order status. Because we own the data model, not a vendor, that extension slots in naturally instead of requiring a re-platform.
If you have a sales or ops team running on a stack of tools that “kind of works” — and every CRM pitch has left you feeling like you’d be building for the software instead of the other way round — talk to us. We’ll build software that respects the way your team actually works, and we’ll ship it in weeks.