200+ TPS · P99 < 25ms · MTN · Telecel · AirtelTigo

The fastest USSD agent banking on the continent.Dial *920#.

AgentDash is a pure-USSD, offline-first cash-in / cash-out platform for Ghana's mobile money agents. No app to install — any GSM handset works. Batch 10 sends on a single PIN. Undo any transfer for 90 seconds. Built to beat both raw telco menus and Accessibility-Service automators like mBanqer.

200+
TPS sustained
< 25ms
Screen P99
5→2
Screens to send
MTN GH · 4G--:--82%
Dial USSD code
Session Handler
ms
Carrier budget
2 000 ms
0.0% of hard timeout used · Target P99 < 25ms
Server Journal
Fastify · Upstash Redis · BullMQ
  1. Waiting for session…
Try it — Ghana flows
  • 1. Dial *920#, PIN 1739, choose 2 = Batch, paste 0241234567*50;0551234567*100;02*80. Single PIN debits all three.
  • 2. Power-send: *920*1*01*50# — alias 01 resolves to Mama Ama, skips to confirm.
  • 3. After a send, dial *920*4# within 90s to reverse.
  • 4. Try a blocked recipient: *920*1*0244000001*20#.

Six structural advantages the competition can't copy

Because we own the server, we can collapse screens, cache identity, and batch settlement — moves that are impossible for a phone-side automator poking at MTN's own USSD tree.

Direct-dial power send

*920*1*number*amount# skips 3 screens. Aliases: *920*1*01*50# resolves to a named contact.

Batch 10, PIN once

Enter up to 10 recipients separated by semicolons. Single float debit, N async credit jobs on BullMQ. mBanqer physically can't do this — it dials once per customer.

90-second undo TTL

Every confirm sets undo:<ref> in Upstash Redis with a 90s TTL. Dial *920*4# to cancel the BullMQ job before settlement lands.

Recents & aliases cache

Last 5 MSISDNs cached 1h. Named contacts (01–99) resolve server-side. Sticky last amount pre-filled on repeat sends.

Blocklist pipeline

Every send and every batch line checked against Redis-cached blocklist in a single pipeline — sub-2ms even for 10-line batches.

Off-hotpath settlement

CBS/wallet API calls (200–500ms) never touch USSD. Session ends immediately with 'Processing' + SMS confirms via async worker.

Built for carrier-grade Ghana

Hot path — Fastify

  • Node.js 20 LTS + Fastify v4
  • Stateless — session state in Redis
  • 2 cores → 2 000 req/s
  • Docker on Railway / Render

State — Upstash Redis

  • Session context JSON
  • Agent + blocklist cache (5m TTL)
  • Recents + aliases (1h TTL)
  • Undo TTL keys (90s)

Ledger — Supabase

  • Postgres via PgBouncer txn-mode
  • Atomic batch inserts
  • RLS on dashboard, service-role on USSD
  • Realtime for admin

Async — BullMQ

  • CBS/wallet settlement jobs
  • SMS via Arkesel / NALO
  • Batch processor + retries
  • Idempotency keys

Telcos

  • MTN 024 054 055 059 025 053
  • Telecel 020 050
  • AirtelTigo 026 027 056 057
  • Aggregator: Hubtel / Nsano

Observability

  • Grafana + Prometheus
  • P99 latency per screen
  • Queue depth alerts
  • SMS delivery SLO