Case study

ZestAMC

Cryptocurrency investment management platform connecting investors with professional fund managers.

$10M+

AUM on the platform

200K+

registered users

5

role-based portals

179

SQL migrations

Production since 2024
zestamc.com
ZestAMC marketing landing page

The challenge

A crypto fund management company with no platform

ZestAMC's team managed multiple cryptocurrency funds across spreadsheets and manual bank transfers. Fund managers tracked investor allocations by hand. Payouts took days. A single decimal error on a $2M fund meant real money lost.

They needed a platform where investors could browse funds, complete KYC verification, invest, and receive automated crypto payouts, all while fund managers tracked performance with financial-grade precision. Five distinct user types (admin, fund manager, investor, fund admin, support) each required different views and permissions.

The platform also had to comply with KYC/AML regulations, support multiple crypto networks (TRC20, ERC20, BEP20), and handle profit distribution across complex referral chains, all without a single rounding error.

What we built

10 systems. One platform.

5 role-based portals

Each user type sees a different application. Admins manage funds and users. Fund managers track AUM and distribute profits. Investors browse indices, invest, and withdraw. Fund admins handle compliance workflows. Support agents resolve issues through real-time chat. One codebase, five distinct experiences, all sharing the same data layer.

ZestAMC application dashboard showing fund management interface

Automated crypto payout engine

We integrated NOWPayments to process payouts across TRC20, ERC20, and BEP20 networks. BullMQ background jobs handle the two-step profit distribution: first to investors, then to referral chains. Each payout runs as an atomic transaction. If any step fails, the entire batch rolls back.

ZestAMC investment steps showing the investor flow

KYC/AML compliance and financial precision

Sumsub handles identity verification through its SDK and webhook callbacks. Every investor completes KYC before their first investment. On the financial side, all monetary values use NUMERIC(30,8) in Postgres paired with decimal.js on the application layer. No floating-point math touches money. 30 digits, 8 decimal places, zero rounding errors.

ZestAMC platform features overview

Smart tranches and passwordless auth

Investors buy into funds through tranches. A deferred aggregation system batches small investments into larger pool entries, reducing database writes and improving query performance on fund analytics. Authentication uses passwordless OTP, eliminating password-related support tickets and reducing the attack surface.

ZestAMC indices section showing available crypto funds

Infrastructure and tooling

  • Real-time support chat via Supabase Realtime, so agents and investors communicate without page refreshes or polling.
  • Feature flag system for progressive rollouts, letting the team ship to a subset of users before a full release.
  • 179 SQL migration files with pgTAP database tests, ensuring schema changes never break production data.
  • Two-step profit and referral distribution via BullMQ background jobs, processing payouts asynchronously without blocking the main thread.

Tech decisions

Why we chose this stack

React 19 + Vite 6

Five portals share one React codebase. Vite's module federation keeps bundle sizes small per-portal. React 19's concurrent features let the dashboard render fund analytics without freezing the UI during large data fetches.

Hono on Fly.io

Hono runs the API layer. It starts in under 50ms, which matters for Fly.io's scale-to-zero model. Cold starts happen; they need to be fast. Hono's middleware system handles auth, rate limiting, and request validation in a composable chain.

Supabase + Upstash Redis

Supabase provides Postgres, auth primitives, and Realtime subscriptions for the support chat. Upstash Redis handles session caching and rate limiting at the edge. Both services scale without ops overhead.

NUMERIC(30,8) + decimal.js

JavaScript's native Number type loses precision above 2^53. For a platform managing $10M+ in crypto assets, that's unacceptable. We store all monetary values as NUMERIC(30,8) in Postgres and use decimal.js for every calculation in the application layer. No floating-point math ever touches money.


Tools

React React Vite Vite Hono Hono TypeScript TypeScript Tailwind CSS Tailwind CSS shadcn/ui shadcn/ui TanStack Query TanStack Query Supabase Supabase Redis Redis Cloudflare Cloudflare Fly.io Fly.io

Results

Production numbers

$10M+

assets under management on the platform

200K+

registered users across all portals

179

SQL migrations with pgTAP tests

5

role-based portals in one codebase

Get in touch

Start a conversation

Tell us about your project. We'll respond within 24 hours with a clear plan, estimated timeline, and pricing range.

Based in

UAE & India