Short answer
RaftLabs built Voter IQ, a Clubhouse-style live audio app for political networks in Andhra Pradesh, India. The first iOS, Android, and web admin release shipped in 16 weeks, ahead of an election cycle. Internal tests recorded about 7,854 simultaneous WebSocket connections and 347 ms p95 latency at 1,000 concurrent HTTP users.
Engagement
The Voter IQ engagement
- Client
- Voter IQ, a founder-led civic tech startup in Andhra Pradesh, India
- Decision-maker
- The founder, somewhat technical, and the person who held the political domain knowledge
- What it is
- A live audio app where party leaders host discussions, badge holders follow their leaders, and citizens listen, comment, and vote in polls
- What we owned
- iOS and Android apps, the web super admin panel, the backend, and load testing
- Why RaftLabs
- Our real-time voice work for PSi, a group deliberation platform
- Team
- One backend engineer, two mobile engineers across the engagement, one QA engineer, one designer, and a project manager
- Engagement model
- Fixed-price, delivered in phases
- Duration
- First release in 16 weeks. Later phases ran the engagement to roughly 1.5 to 2 years
The situation
Political conversation in Andhra Pradesh runs through a hierarchy: MPs, MLAs, constituency leaders, badge-holding party members, and the citizens they represent. Voter IQ's founder wanted that whole structure talking in one app. Leaders would host live audio rooms. Members would follow the right leaders. Citizens would listen, comment, and vote in polls, without getting leader-level access.
WhatsApp groups and public social feeds couldn't do that. They don't know who is an MLA, which constituency someone belongs to, or where a local complaint should go next.
There was also a hard deadline. Elections were coming. If the first phase missed them, the app would have nothing to be used for until the next cycle.
The founder picked RaftLabs because of our real-time voice work for PSi. We shipped the first iOS, Android, and admin release in 16 weeks. Then the founder asked whether it could handle 200,000 people at once. We ran load tests before giving any number, and the answer is on this page.

