Back to Projects

Healthcare Benchmarking & DIY Ads

Enterprise SaaS for Hospital Analytics & Advertising

Overview

Built schema-driven UI rendering engine for dynamic report construction — backend returns JSON schema, React recursively renders Cards, Charts, Tables, and Forms. MobX store-per-domain architecture with computed properties across auth, organization, queries, and reports stores. ag-Grid for complex data tables and Chart.js for 20+ KPI visualization modules.

Key Features

  • Schema-driven UI engine — React recursively renders components from backend JSON schema
  • 100+ unique KPI visualizations with Chart.js (Bar, Line, Doughnut, Stacked charts)
  • MobX store-per-domain: auth, organization, queries, reports stores with computed properties
  • ag-Grid data tables with complex sorting, filtering, and drill-down capabilities
  • Multi-step Query Tool wizard with complex state management
  • Responsive design supporting desktop, tablet, and mobile form factors

Tech Stack

Frontend

ReactTypeScriptMobXVue.jsStyled Components

Data Visualization

Chart.jsag-GridD3.js

Tools

JSON SchemaWebpackJestStorybookJira REST API

Cloud & Auth

AWS CognitoAWS EC2AWS CodeDeployAmazon SESStripe

Backend

Symfony 5.3PHPDoctrine ORMMySQLPostgreSQL

Challenges & Solutions

Schema-Driven Report Constructor

Problem

100+ unique KPIs each with different visualization requirements, calculations, and drill-down capabilities — hardcoding each report layout would be unmaintainable and block business users from configuring new reports.

Solution

Built recursive rendering engine where backend returns JSON schema describing layout (Container, Row, Card, Charts, Tables, Forms). React walks the schema tree and instantiates appropriate components. Non-developers can configure new report layouts without code changes.

Enterprise State Management at Scale

Problem

Multiple interconnected MobX stores (auth, organization, queries, reports) with complex async flows, cross-store dependencies, and side effects across a large healthcare domain.

Solution

Store-per-domain architecture with MobX computed properties for derived state and reactions for side effects. Each store owns its data and exposes computed values — report store reacts to query store changes automatically. Kept state predictable despite 100+ KPI variations.

Stripe Manual Capture for Ad Campaigns

Problem

DIY Ads needed to authorize payment on checkout but only capture when campaign actually launches — standard charge flow would lock user funds prematurely.

Solution

Implemented Stripe PaymentIntents with manual capture: authorize on checkout, capture on campaign launch, void on cancellation. Event-driven campaign status workflow using Symfony EventDispatcher triggers appropriate payment actions at each state transition.

Key Achievements

100+ KPIs
Recursive schema-driven rendering engine
20+ Charts
Chart.js visualizations with ag-Grid data tables
MobX Stores
Store-per-domain with computed properties and reactions
Schema-Driven
JSON-to-component dynamic report construction