Skip to content

CRM / Business Applications

CRM & Business Dashboard

Record management, multi-criteria filtering, reporting and role-scoped dashboards for internal business teams.

My role
Full Stack Developer
Project type
Enterprise web application
Domain
CRM / Business Applications

The problem

Several business teams tracked the same customer and activity records in separate spreadsheets. Nobody had a reliable consolidated view, reporting was manual and slow, and each team needed to see its own data without seeing everyone else’s.

The solution

A CRM-style application with a shared relational model, server-side filtering and pagination for large record sets, dashboards scoped to the signed-in user’s role, and exports that replaced the manual reporting cycle.

Technical architecture

A simplified, public-safe view of how the pieces fit together.

Client

Angular SPA

Record views, filters, dashboards, exports

API

Web API

Filtering, pagination, sorting, validation

Domain

Business rules
Reporting & aggregation

Ownership rules, role scoping, report composition

Data

SQL Server

Normalised schema, indexes, reporting views

Generic layering for the application. No client-specific architecture is shown.

My contribution

  • Built the record management screens: create, edit, assign, bulk actions and detail views.
  • Designed REST endpoints for filtered, sorted and paginated queries with a consistent request/response contract.
  • Implemented reporting views and export generation over aggregated data.
  • Added role-scoped data visibility so each team saw only the records it owned.
  • Profiled and fixed slow list and report queries as record volumes grew.

Engineering challenges

Filtering that stayed fast

Users wanted to combine many optional filters. Building SQL by string concatenation would have been both unsafe and unpredictable to index, so filters were composed as parameterised predicates over a fixed query shape, with indexes chosen for the combinations people actually used.

Exports blocking the request

Large exports generated inside the HTTP request timed out. Moving generation out of the request path and letting the user collect the finished file removed the timeouts and the repeated retry traffic that came with them.

Scoping data without scattering checks

Role scoping applied to every list, report and export. Applying it at the query composition layer instead of per-endpoint meant a new endpoint could not accidentally skip it.

Key features

  • Consolidated record management across teams
  • Multi-criteria search with server-side pagination and sorting
  • Role-scoped dashboards and summary widgets
  • Report generation and export
  • Audit-friendly change tracking on key records

Outcome

Teams worked from one system instead of parallel spreadsheets, and recurring reports were produced from the application rather than assembled by hand.

Lessons learned

  • Cross-cutting rules like data scoping should live where they cannot be forgotten, not in every endpoint.
  • Anything that can grow unbounded — exports, reports, list queries — needs a plan before it reaches production volumes.

Keep reading

Other case studies

All projects
Clinical / Healthcare

Enterprise Clinical Platform

Workflow-driven clinical application with role-based access, dashboards and enterprise integrations.

Role
Full Stack Developer
Type
Enterprise web application
React TypeScript ASP.NET Core Web API SQL Server +4
Education / EdTech

Learning Management Platform

Courses, content structures, learner progress workflows and administrative dashboards.

Role
Software Developer
Type
Web application
PHP Laravel MySQL JavaScript Bootstrap +2
↑ ↓ to navigate · ↵ to open · esc to close Full search