Projects

Selected enterprise projects spanning cloud platforms, data systems, and large-scale transformations.

Averis

Aug 2025

Averis

averis.ericbrandcode.com

A multi-tenant commerce Master Data Management platform that demonstrates federated product, pricing, and customer data flows across interconnected enterprise systems. Seven domain-specific React applications share a consolidated .NET Core API layer backed by a multi-schema PostgreSQL database, with real-time updates via SignalR, event-driven data synchronization through NATS messaging, and role-based access control powered by Stytch authentication. The platform models the complete product lifecycle from draft creation through pricing catalog assignment across global regions and market segments.

Team: 1
Regions: North America
C#.NET CoreASP.NET CoreEntity Framework CorePostgreSQLReactTailwind CSSViteStytchSignalRNATSTraefikDockerNginxRailwaySupabase

Averis is a commerce MDM (Master Data Management) platform that models how product, pricing, and customer data flows through interconnected enterprise systems in a large-scale e-commerce operation. The platform consists of seven domain-specific applications: Product MDM, Pricing MDM, Customer MDM, an E-commerce storefront, Order Management, Enterprise Resource Planning, and a central monitoring dashboard; each representing a distinct business function that consumes and enriches shared master data.

Product

The Product MDM serves as the system of record for product information, managing the full product lifecycle from draft creation through approval workflows to active status. Products are defined with rich metadata including SKU codes, categorization, pricing attributes, licensing flags, fulfillment capabilities, and contract terms. A configurable data dictionary defines field-level metadata, validation rules, and role-based maintenance permissions, ensuring that each field is owned by the appropriate business function; marketing owns product descriptions, finance owns pricing, legal owns compliance flags.

Pricing

The Pricing MDM manages a hierarchical catalog structure organized by geographic regions (Americas, EMEA, Asia Pacific), market segments (Direct, Partner, Reseller), and sales channels. Each catalog represents a unique combination of region and segment with its own currency, pricing rules, and product assortment. Products flow from the Product MDM into the pricing system where they receive region-specific base prices, volume discounts, and promotional pricing. The system supports multi-currency pricing with regional adjustments and includes a localization framework with Google Translate integration for multi-language product content.

Customer

The Customer MDM implements a graduated disclosure model; customers progress from "cold" (anonymous visitors tracked by cookie) through "warm" (registered with email) to "hot" (fully authenticated with purchase history). The system tracks customer segments, lifetime value, acquisition channels, marketing consent, and data processing compliance, reflecting real-world GDPR and privacy requirements.

Frontend Architecture

The frontend architecture consists of seven independent React applications built with Vite and Tailwind CSS, served from a single nginx container with subpath routing. Each app runs at its own URL prefix (/product/, /pricing/, /customer/, etc.) with React Router basename configuration for correct client-side routing. Cross-application navigation preserves authentication state by passing Stytch session tokens between apps, enabling seamless transitions between business functions without re-authentication.

Backend Architecture

On the backend, all seven applications are consolidated into a single ASP.NET Core API service that hosts controllers from eight domain services (Product, Product Staging, Pricing, E-commerce, Customer, Customer Staging, Localization, and System). This decision was made to support the demo deployment environment and in a production scenario all seven domains would be segregated and deployed independently to maximize scalability and fault tolerance.

An assembly-based route prefix convention automatically namespaces each service's endpoints; Product MDM controllers serve under /product/api/, Pricing under /pricing/api/, and so on; allowing the entire API surface to run in a single process while maintaining clean domain separation. Each domain operates against its own PostgreSQL schema (averis_product, averis_pricing, averis_customer, averis_ecomm, averis_system, and corresponding staging schemas), with Entity Framework Core DbContexts configured with schema-specific search paths.

Secure

Authentication is handled through Stytch with Google OAuth integration, supporting passwordless magic links and social login. The system implements role-based access control with 17 distinct roles spanning product management, pricing, legal, finance, sales operations, and administration. Role groups aggregate related permissions; a Marketing group combines product_marketing and product_marketing_approve roles; and the UI dynamically adjusts available features based on the authenticated user's role assignments.

Complex

The full microservices architecture (used in local development) orchestrates over 20 Docker containers including Traefik reverse proxy, NATS JetStream for event-driven messaging between services, and separate containers for each API and UI. For the production deployment, the entire stack is consolidated into two Railway services plus a Supabase PostgreSQL instance, demonstrating how a complex microservices architecture can be packaged for cost-effective cloud deployment without sacrificing functionality.

Consolidated Architecture

Key architectural challenges included consolidating eight independent .NET services with conflicting dependency injection registrations into a single binary, resolving duplicate controller names across assemblies using a custom IApplicationModelConvention, mapping seven React SPAs into a single nginx container with correct subpath routing and API proxying, and adapting a multi-schema PostgreSQL design originally built for localhost Docker networking to work with Supabase's hosted Postgres over SSL with IPv4 connectivity constraints.