Portal Community

message/reply

Reply to an existing message, keeping the conversation in-thread.

In-Thread Reply: This operation replies to an existing message by messageId and preserves the Gmail thread. Use thread/reply if you want to target the thread by threadId instead.

When to Use

Configuration

Connection

FieldTypeDescription
credentialIdGuid requiredOAuth2 credential ID from the BizFirst Credentials Manager. Requires gmail.send scope.

Operation Fields

FieldTypeDefaultDescription
messageIdstring requiredGmail message ID of the message being replied to. The reply is added to the same thread.
messagestring requiredReply body content. HTML or plain text depending on emailType.
emailTypeenum optionalhtmlContent type: html or text.
senderNamestring optionalDisplay name for the replying sender.
ccListstring optionalComma-separated CC addresses for the reply.
bccListstring optionalComma-separated BCC addresses for the reply.
attachmentBinaryFieldsstring[] optionalBinary field names from upstream node outputs to attach to the reply.
replyToSenderOnlybool optionalfalseWhen true, replies only to the original sender. When false, replies to all original recipients (Reply-All).

Sample Configuration

{
  "nodeType": "Gmail",
  "operation": "message/reply",
  "credentialId": "a3f9d12b-44e1-4c89-b7d2-9f0a1e2b3c4d",
  "messageId": "{{trigger.messageId}}",
  "message": "<p>Thank you for contacting support. Your ticket <strong>#{{ticket.id}}</strong> has been created. We will respond within 24 hours.</p>",
  "emailType": "html",
  "senderName": "BizFirst Support",
  "replyToSenderOnly": true
}

Validation Errors

ErrorCauseResolution
MISSING_FIELD: messageIdmessageId is empty or not providedEnsure the upstream trigger or node provides a valid Gmail message ID
MISSING_FIELD: messageReply body is emptyProvide non-empty message content
MESSAGE_NOT_FOUNDProvided messageId does not exist or is inaccessibleVerify the message ID is from the authenticated account
INVALID_CREDENTIALcredentialId not found or OAuth token expiredRe-authenticate the credential in BizFirst Credentials Manager
QUOTA_EXCEEDEDDaily send limit reachedWait for quota reset or switch to Google Workspace account

Output

Success Port

FieldTypeDescription
messageIdstringGmail message ID of the new reply message
threadIdstringThread ID the reply was added to (same as original message thread)
labelIdsstring[]Labels applied to the reply message (e.g. ["SENT"])
statusstringsuccess
errorCodestringEmpty on success

Error Port

On failure, routes to the error port with status: "error", errorCode, and errorMessage.

Sample Output

{
  "messageId": "18e4b3c1a2d4e5f6",
  "threadId": "18e4a2f9d3c0b1a7",
  "labelIds": ["SENT"],
  "status": "success",
  "errorCode": ""
}

Expression Reference

ExpressionResolves ToExample Use
{{trigger.messageId}}Message ID from IMAP trigger or upstream nodemessageId field
{{ticket.id}}Support ticket number created by upstream nodeReply body reference
{{agent.name}}Assigned support agent namePersonalizing reply signature
{{$now | dateFormat:'YYYY-MM-DD'}}Current dateSLA deadline in reply body
{{resolution.summary}}Ticket resolution summary from upstreamClosure reply body content

Node Policies & GuardRails

PolicyRule
Credential StorageStore OAuth credentials in BizFirst Credentials Manager — never hardcode tokens in workflow configuration
Reply-All RiskDefault replyToSenderOnly: false is Reply-All — set to true for automated workflows to avoid unintended broadcast replies
PII ProtectionDo not log reply body content in workflow execution history
Quota Managementmessage/reply costs 100 quota units per send — monitor against 250 units/user/second limit
Daily Send LimitPersonal Gmail: 500/day; Workspace: 2,000/day — throttle high-volume reply workflows
Thread IntegrityAlways use the messageId from the triggering message to preserve thread context

Examples

Example 1: Auto-Reply to Support Inquiry

An IMAP trigger fires on new support emails. The workflow creates a ticket, then replies with the ticket reference.

{
  "nodeType": "Gmail",
  "operation": "message/reply",
  "credentialId": "a3f9d12b-44e1-4c89-b7d2-9f0a1e2b3c4d",
  "messageId": "{{imapTrigger.messageId}}",
  "message": "<p>Hi {{imapTrigger.from.name}},</p><p>Your support request has been logged as ticket <strong>#{{helpdesk.ticketId}}</strong>. Expected response time: 24 hours.</p>",
  "emailType": "html",
  "senderName": "BizFirst Support",
  "replyToSenderOnly": true
}

Example 2: CRM Lead Follow-Up

A CRM trigger marks a lead as qualified. The workflow finds the lead's initial inquiry email and sends a follow-up reply.

{
  "nodeType": "Gmail",
  "operation": "message/reply",
  "credentialId": "a3f9d12b-44e1-4c89-b7d2-9f0a1e2b3c4d",
  "messageId": "{{crm.lead.initialMessageId}}",
  "message": "<p>Hi {{crm.lead.firstName}},</p><p>Thank you for your interest in BizFirst! I'd love to schedule a 30-minute call to learn more about your needs. <a href='{{calendar.bookingLink}}'>Book a time here</a>.</p>",
  "emailType": "html",
  "senderName": "{{crm.assignedRep.name}}",
  "replyToSenderOnly": true
}

Example 3: Ticket Resolution Reply

When a help-desk ticket is closed, reply to the original customer email with the resolution summary.

{
  "nodeType": "Gmail",
  "operation": "message/reply",
  "credentialId": "a3f9d12b-44e1-4c89-b7d2-9f0a1e2b3c4d",
  "messageId": "{{ticket.originalMessageId}}",
  "message": "<p>Hi {{ticket.customerName}},</p><p>Your ticket #{{ticket.id}} has been resolved: <em>{{ticket.resolutionNote}}</em></p><p>Please let us know if you need further assistance.</p>",
  "emailType": "html",
  "replyToSenderOnly": true
}