Netflix Top 10s: Natalee Holloway Docuseries Leads as Black Doves Falls 65% and A Dog’s Perfect Christmas Struggles

Pictures: Netflix
Welcome to our weekly rundown of the Netflix top 10s, covering November 2nd to November 8th. Sadly, this is another tough week to report on, with few new English-language releases worth celebrating. A Dog’s Perfect Christmas topped the English film chart but had the weakest opening of any Netflix Wednesday Christmas movie since 2024.
Black Doves returned for season 2, down 65% on its first season, and two major English series, Bass X Machina and North of North, failed to chart at all. Taken: Natalee Holloway was the one bright spot, debuting at the top of the English TV list with 12.9 million views. Non-English titles carried the week. Collision Course jumped to 17.2 million views in its second week, A Couple of Lies more than doubled its audience and Dead-End Job held on to the top spot. Still, it’s increasingly worrying that Netflix, which has always prided itself on launching new titles, is finding it so hard to get its originals off the ground.

A Dog’s Perfect Christmas Debuts with 8.6M Views
A Dog’s Perfect Christmas. (L to R) Milo Ventimiglia as Hunter, Kathleen Rose Perkins as Juliana, Ethan Loomis as Sean, Director Cathryn Michon, Brooke Lena Johnson as Ello, Mary Steenburgen as Claire and Dennis Quaid as Sander in A Dog’s Perfect Christmas. Cr. Diyah Pera/Netflix ©2026.
Beginning in 2024, Netflix shifted its Christmas movie lineup to all release on Wednesday, which means we’ve now got a few years’ worth of comparisons over the coming weeks as Netflix drops its festive slate. It arguably didn’t get off to the best of starts with A Dog’s Perfect Christmas winning the hearts of those who watched but clearly didn’t get enough people through the door. It’s plum last compared to titles from prior years. Netflix has notably ramped up licensing of other Christmas movies so far this year compared to prior years; is that eating into the visibility of A Dog’s Perfect Christmas? We’re not sure. 

