diff --git src/bp-core/classes/class-bp-invitation-manager.php src/bp-core/classes/class-bp-invitation-manager.php
index a8bb047ce..0b7d2f009 100644
--- src/bp-core/classes/class-bp-invitation-manager.php
+++ src/bp-core/classes/class-bp-invitation-manager.php
@@ -139,7 +139,7 @@ abstract class BP_Invitation_Manager {

 		// "Send" the invite if necessary.
 		if ( $invite_id && $r['send_invite'] ) {
-			$sent = $this->send_invitation_by_id( $invite_id );
+			$sent = $this->send_invitation_by_id( $invite_id, $r );
 			if ( ! $sent ) {
 				return false;
 			}
@@ -154,11 +154,12 @@ abstract class BP_Invitation_Manager {
 	 * @since 5.0.0
 	 * @access public
 	 *
-	 * @param int $invitation_id ID of invitation to send.
+	 * @param int   $invitation_id ID of invitation to send.
+	 * @param array $args          See BP_Invitation::mark_sent().
 	 *
 	 * @return int|bool The number of rows updated, or false on error.
 	 */
-	public function send_invitation_by_id( $invitation_id = 0 ) {
+	public function send_invitation_by_id( $invitation_id = 0, $args = array() ) {
 		$updated = false;

 		$invitation = new BP_Invitation( $invitation_id );
@@ -196,7 +197,7 @@ abstract class BP_Invitation_Manager {
 		// Perform the send action.
 		$this->run_send_action( $invitation );

-		$updated = BP_Invitation::mark_sent( $invitation->id );
+		$updated = BP_Invitation::mark_sent( $invitation->id, $args );

 		return $updated;
 	}
@@ -305,11 +306,12 @@ abstract class BP_Invitation_Manager {
 	 * @since 5.0.0
 	 * @access public
 	 *
-	 * @param int $request_id ID of request to send.
+	 * @param int   $request_id ID of request to send.
+	 * @param array $args       See BP_Invitation::mark_sent().
 	 *
 	 * @return int|bool The number of rows updated, or false on error.
 	 */
-	public function send_request_notification_by_id( $request_id = 0 ) {
+	public function send_request_notification_by_id( $request_id = 0, $args = array() ) {
 		$updated = false;

 		$request = new BP_Invitation( $request_id );
@@ -325,24 +327,24 @@ abstract class BP_Invitation_Manager {
 		 * Before sending notifications, check for outstanding invitations to the same item.
 		 * A sent invitation + a request = acceptance.
 		 */
-		$args = array(
+		$invite_args = array(
 			'user_id'           => $request->user_id,
 			'invitee_email'     => $request->invitee_email,
 			'item_id'           => $request->item_id,
 			'secondary_item_id' => $request->secondary_item_id,
 			'invite_sent'       => 'sent'
 		);
-		$invites = $this->invitation_exists( $args );
+		$invites = $this->invitation_exists( $invite_args );

 		if ( ! empty( $invites ) ) {
 			// Accept the request.
-			return $this->accept_invitation( $args );
+			return $this->accept_invitation( $invite_args );
 		}

 		// Perform the send action.
 		$this->run_send_action( $request );

-		$updated = BP_Invitation::mark_sent( $request->id );
+		$updated = BP_Invitation::mark_sent( $request->id, $args );

 		return $updated;
 	}
@@ -452,25 +454,33 @@ abstract class BP_Invitation_Manager {
 	 * @see BP_Invitation::get() for a description of
 	 *      accepted update/where arguments.
 	 *
-	 * @param array $update_args Associative array of fields to update,
-	 *              and the values to update them to. Of the format
-	 *              array( 'user_id' => 4 )
+	 * @param array $args {
+	 *     Invitation characteristics. Some basic info is required to accept an invitation,
+	 *     because we'll need to accept all similar invitations and requests.
+	 *
+	 *     @type int    $user_id           User ID of the invitee.
+	 *                                     Either 'user_id' or 'invitee_email' is required.
+	 *     @type string $invitee_email     Email address of the invitee.
+	 *                                     Either 'user_id' or 'invitee_email' is required.
+	 *     @type int    $item_id           Item ID of the invitation to accept.
+	 *     @type int    $secondary_item_id Optional. Secondary item ID if needed.
+	 *     @type string $invite_sent       Optional. Defaults to only allowing the
+	 *                                     acceptance of sent invitations.
+	 *     @type string $date_modified     Modified time in 'Y-m-d h:i:s' format, GMT.
+	 *                                     Defaults to current time if not specified.
+	 * }
 	 *
 	 * @return int|bool Number of rows updated on success, false on failure.
 	 */
 	 public function accept_invitation( $args = array() ) {

-		/*
-		 * Some basic info is required to accept an invitation,
-		 * because we'll need to mark all similar invitations and requests.
-		 * The following, except the optional 'secondary_item_id', are required.
-		 */
 		$r = bp_parse_args( $args, array(
 			'user_id'           => 0,
 			'invitee_email'     => '',
 			'item_id'           => null,
 			'secondary_item_id' => null,
 			'invite_sent'       => 'sent',
+			'date_modified'     => bp_core_current_time(),
 		), 'accept_invitation' );
 		$r['class'] = $this->class_name;

@@ -501,22 +511,26 @@ abstract class BP_Invitation_Manager {
 	 * @see BP_Invitation::get() for a description of
 	 *      accepted update/where arguments.
 	 *
-	 * @param array $update_args Associative array of fields to update,
-	 *              and the values to update them to. Of the format
-	 *              array( 'user_id' => 4 )
+	 * @param array $args {
+	 *     Invitation characteristics. Some basic info is required to accept an invitation,
+	 *     because we'll need to accept all similar invitations and requests.
+	 *
+	 *     @type int    $user_id           User ID of the invitee.
+	 *     @type int    $item_id           Item ID of the invitation to accept.
+	 *     @type int    $secondary_item_id Optional. Secondary item ID if needed.
+	 *     @type string $date_modified     Modified time in 'Y-m-d h:i:s' format, GMT.
+	 *                                     Defaults to current time if not specified.
+	 * }
 	 *
 	 * @return bool Number of rows updated on success, false on failure.
 	 */
 	 public function accept_request( $args = array() ) {
-		/*
-		 * Some basic info is required to accept an invitation,
-		 * because we'll need to accept all similar invitations and requests.
-		 * The following, except the optional 'secondary_item_id', are required.
-		 */
+
 		$r = bp_parse_args( $args, array(
 			'user_id'           => 0,
 			'item_id'           => null,
 			'secondary_item_id' => null,
+			'date_modified'     => bp_core_current_time(),
 		), 'accept_request' );
 		$r['class'] = $this->class_name;

@@ -618,11 +632,12 @@ abstract class BP_Invitation_Manager {
 	 *
 	 * @since 5.0.0
 	 *
-	 * @param int $id The ID of the invitation to mark as sent.
+	 * @see BP_Invitation::mark_accepted()
+	 *      for a description of arguments.
 	 * @return bool True on success, false on failure.
 	 */
-	public function mark_accepted_by_id( $id ) {
-		return BP_Invitation::mark_accepted( $id );
+	public function mark_accepted_by_id( $id, $args ) {
+		return BP_Invitation::mark_accepted( $id, $args );
 	}

 	/**
diff --git src/bp-core/classes/class-bp-invitation.php src/bp-core/classes/class-bp-invitation.php
index b7ca0d7eb..e15aa5fa5 100644
--- src/bp-core/classes/class-bp-invitation.php
+++ src/bp-core/classes/class-bp-invitation.php
@@ -640,6 +640,12 @@ class BP_Invitation {
 			}
 		}

+		// date_modified
+		if ( ! empty( $args['date_modified'] ) ) {
+			$where_clauses['data']['date_modified'] = $args['date_modified'];
+			$where_clauses['format'][] = '%s';
+		}
+
 		return $where_clauses;
 	}

@@ -987,9 +993,17 @@ class BP_Invitation {
 	 *
 	 * @since 5.0.0
 	 *
-	 * @param int $id The ID of the invitation to mark as sent.
+	 * @param int   $id   The ID of the invitation to mark as sent.
+	 * @param array $args {
+	 *     Optional. Invitation characteristics used
+	 *     to override certain sending behaviors.
+	 *
+	 *     @type string $date_modified Modified time in 'Y-m-d h:i:s' format, GMT.
+	 *                                 Defaults to current time if not specified.
+	 * }
+	 * @return int|bool The number of rows updated, or false on error.
 	 */
-	public static function mark_sent( $id = 0 ) {
+	public static function mark_sent( $id = 0, $args = array() ) {

 		if ( ! $id ) {
 			return false;
@@ -997,8 +1011,13 @@ class BP_Invitation {

 		// Values to be updated.
 		$update_args = array(
-			'invite_sent' => 'sent',
+			'invite_sent'   => 'sent',
+			'date_modified' => bp_core_current_time(),
 		);
+		// Respect a specified `date-modified`.
+		if ( ! empty( $args['date_modified'] ) ) {
+			$update_args['date_modified'] = $args['date_modified'];
+		}

 		// WHERE clauses.
 		$where_args = array(
@@ -1014,14 +1033,20 @@ class BP_Invitation {
 	 *
 	 * @since 5.0.0
 	 *
- 	 * @param array $args See BP_Invitation::update().
+	 * @param array $args See BP_Invitation::update().
+	 * @return int|bool The number of rows updated, or false on error.
 	 */
 	public static function mark_sent_by_data( $args ) {

 		// Values to be updated.
 		$update_args = array(
-			'invite_sent' => 'sent',
+			'invite_sent'   => 'sent',
+			'date_modified' => bp_core_current_time(),
 		);
+		// Respect a specified `date-modified`.
+		if ( ! empty( $args['date_modified'] ) ) {
+			$update_args['date_modified'] = $args['date_modified'];
+		}

 		return self::update( $update_args, $args );
 	}
@@ -1033,9 +1058,17 @@ class BP_Invitation {
 	 *
 	 * @since 5.0.0
 	 *
-	 * @param int $id The ID of the invitation to mark as sent.
+	 * @param int   $id   The ID of the invitation to mark as sent.
+	 * @param array $args {
+	 *     Optional. Invitation characteristics used
+	 *     to override certain sending behaviors.
+	 *
+	 *     @type string $date_modified Modified time in 'Y-m-d h:i:s' format, GMT.
+	 *                                 Defaults to current time if not specified.
+	 * }
+	 * @return int|bool The number of rows updated, or false on error.
 	 */
-	public static function mark_accepted( $id = 0 ) {
+	public static function mark_accepted( $id = 0, $args = array() ) {

 		if ( ! $id ) {
 			return false;
@@ -1043,8 +1076,13 @@ class BP_Invitation {

 		// Values to be updated.
 		$update_args = array(
-			'accepted' => 'accepted',
+			'accepted'      => 'accepted',
+			'date_modified' => bp_core_current_time(),
 		);
+		// Respect a specified `date-modified`.
+		if ( ! empty( $args['date_modified'] ) ) {
+			$update_args['date_modified'] = $args['date_modified'];
+		}

 		// WHERE clauses.
 		$where_args = array(
@@ -1060,14 +1098,20 @@ class BP_Invitation {
 	 *
 	 * @since 5.0.0
 	 *
- 	 * @param array $args See BP_Invitation::update().
+	 * @param array $args See BP_Invitation::update().
+	 * @return int|bool The number of rows updated, or false on error.
 	 */
 	public static function mark_accepted_by_data( $args ) {

 		// Values to be updated.
 		$update_args = array(
-			'accepted' => 'accepted',
+			'accepted'      => 'accepted',
+			'date_modified' => bp_core_current_time(),
 		);
+		// Respect a specified `date-modified`.
+		if ( ! empty( $args['date_modified'] ) ) {
+			$update_args['date_modified'] = $args['date_modified'];
+		}

 		return self::update( $update_args, $args );
 	}
diff --git src/bp-groups/bp-groups-functions.php src/bp-groups/bp-groups-functions.php
index d1af9ad1f..e8c5639b0 100644
--- src/bp-groups/bp-groups-functions.php
+++ src/bp-groups/bp-groups-functions.php
@@ -2044,7 +2044,7 @@ function groups_send_membership_request( ...$args ) {

 	// If a new request was created, send the emails.
 	if ( $request_id && is_int( $request_id ) ) {
-		$invites_class->send_request_notification_by_id( $request_id );
+		$invites_class->send_request_notification_by_id( $request_id, $r );
 		$admins = groups_get_group_admins( $r['group_id'] );

 		/**
diff --git tests/phpunit/testcases/core/invitations.php tests/phpunit/testcases/core/invitations.php
index 0646557a4..d8f1f4efb 100644
--- tests/phpunit/testcases/core/invitations.php
+++ tests/phpunit/testcases/core/invitations.php
@@ -332,4 +332,52 @@ include_once BP_TESTS_DIR . 'assets/invitations-extensions.php';
 		$this->set_current_user( $old_current_user );
 	}

+	public function test_bp_invitations_add_request_with_date_modified() {
+		$old_current_user = get_current_user_id();
+
+		$u1 = $this->factory->user->create();
+		$this->set_current_user( $u1 );
+
+		$invites_class = new BPTest_Invitation_Manager_Extension();
+
+		$time = gmdate( 'Y-m-d H:i:s', time() - 100 );
+		$args = array(
+			'user_id'           => $u1,
+			'item_id'           => 7,
+			'date_modified'     => $time,
+		);
+		$r1 = $invites_class->add_request( $args );
+
+		$req = new BP_Invitation( $r1 );
+		$this->assertEquals( $time, $req->date_modified );
+
+		$this->set_current_user( $old_current_user );
+	}
+
+	public function test_bp_invitations_add_invite_with_date_modified() {
+		$old_current_user = get_current_user_id();
+
+		$u1 = $this->factory->user->create();
+		$u2 = $this->factory->user->create();
+		$this->set_current_user( $u1 );
+
+		$invites_class = new BPTest_Invitation_Manager_Extension();
+		$time = gmdate( 'Y-m-d H:i:s', time() - 100 );
+
+		// Create an invitation.
+		$invite_args = array(
+			'user_id'           => $u2,
+			'inviter_id'		=> $u1,
+			'item_id'           => 1,
+			'send_invite'       => 1,
+			'date_modified'     => $time,
+		);
+		$i1 = $invites_class->add_invitation( $invite_args );
+
+		$inv = new BP_Invitation( $i1 );
+		$this->assertEquals( $time, $inv->date_modified );
+
+		$this->set_current_user( $old_current_user );
+	}
+
 }
