diff --git src/wp-admin/js/customize-controls.js src/wp-admin/js/customize-controls.js
index 320f892..631df0b 100644
--- src/wp-admin/js/customize-controls.js
+++ src/wp-admin/js/customize-controls.js
@@ -3461,12 +3461,13 @@
 				// Add notifications for invalidities.
 				if ( _.isObject( validity ) ) {
 					_.each( validity, function( params, code ) {
-						var notification = new api.Notification( code, params ), existingNotification, needsReplacement = false;
+						var notification, existingNotification, needsReplacement = false;
+						notification = new api.Notification( code, _.extend( { fromServer: true }, params ) );
 
 						// Remove existing notification if already exists for code but differs in parameters.
 						existingNotification = setting.notifications( notification.code );
 						if ( existingNotification ) {
-							needsReplacement = ( notification.type !== existingNotification.type ) || ! _.isEqual( notification.data, existingNotification.data );
+							needsReplacement = notification.type !== existingNotification.type || notification.message !== existingNotification.message || ! _.isEqual( notification.data, existingNotification.data );
 						}
 						if ( needsReplacement ) {
 							setting.notifications.remove( code );
@@ -3715,7 +3716,7 @@
 					 */
 					api.each( function( setting ) {
 						setting.notifications.each( function( notification ) {
-							if ( 'error' === notification.type && ( ! notification.data || ! notification.data.from_server ) ) {
+							if ( 'error' === notification.type && ! notification.fromServer ) {
 								invalidSettings.push( setting.id );
 							}
 						} );
diff --git src/wp-includes/class-wp-customize-manager.php src/wp-includes/class-wp-customize-manager.php
index 5ee3b6d..668989b 100644
--- src/wp-includes/class-wp-customize-manager.php
+++ src/wp-includes/class-wp-customize-manager.php
@@ -1046,17 +1046,9 @@ final class WP_Customize_Manager {
 		if ( is_wp_error( $validity ) ) {
 			$notification = array();
 			foreach ( $validity->errors as $error_code => $error_messages ) {
-				$error_data = $validity->get_error_data( $error_code );
-				if ( is_null( $error_data ) ) {
-					$error_data = array();
-				}
-				$error_data = array_merge(
-					$error_data,
-					array( 'from_server' => true )
-				);
 				$notification[ $error_code ] = array(
 					'message' => join( ' ', $error_messages ),
-					'data' => $error_data,
+					'data' => $validity->get_error_data( $error_code ),
 				);
 			}
 			return $notification;
diff --git src/wp-includes/js/customize-base.js src/wp-includes/js/customize-base.js
index e59f926..20bb74a 100644
--- src/wp-includes/js/customize-base.js
+++ src/wp-includes/js/customize-base.js
@@ -762,18 +762,30 @@ window.wp = window.wp || {};
 	 * @augments wp.customize.Class
 	 * @since 4.6.0
 	 *
-	 * @param {string} code                The error code.
-	 * @param {object} params              Params.
-	 * @param {string} params.message      The error message.
-	 * @param {string} [params.type=error] The notification type.
-	 * @param {*}      [params.data]       Any additional data.
+	 * @param {string}  code - The error code.
+	 * @param {object}  params - Params.
+	 * @param {string}  params.message=null - The error message.
+	 * @param {string}  [params.type=error] - The notification type.
+	 * @param {boolean} [params.fromServer=false] - Whether the notification was server-sent.
+	 * @param {string}  [params.setting=null] - The setting ID that the notification is related to.
+	 * @param {*}       [params.data=null] - Any additional data.
 	 */
 	api.Notification = api.Class.extend({
 		initialize: function( code, params ) {
+			var _params;
 			this.code = code;
-			this.message = params.message;
-			this.type = params.type || 'error';
-			this.data = params.data || null;
+			_params = _.extend(
+				{
+					message: null,
+					type: 'error',
+					fromServer: false,
+					data: null,
+					setting: null
+				},
+				params
+			);
+			delete _params.code;
+			_.extend( this, _params );
 		}
 	});
 