(function () {
if (!window.wonWatermarkPlugin) {
window.wonWatermarkPlugin = {
id: ‘wonWatermark’,
afterDraw: function (chart) {
var ctx = chart.ctx;
var area = chart.chartArea;
if (!ctx || !area) return;
// Scale watermark to the chart’s current pixel width so it stays
// a subtle attribution on phones (20px on a 320px canvas would
// dominate) while still reading on a 1200px desktop chart.
var w = area.right – area.left;
var fontSize = Math.max(11, Math.min(20, Math.round(w * 0.045)));
var offset = Math.max(6, Math.round(w * 0.018));
ctx.save();
ctx.font = ‘700 ‘ + fontSize + ‘px -apple-system, BlinkMacSystemFont, “Segoe UI”, Arial, sans-serif’;
ctx.fillStyle = ‘rgba(0, 0, 0, 0.22)’;
ctx.textAlign = ‘right’;
ctx.textBaseline = ‘bottom’;
ctx.fillText(‘whats-on-netflix.com’, area.right – offset, area.bottom – Math.max(4, Math.round(offset * 0.6)));
ctx.restore();
}
};
}

// Shared compact-number helper. Returns e.g. “1.2B”, “45.6M”, “789K” when
// useCompact is true, otherwise the full `toLocaleString()` form. Used by
// every chart’s datalabels and axis ticks on mobile so wide numbers like
// “1,234,567,890” don’t crowd small viewports. Tooltips keep the full
// number for accuracy.
if (!window.wonCompactNumber) {
window.wonCompactNumber = function (value, useCompact) {
if (value === null || value === undefined || isNaN(value)) return ”;
var n = Number(value);
if (!useCompact) {
return n.toLocaleString();
}
try {
if (typeof Intl !== ‘undefined’ && Intl.NumberFormat) {
if (!window.wonCompactFormatter) {
window.wonCompactFormatter = new Intl.NumberFormat(‘en’, {
notation: ‘compact’,
maximumFractionDigits: 1
});
}
return window.wonCompactFormatter.format(n);
}
} catch (e) {}
// Manual fallback for browsers without Intl compact notation support.
var abs = Math.abs(n);
var divisor, suffix;
if (abs >= 1e9) { divisor = 1e9; suffix = ‘B’; }
else if (abs >= 1e6) { divisor = 1e6; suffix = ‘M’; }
else if (abs >= 1e3) { divisor = 1e3; suffix = ‘K’; }
else { return n.toLocaleString(); }
var scaled = n / divisor;
var formatted = scaled.toFixed(scaled >= 100 ? 0 : (scaled >= 10 ? 1 : 2));
return formatted.replace(/(.d*?)0+$/, ‘$1’).replace(/.$/, ”) + suffix;
};
}

// End-of-line pills for the cumulative line charts. chartjs-plugin-datalabels
// always anchors them to the right of the final point, so a long title
// runs off the canvas. This draws them inside the canvas instead: the
// right gutter when it fits, otherwise to the left of the point, shortened
// with an ellipsis when neither side is wide enough, and nudged apart
// when two pills would cover each other.
if (!window.wonLineEndLabels) {
function wonLineLabelFont(fontSize) {
var family = ‘Arial, sans-serif’;
try {
if (window.Chart && Chart.defaults && Chart.defaults.font && Chart.defaults.font.family) {
family = Chart.defaults.font.family;
}
} catch (e) {}
return ‘700 ‘ + fontSize + ‘px ‘ + family;
}
function wonLineLabelWidth(ctx, text, fontSize) {
ctx.save();
ctx.font = wonLineLabelFont(fontSize);
var width = ctx.measureText(text).width;
ctx.restore();
return width;
}
function wonLineLabelFit(ctx, text, fontSize, maxWidth) {
if (maxWidth < 8) return ''; if (wonLineLabelWidth(ctx, text, fontSize) 1 && wonLineLabelWidth(ctx, trimmed + ellipsis, fontSize) > maxWidth) {
trimmed = trimmed.slice(0, -1).replace(/s+$/, ”);
}
return (trimmed || text.charAt(0)) + ellipsis;
}
window.wonLineEndLabels = {
id: ‘wonLineEndLabels’,
afterDatasetsDraw: function (chart) {
var ctx = chart.ctx;
var area = chart.chartArea;
if (!ctx || !area) return;
var opts = (chart.options.plugins && chart.options.plugins.wonLineEndLabels) || {};
var fontSize = opts.fontSize || 12;
var padX = fontSize canvasW – margin) x = Math.max(margin, canvasW – margin – drawnW);
var y = point.y – pillH / 2;
if (y < margin) y = margin; if (y + pillH > area.bottom) y = area.bottom – pillH;
if (y < margin) y = margin; pills.push({ x: x, y: y, w: drawnW, h: pillH, text: text, color: dataset.borderColor || '#221f1f', preferY: point.y }); }); pills.sort(function (a, b) { return a.preferY - b.preferY; }); var placed = []; function overlaps(pill, testY) { for (var n = 0; n < placed.length; n++) { var other = placed[n]; var xHit = pill.x < other.x + other.w + 4 && pill.x + pill.w + 4 > other.x;
var yHit = testY < other.y + other.h + 3 && testY + pill.h + 3 > other.y;
if (xHit && yHit) return true;
}
return false;
}
pills.forEach(function (pill) {
var y = pill.y;
var guard = 0;
while (overlaps(pill, y) && y + pill.h < area.bottom && guard < 30) { y += pill.h + 3; guard++; } if (overlaps(pill, y)) { y = pill.y; guard = 0; while (overlaps(pill, y) && y > margin && guard < 30) { y -= pill.h + 3; guard++; } } if (y < margin) y = margin; if (y + pill.h > canvasH – margin) y = canvasH – margin – pill.h;
pill.y = y;
placed.push(pill);
});
ctx.save();
ctx.font = wonLineLabelFont(fontSize);
ctx.textAlign = ‘left’;
ctx.textBaseline = ‘middle’;
placed.forEach(function (pill) {
ctx.beginPath();
if (ctx.roundRect) {
ctx.roundRect(pill.x, pill.y, pill.w, pill.h, 4);
} else {
ctx.rect(pill.x, pill.y, pill.w, pill.h);
}
ctx.fillStyle = pill.color;
ctx.fill();
ctx.fillStyle = ‘#fff’;
ctx.fillText(pill.text, pill.x + padX, pill.y + pill.h / 2);
});
ctx.restore();
}
};
}

// Mirror the host theme’s body font onto Chart.js defaults so chart text
// (ticks, legend, tooltips, datalabels) matches the surrounding article.
// Chart.js is loaded with `defer`, so we wait for DOMContentLoaded before
// touching `Chart.defaults` — by that point Chart.js is guaranteed to be
// parsed but no chart in this file has instantiated yet (their init code
// also runs on DOMContentLoaded, and they’re registered after this block
// in HTML source order, so listener-registration order keeps us first).
if (window.wonChartFontDefaults) return;
window.wonChartFontDefaults = true;

function applyThemeChartFont() {
if (typeof Chart === ‘undefined’ || !Chart.defaults || !Chart.defaults.font) {
return false;
}
var bodyFont = ”;
try {
bodyFont = getComputedStyle(document.body).fontFamily || ”;
} catch (e) {}
if (bodyFont) {
Chart.defaults.font.family = bodyFont;
}
return true;
}

if (document.readyState === ‘loading’) {
document.addEventListener(‘DOMContentLoaded’, applyThemeChartFont);
} else {
applyThemeChartFont();
}
})();

