Index: src/bp-core/admin/bp-core-admin-schema.php
--- src/bp-core/admin/bp-core-admin-schema.php
+++ src/bp-core/admin/bp-core-admin-schema.php
@@ -114,6 +114,15 @@
 				KEY useritem (user_id,is_new)
 			) {$charset_collate};";
 
+	$sql[] = "CREATE TABLE {$bp_prefix}bp_notifications_meta (
+				id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
+				notification_id bigint(20) NOT NULL,
+				meta_key varchar(255) DEFAULT NULL,
+				meta_value longtext DEFAULT NULL,
+				KEY notification_id (notification_id),
+				KEY meta_key (meta_key)
+			) {$charset_collate};";
+
 	dbDelta( $sql );
 }
 
Index: src/bp-core/bp-core-update.php
--- src/bp-core/bp-core-update.php
+++ src/bp-core/bp-core-update.php
@@ -211,18 +211,18 @@
 		// Run the schema install to update tables
 		bp_core_install();
 
-		// 1.5
+		// 1.5.0
 		if ( $raw_db_version < 1801 ) {
 			bp_update_to_1_5();
 			bp_core_add_page_mappings( $default_components, 'delete' );
 		}
 
-		// 1.6
+		// 1.6.0
 		if ( $raw_db_version < 6067 ) {
 			bp_update_to_1_6();
 		}
 
-		// 1.9
+		// 1.9.0
 		if ( $raw_db_version < 7553 ) {
 			bp_update_to_1_9();
 		}
@@ -232,7 +232,7 @@
 			bp_update_to_1_9_2();
 		}
 
-		// 2.0
+		// 2.0.0
 		if ( $raw_db_version < 7892 ) {
 			bp_update_to_2_0();
 		}
@@ -242,10 +242,15 @@
 			bp_update_to_2_0_1();
 		}
 
-		// 2.2
+		// 2.2.0
 		if ( $raw_db_version < 9181 ) {
 			bp_update_to_2_2();
 		}
+
+		// 2.3.0
+		if ( $raw_db_version < 9572 ) {
+			bp_update_to_2_3();
+		}
 	}
 
 	/** All done! *************************************************************/
@@ -418,6 +423,19 @@
 }
 
 /**
+ * 2.3.0 update routine.
+ *
+ * - Add notifications meta table
+ *
+ * @since BuddyPress (2.3.0)
+ */
+function bp_update_to_2_3() {
+	if ( bp_is_active( 'notifications' ) ) {
+		bp_core_install_notifications();
+	}
+}
+
+/**
  * Updates the component field for new_members type.
  *
  * @since BuddyPress (2.2.0)
Index: src/bp-loader.php
--- src/bp-loader.php
+++ src/bp-loader.php
@@ -303,7 +303,7 @@
 		/** Versions **********************************************************/
 
 		$this->version    = '2.3-alpha';
-		$this->db_version = 9181;
+		$this->db_version = 9572;
 
 		/** Loading ***********************************************************/
 
Index: src/bp-notifications/bp-notifications-cache.php
--- src/bp-notifications/bp-notifications-cache.php
+++ src/bp-notifications/bp-notifications-cache.php
@@ -7,6 +7,30 @@
  */
 
 /**
+ * Slurp up metadata for a set of notifications.
+ *
+ * It grabs all notification meta associated with all of the notifications
+ * passed in $notification_ids and adds it to WP cache. This improves efficiency
+ * when using notification meta within a loop context.
+ *
+ * @since BuddyPress (2.3.0)
+ *
+ * @param int|str|array $notification_ids Accepts a single notification_id, or a
+ *                                        comma-separated list or array of
+ *                                        notification ids.
+ */
+function bp_notifications_update_meta_cache( $notification_ids = false ) {
+	bp_update_meta_cache( array(
+		'object_ids' 	   => $notification_ids,
+		'object_type' 	   => buddypress()->notifications->id,
+		'cache_group'      => 'notification_meta',
+		'object_column'    => 'notification_id',
+		'meta_table' 	   => buddypress()->notifications->table_name_meta,
+		'cache_key_prefix' => 'bp_notifications_meta'
+	) );
+}
+
+/**
  * Invalidate 'all_for_user_' cache when saving.
  *
  * @since BuddyPress (2.0.0)
Index: src/bp-notifications/bp-notifications-functions.php
--- src/bp-notifications/bp-notifications-functions.php
+++ src/bp-notifications/bp-notifications-functions.php
@@ -611,3 +611,134 @@
 	 */
 	return apply_filters( 'bp_notifications_get_registered_components', $component_names, $active_components );
 }
