diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp
index e77c518ead..f18d19814a 100644
--- a/assignment-client/src/avatars/AvatarMixer.cpp
+++ b/assignment-client/src/avatars/AvatarMixer.cpp
@@ -178,7 +178,13 @@ void AvatarMixer::broadcastAvatarData() {
             
             // keep track of outbound data rate specifically for avatar data
             int numAvatarDataBytes = 0;
-            
+
+            // keep track of the number of other avatars held back in this frame
+            int numAvatarsHeldBack = 0;
+
+            // keep track of the number of other avatar frames skipped
+            int numAvatarsWithSkippedFrames = 0;
+
             // use the data rate specifically for avatar data for FRD adjustment checks
             float avatarDataRateLastSecond = nodeData->getOutboundAvatarDataKbps();
 
@@ -265,9 +271,11 @@ void AvatarMixer::broadcastAvatarData() {
                     // make sure we haven't already sent this data from this sender to this receiver
                     // or that somehow we haven't sent
                     if (lastSeqToReceiver == lastSeqFromSender && lastSeqToReceiver != 0) {
-                        qDebug() << "Not sending a data for" << otherNode->getUUID() << "to" << node->getUUID()
-                            << "since it has already been sent.";
+                        ++numAvatarsHeldBack;
                         return;
+                    } else if (lastSeqFromSender - lastSeqToReceiver > 1) {
+                        // this is a skip - we still send the packet but capture the presence of the skip so we see it happening
+                        ++numAvatarsWithSkippedFrames;
                     } 
                     
                     // we're going to send this avatar
@@ -337,6 +345,10 @@ void AvatarMixer::broadcastAvatarData() {
             
             // record the bytes sent for other avatar data in the AvatarMixerClientData
             nodeData->recordSentAvatarData(numAvatarDataBytes + mixedAvatarByteArray.size());
+            
+            // record the number of avatars held back this frame
+            nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);
+            nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames);
 
             if (numOtherAvatars == 0) {
                 // update the full rate distance to FLOAT_MAX since we didn't have any other avatars to send
diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp
index e3506a25e5..dbdc573b96 100644
--- a/assignment-client/src/avatars/AvatarMixerClientData.cpp
+++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp
@@ -40,6 +40,8 @@ void AvatarMixerClientData::loadJSONStats(QJsonObject& jsonObject) const {
     jsonObject["full_rate_distance"] = _fullRateDistance;
     jsonObject["max_avatar_distance"] = _maxAvatarDistance;
     jsonObject["num_avatars_sent_last_frame"] = _numAvatarsSentLastFrame;
+    jsonObject["avg_other_avatar_starves_per_second"] = getAvgNumOtherAvatarStarvesPerSecond();
+    jsonObject["avg_other_avatar_skips_per_second"] = getAvgNumOtherAvatarSkipsPerSecond();
     
     jsonObject[OUTBOUND_AVATAR_DATA_STATS_KEY] = getOutboundAvatarDataKbps();
 }
diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h
index d1dc996e39..d91dccbdaa 100644
--- a/assignment-client/src/avatars/AvatarMixerClientData.h
+++ b/assignment-client/src/avatars/AvatarMixerClientData.h
@@ -56,6 +56,12 @@ public:
     void incrementNumAvatarsSentLastFrame() { ++_numAvatarsSentLastFrame; }
     int getNumAvatarsSentLastFrame() const { return _numAvatarsSentLastFrame; }
 
+    void recordNumOtherAvatarStarves(int numAvatarsHeldBack) { _otherAvatarStarves.updateAverage((float) numAvatarsHeldBack); } 
+    float getAvgNumOtherAvatarStarvesPerSecond() const { return _otherAvatarStarves.getAverageSampleValuePerSecond(); }
+
+    void recordNumOtherAvatarSkips(int numOtherAvatarSkips) { _otherAvatarSkips.updateAverage((float) numOtherAvatarSkips); }
+    float getAvgNumOtherAvatarSkipsPerSecond() const { return _otherAvatarSkips.getAverageSampleValuePerSecond(); }
+
     int getNumFramesSinceFRDAdjustment() const { return _numFramesSinceAdjustment; }
     void incrementNumFramesSinceFRDAdjustment() { ++_numFramesSinceAdjustment; }
     void resetNumFramesSinceFRDAdjustment() { _numFramesSinceAdjustment = 0; }
@@ -81,6 +87,9 @@ private:
     int _numAvatarsSentLastFrame = 0;
     int _numFramesSinceAdjustment = 0;
 
+    SimpleMovingAverage _otherAvatarStarves;
+    SimpleMovingAverage _otherAvatarSkips;
+    
     SimpleMovingAverage _avgOtherAvatarDataRate;
 };