starting point
From scattered groups to one structured network
The goal was a product that knows the political hierarchy, puts every person in the right place in it, and ships before the election window closes.
- Political discussion moved through scattered groups and calls, one level at a time
- Getting the right leaders into a conversation meant manual outreach and reminders
- Citizens followed politics through fragmented public channels, not their own constituency
- Generic tools had no idea who was a host, speaker, badge holder, citizen, or admin
- Local issues had no defined path to the constituency leader, MLA, or MP
- Nobody had tested how many simultaneous users the product could take
- Live audio rooms with host, co-host, speaker, and listener roles
- Four user groups with distinct permissions across mobile and web admin
- Citizens listen, comment, and vote without leader-level access
- Geographic groups tied to constituencies, with feeds for the sessions and issues that matter to each role
- Unanswered issues escalate up the hierarchy automatically
- A tested capacity boundary instead of a guessed one
What discovery changed
The hierarchy was the product, not a setting
We expected roles and permissions to be one module among many. It turned out every feature depended on them: who sees which room, whose feed shows which issue, where a complaint goes next. The founder held that domain knowledge, and our PM spent several rounds getting it out of his head and onto paper before the backend engineer designed a single table.
The data model then went through more iterations. Once the founder used a working build, he saw gaps the whiteboard version had hidden. We rebuilt parts of the structure to fit what he'd learned.
The admin panel had to act for users, not just manage them
The plan was a minimal super admin panel. Mid-build, the founder explained that many end users wouldn't do the key actions themselves. Someone would do it on their behalf. That turned the admin panel into a second product, with its own flows for acting as a user.
Our PM's own takeaway: agree visually on the admin panel early, and ask how it will really be used, not just what it should contain.
We pushed back on deleting constituencies
The founder asked for a feature to delete a constituency. On paper it's one button. In the data model, almost everything hangs off a constituency: members, leaders, groups, issues, and escalation paths. Deleting one safely needs careful planning for every record attached to it.
We moved it to a later phase rather than rush it into the election release. A half-planned delete in a hierarchy like this breaks things silently.
The engineering problems worth reporting
Mapping a democratic hierarchy into a data model
Challenge. The product needed to place every user in the right party and constituency, give them the right powers, and build a feed of upcoming sessions and issues based on their role and geography.
Approach. We kept network membership, following, discussion roles, and admin authority as separate concepts. The shortcut was one "role" field. That would have let a follow relationship quietly grant organisational access, and it would have made counts disagree across screens.
Result. Four user groups (mobile admins, badge holders, non-badge-holder citizens, and web super or sub-admins) each got distinct actions. When deleted users were still showing in network totals, we fixed the counting rule in the backend, so mobile and admin views read one definition instead of disagreeing.
Issues that climb the hierarchy on their own
Challenge. A constituency leader raises an issue. It should reach a specific higher-level leader. If that leader doesn't act in time, it shouldn't just sit there.
Approach. We built a routing and escalation workflow. Each issue is assigned to the next leader up the chain, with a time limit. If it isn't actioned in that window, the system moves it up another level automatically.
Result. Local problems have a defined path from constituency level toward the MLA and MP, and silence at one level doesn't end the issue.
A 10,000-user audio target, and a 200,000-user question
Challenge. The architecture was designed for up to 10,000 people in one audio session. Then the founder asked whether it could reach 200,000.
Approach. We didn't answer with a number from a slide. We tested two layers separately. Artillery drove HTTP application traffic, and k6 opened WebSocket connections. Agora handled the audio itself. The app controlled who could host, speak, listen, comment, and vote.
Result. At 1,000 concurrent HTTP users, all 2,000 requests succeeded at 347 ms p95. At 5,000, only 7,824 of 10,000 succeeded and p95 rose to about 3.1 seconds. That's degradation, not a pass. WebSockets reached about 7,854 simultaneous connections before latency climbed. All of this ran on one AWS EC2
m5a.large, at about $38 a month at the time.An audio join failure that only showed up in production
Challenge. Users hit Agora's
CAN_NOT_GET_GATEWAY_SERVERerror in production, reported with an invalid-token message.Approach. We compared the generated token with the join parameters. The app was passing a UUID string where the SDK flow we'd implemented expected a numeric UID.
Result. Switching to a numeric UID fixed the failure. The general lesson is to check the SDK's contract, not just the token, whenever a join fails.
Proof
What we can and can't claim
Every figure below comes from RaftLabs delivery records or internal tests. None of it is live usage.
| Result | What changed | Period or context | Evidence and limitation |
|---|---|---|---|
| First release | 16 weeks to iOS, Android, and web admin | Ahead of the election cycle the founder was building for | RaftLabs delivery record. Both app store listings confirm the app shipped on iOS and Android |
| HTTP at 1,000 users | 2,000 of 2,000 requests succeeded, 347 ms p95 | 100-second Artillery scenario | Retained internal test report. One environment, one workload |
| HTTP at 5,000 users | 7,824 of 10,000 requests succeeded, about 3.1 s p95 | Same setup, higher load | Retained internal test report. We report this as degradation, not a pass |
| WebSocket connections | About 7,854 before latency climbed | k6 connection test on one EC2 m5a.large, about $38 a month | Retained internal test report. Not a live user count and not 7,854 simultaneous Agora audio streams |
| Scale-out path | 60,000 to 70,000 connections, projected | Horizontal scaling plan in the project record | A projection. It was never tested, so we don't count it as a result |
| Adoption | Low after launch | Tracked through the database and Firebase analytics | PM's recollection. We don't hold usage numbers to publish |
the build
What we built
Everything in the product hangs off one question: who is this person in the political structure, and what are they allowed to do here?
Live audio rooms with political roles built in
Leaders host rooms, invite co-hosts, and bring speakers up. Citizens listen, comment, and vote in live polls. Agora carries the audio. The app decides who can do what, based on each person's place in the network.

One React Native codebase for iOS and Android
With an election date fixed, two native codebases would have doubled the work. React Native let the team share most of the product across both stores and keep platform-specific code where iOS and Android behaved differently. Both Google Play and the App Store list live discussions, issue-based polls, and geographic groups.

Constituency groups and issue escalation
Users land in groups tied to their constituency. Their feed shows the sessions and issues that fit their role and location. Issues raised by constituency leaders go to a named higher-level leader and escalate automatically if nobody acts.

A super admin panel that can act on a user's behalf
Super and sub-admins manage networks, members, and permissions from the web. Because many users wouldn't do key actions themselves, the panel also lets admins carry those actions out for them.

