> This page is for Tools.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.moveworks.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.moveworks.com/_mcp/server.

# Notify

# Overview

**Notify** pulls compound actions into the chat spotlight, sending messages to specific users with embedded actions, shown as buttons, that can perform various actions when clicked.

### Action Types

| Type                    | Function                                                                             |
| :---------------------- | :----------------------------------------------------------------------------------- |
| **Content Action**      | Deliver an inline message. Ideal for links or summaries                              |
| **System Action**       | Triggers an action or compound action with input arguments                           |
| **Conversation Action** | Starts a conversation process. Inputs args must be declared as slots in the process. |

> **Button expiration (TTL)**
>
> Buttons generated by a Notify step follow the same TTL as other AI Assistant buttons — they should be clickable for **30 days** after delivery (pending confirmation). See [URL Hyperlink & Button Expiry Specs](/platform-management/hyperlink-button-expiry) for the full breakdown.

> **️ \_IMPORTANT NOTE:\_**
>
> #### *Requirements for Calling a Conversation Action*
>
> *To ensure your action is triggered correctly, please note the following:*
>
> * ***Use the Conversational Process Name**: When calling the action, specify the name of the conversational process itself, not the name of the plugin.*
> * ***Conversational Action input_args**: These must be declared as slots in the conversational process in order to reference the data passed in as input args.*

# Low-Code Editor

Add a **Notify** step, define the recipient, the content of the message they are receiving, and what actions they'll be provided with.

