diff --git src/bp-activity/bp-activity-cache.php src/bp-activity/bp-activity-cache.php
index d1c4bc0..d6655a4 100644
--- src/bp-activity/bp-activity-cache.php
+++ src/bp-activity/bp-activity-cache.php
@@ -75,7 +75,9 @@ add_action( 'bp_activity_deleted_activities', 'bp_activity_clear_cache_for_delet
  * @return bool True on success, false on failure.
  */
 function bp_activity_reset_cache_incrementor() {
-	return bp_core_reset_incrementor( 'bp_activity' );
+	$without_last_activity = bp_core_reset_incrementor( 'bp_activity' );
+	$with_last_activity    = bp_core_reset_incrementor( 'bp_activity_with_last_activity' );
+	return $without_last_activity && $with_last_activity;
 }
 add_action( 'bp_activity_delete', 'bp_activity_reset_cache_incrementor' );
 add_action( 'bp_activity_add', 'bp_activity_reset_cache_incrementor' );
diff --git src/bp-activity/classes/class-bp-activity-activity.php src/bp-activity/classes/class-bp-activity-activity.php
index bfcf975..d405295 100644
--- src/bp-activity/classes/class-bp-activity-activity.php
+++ src/bp-activity/classes/class-bp-activity-activity.php
@@ -645,10 +645,16 @@ class BP_Activity_Activity {
 			 */
 			$activity_ids_sql = apply_filters( 'bp_activity_paged_activities_sql', $activity_ids_sql, $r );
 
-			$cached = bp_core_get_incremented_cache( $activity_ids_sql, 'bp_activity' );
+			if ( preg_match( '/a\.type NOT IN \([^\)]*\'last_activity\'[^\)]*\)/', $activity_ids_sql ) ) {
+				$cache_group = 'bp_activity';
+			} else {
+				$cache_group = 'bp_activity_with_last_activity';
+			}
+
+			$cached = bp_core_get_incremented_cache( $activity_ids_sql, $cache_group );
 			if ( false === $cached ) {
 				$activity_ids = $wpdb->get_col( $activity_ids_sql );
-				bp_core_set_incremented_cache( $activity_ids_sql, 'bp_activity', $activity_ids );
+				bp_core_set_incremented_cache( $activity_ids_sql, $cache_group, $activity_ids );
 			} else {
 				$activity_ids = $cached;
 			}
@@ -708,10 +714,10 @@ class BP_Activity_Activity {
 			 * @param string $sort      Sort direction for query.
 			 */
 			$total_activities_sql = apply_filters( 'bp_activity_total_activities_sql', "SELECT count(DISTINCT a.id) FROM {$bp->activity->table_name} a {$join_sql} {$where_sql}", $where_sql, $sort );
-			$cached = bp_core_get_incremented_cache( $total_activities_sql, 'bp_activity' );
+			$cached = bp_core_get_incremented_cache( $total_activities_sql, $cache_group );
 			if ( false === $cached ) {
 				$total_activities = $wpdb->get_var( $total_activities_sql );
-				bp_core_set_incremented_cache( $total_activities_sql, 'bp_activity', $total_activities );
+				bp_core_set_incremented_cache( $total_activities_sql, $cache_group, $total_activities );
 			} else {
 				$total_activities = $cached;
 			}
diff --git src/bp-core/classes/class-bp-core-user.php src/bp-core/classes/class-bp-core-user.php
index a9657aa..f102892 100644
--- src/bp-core/classes/class-bp-core-user.php
+++ src/bp-core/classes/class-bp-core-user.php
@@ -912,6 +912,16 @@ class BP_Core_User {
 		// Set cache.
 		wp_cache_set( $user_id, $activity[ $user_id ], 'bp_last_activity' );
 
+		/**
+		 * Fires when a user's last_activity value has been updated.
+		 *
+		 * @since 2.7.0
+		 *
+		 * @param int    $user_id ID of the user.
+		 * @param string $time    Last activity timestamp, in 'Y-m-d H:i:s' format.
+		 */
+		do_action( 'bp_core_user_updated_last_activity', $user_id, $time );
+
 		return $updated;
 	}
 
diff --git src/bp-members/bp-members-cache.php src/bp-members/bp-members-cache.php
index 49b4b50..df36860 100644
--- src/bp-members/bp-members-cache.php
+++ src/bp-members/bp-members-cache.php
@@ -61,3 +61,15 @@ function bp_members_clear_member_type_cache( $user_id ) {
 }
 add_action( 'wpmu_delete_user', 'bp_members_clear_member_type_cache' );
 add_action( 'delete_user', 'bp_members_clear_member_type_cache' );
+
+/**
+ * Invalidate activity caches when a user's last_activity value is changed.
+ *
+ * @since 2.7.0
+ *
+ * @return bool True on success, false on failure.
+ */
+function bp_members_reset_activity_cache_incrementor() {
+	return bp_core_reset_incrementor( 'bp_activity_with_last_activity' );
+}
+add_action( 'bp_core_user_updated_last_activity', 'bp_members_reset_activity_cache_incrementor' );
diff --git tests/phpunit/testcases/members/cache.php tests/phpunit/testcases/members/cache.php
index e4d7e04..725e791 100644
--- tests/phpunit/testcases/members/cache.php
+++ tests/phpunit/testcases/members/cache.php
@@ -22,5 +22,61 @@ class BP_Tests_Members_Cache extends BP_UnitTestCase {
 		// check if function references cache or hits the DB by comparing query count
 		$this->assertEquals( $num_queries, $wpdb->num_queries );
 	}
+
+	/**
+	 * @ticket BP7237
+	 * @ticket BP6643
+	 * @ticket BP7245
+	 */
+	public function test_last_activity_should_bust_activity_with_last_activity_cache() {
+		global $wpdb;
+
+		$u1 = $this->factory->user->create();
+		$u2 = $this->factory->user->create();
+
+		$time_1 = date( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS );
+		$time_2 = date( 'Y-m-d H:i:s', time() - ( HOUR_IN_SECONDS * 2 ) );
+		bp_update_user_last_activity( $u1, $time_1 );
+		bp_update_user_last_activity( $u2, $time_2 );
+
+		$activity_args_a = array(
+			'filter' => array(
+				'object' => buddypress()->members->id,
+				'action' => 'last_activity',
+			),
+			'max' => 1,
+		);
+
+		$activity_args_b = array(
+			'filter' => array(
+				'action' => 'new_member',
+			),
+			'fields' => 'ids',
+		);
+
+		// Prime bp_activity and bp_activity_with_last_activity caches.
+		$a1 = bp_activity_get( $activity_args_a );
+		$expected = array( $u1, $u2 );
+		$found = array_map( 'intval', wp_list_pluck( $a1['activities'], 'user_id' ) );
+		$this->assertSame( $expected, $found );
+
+		$b1 = bp_activity_get( $activity_args_b );
+
+		// Bump u2 activity so it should appear first.
+		$new_time = date( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS );
+		bp_update_user_last_activity( $u2, $new_time );
+
+		$a2 = bp_activity_get( $activity_args_a );
+		$expected = array( $u2, $u1 );
+		$found = array_map( 'intval', wp_list_pluck( $a2['activities'], 'user_id' ) );
+		$this->assertSame( $expected, $found );
+
+		$num_queries = $wpdb->num_queries;
+
+		// bp_activity cache should not have been touched.
+		$b2 = bp_activity_get( $activity_args_b );
+		$this->assertEqualSets( $b1, $b2 );
+		$this->assertSame( $num_queries, $wpdb->num_queries );
+	}
 }
 
