Back to work

Product · Crypto banking

GRX Pay — Crypto Payment Solution

Frontend Engineer · Feb 2026 – Jul 2026

GRX Pay is a multi-currency crypto banking product — merchants accept payments across 24+ cryptocurrencies, track balances, and move funds out via SEPA, with every transaction carrying AML and risk data. I worked on the merchant dashboard: balances, invoices, transactions, and team management.

The Challenge

Balances and transaction state change mid-session — deposits settling, auto-conversions completing, mass payouts processing — and that state has to stay correct across several large, paginated tables (invoices, transactions, team members) without the dashboard feeling stale or the tables janking on every update.

The Approach

  • A normalized client-side data layer, so a balance update in one view is reflected everywhere else it's rendered without a manual refetch
  • A dedicated async query layer for the state around real-time balance and transaction updates, keeping loading/stale/error states explicit instead of implicit
  • Paginated, cursor-based tables for invoices, transactions, and members rather than loading full result sets client-side
  • A shared role-based access layer — admin, merchant, and member views render different actions from the same components instead of forking screens per role
  • Flag-gated rollout for new payment features (auto-convert, fixed-sum invoices), so product could ship behind a flag and turn it on per merchant

The Outcome

24+

currencies, real-time balances via WebSocket

100%

transactions surfaced with AML / risk data

Dashboard — balances, payment volume, and the live transaction feed in one view
Assets — real-time multi-currency balances, held and available
Transactions — filterable, paginated ledger across every currency
Team management — role-based access across merchant admins
Deposit — per-currency methods and fees, surfaced before the merchant commits
Add member — the same role system from @grx/rabac, explained inline
Create invoice — fixed-sum invoices and auto-convert, gated behind FeatureScript