Skip to content
Building a React Native Video Chat App with In-Call Statistics - Featured Social

Building a React Native Video Chat App with In-Call Statistics

By Author: Ekaansh Arora In Developer

When you’re building a real-time engagement application, there’s a ton of metrics that need to be monitored to deliver a smooth experience to the end user. There can be many challenges when debugging a suboptimal user experience, high CPU usage, low internet bandwidth, dropped frames, and so on. The in-call statistics can be used to monitor, maintain, and improve user experience.

In this tutorial, we’ll add in-call stats to the React Native quick-start app. If you’re new to the Agora SDK, you can learn how the demo works here. We’ll look at how to access and display these statistics for local video, remote videos, and other important call aspects, like bandwidth and CPU usage.


  • Node.js LTS release
  • An Android or iOS device
  • An Agora developer account (see How to Get Started with Agora)
  • A basic understanding of React Native and Agora SDK

The quick-start app is a good place to start as it has the video calling already built out and it doesn’t contain features we won’t need. You can follow the instructions in the to get the app working on your device. If you just want the final app with in-call stats, you can find the app here.

Accessing In-Call Stats

Building a React Native Video Chat App with In-Call Statistics - Screenshot #1

Let’s start writing the code for in-call stats to our demo app.

Updating the State

We’ll add three objects (remoteStats, code>rtcStats, and localStats) to the state to store the three different types of statistics. The localStats and rtcStats will be objects containing the different stats directly. We’ll use the remoteStats object to store the remote user’s UID as the key and the stats for that user as its value in the key-value pair. We’ll add a Boolean showStats to hide and unhide our stats in our UI:

Listening for the Stats

We can access the in-call statistics by listening for the LocalVideoStats, RemoteVideoStats, and RtcStats events. Let’s add event listeners to access and store the stats in our state. Each event triggers once every two seconds. (If we have N users in a call, the RemoteVideoStats triggers N times every 2 seconds.)

Function to Toggle showStats

Let’s create a function that flips the showStats Boolean value when we press our toggle button:

Displaying the Stats

Now that we’ve got all our logic in place, let’s display these stats in our UI. We’ll use the Boolean showStats to conditionally render the stats.

Toggle Button

We’ll add a button to hide and unhide the stats alongside our start and end call buttons in the render method:

Local Video Stats and RTC Stats

We’ll define a function _renderLocalStats to render the local stats using a FlatList. We iterate over the keys of our object and display them in Text components with their values. (_localStatItem and _rtcStatItem are helper functions for our list.)

We add our _renderLocalStats function to our _renderVideos function like so:

Remote Video Stats

We’ll create a function to render the remote stats for a given remote user using their UID. We’ll use a FlatList to render Text components iterating over our remoteStats object with their UID; as the key:

We’ll render this component as an overlay to our RtcRemoteView component. You can find the style definitions here:


That is how we can listen, monitor, and display the in-call statistics for our video experience. You can even build functions to log or react to change in these values to deliver an exceptional user experience.

Other Resources

If you want to learn about how the demo app works, see this tutorial. And if you want to look at other features of the Agora SDK, see the API Reference. I also invite you to join the Agora Slack Community.