Custom System · Southeast Asia

Crypto payroll platform

Crypto payoutsMaker-checker RBACPasskey step-up11 currencies
Crypto payroll platform
Snapshot

An enterprise crypto payroll and payout operations platform for a financial services group — batch salary disbursement over crypto payment rails with maker-checker approvals, funding reconciliation, refund handling, in-house payslip generation, and 11-currency support, engineered to bank-grade control standards.

Business
Financial services group
Market
Southeast Asia
Format
Custom System
Status
Delivered
11
Display currencies
177
Database migrations
~100
Serverless functions
100+
End-to-end test suites
How the system runs
Draft
HR builds the batch
Approve
Director sign-off, enforced
Fund
Verified before anything moves
Disburse
Passkey step-up, bounded retries
Paid
Audit trail + payslips
Business context

A financial services group operating crypto-settled payroll across multiple client companies and currencies needed a system where control was structural, not procedural: approvals that cannot be bypassed, funding that must reconcile before anything moves, failures that resolve without ever paying twice, and a complete record of who did what. This case is published with the client's identity withheld.

The challenge

Crypto payroll is a fund-moving system, so the hard requirements were control requirements: segregation of duties across roles, funding that reconciles to the cent, failure handling that can never pay twice, salary data that never leaves the platform, and correctness across eleven display currencies settling onto crypto rails.

  • No single person could be allowed to create, approve, and disburse a payment batch — segregation of duties had to be enforced by the system, not by policy
  • Every batch had to be verifiably funded before disbursement, with over- and under-payment detected automatically
  • Payment failures and retries could never result in a double payment, even across crashes
  • Salary data could not leave the platform — payslip generation had to happen entirely in-process
  • Eleven currencies meant exchange rates had to lock the moment the payer commits — before funds move — with money arithmetic exact to the cent
How Undertide responded
Decision 01

An explicit lifecycle, not a status field

Every batch moves through a strict state machine — draft, director approval, funding, disbursement, paid, plus explicit failure and refund branches — with legal transitions enforced in the database. HR drafts and submits, the single active Director approves or rejects, Finance funds and releases payment; each role sees a task queue of exactly its pending work, with dashboard exception counts deep-linking to pre-filtered lists.

Decision 02

Control enforced below the application

Maker-checker separation, single-active-owner constraints, and money arithmetic all live in the database layer as constraints and atomic procedures — integer cents, no floating point, no application-level trust. Every fund-moving action additionally requires a passkey (WebAuthn) step-up from the acting user.

Decision 03

Funding that proves itself

Each batch gets a dedicated deposit reference; confirmation is event-driven with scheduled verification as a backstop, and incoming events are never trusted at face value — balances are independently re-verified before any state changes. Over- and under-funding are detected and routed to structured resolution, including refunds with their own approval gates — every refund and fee movement recorded as balanced journal lines that must sum to zero.

Decision 04

Failure as a designed path

Retries are bounded and guarded against double-spend; executions stranded by crashes are found and resolved by recovery sweeps; anything that exhausts its retries escalates to a manual-intervention queue. A six-dimension reconciliation scan runs daily and reports drift before it becomes a discrepancy.

Under the hood

Built on a modern TypeScript stack with a Postgres core — 177 database migrations, ~100 serverless functions, atomic integer-cents money logic in database procedures, row-level security, scheduled reconciliation and recovery jobs, and hardened authentication (email one-time codes on every login, mandatory passkey enrollment, passkey step-up on every fund action) — delivered through a multi-gate review process covering spec, code, contracts, and security.

What was delivered
01Batch lifecycle engine: draft → approval → funding → disbursement → paid
02Maker-checker roles with database-enforced segregation of duties
03Passkey (WebAuthn) step-up on all fund-moving actions
04Funding reconciliation via dedicated deposit references
05Refund engine with balance re-verification and approval gates
06In-house payslip generation with signed, expiring links
0711-currency support — binding rate locks when payment is committed
08Bulk employee import (CSV/Excel) with per-row validation
09Recurring allowances/deductions with snapshot semantics
10Trilingual UI — English, 中文, Bahasa Indonesia
11Six-dimension reconciliation scanning with drift reporting
What changed
  • Payment batches now move through enforced approval gates that no role can bypass
  • Funding now reconciles automatically per batch, with mismatches detected and routed to resolution
  • Failures now resolve through bounded retries, recovery sweeps, and escalation — never a double payment
  • Payslips now generate in-house with signed expiring links, so salary data never leaves the platform
  • Every action is now attributable through audit trails and role-aware dashboards
  • The platform is validated by 100+ automated end-to-end test suites and staged acceptance deployments

Need a similar result for your business?

If your operations move money — or anything else you can't afford to get wrong — tell us how it works today. Undertide will assess fit and recommend the right scope.