Marked as helpful by the asker
4M reads with the same users means a listener that re-reads the whole collection on every change. Classic: onSnapshot(collection) on a list that someone writes to every second (a typing indicator, a presence field).
Open Firestore → Usage → look at the peak hour, then check which screen was open. Fix: listen to a query with limit(50), and move high-frequency fields (presence, typing) to Realtime Database, which is priced per GB not per read.