{
“@context”: “https://schema.org”,
“@type”: “Dataset”,
“name”: “Netflix Viewership Comparison – Our Little Secret, Champagne Problems, Jingle Bell Heist, That Christmas, Meet Me Next Christmas and 6 more Netflix titles (1-week cumulative views)”,
“description”: “Cumulative weekly views for Our Little Secret, Champagne Problems, Jingle Bell Heist, That Christmas, Meet Me Next Christmas and 6 more Netflix titles on Netflix over 1 weeks. Our Little Secret leads the comparison with 32,400,000 cumulative views. Combined total: 191,700,000 views. Data sourced from Netflix’s official Top 10 engagement reports.”,
“license”: “https://www.whats-on-netflix.com/corrections-policy/”,
“keywords”: “Netflix, viewership, streaming data, Netflix Top 10, weekly views, audience metrics, Our Little Secret, Champagne Problems, Jingle Bell Heist, That Christmas, Meet Me Next Christmas, My Secret Santa, Hot Frosty, The Merry Gentlemen”,
“creator”: {
“@type”: “Organization”,
“name”: “What’s on Netflix”,
“url”: “https://www.whats-on-netflix.com/”
},
“publisher”: {
“@type”: “Organization”,
“name”: “What’s on Netflix”,
“url”: “https://www.whats-on-netflix.com/”
},
“datePublished”: “2026-11-11”,
“dateModified”: “2026-11-11”,
“variableMeasured”: “Cumulative weekly views (Netflix Top 10)”,
“measurementTechnique”: “Aggregation of Netflix’s official weekly Top 10 engagement reports”,
“temporalCoverage”: “1 weeks”,
“spatialCoverage”: “Global”,
“isAccessibleForFree”: true,
“about”: [
{“@type”:”CreativeWork”,”name”:”Our Little Secret”},
{“@type”:”CreativeWork”,”name”:”Champagne Problems”},
{“@type”:”CreativeWork”,”name”:”Jingle Bell Heist”},
{“@type”:”CreativeWork”,”name”:”That Christmas”},
{“@type”:”CreativeWork”,”name”:”Meet Me Next Christmas”},
{“@type”:”CreativeWork”,”name”:”My Secret Santa”},
{“@type”:”CreativeWork”,”name”:”Hot Frosty”},
{“@type”:”CreativeWork”,”name”:”The Merry Gentlemen”},
{“@type”:”CreativeWork”,”name”:”I Believe in Santa”},
{“@type”:”CreativeWork”,”name”:”A Merry Little Ex-Mas”} ],
“distribution”: {
“@type”: “DataDownload”,
“encodingFormat”: “JSON”,
“contentUrl”: “#netflix_bar_graph_6af3db2fd16ff” }
}

Netflix Viewership Comparison – Our Little Secret, Champagne Problems, Jingle Bell Heist, That Christmas, Meet Me Next Christmas and 6 more Netflix titles (1-week analysis)
Cumulative views over 1 weeks for 11 Netflix titles: Our Little Secret, Champagne Problems, Jingle Bell Heist, That Christmas, Meet Me Next Christmas, My Secret Santa, Hot Frosty, The Merry Gentlemen, I Believe in Santa, A Merry Little Ex-Mas, A Dog’s Perfect Christmas. Combined total: 191,700,000 views.

Netflix cumulative views ranking for Our Little Secret, Champagne Problems, Jingle Bell Heist, That Christmas, Meet Me Next Christmas and 6 more Netflix titles over 1 weeks.

Title
Opening Week Views
Rank

Our Little Secret
32,400,000
1

Champagne Problems
20,500,000
2

Jingle Bell Heist
19,300,000
3

That Christmas
18,300,000
4

Meet Me Next Christmas
18,100,000
5

My Secret Santa
18,100,000
6

Hot Frosty
16,000,000
7

The Merry Gentlemen
14,700,000
8

I Believe in Santa
12,900,000
9

A Merry Little Ex-Mas
12,800,000
10

A Dog’s Perfect Christmas
8,600,000
11

(function() {
var showLabels = true;
var titleHighlight = “A Dog’s Perfect Christmas”;
// Title rendered above the chart in place of the legend (1 week → “Opening Week”).
var chartTitle = “Opening Week Views”;

function loadScript(src, callback) {
var script = document.createElement(‘script’);
script.src = src;
script.onload = callback;
document.head.appendChild(script);
}

function createChart() {
var canvasEl = document.getElementById(‘netflix_bar_graph_6af3db2fd16ff’);
var ctx = canvasEl.getContext(‘2d’);

// Detect mobile screen size
var isMobile = window.innerWidth

Leave a Reply

Your email address will not be published. Required fields are marked *