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.