+
+/** Meta **********************************************************************/
+
+/**
+ * Delete a meta entry from the DB for a notification item.
+ *
+ * @since BuddyPress (2.3.0)
+ *
+ * @global object $wpdb WordPress database access object.
+ *
+ * @param int    $notification_id ID of the notification item whose metadata is being deleted.
+ * @param string $meta_key        Optional. The key of the metadata being deleted. If
+ *                                omitted, all metadata associated with the notification
+ *                                item will be deleted.
+ * @param string $meta_value      Optional. If present, the metadata will only be
+ *                                deleted if the meta_value matches this parameter.
+ * @param bool   $delete_all      Optional. If true, delete matching metadata entries
+ * 	                              for all objects, ignoring the specified object_id. Otherwise,
+ * 	                              only delete matching metadata entries for the specified
+ * 	                              notification item. Default: false.
+ *
+ * @return bool                   True on success, false on failure.
+ */
+function bp_notifications_delete_meta( $notification_id, $meta_key = '', $meta_value = '', $delete_all = false ) {
+
+	// Legacy - if no meta_key is passed, delete all for the item
+	if ( empty( $meta_key ) ) {
+		$all_meta = bp_notifications_get_meta( $notification_id );
+		$keys     = ! empty( $all_meta )
+			? array_keys( $all_meta )
+			: array();
+
+		// With no meta_key, ignore $delete_all
+		$delete_all = false;
+	} else {
+		$keys = array( $meta_key );
+	}
+
+	$retval = true;
+
+	add_filter( 'query', 'bp_filter_metaid_column_name' );
+	foreach ( $keys as $key ) {
+		$retval = delete_metadata( 'notifications', $notification_id, $key, $meta_value, $delete_all );
+	}
+	remove_filter( 'query', 'bp_filter_metaid_column_name' );
+
+	return $retval;
+}
+
+/**
+ * Get metadata for a given notification item.
+ *
+ * @since BuddyPress (2.3.0)
+ *
+ * @uses apply_filters() To call the 'bp_notifications_get_meta' hook.
+ *
+ * @param int    $notification_id ID of the notification item whose metadata is being requested.
+ * @param string $meta_key        Optional. If present, only the metadata matching
+ *                                that meta key will be returned. Otherwise, all metadata for the
+ *                                notification item will be fetched.
+ * @param bool   $single          Optional. If true, return only the first value of the
+ *	                              specified meta_key. This parameter has no effect if meta_key is not
+ *	                              specified. Default: true.
+ *
+ * @return mixed                  The meta value(s) being requested.
+ */
+function bp_notifications_get_meta( $notification_id = 0, $meta_key = '', $single = true ) {
+	add_filter( 'query', 'bp_filter_metaid_column_name' );
+	$retval = get_metadata( 'notifications', $notification_id, $meta_key, $single );
+	remove_filter( 'query', 'bp_filter_metaid_column_name' );
+
+	/**
+	 * Filters the metadata for a specified notification item.
+	 *
+	 * @since BuddyPress (2.3.0)
+	 *
+	 * @param mixed  $retval          The meta values for the notification item.
+	 * @param int    $notification_id ID of the notification item.
+	 * @param string $meta_key        Meta key for the value being requested.
+	 * @param bool   $single          Whether to return one matched meta key row or all.
+	 */
+	return apply_filters( 'bp_notifications_get_meta', $retval, $notification_id, $meta_key, $single );
+}
+
+/**
+ * Update a piece of notification meta.
+ *
+ * @since BuddyPress (1.2.0)
+ *
+ * @param  int    $notification_id ID of the notification item whose metadata is being
+ *                                 updated.
+ * @param  string $meta_key        Key of the metadata being updated.
+ * @param  mixed  $meta_value      Value to be set.
+ * @param  mixed  $prev_value      Optional. If specified, only update existing
+ *                                 metadata entries with the specified value.
+ *                                 Otherwise, update all entries.
+ *
+ * @return bool|int                Returns false on failure. On successful
+ *                                 update of existing metadata, returns true. On
+ *                                 successful creation of new metadata,  returns
+ *                                 the integer ID of the new metadata row.
+ */
+function bp_notifications_update_meta( $notification_id, $meta_key, $meta_value, $prev_value = '' ) {
+	add_filter( 'query', 'bp_filter_metaid_column_name' );
+	$retval = update_metadata( 'notifications', $notification_id, $meta_key, $meta_value, $prev_value );
+	remove_filter( 'query', 'bp_filter_metaid_column_name' );
+
+	return $retval;
+}
+
+/**
+ * Add a piece of notification metadata.
+ *
+ * @since BuddyPress (2.3.0)
+ *
+ * @param int    $notification_id ID of the notification item.
+ * @param string $meta_key        Metadata key.
+ * @param mixed  $meta_value      Metadata value.
+ * @param bool   $unique          Optional. Whether to enforce a single metadata value
+ *                                for the given key. If true, and the object already has a value for
+ *                                the key, no change will be made. Default: false.
+ *
+ * @return int|bool               The meta ID on successful update, false on failure.
+ */
+function bp_notifications_add_meta( $notification_id, $meta_key, $meta_value, $unique = false ) {
+	add_filter( 'query', 'bp_filter_metaid_column_name' );
+	$retval = add_metadata( 'notifications', $notification_id, $meta_key, $meta_value, $unique );
+	remove_filter( 'query', 'bp_filter_metaid_column_name' );
+
+	return $retval;
+}
Index: src/bp-notifications/bp-notifications-loader.php
--- src/bp-notifications/bp-notifications-loader.php
+++ src/bp-notifications/bp-notifications-loader.php
@@ -247,7 +247,8 @@
 
 		// Global groups
 		wp_cache_add_global_groups( array(
-			'bp_notifications'
+			'bp_notifications',
+			'notification_meta'
 		) );
 
 		parent::setup_cache_groups();
