Run the same Takeout export through two different watch-history analyzers and you will often get two different totals, sometimes differing by thousands. Neither tool is necessarily broken. The number depends entirely on what each one decides counts as a view, and that decision is rarely documented. This guide explains the filtering choices that produce the gap, so you can work out which number is answering your actual question.
The array length is not your view count
The laziest possible implementation reads the JSON file and reports its array length. That number is always the largest, and it is almost always wrong.
It is wrong because the array may contain entries that are not watch events at all, and because it treats degraded entries and real ones identically without saying so. If a tool gives you a suspiciously round, suspiciously large number instantly, this is usually why.
Combined exports mix in searches and other activity
If you exported all YouTube data rather than just history, or if you took a combined Google activity export, you may be holding a MyActivity.json rather than a clean watch-history.json. Those files interleave several activity types in one array: videos watched, searches performed, and other recorded actions, all as sibling objects.
Search entries look structurally similar to watch entries. They have a title, a time, and an activityControls array. The distinguishing detail is the title prefix: watch events begin with 'Watched ', searches begin with 'Searched for '.
Our analyzer applies two filters before counting anything. An entry is included only if its activityControls array contains 'YouTube watch history', and only if its title begins with 'Watched '. A tool that checks neither will report your searches as videos. This is the single largest source of inflated counts.
Removed videos: counted, but not attributable
Deleted and private videos remain in the export as entries reading 'Watched a video that has been removed', with no title, URL, or channel.
Tools disagree about what to do with them. Some drop them entirely, which lowers the total. Some count them but exclude them from channel rankings, which keeps the total honest while leaving a visible gap between your view count and the sum of your per-channel counts. Some silently attribute them to a placeholder channel, which makes the numbers add up at the cost of inventing a channel that does not exist.
We count them and label them 'Unknown Channel'. If your top-channels list does not sum to your total, that difference is your removed-video count, and it is a genuinely interesting number — it is a measure of how much of your viewing history has rotted away.
Rewatches, Shorts, and ads
Watching the same video three times produces three entries with three timestamps. That is correct behaviour for a log of events, but it means 'videos watched' and 'unique videos watched' are different questions with different answers, and tools do not always say which one they are showing you.
Shorts are recorded as ordinary watch events. Because they are seconds long and easy to scroll through by the dozen, a heavy Shorts habit can dominate a view count in a way that badly misrepresents time spent. This is another reason 'hours watched' estimates derived from view counts fall apart.
Ads are not separated out. If an entry was recorded as a watch event, we count it as one; the export gives no reliable flag to do otherwise.
Which number should you trust
Ask what you want to know. For 'how many times did I open a video', the filtered event count is right. For 'how many different videos have I seen', you want a distinct count on video ID, which will be substantially lower. For 'how much time did I spend', the honest answer is that this export cannot tell you.
The more useful test of any analyzer is whether it tells you which question it answered. A tool that states its filters can be checked. A tool that shows one big number and no methodology cannot, and the fact that its number is bigger is not evidence that it is better.
A worked example of where the numbers diverge
Picture an export whose array holds 12,000 objects. Four tools can legitimately report four different totals from it.
A tool reporting array length says 12,000. A tool that filters to genuine watch events — activityControls containing 'YouTube watch history' and a title beginning 'Watched ' — might say 9,400, having set aside 2,600 search entries that were riding along in a combined export. A tool that also discards degraded entries says 8,900, dropping 500 removed videos. A tool reporting distinct video IDs says 6,100, because rewatches collapse.
Every one of those four numbers is defensible. They answer different questions: how many records exist, how many views happened, how many views can be attributed, and how many different videos were seen. The problem is not that the numbers differ; it is that most tools present one of them as 'videos watched' without saying which.
Auditing a count yourself
You do not need to trust anyone's arithmetic. The raw file is text, and a couple of checks will tell you which question a tool answered.
Open the JSON in any editor with a search-count function and count occurrences of '"Watched ' including the quote and the trailing space. That approximates the genuine watch events. Then count occurrences of 'has been removed' to get your degraded entries. If a tool's headline number matches the first figure, it filtered properly; if it is noticeably higher, it counted things that are not views.
For distinct videos, the honest answer needs deduplication on the extracted ID rather than a text search, which is where a tool earns its keep. But the two counts above are enough to tell whether a total is inflated.
Why the same account gives different totals over time
Two exports taken months apart will disagree even if no tool changed, and the direction of the change is informative.
The total normally grows as you keep watching. It shrinks at the tail if auto-delete is enabled, because activity older than your chosen window of 3, 18, or 36 months is being removed continuously. It shrinks in the middle if you cleared a range by hand. And it stops growing while watch history is paused, which produces a plateau rather than a gap at the edge.
So a falling total is not evidence of a broken export. It usually means one of Google's retention controls is doing exactly what it was set to do.