Timeline
How the engagement ran
Before the build
Chosen for the PSi work
The founder had seen our real-time voice platform for PSi. A fixed-price first phase was agreed, sized to land before the election cycle.
Discovery
Learning the political structure
Several rounds of domain transfer from the founder, led by our PM, then internal working sessions before the backend engineer designed the data model.
Weeks 1 to 16
First release on iOS, Android, and web admin
Live rooms, roles, constituency groups, polls, comments, issue escalation, and the admin panel. Deleting constituencies was deliberately held back for a later phase.
After launch
Load testing and later phases
HTTP and WebSocket tests set a measured capacity boundary. Later phases added admin features as the founder's picture of the product sharpened, over roughly 1.5 to 2 years in total.
Today
Engagement closed
RaftLabs isn't currently working with Voter IQ. Usage after launch stayed low, and we don't hold adoption figures to publish.
The lesson
Test the scale you need, and plan the audience you'll actually get
If you're building a live audio product for a political or member network, the thing most teams miss is that the concurrency number is a question, not a spec. Our founder asked about 200,000 people at once. Tests showed one small server hitting its limit at around 7,854 WebSocket connections. That's the useful answer: a measured boundary, a cost to go further, and no money spent on capacity nobody had shown up for yet. Pick a stack that can scale when audio rooms fill up. Don't pay for the peak before the audience exists.
The second half of the lesson is harder. We shipped before the election, and usage stayed low anyway. A product built for a political moment needs a plan for getting leaders and citizens into it, as serious as the plan for building it. And when a founder holds all the domain knowledge, get written sign-off on each milestone. Scope that lives only in one person's head moves.
How it runs
- React Native
- An election date left no room for two native builds. One shared codebase shipped iOS and Android in 16 weeks, with platform-specific code where behaviour differed.
- Agora
- Carried the live audio, so the team built political roles and permissions instead of a media server. The app still owned who could host, speak, and listen.
- AWS
- One EC2 instance ran the tested setup at about $38 a month, with Lambda for background jobs. That kept costs tied to real demand, not a hypothetical peak.
- Firebase
- Handled push notifications for upcoming sessions and mobile analytics, outside the main backend.
Common questions
RaftLabs built Voter IQ, a Clubhouse-style live audio app for political networks in Andhra Pradesh, India. Leaders host rooms, badge holders follow their leaders, and citizens listen, comment, and vote in polls. It includes constituency groups, automatic issue escalation up the hierarchy, and a web super admin panel. The first iOS, Android, and admin release shipped in 16 weeks.
Voter IQ's first release took 16 weeks with a small team: one backend engineer, mobile engineers, QA, a designer, and a PM. Live rooms are the quick part when a provider like Agora carries the audio. Roles, permissions, and admin tooling take the time. Our guide to building a social audio app like Clubhouse breaks down the rest.
It depends on the setup, so test it. On one AWS EC2 m5a.large at about $38 a month, Voter IQ reached about 7,854 simultaneous WebSocket connections before latency climbed. HTTP traffic passed cleanly at 1,000 concurrent users and degraded at 5,000. A 60,000 to 70,000 connection scale-out path was planned but never tested.
Keep membership, following, discussion roles, and admin authority as separate concepts. Voter IQ had four user groups, each with its own actions, and a data model built around constituencies. Getting it right took several rounds with the founder before any database design, and more iterations once he used a working build. We shipped it on one React Native codebase for iOS and Android.
A constituency leader raises an issue, and it goes to a specific higher-level leader with a time limit. If that leader doesn't act in time, the system moves it up another level automatically. Issues can't stall silently at one level on their way toward the MLA or MP.
Three things. Get written client sign-off at each milestone, so scope held in the founder's head can't drift. Agree visually on the admin panel early, and ask how it will really be used. And plan how leaders and citizens will find the app with the same care as the build, because usage stayed low after launch.
No. RaftLabs delivered the first release and later phases over roughly 1.5 to 2 years, and the engagement has since closed. If you're building something similar, see our social media app development and real-time application development services.
Related work
More real-time voice and Indian product work

300+ people in one anonymous voice discussion
PSi runs real-time voice deliberation that splits large groups into small tables. Voter IQ's founder hired us because of this build.

3,000+ audio and video minutes in two beta weeks
Worxwide's hybrid work app put meetings and virtual office rooms in one product for distributed teams in India.

3,500 field staff completing training every day
Eris Lifesciences' EMS Connect reached 3,500+ daily users across India, with offline access for field reps.