> For the complete documentation index, see [llms.txt](https://docs.ebbot.ai/ebbot-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ebbot.ai/ebbot-docs/integrations/automations-integrations/integration-setup-guides/hubspot-integration-in-automations/actions/add-public-ticket-comment.md).

# Add Public Ticket Comment

Reply through an existing conversation, or log an Email engagement when there is no conversation. Read the delivery distinction below before using this action.

**Action identifier:** `add_public_ticket_comment`. **Reference checked:** 29 September 2026.

## Inputs

| Field             | Type   | Required/default | Meaning                                                                                                                                                                                                                                                                                                                           |
| ----------------- | ------ | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ticket_id`       | string | Required         | The ID of the ticket                                                                                                                                                                                                                                                                                                              |
| `content`         | string | Required         | The message body. In the standard email-ticket flow, this normally sends an email reply to the customer through HubSpot using the existing conversation thread. If no conversation thread is available, it logs a CRM Email engagement without delivering an email. Supports HTML formatting; use HTML tags rather than Markdown. |
| `sender_actor_id` | string | Required         | The actor ID of the agent sending the reply (e.g. A-12345)                                                                                                                                                                                                                                                                        |
| `subject`         | string | `""`             | Subject line for the email engagement fallback. Leave blank to default to 'Reply to Ticket {ticket\_id}'.                                                                                                                                                                                                                         |

## Output shape

Paths are relative to this action's output. Select them from the builder's variable picker; do not add a `ticket` wrapper to actions that return top-level fields. Nullable property fields and empty defaults are not proof that a value was retrieved.

| Path                                 | Type           | Meaning                                                                                                                             |
| ------------------------------------ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| `message`                            | object         | Conversation message or logged CRM Email engagement, normalized to this output shape.                                               |
| `message.id`                         | string         | ID of the conversation message or CRM Email engagement; the object type depends on the path used.                                   |
| `message.properties`                 | object         | Property values returned for this record; some declared fields may be empty.                                                        |
| `message.properties.hs_message_body` | string \| null | Message body when returned in this field; may be empty even when creation succeeds.                                                 |
| `message.createdAt`                  | string         | Creation timestamp returned by HubSpot; empty when unavailable.                                                                     |
| `message.updatedAt`                  | string         | Last-update timestamp returned by HubSpot; empty when unavailable.                                                                  |
| `message.archived`                   | boolean        | Archive flag returned by HubSpot; defaults to false when omitted.                                                                   |
| `success`                            | boolean        | True when the conversation request returns message data or the fallback engagement is created and attached. Not a delivery receipt. |
| `exists`                             | boolean        | Mirrors `success` in this action; it does not confirm email delivery.                                                               |

Property objects can contain additional fields returned by HubSpot. The declared fields above are not a promise that every property is populated.

## Behavior and limits

**With a conversation thread:** posts a `MESSAGE` through the selected thread's original channel/account to the associated contact's email. Channel information and recipient email must be available, and the sender must be allowed to use that channel. The most recently active returned thread is selected.

**Without a conversation thread:** creates and associates a CRM Email engagement. This logs an email on the timeline; it does **not** deliver an email. Even `success: true` or the engagement's `SENT` status does not prove delivery. Verify the actual path and outcome before telling a customer that a message was sent.

The sender picker uses `A-{userId}` from HubSpot owner records. An owner record's `id` is a different identifier. The `subject` input affects the engagement fallback, not the subject of an existing conversation.

Use HTML, preferably simple inline markup such as `<strong>` and `<br>`. The conversation path wraps the content in a paragraph; test nested block markup in the rendered message. The normalized `message` output is not a delivery receipt and may not echo the body in `message.properties.hs_message_body`.

Failure to create or attach the fallback returns false flags. Creation and association are separate requests: a failed association can leave an unattached engagement. Inspect existing effects before retrying.

See [Troubleshooting](/ebbot-docs/integrations/automations-integrations/integration-setup-guides/hubspot-integration-in-automations/troubleshooting.md) for request errors and retry behavior, or return to the [action catalog](/ebbot-docs/integrations/automations-integrations/integration-setup-guides/hubspot-integration-in-automations/actions.md).
