Splash Lease

Business management system for student equipment rental

Over 8 years, I've built 30+ features for this platform — from in-house accounting to automated invoice processing. This case study highlights three of the more technically interesting challenges: real-time customer communication via WhatsApp, an intelligent search system that predicts what users are looking for, and a duplicate detection service to clean years of messy data.

All personal data has been replaced with fictitious information for privacy.

The Challenge

Splash Lease ran on a legacy Microsoft Access system that was being deprecated. They needed a modern replacement that could handle their growing business operations.

The Solution

A complete rebuild covering all business operations with many new features. A full API powers the back-office, their website splash.nl, and a mobile app in development.

My Role

Lead developer for 8+ years and ongoing. Full-stack: database design, backend, frontend, and DevOps (Docker, servers). Close collaboration with the owner for rapid iteration.

Largest
Student equipment rental in NL
135,000+
Messages processed
5+ years
Continuous uptime
10+
Integrations

01.Unified Communication

Problem

Employees constantly switched between WhatsApp, email, and the CRM. Customer context was lost across tools. Response times suffered because staff had to manually look up customer information for every conversation.

Solution

Built an integrated communication hub connecting CM.com's WhatsApp Business API, Microsoft Graph API for email synchronization, and Voys API for phone calls. All channels unified in one view with full customer context. When a message arrives, the system instantly identifies the customer and surfaces their complete history — contracts, payments, previous conversations across all channels. Staff can compose messages using customer data directly, automate routine communications, and respond faster with full context at their fingertips.

Loading diagram...

Example: CM.com WhatsApp integration flow

Technical Details

  • Webhook endpoint receives incoming messages from CM.com in real-time
  • Reliable phone number lookup using E.164 format — all numbers normalized via Google's libphonenumber
  • WebSocket connection pushes messages to the UI without polling
  • Smart reply templates auto-populate with customer data (name, contract details, balances)

Result

No more app-switching. Staff see the full customer context immediately. Response times improved significantly. 135,000+ messages processed through the system.

All personal data has been replaced with fictitious information for privacy.

02.Intelligent Customer Search

All personal data has been replaced with fictitious information for privacy.

Problem

Finding customers required staff to navigate a complex dialog with dozens of searchable fields. A naive approach — taking the input and searching all fields — proved too slow for a responsive experience. We then tried pattern detection to identify input types (emails, phone numbers, postal codes), but hit another wall: ambiguous inputs that could match multiple field types still required querying all possibilities, negating our performance gains.

Solution

We built an intelligent input recognition system directly in the search bar. As users type, the system analyzes the input in real-time and suggests what type of field it might be — last name, first name, phone number, postal code, organization name — ranked by confidence. Instead of technical filter syntax like field:value, we designed an intuitive UI where suggestions appear alongside the input. Staff can use arrow keys to select a different field type if needed, transforming the input into a visual "search element tag."

The key insight: live search results update based on the highest-confidence field type, so most of the time users don't need to explicitly select anything — they just see their results appear. This makes the search efficient for both the user experience and database performance, as we only query the most likely field rather than all possibilities.

These tags can be combined for complex queries: searching for a customer named "Kievits" at house number "53" becomes two tags that work together. The system also auto-formats input appropriately — names are capitalized, phone numbers normalized. The result is powerful search capability wrapped in an interface that requires zero training.

1. Type search term, see field suggestions
2. Combine tags for complex queries
Loading diagram...

Confidence-based search flow with tag combination

Technical Details

  • Real-time pattern analysis with confidence-based ranking of possible field types
  • Live search queries the highest-confidence field type automatically
  • Visual "search element tags" (pills) for confirmed field selections
  • Combinable tags enable complex multi-field queries
  • Auto-formatting per field type (capitalization, number formatting)
  • Keyboard-first navigation: arrow keys to browse suggestions, enter to confirm

Result

Staff find customers in seconds using whatever information they have — a partial name, phone number, or address fragment. Live results appear immediately based on the predicted field type, eliminating the need to manually select filters in most cases. Complex combination queries that previously required navigating multiple filter dialogs now happen naturally in a single search bar. No training needed; the interface guides users to the right field type intuitively.

03.Duplicate Resolution

Problem

Years of data entry created duplicate customer records. Some customers existed 3-4 times with slight variations — different phone formats, typos in names, old addresses. Merging manually was error-prone and time-consuming. Worse: some duplicates were linked indirectly (A matches B, B matches C, but A doesn't match C).

Solution

Built a dedupe service with fuzzy matching and custom similarity scoring. Records are compared across multiple fields (name, email, phone, address) with weighted scores. The tricky part: handling multi-way duplicates where transitive relationships don't hold.

Loading diagram...

Once duplicate groups are identified, staff review them through a merge dialog. The interface displays both records side-by-side, highlighting differences and allowing staff to select which value to keep for each field. With one click, the selected record becomes the master — all references throughout the system (contracts, invoices, communications) are automatically updated to point to the merged record.

All personal data has been replaced with fictitious information for privacy.

Technical Details

  • Pairwise comparison with Levenshtein distance for string similarity
  • Weighted scoring: exact email match (high weight), similar name (medium), same postal code (low)
  • Threshold-based grouping with configurable sensitivity
  • Graph analysis for multi-way matches: if A-B and B-C are linked but A-C score is below threshold, split into separate groups
  • Review UI shows confidence scores and lets staff approve/reject merge suggestions

Result

Automated detection of duplicate clusters with confidence scores. Staff review and merge with confidence. Clean data enables reliable reporting and prevents customers receiving duplicate communications.

Tech Stack

React Node.js TypeScript Rust MSSQL Docker REST SOAP CM.com OpenAI

Also: Microsoft Graph API · Voys API · Various payment & shipping integrations

Other Notable Work

  • In-house accounting module — eliminated dependency on external accounting software
  • Automated message parsing — invoices, track & trace codes, and work orders automatically routed and processed
  • 10+ external integrations — payment providers, shipping carriers, communication channels unified in one system
  • OpenAI sentiment analysis — automated classification of customer review sentiment

"Dennis is an outstanding software engineer who was instrumental in designing and building our entire platform. He combines strong technical execution with thoughtful advice and support. Any company would benefit from his broad expertise."

Gilbert de Baat · Owner at Splash Lease
Back to projects