![](https://files.readme.io/3cb8bd54e682f1c0ae802d72ee02ce19832b23468d55f9e7ff33b96a32c09869-CleanShot_2025-09-17_at_10.13.58.png)

1. **Prepare Essentials**: Set the notification's recipient, informational message, and optionally provide image URLs to display in the notification.

![](https://files.readme.io/25125e95b1e37e98a8199763cfeabab17ad7459f587e97dac32c7b88ea54c456-CleanShot_2025-09-17_at_10.16.19.png)

2. **Add Actionable Task**: Add a button that can trigger an HTTP, compound, or script action.

![](https://files.readme.io/642b46581e337c0cab0a23af142117250505d9a01ef9c9405f8da9550935d4db-CleanShot_2025-09-17_at_10.17.38.png)

3. **Start a Conversation**: Add a button that invokes a conversational flow with the user.

![](https://files.readme.io/98ffd235462e7e671805c400de46f8e182112a7813558886917a822ee4f2072a-CleanShot_2025-09-17_at_10.19.52.png)

4. **Add More Content**: Provide a button that provides inline content that doesn't require fetching or starting a conversation.

# Syntax Reference

#### Schema

```yaml
notify:  # Delivers message + buttons to user
  output_key: RESULT_VAR*  # str: Stores interaction results
  recipient_id: USER_ID*   # str: e.g., data.target_user.record_id
  message: MSG_EXPR*       # DSL str or RENDER() template
  image_urls:              # Optional list[str]: Images shown in notification
    - IMAGE_URL
  resources:               # Optional list[dict] only available in pro-code
    - name: RESOUCE_NAME   # str: no dsl evaluation just type out string
      datatype: DATA_TYPE  # datatype: no dsl evaluation just type out string
      value: VAL           # DSL of datatype declared above
  actions:                 # Optional list[dict]
    - key: ACTION_KEY      # Unique str ID
      label: BUTTON_TEXT   # Display DSL str
      # ONE of:
      content_action:
        message: CONTENT_MSG
      system_action:
        action_name: ACTION_NAME
        input_args:
					key: VAL
      conversation_action:
        conversation_process_name: PROCESS_NAME  # Published plugin
        input_args: 
					slot_name: VAL   # Match process slots
```

#### Fields

| Field          | Type        | Mandatory | Description                                         |
| :------------- | :---------- | :-------- | :-------------------------------------------------- |
| `output_key`   | string      | Yes       | Captures button outcome. **Currently returns NULL** |
| `recipient_id` | string      | Yes       | ID of the target user                               |
| `message`      | string      | Yes       | DSL expression field                                |
| `image_urls`   | list\[str]  | No        | Image URLs displayed in the notification            |
| `actions`      | list\[dict] | No        | Buttons displayed to user                           |
| `resources`    | list\[dict] | No        | Pass additional context to the reasoning engine     |

\


#### Resources Schema

| Field      | Type   | Mandatory | Description                                                              |
| :--------- | :----- | :-------- | :----------------------------------------------------------------------- |
| `name`     | string | Yes       | Name of the resource                                                     |
| `datatype` | string | Yes       | Datatype of value; options [here](/tool-studio/core-concepts/data-types) |
| `value`    | any    | Yes       | DSL expression field: Value of data to pass as context                   |

\


#### Action Types

| Field                 | Keys                                      | Use Case                     |
| :-------------------- | :---------------------------------------- | :--------------------------- |
| `content_action`      | `message`                                 | Quick info drops.            |
| `system_action`       | `action_name`, `input_args`               | Invoke actions               |
| `conversation_action` | `conversation_process_name`, `input_args` | Start conversation processes |

\


# Resources

Resources are an optional field that can be used in the pro-code syntax. These are used for passing additional data as context for the LLM. These can be used situationally for giving the llm additional data to reference when using a follow up action such as passing a string to the LLM for SDA reasoning.

`"instructions": "Analyze the data for the top commented on tickets"`

### Example 1: Enforcing specific analysis on an action button click

```yaml
# input args: data.tickets
notify:
  output_key: user_choice
  recipient_id: data.target_user.record_id
  message: 
    RENDER():
      template: "Click the button below for insights on the top commented tickets"
      args:
				id: data.ticket.id
  resources:
     - name: instructions
       datatype: string
       value: '"Analyze the data for the top commented on tickets"'
  actions:
    - key: view
      label: "'View Tickets'"
      system_action: 
        action_name: retrieve_all_tickets
        input_args: 
          support_tickets: data.tickets
```

\


# Practical Examples

### Example 1: Simple Ticket Alert

Notify assignee with a link

```yaml
notify:
  output_key: alert_sent
  recipient_id: data.target_user.record_id
  message: 
    RENDER():
      template: "Hello {{name}}, [<b>T-{{id}}</b>]({{link}}) assigned to you. Follow runbook."
      args: 
        name: data.target_user.first_name
        id: data.ticket.display_id 
				link: data.ticket.url
```

**Expectation**: User will receive a simple notification message with the ID of the ticket they were assigned

### Example 2: Multi-Option Response

Offer multiple options to the user

```yaml
# input args: data.ticket
notify:
  output_key: user_choice
  recipient_id: data.target_user.record_id
  message: 
    RENDER():
      template: "Ticket {{id}} assigned—act now."
      args:
        id: data.ticket.id
  actions:
    - key: view
      label: "'View Ticket'"
      content_action: 
        message: 
          RENDER():
            template: "View ticket {{id}}"
            args:
              id: data.ticket.id
    - key: convert
      label: "'Convert to Bug'"
      system_action:
        action_name: convert_support_issue_to_known_bug
        input_args: 
          support_ticket: data.ticket
```

**Expectation**: User will receive a notification about a ticket that was assigned to them. They will be provided two buttons, one to look at the ticket and one to convert the ticket.

### Example 3: Handoff to Conversation

Alert the user and collection more information

```yaml
# input args: data.ticket
notify:
  output_key: handoff_result
  recipient_id: data.target_user.record_id
  message: 
    RENDER():
      template: "[{{id}}]({{url}}) assigned—need details?"
      args: 
        id: data.ticket.display_id, 
        url: $CONCAT(["https://notion.so/", data.ticket.sys_id], "")
  actions:
    - key: send_back
      label: "'Send Back'"
      conversation_action:
        conversation_process_name: collect_reason_for_send_back_and_send_case_back_to_case_owner
        input_args: 
          support_ticket: data.ticket 
```

**Expectation**: User receives the notification and are prompted to start a conversational process to send back the ticket for more information.

### Example 4: Notification with Images

Include images in a notification using the `image_urls` field.

```yaml
notify:
  output_key: image_notification
  recipient_id: data.target_user.record_id
  message:
    RENDER():
      template: "Here are the latest charts for project {{name}}."
      args:
        name: data.project.name
  image_urls:
    - data.project.chart_url
    - data.project.timeline_url
```

**Expectation**: User receives a notification with the message and the referenced images rendered inline.

# Troubleshooting

## Notify actions not appearing in Tool Studio logs

Notify actions may not appear in Tool Studio execution logs, even when the notification is successfully delivered. This is a known limitation that affects troubleshooting.

> **Logging limitation**
>
> When a notify step fails silently or does not send as expected, Tool Studio logs may not show any invocation record for the notify action — neither a success nor a failure entry. This applies regardless of your role, including Super Admin and Elevated Tool Studio Logs Viewer.

**Workarounds:**

* Verify the `recipient_id` resolves to a valid user by logging it in a prior step.
* Test with a minimal compound action containing only the notify step to isolate the issue.
* If using notify inside a `for` loop, test with a small iteration count first to rule out timeout or memory limits.
* Confirm the recipient has an active chat platform connection (e.g., Slack, Teams) — notify requires a reachable messaging channel.