The product challenge
Three app surfaces have to agree on a single call lifecycle. Discovery and agent availability lead into incoming-call UI, connection, active-session billing and a final settlement; interruptions and push delivery must not leave either side in a stale state.
Built the two customer Flutter apps and the dedicated agent app, alongside Laravel API and integration work for calls, wallet billing, payments and notifications.
Implementation & engineering decisions
- 01Separated customer and agent experiences while keeping call states and account data aligned through Laravel APIs and real-time events.
- 02Integrated LiveKit for one-to-one audio/video sessions and WebSocket events for ringing, connection, active-call and end-call transitions.
- 03Connected per-second wallet debits and agent earnings to the call lifecycle; integrated Cashfree, Razorpay and in-app purchase paths.
- 04Handled incoming-call and background delivery paths with Firebase messaging, APNs VoIP and native CallKit / Android Telecom integration.
Where the implementation needed care
Architecture
Three Flutter clients use Laravel APIs for application data and wallet/payment workflows. LiveKit carries audio/video; WebSockets communicate changing call state, while push and native call surfaces handle incoming calls when the app is backgrounded.
Key challenge
Keep billing, call status and agent/customer views consistent across asynchronous call events, app backgrounding and network transitions.
Delivered
Three Flutter app surfaces, Laravel API integrations, real-time call flows, wallet billing integration and platform-specific incoming-call handling.