Your video autoplays every single time you load the page. It does not autoplay for somebody arriving for the first time, and there is no bug in your code.
Chrome has been keeping a score on you, per site, and you have been raising it all week.
The score is real and you can read it
Chrome's autoplay documentation states the rule plainly. Autoplay with sound is allowed if "The user has interacted with the domain (click, tap, etc.)" or, on desktop, if "the user's Media Engagement Index threshold has been crossed, meaning the user has previously played video with sound."
The Media Engagement Index "measures an individual's propensity to consume media on a site", and Chrome calculates it as "a ratio of visits to significant media playback events per origin."
A playback counts as significant only when all of these hold:
- "Consumption of the media (audio/video) must be greater than seven seconds."
- "Audio must be present and unmuted."
- "The tab with the video is active."
- "Size of the video (in px) must be greater than 200x140."
Read that list again as a description of what you do all day when you are working on a video feature. You load the page, you unmute it to check the sound, you watch more than seven seconds of it to see whether it stutters, you do it in the tab you are looking at, at a normal size.
Every one of those is a significant playback event for your own origin.
Which makes this worse than ordinary unrepresentativeness
You are not merely an unrepresentative tester for this feature. You are becoming less representative with every test. The more carefully you check that autoplay works, the more confident Chrome becomes that you personally like watching video on this domain, and the more reliably it will let the video play for you and nobody else.
The useful part is that none of this is hidden. Open about://media-engagement and Chrome lists the score it is keeping, per origin, for your profile. Find your own site in that list. If the score is high, you have not actually tested autoplay in months, whatever your last few page loads suggested.
Meanwhile the failure is silent by default
Here is the code almost everybody writes:
// Looks fine. Fails silently for a first-time visitor.
videoEl.play()
Chrome is explicit about what happens next: "calls to play() without a user gesture will reject the promise with a NotAllowedError DOMException." And it gives the instruction most code ignores: "You should always look at the Promise returned by the play function to see if it was rejected."
A bare videoEl.play() throws that rejection away. Nothing appears in the console, nothing reaches your error tracker, and the video simply sits there showing its first frame. From the user's side, the page is broken in a way they have no words for.
videoEl.play().catch((err) => {
if (err.name !== 'NotAllowedError') throw err
// Chrome declined. Fall back to something that is always permitted.
videoEl.muted = true
videoEl.play()
showUnmuteButton()
})
That fallback works because of one more line in the same documentation: "Muted autoplay is always allowed." Start muted, give the user a control, and the experience stops depending on what the browser has decided about them.
Why the report will not say any of this
The bug report says the video does not play. It cannot say more than that, because nothing told the user anything: no error dialog, no console message they would ever see, no indication that a decision was made about them at all.
And you cannot reproduce it, by construction. Your profile has a high engagement score for your own origin and theirs has none. A fresh profile or a guest window will show you the failure in ten seconds; your ordinary browser, the one you have been working in, never will. That is the whole gap, and it widens every day you spend on the feature.
Top comments (0)