US Posts Modest Jobs Growth In November As Investors Brace For CPI Volatility
- Payrolls rise 64k, reversing October’s sharp decline - Health care and construction drive job gains - Wage growth softens as private sector hiring remains subdued - CPI likely distorted by technical factors - Analysts flag shelter inflation as key signal
On Tuesday, the Bureau of Labor Statistics (BLS) reported a 64,000 rise in November payrolls, an upside surprise versus expectations for a 50,000 gain and a reversal of October’s headline decline of 105,000.
The unemployment rate edged up one-tenth to 4.6%, while wage growth appeared to cool. Average hourly earnings rose 0.1% m/m and 3.5% y/y in November, undershooting forecasts of 0.3% and 3.6%, respectively.
Private payrolls increased by 69,000 on the month, only partially offset by a combined 10,000 decline across manufacturing and government employment. Analysts noted that private-sector hiring has totalled 44,000 over the past six months, marking the slowest pace of six-month job growth since the pandemic.
The agency released revised October figures alongside the November report, but noted that household survey data for October were not collected due to the federal government shutdown.
The BLS said total nonfarm payroll employment “changed little” in November and had also shown little net change since April. “The unemployment rate was 4.6% in November, little changed from September. Employment rose in health care and construction, while federal government employment continued to decline,” the report said.
Health care added 46,000 jobs, broadly in line with the average monthly gain of 39,000 over the prior 12 months. Construction employment rose by 28,000, led by a 19,000 increase among non-residential speciality trade contractors.
Nationwide chief economist Kathy Bostjancic said catch-up employment data pointed to a soft but slightly firmer overall labour-market picture. “The private-sector nonfarm employment readings for November and October suggest that while net hiring remains soft and narrowly based, it is not softening further and is moderately firmer than the weak readings seen over the summer,” she said.
Source@ BLS Household data
Technical factors may distort US inflation data
Hot on the heels of the jobs report, investors will turn to US inflation data due on Wednesday.
The latest analysts’ poll expects headline CPI to rise 3.1% y/y in November, with core inflation forecast at 3.0%.
Deutsche Bank said that, because October price data were not collected, the report would focus on y/y changes. The bank expects headline CPI to hold broadly steady at 3.03% y/y (unrounded), with core inflation seen at 3.02%.
“Within the details, core goods prices are likely to show modest increases in household furnishings and apparel, while used car prices should continue to decline,” said Deutsche Bank’s Jim Reid. “Core services will attract particular attention, especially rents, which are expected to rebound after September’s anomalous weakness. Airline fares and lodging should soften from recent highs, though health insurance may surprise on the upside.”
Commenting on last week’s rate cut at the FOMC press conference, Fed Chair Jerome Powell cautioned that technical factors were likely to distort both inflation and labour-market data. “We’ll need to look at the data with a sceptical eye,” he said.
Policymakers lowered the federal funds target range by 25 basis points to 3.50%–3.75%, in line with expectations.
Explaining the rationale for the move, Powell said downside risks had risen in recent months. “Why we moved today is due to a gradual cooling in the labour market,” he said, adding that evidence was building that services inflation had eased, while goods inflation was being driven entirely by tariffs.
With the combined October–November CPI report expected to be “messy”, Citi Research’s Veronica Clark warned that, in the absence of October data, assessments of a “strong” or “weak” November print would need to be benchmarked against September.
“For us, the most important detail in the November CPI report is shelter inflation following a substantial slowing in owners’ equivalent rent,” Clark said. “We do expect some reacceleration in OER over October and November, but look for average monthly gains of around 0.21% m/m. That would be stronger than September’s 0.13% increase, but still on the softer end of typical OER increases.”
/*jshint esversion: 6 */
var socket;
var assigned_server = 3001;
var distributor_server = 3010;
var publisher_channel = '';
var broadcaster_channel = '';
var remote_ip = '';
var session_info = {};
var logging_interval;
var logging_interval_time = 120000;
var socket_emits = 0;
var session_start_time;
var reconnectionDelayGrowFactor = 1.2;
var reconnection_delay = 1000;
var playing = false;
var connected_to_assigned = false;
var socket_close_timeout;
var player_disconnected_annoucement_play_delay = 1500;
var player_disconnected_annoucement_play_timeout = null;
self.onmessage = function (msg) {
switch(msg.data.action) {
case 'Reactivate': reactivate(); break;
case 'ConnectDistributor': connect_to_distributor(msg); break;
case 'SessionStaticInfo': session_static_info(msg); break;
case 'SessionInfo': update_session_info(msg.data); break;
case 'PauseLogging': clearTimeout(logging_interval); break;
case 'RestartLogging': postMessage({action: 'RequestSessionStaticInfo' }); break;
case 'JoinPublisherChannel': join_publisher_channel(msg.data); break;
case 'JoinPlayerChannel': join_player_channel(msg.data); break;
case 'CheckChannelStatus': check_channel_status(msg.data); break;
case 'PlayerLogResponse': player_log_response(msg.data); break;
case 'CloseSocket': close_socket(); break;
case 'RequestMessageSearch': request_message_search(msg.data); break;
case 'RequestMoreMessages': request_more_messages(msg.data); break;
case 'PlayerDisconnectedAnnoucementTimeoutStart': player_disconnected_annoucement_timeout_start(); break;
case 'PlayerDisconnectedAnnoucementTimeoutClear': player_disconnected_annoucement_timeout_clear(); break;
}
};
function player_disconnected_annoucement_timeout_clear() {
clearTimeout(player_disconnected_annoucement_play_timeout);
player_disconnected_annoucement_play_timeout = null;
}
function player_disconnected_annoucement_timeout_start() {
player_disconnected_annoucement_play_timeout = setTimeout(function() { send_play_disconnect_annoucement(); }, player_disconnected_annoucement_play_delay );
}
function send_play_disconnect_annoucement() {
postMessage({action: "PlayDisconnectAnnoucement"});
}
function reactivate() {
playing = false;
connect_to_assigned_server();
}
function player_log_response(data) {
var data_array = {};
data_array.type = 'PlayerLogResponse';
data_array.respond_to_socket_final = data.respond_to_socket_final;
data_array.respond_to_socket = data.respond_to_socket;
data_array.player_socket_id = data.player_socket_id;
data_array.logs = data.logs;
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
}
function request_message_search(data) {
var data_array = {};
data_array.type = 'request_message_search';
data_array.publisher_channel = data.publisher_channel;
data_array.search_term = data.search_term;
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
}
function request_more_messages(data) {
var data_array = {};
data_array.type = 'request_more_messages';
data_array.publisher_channel = data.publisher_channel;
data_array.last_record_id = data.last_record_id;
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
}
function check_channel_status(data) {
var data_array = {};
data_array.type = 'check_channel_status';
data_array.app_name = data.app_name;
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1 && connected_to_assigned) { socket.send(msg_string); }
else { setTimeout(function() { check_channel_status(data); },500); }
}
function check_channel_status_response(data) {
postMessage({ action: 'CheckChannelStatusReponse', stream_status: data.stream_status.status, onair: data.stream_status.onair, connected: data.stream_status.connected });
}
function join_publisher_channel(data) {
var data_array = {};
data_array.type = 'join_publisher_channel';
if (typeof data.api_key !== 'undefined') { data_array.api_key = data.api_key; }
else {
data_array.publisher_channel = data.publisher_channel;
data_array.username = data.username;
data_array.subscriber_group = data.subscriber_group;
data_array.display_name = data.display_name;
data_array.single_sign_on = data.single_sign_on;
data_array.remote_ip = data.remote_ip;
data_array.http_referrer = data.http_referrer;
data_array.current_page = data.current_page;
data_array.php_session_id = data.php_session_id;
data_array.from_react = data.from_react;
}
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) {
socket.send(msg_string); }
postMessage({action: 'PublisherChannelJoined' });
}
function session_static_info(msg) {
set_static_session_info(msg.data);
start_log();
}
function connect_to_distributor(msg) {
publisher_channel = msg.data.publisher_channel;
remote_ip = msg.data.remote_ip;
socket = new WebSocket("wss://ws.livesquawk.com/ws"+distributor_server);
socket.onopen = function(event) { request_server_assignment(); };
socket.onmessage = function(event) {
var msg_string = event.data.toString();
var data = JSON.parse(msg_string);
switch(data.type) {
case 'server_assignment_response': server_assignment_response(data); break;
}
};
}
function session_info_interval() {
postMessage({action: 'RequestSessionInfo' });
logging_interval = setTimeout(session_info_interval,logging_interval_time);
}
function server_assignment_response(data) {
assigned_server = data.selected_server;
socket.close();
connect_to_assigned_server();
}
function request_server_assignment() {
var data_array = {};
data_array.type = 'request_server_assignment';
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
}
function connect_to_assigned_server() {
socket = new WebSocket("wss://ws.livesquawk.com/ws"+assigned_server);
socket.onopen = function(event) {
postMessage({ action: 'VisibleConsole',console_string: "Connected to server "+assigned_server });
console.log("Connected to server "+assigned_server);
postMessage({ action: 'ConnectedToAssigned' });
connected_to_assigned = true;
if (playing) {
postMessage({ action: 'RejoinPlayerChannel' });
}
};
socket.onmessage = function(event) {
var msg_string = event.data.toString();
var data = JSON.parse(msg_string);
if (data.type != 'server_ping') { /* console.log(data.type); */ }
switch(data.type) {
case 'reconnect': postMessage({ action: 'VisibleConsole',console_string: "Reconnected" }); break;
case 'reload': postMessage({ action: 'Reload' }); break;
case 'start_log_response': start_log_response(data); break;
case 'application_refresh_start': application_refresh_start(data); break;
case 'application_refresh_stop': application_refresh_stop(data); break;
case 'player_log_request':
case 'check_channel_status_response': check_channel_status_response(data); break;
case 'PlayerLogRequest':
case 'new_tweet':
case 'new_latest_news':
case 'delete_report':
case 'add_report':
case 'add_ref_doc':
case 'calendar_change':
case 'calendar_insert':
case 'calendar_delete':
case 'new_note':
case 'AppStart':
case 'AppStop':
case 'BroadcasterStarted':
case 'BroadcasterStopped':
case 'added_cme_report':
case 'updated_cme_report':
case 'added_cme_commentary':
case 'updated_cme_commentary':
case 'server_assignment_response':
case 'initial_messages':
case 'message_categories':
case 'more_messages':
case 'matched_messages':
pass_straight_to_post_message(data);
break;
case 'output':
case 'server_ping':
case 'reconnect':
case 'disconnect':
break;
}
};
socket.onerror = function(event) {
postMessage({ action: 'VisibleConsole',console_string: "LS Socket Error" + event.type });
console.log(event);
postMessage({ action: 'LSSocketConnectionError' });
};
socket.onclose = function(event) {
console.log('Socket is closed. Reconnect will be attempted in 1 second.', event.reason);
socket_close_timeout = setTimeout(connect_to_assigned_server, reconnection_delay);
reconnection_delay = reconnection_delay*reconnectionDelayGrowFactor;
connected_to_assigned = false;
};
}
function close_socket() {
clearTimeout(socket_close_timeout);
socket_close_timeout = null;
socket.onclose = function(event) {};
socket.onmessage = function(event) {};
socket.onerror = function(event) {};
socket.close(1000);
console.log('Socket Closed');
}
function pass_straight_to_post_message(data) {
data.action = data.type;
postMessage(data);
}
function join_player_channel(data) {
var data_array = {};
data_array.type = 'join_player_channel';
data_array.player_channel = data.player_channel;
data_array.remote_ip = data.remote_ip;
data_array.username = data.username;
data_array.app_name = data.app_name;
data_array.onair_status = data.onair_status;
data_array.http_referrer = data.http_referrer;
data_array.current_page = data.current_page;
data_array.php_session_id = data.php_session_id;
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
postMessage({action: 'PlayerChannelJoined' });
playing = true;
}
function start_log_response(data) {
session_info.session_id = data.log_record_id;
session_info_interval();
}
function application_refresh_start(data) {
if (data.app_name == session_info.application_name) { postMessage({action: 'ApplicationRefreshStart' }); }
}
function application_refresh_stop(data) {
if (data.app_name == session_info.application_name) { postMessage({action: 'ApplicationRefreshStop' }); }
}
function set_static_session_info(data) {
session_info.browser_codename = data.browser_codename;
session_info.browser_name = data.browser_name;
session_info.user_agent = data.user_agent;
session_info.browser_version = data.browser_version;
session_info.cookies_enabled = data.cookies_enabled;
session_info.platform = data.platform;
session_info.player_version = data.player_version;
session_info.stream = data.stream;
session_info.connection_protocol = data.protocol;
session_info.delay_target = data.delay_target;
session_info.session_email = data.session_email;
session_info.remote_ip = data.remote_ip;
session_info.php_session_id = data.php_session_id;
session_info.application_name = data.application_name;
session_info.http_referrer = data.http_referrer;
}
function start_log() {
var session_start_date = new Date();
session_start_time = session_start_date.getTime();
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var session_start_date_string = session_start_date.getDate() + " " + months[session_start_date.getMonth()] + " " + session_start_date.getFullYear();
var data_array = {};
data_array.type = 'webrtc_start_log';
data_array.remote_ip = session_info.remote_ip;
data_array.username = session_info.session_email;
data_array.php_session_id = session_info.php_session_id;
data_array.webrtc_protocol = '';
data_array.session_start_time = (session_start_time/1000).toFixed(0);
data_array.stream_name = session_info.stream;
data_array.session_start_date = session_start_date_string;
var msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
}
function update_session_info(data) {
var data_array = {};
var msg_string = '';
var current_date = new Date();
var current_time = current_date.getTime();
session_info.protocol = data.protocol;
session_info.curr_delay = (data.effective_latency / 1000).toFixed(2);
session_info.session_length = current_time - session_start_time;
session_info.ping_time = data.ping_time;
session_info.jitter = data.jitter;
session_info.packet_loss = data.packet_loss;
session_info.effective_latency = data.effective_latency;
session_info.mean_opinion_score = data.mean_opinion_score;
session_info.restarts = data.restarts;
if (socket_emits == 0) {
data_array = {};
data_array.type = 'webrtc_log_data_full';
data_array.connection_protocol = session_info.protocol;
data_array.threshold = 0;
data_array.curr_delay = session_info.curr_delay;
data_array.session_length = session_info.session_length;
data_array.date = current_time;
data_array.browser_codename = session_info.browser_codename;
data_array.browser_name = session_info.browser_name;
data_array.user_agent = session_info.user_agent;
data_array.browser_version = session_info.browser_version;
data_array.cookies_enabled = session_info.cookies_enabled;
data_array.platform = session_info.platform;
data_array.player_version = session_info.player_version;
data_array.stream = session_info.stream;
data_array.restarts = session_info.restarts;
data_array.delay_target = 0;
data_array.op_sys = '';
data_array.flash_version = '';
data_array.remote_ip = session_info.remote_ip;
data_array.http_referrer = session_info.http_referrer;
data_array.php_session_id = session_info.php_session_id;
data_array.user_email = session_info.session_email;
data_array.webrtc_protocol = session_info.protocol;
data_array.ping_time = session_info.ping_time;
data_array.jitter = session_info.jitter;
data_array.packet_loss = session_info.packet_loss;
data_array.effective_latency = session_info.effective_latency;
data_array.mean_opinion_score = session_info.mean_opinion_score;
data_array.session_id = session_info.session_id;
msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
}
else {
data_array = {};
data_array.type = 'webrtc_log_data';
data_array.session_id = session_info.session_id;
data_array.php_session_id = session_info.php_session_id;
data_array.connection_protocol = session_info.protocol;
data_array.restarts = session_info.restarts;
data_array.threshold = 0;
data_array.curr_delay = session_info.curr_delay;
data_array.session_length = session_info.session_length;
data_array.date = current_time;
data_array.webrtc_protocol = session_info.protocol;
data_array.ping_time = session_info.ping_time;
data_array.jitter = session_info.jitter;
data_array.packet_loss = session_info.packet_loss;
data_array.effective_latency = session_info.effective_latency;
data_array.mean_opinion_score = session_info.mean_opinion_score;
data_array.stream = session_info.stream;
msg_string = JSON.stringify(data_array);
if (socket.readyState == 1) { socket.send(msg_string); }
}
socket_emits++;
if (socket_emits == 100) { socket_emits = 0; }
}
- Payrolls rise 64k, reversing October’s sharp decline
- Health care and construction drive job gains
- Wage growth softens as private sector hiring remains subdued
- CPI likely distorted by technical factors
- Analysts flag shelter inflation as key signal
By Harry Daniels
LiveSquawk News
@HarryDaniels71
16 December 2025 | 16:00 GMT
On Tuesday, the Bureau of Labor Statistics (BLS) reported a 64,000 rise in November payrolls, an upside surprise versus expectations for a 50,000 gain and a reversal of October’s headline decline of 105,000.
The unemployment rate edged up one-tenth to 4.6%, while wage growth appeared to cool. Average hourly earnings rose 0.1% m/m and 3.5% y/y in November, undershooting forecasts of 0.3% and 3.6%, respectively.
Private payrolls increased by 69,000 on the month, only partially offset by a combined 10,000 decline across manufacturing and government employment. Analysts noted that private-sector hiring has totalled 44,000 over the past six months, marking the slowest pace of six-month job growth since the pandemic.
The agency released revised October figures alongside the November report, but noted that household survey data for October were not collected due to the federal government shutdown.
The BLS said total nonfarm payroll employment “changed little” in November and had also shown little net change since April. “The unemployment rate was 4.6% in November, little changed from September. Employment rose in health care and construction, while federal government employment continued to decline,” the report said.
Health care added 46,000 jobs, broadly in line with the average monthly gain of 39,000 over the prior 12 months. Construction employment rose by 28,000, led by a 19,000 increase among non-residential speciality trade contractors.
Nationwide chief economist Kathy Bostjancic said catch-up employment data pointed to a soft but slightly firmer overall labour-market picture. “The private-sector nonfarm employment readings for November and October suggest that while net hiring remains soft and narrowly based, it is not softening further and is moderately firmer than the weak readings seen over the summer,” she said.
Hot on the heels of the jobs report, investors will turn to US inflation data due on Wednesday.
The latest analysts’ poll expects headline CPI to rise 3.1% y/y in November, with core inflation forecast at 3.0%.
Deutsche Bank said that, because October price data were not collected, the report would focus on y/y changes. The bank expects headline CPI to hold broadly steady at 3.03% y/y (unrounded), with core inflation seen at 3.02%.
“Within the details, core goods prices are likely to show modest increases in household furnishings and apparel, while used car prices should continue to decline,” said Deutsche Bank’s Jim Reid. “Core services will attract particular attention, especially rents, which are expected to rebound after September’s anomalous weakness. Airline fares and lodging should soften from recent highs, though health insurance may surprise on the upside.”
Commenting on last week’s rate cut at the FOMC press conference, Fed Chair Jerome Powell cautioned that technical factors were likely to distort both inflation and labour-market data. “We’ll need to look at the data with a sceptical eye,” he said.
Policymakers lowered the federal funds target range by 25 basis points to 3.50%–3.75%, in line with expectations.
Explaining the rationale for the move, Powell said downside risks had risen in recent months. “Why we moved today is due to a gradual cooling in the labour market,” he said, adding that evidence was building that services inflation had eased, while goods inflation was being driven entirely by tariffs.
With the combined October–November CPI report expected to be “messy”, Citi Research’s Veronica Clark warned that, in the absence of October data, assessments of a “strong” or “weak” November print would need to be benchmarked against September.
“For us, the most important detail in the November CPI report is shelter inflation following a substantial slowing in owners’ equivalent rent,” Clark said. “We do expect some reacceleration in OER over October and November, but look for average monthly gains of around 0.21% m/m. That would be stronger than September’s 0.13% increase, but still on the softer end of typical OER increases.”