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