Custom CRM Platform
The problem
Northfield sells and services laboratory instruments. Sales and service are the same relationship to the customer, and were two entirely separate systems internally — a licensed CRM for the pipeline, a service desk for maintenance contracts, and no link between them.
An engineer visiting a site could not see the account was mid-renewal. A salesperson quoting a new instrument could not see three unresolved service tickets. Both teams built spreadsheets to compensate, and neither trusted the other numbers in the Monday meeting.
The trigger was a lost renewal worth about eleven percent of annual recurring revenue, on an account with an open complaint nobody in sales had seen.
Constraints we designed around
Four years of history
Engineers work offline
No retraining budget
Architecture
One ASP.NET Core application with a single customer record at its centre. Sales and service are views over the same account, not separate entities that sync — the integration problem was the actual problem, so we removed it rather than automating it.
The offline service view is a local-first React client with a queued write model; conflicts surface to the engineer rather than resolving silently. Calendar and email flow through Microsoft Graph, so activity logs itself.
Outcome
What we would do differently
We built the offline service view in week nine. It should have been week two — it was the feature with the most unknowns and the least precedent in our own codebase, and discovering that late compressed everything after it. Highest-uncertainty work belongs early, and we knew that.
Sales and service on different systems?
Send us how the two teams hand over today. We will map what one record changes.