Replacing per-seat CRM licensing with a system the client owns
A custom CRM unifying lead management, reporting and automated invoicing for a logistics company — replacing licensed software billed monthly per seat, with the client's data no longer split across two systems.
Client name withheld under NDA
- Licensing model
- Per-seat → owned
- Invoicing
- Manual → automated
- Status
- Live, maintained
The problem
A logistics company was running a licensed CRM billed per seat on a monthly subscription, alongside a separate system holding the rest of their operational data.
The recurring cost was part of the frustration, but it wasn't the core problem. The core problem was that the data was split across two systems. Client information lived in one place, the records that mattered for billing and operations in another, and nothing reconciled automatically. Answering a question that spanned both meant somebody exporting from each and comparing by hand.
Per-seat licensing then compounds it: the cost scales with headcount while the usefulness doesn't, and a system nobody fully trusts is a system people quietly work around with spreadsheets.
Why the obvious solutions didn't work
Adding another integration between the two systems would have preserved the split rather than removing it, and left the licensing cost untouched. Migrating everything into the licensed CRM would have deepened a dependency the client already wanted out of, at a price that grows with the team.
The requirement was a single system, owned outright, that modelled how the business actually works.
What I built
One system covering lead management, reporting and invoicing, so the record of a client relationship and the record of what they've been billed are the same record.
React front end with views that differ by role — administrators and standard users see the same underlying data presented according to what they're responsible for.
Laravel API handling business logic, authentication and role-based permissions.
MongoDB as the data layer.
Automated invoicing. Invoices are generated directly from client records with the company's watermark applied, rather than assembled by hand in a separate tool. Because billing draws on the same data as the pipeline, the two cannot drift apart — which was the original problem stated as a solution.
Reporting and dashboards, again role-aware: administrators see across the business, individual users see their own.
Email integration for system correspondence, with the accounting logic implemented directly in the application rather than delegated to a third-party package.
Version-controlled in Git with a structured deployment process.
The result
- Two systems consolidated into one, eliminating manual reconciliation between them
- Recurring per-seat licensing replaced with software the client owns outright
- Invoice generation moved from a manual task to an automatic one, watermarked and consistent
- Role-aware reporting available to administrators and users without exporting anything
The system is live and I continue to maintain it.
Working on something similar?
Get in touch