💳
M-PESA STK Push
Per-tenant Safaricom integration with AES-256 encrypted credentials.
STK push and confirmation SMS run in parallel via virtual threads.
📈
Dynamic Pricing
Fare windows keyed to LocalDateTime ranges.
Peak-hour, off-peak, or open-ended pricing with automatic fallback to base fare.
🏢
Multi-Tenant
Fully isolated tenants — each sacco has its own stages, trips, vehicles,
users, and encrypted M-PESA credentials.
⚡
Virtual Threads
Java 22 virtual threads + StructuredTaskScope
for atomic batch bookings. Semaphore-throttled M-PESA concurrency.
🔐
Role-Based Access
Four roles: Super Admin, Tenant Admin, Stage Head, Stage Attendant —
each with scoped permissions enforced at the API and UI layer.
📱
Offline PWA
Installable progressive web app with service worker caching, offline fallback,
push notification support, and background sync.