diff --git a/packages/dynamics-lib/src/queries/__tests__/activity.queries.spec.js b/packages/dynamics-lib/src/queries/__tests__/activity.queries.spec.js
index 66290b415..85788234e 100644
--- a/packages/dynamics-lib/src/queries/__tests__/activity.queries.spec.js
+++ b/packages/dynamics-lib/src/queries/__tests__/activity.queries.spec.js
@@ -1,4 +1,4 @@
-import { createActivity } from '../activity.queries.js'
+import { createActivity, updateActivity } from '../activity.queries.js'
 import { dynamicsClient } from '../../client/dynamics-client.js'
 
 jest.mock('dynamics-web-api', () => {
@@ -11,26 +11,26 @@ jest.mock('dynamics-web-api', () => {
 
 describe('Activity Service', () => {
   describe('createActivity', () => {
-    const mockResponse = {
+    const getSuccessResponse = () => ({
       '@odata.context': 'https://dynamics.com/api/data/v9.1/defra_CreateRCRActivityResponse',
       RCRActivityId: 'abc123',
       ReturnStatus: 'success',
       SuccessMessage: 'RCR Activity - created successfully',
       ErrorMessage: null,
       oDataContext: 'https://dynamics.com/api/data/v9.1/defra_CreateRCRActivityResponse'
-    }
+    })
 
-    const errorResponse = {
+    const getErrorResponse = () => ({
       '@odata.context': 'https://dynamics.com/api/data/v9.1/.defra_CreateRCRActivityResponse',
       RCRActivityId: null,
       ReturnStatus: 'error',
       SuccessMessage: '',
       ErrorMessage: 'Failed to create activity',
       oDataContext: 'https://dynamics.com/api/data/v9.1/$metadata#Microsoft.Dynamics.CRM.defra_CreateRCRActivityResponse'
-    }
+    })
 
     it('should call dynamicsClient with correct parameters', async () => {
-      dynamicsClient.executeUnboundAction.mockResolvedValue(mockResponse)
+      dynamicsClient.executeUnboundAction.mockResolvedValue(getSuccessResponse())
 
       await createActivity('contact-identifier-123', 2023)
 
@@ -42,11 +42,12 @@ describe('Activity Service', () => {
     })
 
     it('should return the CRM response correctly', async () => {
-      dynamicsClient.executeUnboundAction.mockResolvedValue(mockResponse)
+      const successResponse = getSuccessResponse()
+      dynamicsClient.executeUnboundAction.mockResolvedValue(successResponse)
 
       const result = await createActivity('contact-identifier-123', 2024)
 
-      expect(result).toEqual(mockResponse)
+      expect(result).toEqual(successResponse)
     })
 
     it('should handle error in dynamicsClient response', async () => {
@@ -57,7 +58,7 @@ describe('Activity Service', () => {
     })
 
     it('should handle the case where activity creation fails', async () => {
-      dynamicsClient.executeUnboundAction.mockResolvedValue(errorResponse)
+      dynamicsClient.executeUnboundAction.mockResolvedValue(getErrorResponse())
 
       const result = await createActivity('invalid-contact-id', 2024)
 
@@ -69,4 +70,64 @@ describe('Activity Service', () => {
       })
     })
   })
+
+  describe('updateActivity', () => {
+    const getSuccessResponse = () => ({
+      '@odata.context': 'https://dynamics.om/api/data/v9.1/defra_UpdateRCRActivityResponse',
+      ReturnStatus: 'success',
+      SuccessMessage: 'RCR Activity - updated successfully',
+      ErrorMessage: null,
+      oDataContext: 'https://dynamics.com/api/data/v9.1/defra_UpdateRCRActivityResponse'
+    })
+
+    const getErrorResponse = () => ({
+      '@odata.context': 'https://dynamics.om/api/data/v9.1/defra_UpdateRCRActivityResponse',
+      RCRActivityId: null,
+      ReturnStatus: 'error',
+      SuccessMessage: '',
+      ErrorMessage: 'Failed to update activity',
+      oDataContext: 'https://dynamics.com/api/data/v9.1/defra_UpdateRCRActivityResponse'
+    })
+
+    it('should call dynamicsClient with correct parameters', async () => {
+      dynamicsClient.executeUnboundAction.mockResolvedValue(getSuccessResponse())
+
+      await updateActivity('contact-identifier-123', 2023)
+
+      expect(dynamicsClient.executeUnboundAction).toHaveBeenCalledWith('defra_UpdateRCRActivity', {
+        ContactId: 'contact-identifier-123',
+        ActivityStatus: 'SUBMITTED',
+        Season: 2023
+      })
+    })
+
+    it('should return the CRM response correctly', async () => {
+      const successResponse = getSuccessResponse()
+      dynamicsClient.executeUnboundAction.mockResolvedValue(successResponse)
+
+      const result = await updateActivity('contact-identifier-123', 2024)
+
+      expect(result).toEqual(successResponse)
+    })
+
+    it('should handle error in dynamicsClient response', async () => {
+      const error = new Error('Failed to update activity')
+      dynamicsClient.executeUnboundAction.mockRejectedValue(error)
+
+      await expect(updateActivity('contact-identifier-123', 2024)).rejects.toThrow('Failed to update activity')
+    })
+
+    it('should handle the case where activity creation fails', async () => {
+      dynamicsClient.executeUnboundAction.mockResolvedValue(getErrorResponse())
+
+      const result = await updateActivity('invalid-contact-id', 2024)
+
+      expect(result).toMatchObject({
+        RCRActivityId: null,
+        ReturnStatus: 'error',
+        SuccessMessage: '',
+        ErrorMessage: 'Failed to update activity'
+      })
+    })
+  })
 })
diff --git a/packages/dynamics-lib/src/queries/activity.queries.js b/packages/dynamics-lib/src/queries/activity.queries.js
index 3a125c6f4..efbbb339f 100644
--- a/packages/dynamics-lib/src/queries/activity.queries.js
+++ b/packages/dynamics-lib/src/queries/activity.queries.js
@@ -22,3 +22,26 @@ export const createActivity = (contactId, season) => {
 
   return dynamicsClient.executeUnboundAction('defra_CreateRCRActivity', request)
 }
+
+/**
+ * Updates an RCR Activity in Microsoft Dynamics CRM.
+ *
+ * @param {string} contactId - The ID of the contact associated with the activity.
+ * @param {number} season - The season year for which the activity is being created.
+ * @returns {Promise<Object>} - A promise that resolves to the response from Dynamics CRM.
+ * @property {string} response.@odata.context - The OData context URL of the response.
+ * @property {string} response.RCRActivityId - The unique identifier of the created RCR activity.
+ * @property {string} response.ReturnStatus - The status of the activity creation operation (e.g., 'success').
+ * @property {string} response.SuccessMessage - A message indicating successful creation of the activity.
+ * @property {string|null} response.ErrorMessage - An error message if the activity creation failed, otherwise null.
+ * @property {string} response.oDataContext - The OData context URL of the response.
+ */
+export const updateActivity = (contactId, season) => {
+  const request = {
+    ContactId: contactId,
+    ActivityStatus: 'SUBMITTED',
+    Season: season
+  }
+
+  return dynamicsClient.executeUnboundAction('defra_UpdateRCRActivity', request)
+}