Emisell Merchant Dashboard

ReactTypeScriptTailwind CSSSWRTanStack QueryZustandZodshadcn/ui
Emisell Merchant Dashboard

Overview

Emisell Merchant Dashboard is the central control panel for merchants on the Emisell platform. I joined this project mid-development — inheriting an existing codebase, resolving bugs, and contributing new features on top of what was already built. It covers a wide range of features: sales analytics, order and draft management, product catalog, customer management, discount configuration, content management, and deep store settings including checkout, shipping & delivery, and location management.

Problem

Managing an online store requires juggling many concerns at once — from tracking sales performance to configuring shipping rules and handling customer data. A poorly structured dashboard makes this overwhelming. Emisell Merchant Dashboard was built to give merchants a single, well-organized hub to operate their entire store efficiently.

Key Features

  • Analytics — gross sales, average order value, orders over time, and returns, all filterable by date range
  • Order Management — full order list and draft orders
  • Product & Customer Management — product catalog, variants, and customer data
  • Discounts — discount rule configuration
  • Content & Settings — content management alongside extensive settings covering checkout flow, shipping & delivery, store locations, and more

Technical Highlights

Dynamic address schema per country was one of the more nuanced challenges — different countries have different address field requirements (states, provinces, postal code formats, etc.), so the form schema had to be dynamic and driven by the selected country, not hardcoded.

Feature-based architecture was key to keeping the codebase manageable at this scale. Components were split into two layers: compose (feature-specific components tied to a particular page or domain) and shared (reusable components across features). This separation kept each feature self-contained and prevented the codebase from becoming a tangled mess as the project grew.

Server state synchronization was handled with a mix of SWR (carried over from the existing codebase) and TanStack Query for newer features. Both tools were used where appropriate — SWR for simpler data fetching patterns already in place, TanStack Query for mutation-heavy flows that needed fine-grained cache invalidation across interconnected features.