Feature Request — Allow updating Status / Bounced_Time / Bounce_Reason on emails created via actions/associate_email (v8)

Feature Request — Allow updating Status / Bounced_Time / Bounce_Reason on emails created via actions/associate_email (v8)

Summary

Emails created through the v8 POST /{module}/{record}/actions/associate_email endpoint are returned by View Email with "editable": false and reject every update method (PUT, PATCH) with INVALID_REQUEST_METHOD. There is no way via the public API to update the Email entity's Status, Bounced_Time, Bounce_Reason, First_Opened, Last_Opened, First_Clicked, or Last_Clicked fields after creation.

The fields exist in the module metadata (getFields on Emails returns them as writable text / datetime / integer), and they appear in the Get Emails of a Record payload, but they cannot actually be written via any documented endpoint.

Reproduction

  1. POST /crm/v8/Contacts/{contact_id}/actions/associate_email with a valid payload. Zoho returns:
{
"Emails": [{
"code": "SUCCESS",
"details": { "message_id": "cb1d6fc4b7b59…" },
"message": "Your mail has been added successfully",
"status": "success"
}]
}
  1. GET /crm/v8/Contacts/{contact_id}/Emails/{message_id} returns editable: false and status: [{ "type": "Sent" }].

  2. PUT /crm/v8/Contacts/{contact_id}/Emails/{message_id} with { data: [{ Status: "Bounced", Bounced_Time: "…", Bounce_Reason: "…" }] } returns:

{
"code": "INVALID_REQUEST_METHOD",
"message": "The http request method type is not a valid one",
"status": "error"
}
  1. The standalone path /crm/v8/Emails/{message_id} returns INVALID_URL_PATTERN (404), confirming there's no record-level URL for these entities.

Use case

Our team logs emails delivered via Customer.io (an external ESP) against Zoho CRM Contacts and Stores using actions/associate_email. Customer.io sends additional webhook events for bounced, delivered, opened, clicked, failed, dropped, spam, and unsubscribed. We need to reflect those status transitions back onto the corresponding Email record so account managers see the up-to-date deliverability status next to the email in the Zoho UI — without it, a bounced campaign email is indistinguishable from a successfully delivered one inside Zoho.

The same need exists for anyone integrating an external ESP (SendGrid, Mailgun, Postmark, Customer.io, AWS SES, etc.) with Zoho CRM. Today the only workarounds are to (a) duplicate the email entity by creating a new associate_email call with [BOUNCED] in the subject, (b) put the status in a separate Note on the parent record, or (c) maintain a custom module. None of those surface the status next to the actual email entry the way the built-in Status field would.

Request

Either:

  1. Support PUT /crm/v8/{module}/{record_id}/Emails/{message_id} with at minimum the following writable fields on emails created via actions/associate_emailStatusBounced_TimeBounce_ReasonFirst_OpenedLast_OpenedFirst_ClickedLast_Clicked. The fields are already in the module metadata; just allow updates on records flagged editable: false only when they were created externally (via associate_email).

Or:

  1. Add a dedicated actions/update_email_status endpoint (similar to actions/associate_email) that accepts message_id + a status payload (statusbounced_timebounce_reason, …) and updates the corresponding entry.

Either shape unblocks every external-ESP integration; option 2 may be the easier internal change since it sidesteps making Email records generally editable.

Tested against

  • API version: v8
  • DC: EU sandbox (sandbox.zohoapis.eu)
  • Date: 2026-05-18

Thank you!