# Add Url To Agent
Source: https://docs.thena.ai/api-reference/agent-studio/agent-files/add-url-to-agent
post /api/v1/agent-files/{agent_id}/urls
Add a URL to an agent's knowledge base.
# Delete Agent File
Source: https://docs.thena.ai/api-reference/agent-studio/agent-files/delete-agent-file
delete /api/v1/agent-files/{agent_id}/files/{file_id}
Delete a file.
# Get Agent File
Source: https://docs.thena.ai/api-reference/agent-studio/agent-files/get-agent-file
get /api/v1/agent-files/{agent_id}/files/{file_id}
Get a specific file's details.
# List Agent Files
Source: https://docs.thena.ai/api-reference/agent-studio/agent-files/list-agent-files
get /api/v1/agent-files/{agent_id}/files
List all files associated with an agent.
# Search Agent Files
Source: https://docs.thena.ai/api-reference/agent-studio/agent-files/search-agent-files
get /api/v1/agent-files/{agent_id}/files/search
Search files by content.
# Upload Agent File
Source: https://docs.thena.ai/api-reference/agent-studio/agent-files/upload-agent-file
post /api/v1/agent-files/{agent_id}/files
Upload a file for an agent.
# Create Agent Tool
Source: https://docs.thena.ai/api-reference/agent-studio/agent-tools/create-agent-tool
post /api/v1/agents/{agent_id}/tools
Configure a new tool for an agent.
Args:
agent_id: The ID of the agent
tool_data: Tool configuration data
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Created agent tool
Raises:
HTTPException: If agent not found, tool invalid, or access denied
# Delete Agent Tool
Source: https://docs.thena.ai/api-reference/agent-studio/agent-tools/delete-agent-tool
delete /api/v1/agents/{agent_id}/tools/{tool_id}
Remove a tool configuration from an agent.
Args:
agent_id: The ID of the agent
tool_id: The ID of the tool configuration
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Success confirmation
Raises:
HTTPException: If tool not found or access denied
# Get Agent Tool
Source: https://docs.thena.ai/api-reference/agent-studio/agent-tools/get-agent-tool
get /api/v1/agents/{agent_id}/tools/{tool_id}
Get a specific tool configuration for an agent.
Args:
agent_id: The ID of the agent
tool_id: The ID of the tool configuration
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Agent tool configuration
Raises:
HTTPException: If tool not found or access denied
# Get Agent Tools
Source: https://docs.thena.ai/api-reference/agent-studio/agent-tools/get-agent-tools
get /api/v1/agents/{agent_id}/tools
Get all tools configured for an agent.
Args:
agent_id: The ID of the agent
tool_type: Optional filter by tool type
is_enabled: Optional filter by enabled status
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
List of agent tools
Raises:
HTTPException: If agent not found or access denied
# Get Tool Executions
Source: https://docs.thena.ai/api-reference/agent-studio/agent-tools/get-tool-executions
get /api/v1/agents/{agent_id}/tools/{tool_id}/executions
Get execution history for a specific tool.
Args:
agent_id: The ID of the agent
tool_id: The ID of the tool configuration
limit: Maximum number of executions to return
offset: Number of executions to skip
status: Optional filter by execution status
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
List of tool executions
Raises:
HTTPException: If tool not found or access denied
# Update Agent Tool
Source: https://docs.thena.ai/api-reference/agent-studio/agent-tools/update-agent-tool
put /api/v1/agents/{agent_id}/tools/{tool_id}
Update a tool configuration for an agent.
Args:
agent_id: The ID of the agent
tool_id: The ID of the tool configuration
tool_update: Updated tool data
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Updated agent tool
Raises:
HTTPException: If tool not found or access denied
# Create Agent
Source: https://docs.thena.ai/api-reference/agent-studio/agents/create-agent
post /api/v1/agents
Create a new agent.
# Delete Agent
Source: https://docs.thena.ai/api-reference/agent-studio/agents/delete-agent
delete /api/v1/agents/{agent_id}
Delete an agent.
# Get Agent
Source: https://docs.thena.ai/api-reference/agent-studio/agents/get-agent
get /api/v1/agents/{agent_id}
Get details of a specific agent.
# List Agents
Source: https://docs.thena.ai/api-reference/agent-studio/agents/list-agents
get /api/v1/agents
List all agents for an organization.
# Update Agent
Source: https://docs.thena.ai/api-reference/agent-studio/agents/update-agent
put /api/v1/agents/{agent_id}
Update an agent.
# Add Chat Message
Source: https://docs.thena.ai/api-reference/agent-studio/chat/add-chat-message
post /api/v1/chat/{agent_id}/threads/{thread_id}/messages
Add a new message to a chat thread.
# Add Chat Message Stream
Source: https://docs.thena.ai/api-reference/agent-studio/chat/add-chat-message-stream
post /api/v1/chat/{agent_id}/threads/{thread_id}/messages/stream
Add a new message to a chat thread and stream the AI response.
# Clear All Chats
Source: https://docs.thena.ai/api-reference/agent-studio/chat/clear-all-chats
delete /api/v1/chat/clear-all-chats
Clear all chat threads and messages for the current user with a specific agent.
Args:
agent_id: Agent ID to filter chats by (required)
chat_service: The chat service instance
organization_id: The organization ID to clear chats for
user_id: The user ID to clear chats for
_auth_token: The platform token for authentication
Returns:
Dict with counts of deleted threads, messages, and cache keys
# Create Chat Thread
Source: https://docs.thena.ai/api-reference/agent-studio/chat/create-chat-thread
post /api/v1/chat/{agent_id}/threads
Create a new chat thread.
# Delete Chat Thread
Source: https://docs.thena.ai/api-reference/agent-studio/chat/delete-chat-thread
delete /api/v1/chat/{agent_id}/threads/{thread_id}
Delete a chat thread.
# Get Chat History
Source: https://docs.thena.ai/api-reference/agent-studio/chat/get-chat-history
get /api/v1/chat/history
Get all chat histories for the authenticated user.
# Get Chat Thread
Source: https://docs.thena.ai/api-reference/agent-studio/chat/get-chat-thread
get /api/v1/chat/{agent_id}/threads/{thread_id}
Get a specific chat thread with its messages.
# Get Recent Thread
Source: https://docs.thena.ai/api-reference/agent-studio/chat/get-recent-thread
get /api/v1/chat/{agent_id}/recent-thread
Get the most recent chat thread for an agent, if it exists.
# List Chat Messages
Source: https://docs.thena.ai/api-reference/agent-studio/chat/list-chat-messages
get /api/v1/chat/{agent_id}/threads/{thread_id}/messages
Get all messages for a specific chat thread.
# List Chat Threads
Source: https://docs.thena.ai/api-reference/agent-studio/chat/list-chat-threads
get /api/v1/chat/{agent_id}/threads
List all chat threads for a specific agent.
# List Enhanced Web Chat Threads
Source: https://docs.thena.ai/api-reference/agent-studio/chat/list-enhanced-web-chat-threads
get /api/v1/chat/{agent_id}/web-threads/enhanced
List all web chat threads (anonymous user threads) for a specific agent with enhanced data including widget user information and message count.
Filters:
- Sort by newest/oldest
- Filter by feedback type (any, positive, negative)
- Filter by ticket presence
- Filter by platform connection
# List Web Chat Threads
Source: https://docs.thena.ai/api-reference/agent-studio/chat/list-web-chat-threads
get /api/v1/chat/{agent_id}/web-threads
List all web chat threads (anonymous user threads) for a specific agent.
# Search Web Chat Threads
Source: https://docs.thena.ai/api-reference/agent-studio/chat/search-web-chat-threads
get /api/v1/chat/{agent_id}/web-threads/search
Search web chat threads (anonymous user threads) for a specific agent.
Searches across:
- Widget user name
- Widget user email
- Chat thread title
- Chat thread messages
Filters:
- Sort by newest/oldest
- Filter by feedback type (any, positive, negative)
- Filter by ticket presence
- Filter by platform connection
# Stream Chat Messages
Source: https://docs.thena.ai/api-reference/agent-studio/chat/stream-chat-messages
get /api/v1/chat/{agent_id}/threads/{thread_id}/stream
Stream new messages for a chat thread using SSE.
# Create Chat Message Feedback
Source: https://docs.thena.ai/api-reference/agent-studio/feedback/create-chat-message-feedback
post /api/v1/feedback/chat
Create a new feedback entry for a chat message.
# Create Flow Execution Feedback
Source: https://docs.thena.ai/api-reference/agent-studio/feedback/create-flow-execution-feedback
post /api/v1/feedback/flow
Create a new feedback entry for a flow execution.
# Get Chat Message Feedback
Source: https://docs.thena.ai/api-reference/agent-studio/feedback/get-chat-message-feedback
get /api/v1/feedback/message/{message_id}
Get feedback for a specific AI message.
# Get Chat Messages Feedback Batch
Source: https://docs.thena.ai/api-reference/agent-studio/feedback/get-chat-messages-feedback-batch
post /api/v1/feedback/batch-chat
Get feedback for a batch of AI messages.
# Get Flow Execution Feedback
Source: https://docs.thena.ai/api-reference/agent-studio/feedback/get-flow-execution-feedback
get /api/v1/feedback/flow-execution/{execution_id}
Get feedback for a specific flow execution.
# Bulk Execute Flows
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/bulk-execute-flows
post /api/v1/flows/executions/bulk
Execute multiple flows in bulk.
Useful for:
- Testing multiple flows
- Running related workflows together
- Batch processing scenarios
# Cancel Execution
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/cancel-execution
post /api/v1/flows/executions/{execution_id}/cancel
Cancel a running or queued execution.
This will:
- Cancel the execution if running
- Remove from queue if queued
- Mark as cancelled in the database
# Execute Flow
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/execute-flow
post /api/v1/flows/execute
Execute a flow immediately or queue for background execution.
- **flow_id**: ID of the flow to execute
- **trigger_type**: How the execution was triggered
- **variables**: Input variables for the flow
- **priority**: Execution priority (urgent, high, normal, low)
- **scheduled_at**: Optional datetime to schedule execution for later
# Get Execution
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/get-execution
get /api/v1/flows/executions/{execution_id}
Get details of a specific flow execution.
Returns complete execution information including:
- Execution status and timing
- Input variables and outputs
- Step-by-step execution log
- Error details if failed
# Get Execution Analytics
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/get-execution-analytics
get /api/v1/flows/analytics
Get execution analytics and statistics.
Provides:
- Success/failure rates
- Average execution times
- Most active triggers
- Error analysis
- Performance trends
# Get Queue Status
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/get-queue-status
get /api/v1/flows/queue-status
Get status of execution queues.
Shows:
- Queue lengths
- Average wait times
- Worker status
- Failed job counts
# List Executions
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/list-executions
get /api/v1/flows/executions
List flow executions with filtering and pagination.
Supports filtering by:
- **flow_id**: Specific flow
- **status**: Execution status
- **trigger_type**: How execution was triggered
- **start_date/end_date**: Date range filtering
# Retry Failed Jobs
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/retry-failed-jobs
post /api/v1/flows/queue/retry
Retry failed jobs in a specific priority queue.
This will:
- Find failed jobs in the queue
- Reset their status
- Re-enqueue for execution
# Stream Execution Updates
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/stream-execution-updates
get /api/v1/flows/executions/{execution_id}/stream
Stream real-time updates for a specific execution.
Returns Server-Sent Events (SSE) with:
- Status changes
- Step completions
- Progress updates
- Error notifications
# Update Execution
Source: https://docs.thena.ai/api-reference/agent-studio/flow-execution/update-execution
patch /api/v1/flows/executions/{execution_id}
Update execution status or metadata.
Allows updating:
- Status
- Error information
- Final output
- Custom metadata
# Check Mcp Server Health
Source: https://docs.thena.ai/api-reference/agent-studio/mcp-servers/check-mcp-server-health
post /api/v1/mcp/agents/{agent_id}/servers/{server_id}/health-check
Perform a health check on an MCP server.
Args:
agent_id: The ID of the agent
server_id: The ID of the MCP server
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Health check results
Raises:
HTTPException: If server not found or access denied
# Connect Mcp Server
Source: https://docs.thena.ai/api-reference/agent-studio/mcp-servers/connect-mcp-server
post /api/v1/mcp/agents/{agent_id}/servers/{server_id}/connect
Smart MCP server connection with automatic authentication detection.
This endpoint automatically detects if the MCP server requires OAuth
authentication or can be connected to directly (public servers).
# Create Mcp Server
Source: https://docs.thena.ai/api-reference/agent-studio/mcp-servers/create-mcp-server
post /api/v1/mcp/agents/{agent_id}/servers
Configure a new MCP server for an agent.
Args:
agent_id: The ID of the agent
server_data: MCP server configuration data
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Created MCP server
Raises:
HTTPException: If agent not found, server invalid, or access denied
# Delete Mcp Server
Source: https://docs.thena.ai/api-reference/agent-studio/mcp-servers/delete-mcp-server
delete /api/v1/mcp/agents/{agent_id}/servers/{server_id}
Remove an MCP server configuration from an agent.
Args:
agent_id: The ID of the agent
server_id: The ID of the MCP server
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Success confirmation
Raises:
HTTPException: If server not found or access denied
# Get Agent Mcp Servers
Source: https://docs.thena.ai/api-reference/agent-studio/mcp-servers/get-agent-mcp-servers
get /api/v1/mcp/agents/{agent_id}/servers
Get all MCP servers configured for an agent.
Args:
agent_id: The ID of the agent
status: Optional filter by connection status
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
List of MCP servers
Raises:
HTTPException: If agent not found or access denied
# Get Mcp Server Tools
Source: https://docs.thena.ai/api-reference/agent-studio/mcp-servers/get-mcp-server-tools
get /api/v1/mcp/agents/{agent_id}/servers/{server_id}/tools
Get tools available from an MCP server.
Args:
agent_id: The ID of the agent
server_id: The ID of the MCP server
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
List of available tools
Raises:
HTTPException: If server not found or access denied
# Update Mcp Server
Source: https://docs.thena.ai/api-reference/agent-studio/mcp-servers/update-mcp-server
put /api/v1/mcp/agents/{agent_id}/servers/{server_id}
Update an MCP server configuration.
Args:
agent_id: The ID of the agent
server_id: The ID of the MCP server
server_update: Updated server data
user_id: The user ID of the current user
organization_id: The organization ID of the current user
Returns:
Updated MCP server
Raises:
HTTPException: If server not found or access denied
# Create a new app
Source: https://docs.thena.ai/api-reference/apps-platform/app-creation/create-a-new-app
post /apps/create-app
Creates a new app with the provided manifest and configurations
# Delete an app
Source: https://docs.thena.ai/api-reference/apps-platform/app-creation/delete-an-app
delete /apps/{id}/delete-app
Soft deletes an app from the system
# Fetch app manifest
Source: https://docs.thena.ai/api-reference/apps-platform/app-creation/fetch-app-manifest
get /apps/fetch-app-manifest/{id}
Retrieves the manifest and details of a specific app
# null
Source: https://docs.thena.ai/api-reference/apps-platform/app-creation/get-appsfetch-apps
get /apps/fetch-apps
# Update an existing app
Source: https://docs.thena.ai/api-reference/apps-platform/app-creation/update-an-existing-app
patch /apps/{id}/update-app
Updates an app's manifest and configurations
# add app to teams
Source: https://docs.thena.ai/api-reference/apps-platform/app-installation/add-app-to-teams
post /apps/add-app-to-teams
# Get installed apps by organization
Source: https://docs.thena.ai/api-reference/apps-platform/app-installation/get-installed-apps-by-organization
get /apps/installed-apps
Get installed apps by organization
# Install an app
Source: https://docs.thena.ai/api-reference/apps-platform/app-installation/install-an-app
post /apps/install
Installs an app for the given teams.
# remove app from teams
Source: https://docs.thena.ai/api-reference/apps-platform/app-installation/remove-app-from-teams
post /apps/remove-app-from-teams
# update the configuration for installations
Source: https://docs.thena.ai/api-reference/apps-platform/app-installation/update-the-configuration-for-installations
post /apps/update-config
# Reinstall an app
Source: https://docs.thena.ai/api-reference/apps-platform/app-reinstallation/reinstall-an-app
post /apps/reinstall
Reinstall an app for the given teams.
# Uninstall an app
Source: https://docs.thena.ai/api-reference/apps-platform/app-uninstallation/post-appsuninstall
post /apps/uninstall
Uninstalls an app and removes all associated data for the given teams.
# Handle published events webhook
Source: https://docs.thena.ai/api-reference/apps-platform/incoming-webhook/handle-published-events-webhook
post /incoming-webhook/events
Handles the published events webhook
# Introduction
Source: https://docs.thena.ai/api-reference/introduction
Complete API reference documentation for the Thena platform.
Welcome to the Thena API reference documentation. Our API suite is organized into three main sections, each serving a distinct purpose in the Thena ecosystem.
All APIs require authentication using an x-api-key header. API keys are tied to individual users and can be generated from Dashboard → Organization Settings → Security and Access.
Core infrastructure services including authentication, SLA management, workflow orchestration, ticketing, accounts, teams, tags, forms, comments, and more.
Create, manage, and distribute custom applications within the Thena ecosystem. Includes app creation, installation, uninstallation, and webhook handling.
Automate business processes and orchestrate workflows across the Thena platform. Includes workflow creation, execution, event handling, and activity/task management.
Remember to check our rate limits and implement appropriate error handling in your applications. For production deployments, consider implementing retry logic with exponential backoff.
## API overview
The Platform APIs form the core of Thena's infrastructure:
* **Core services**: Authentication, health checks, and storage management.
* **SLA management**: Create and manage SLA policies, monitor SLA compliance.
* **Workflow orchestration**: Define, execute, and monitor automated workflows.
* **Ticket management**: Comprehensive ticket lifecycle management.
* **Accounts, teams, tags, forms, comments, and more**: Manage all aspects of your organization.
Platform APIs are designed for system-level integrations and core service management.
The App Platform APIs enable custom application development and management:
* **App management**: Create, update, and manage app manifests.
* **Installation**: Handle app installation, uninstallation, and updates.
* **Distribution**: Control app visibility and distribution.
* **Configuration**: Manage app settings and configurations.
* **Webhooks**: Handle incoming events from Thena.
Perfect for developers building custom solutions and integrations on top of Thena.
The Workflows APIs enable automation and orchestration across the Thena platform:
* **Workflow management**: Create, update, and delete workflows.
* **Execution tracking**: Monitor workflow executions and tasks.
* **Event handling**: Register and handle events to trigger workflows.
* **Activity registry**: Access available workflow activities and operators.
Ideal for automating business processes and integrating event-driven logic.
## Getting started
Select the appropriate API section based on your use case:
* Platform APIs for core infrastructure and organization management.
* App Platform APIs for custom applications and integrations.
* Workflows APIs for automation and workflow orchestration.
Generate an API key from your Thena Dashboard:
* Go to Organization Settings → Security and Access.
* Click Generate API Key and copy your key securely.
* Include your API key in all requests using the x-api-key header.
```bash theme={null}
curl -X GET https://platform.thena.ai/v1/users \
-H "x-api-key: YOUR_API_KEY"
```
Browse the API reference for your chosen section:
* Review request/response formats.
* Check required parameters.
* Test example requests.
Start integrating with your application:
* Follow best practices.
* Monitor rate limits.
* Handle errors appropriately.
## Rate limiting
All API requests are subject to rate limiting to ensure fair usage and platform stability. Rate limit information is provided in the response headers for every request:
| Header | Description |
| --------------------- | --------------------------------------------------------------- |
| X-RateLimit-Limit | The maximum number of requests allowed in the current window. |
| X-RateLimit-Remaining | The number of requests remaining in the current window. |
| X-RateLimit-Reset | The UNIX timestamp (seconds) when the rate limit window resets. |
| X-RateLimit-IP | The IP address associated with the request. |
| X-RateLimit-UserID | The user ID associated with the request (if available). |
| X-RateLimit-OrgID | The organization ID associated with the request (if available). |
| X-RateLimit-Path | The API path for which the rate limit applies. |
**Default rate limit:**
* Standard tier: 60 requests per minute per user, org, and IP (unless otherwise specified).
* Enterprise tier: Custom limits based on your plan.
You can monitor your current usage and remaining quota by inspecting these headers in each API response. If you exceed your rate limit, you will receive a `429 Too Many Requests` error. Wait until the reset time before making additional requests.
# Create account
Source: https://docs.thena.ai/api-reference/mcp/accounts/create-account
MCP tool to create a new account in the Thena platform.
### MCP tool: `create_account`
Creates a new account in the Thena platform. This tool allows you to set up comprehensive account information including basic details, classification, health status, and custom fields.
You must provide the account name and primary domain. All other fields are optional.
### Example prompt
```prompt theme={null}
Create a new account named "TechCorp Solutions" with primary domain "techcorp.com"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_account tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------------------------------- | ------- | -------- | ------------------------------------------------------- |
| name | string | Yes | The name of the account |
| primaryDomain | string | Yes | The primary domain of the account |
| secondaryDomain | string | No | The secondary domain of the account |
| website | string | No | The website URL of the account |
| industry | string | No | The industry name (e.g., Technology, Finance) |
| description | string | No | A description of the account |
| source | string | No | The source of the account (e.g., "hubspot") |
| accountOwnerId | string | No | The user identifier of the account owner |
| logo | string | No | The URL of the account logo |
| status | string | No | The account status (e.g., Prospect, Active) |
| classification | string | No | The account classification (e.g., Enterprise) |
| health | string | No | The account health status (e.g., Red, Green) |
| annualRevenue | number | No | The annual revenue of the account |
| employees | number | No | The number of employees of the account |
| billingAddress | string | No | The billing address of the account |
| shippingAddress | string | No | The shipping address of the account |
| customFieldValues | array | No | Custom field values for the account |
| addExistingUsersToAccountContacts | boolean | No | Whether to add existing users matching the email domain |
| metadata | object | No | Additional metadata for the account |
#### Custom field values structure
Each custom field value in the `customFieldValues` array contains:
| Field | Type | Description |
| ------- | -------------------------- | ------------------------------ |
| fieldId | string | The ID of the custom field |
| value | string/number/boolean/null | The value for the custom field |
### Response fields
The response will contain the created account with the same structure as the `get_account` tool.
### Sample response
```json theme={null}
{
"data": {
"id": "ACC002",
"name": "TechCorp Solutions",
"description": "Leading technology solutions provider",
"source": "manual",
"logo": "https://example.com/logo.png",
"statusId": "STATUS002",
"status": "Prospect",
"statusConfiguration": {
"id": "STATUS002",
"name": "Prospect",
"color": "#F59E0B"
},
"classificationId": "CLASS001",
"classification": "Enterprise",
"classificationConfiguration": {
"id": "CLASS001",
"name": "Enterprise",
"color": "#3B82F6"
},
"healthId": "HEALTH003",
"health": "Green",
"healthConfiguration": {
"id": "HEALTH003",
"name": "Green",
"color": "#10B981"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "techcorp.com",
"secondaryDomain": "techcorpsolutions.com",
"accountOwner": "John Doe",
"accountOwnerId": "USER001",
"accountOwnerEmail": "john.doe@company.com",
"accountOwnerAvatarUrl": "https://example.com/avatar.jpg",
"annualRevenue": 10000000,
"employees": 500,
"website": "https://techcorp.com",
"billingAddress": "123 Tech Street, Silicon Valley, CA 94025",
"shippingAddress": "123 Tech Street, Silicon Valley, CA 94025",
"customFieldValues": [
{
"fieldId": "CUSTOM001",
"value": "Premium"
}
],
"metadata": {
"leadSource": "Website",
"dealStage": "Qualification"
},
"createdAt": "2025-07-25T12:50:38.937Z",
"updatedAt": "2025-07-25T12:50:38.937Z"
},
"status": true,
"message": "Account created successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool creates new accounts in the system. Ensure all required information is accurate before creation.
***
# Create bulk customer contacts
Source: https://docs.thena.ai/api-reference/mcp/accounts/create-bulk-customer-contacts
MCP tool to create multiple customer contacts in a single request in the Thena platform.
### MCP tool: `create_bulk_customer_contacts`
Creates multiple customer contacts in a single request. This tool is useful for bulk importing contacts or creating multiple contacts for an account at once.
You must provide an array of contact objects. Each contact requires an accountId and email, with other fields being optional.
### Example prompt
```prompt theme={null}
Create bulk customer contacts for account ACC001 with contacts John Smith and Jane Doe
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_bulk\_customer\_contacts tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| -------- | ----- | -------- | ----------------------------------- |
| contacts | array | Yes | List of customer contacts to create |
#### Contact object structure
Each contact in the `contacts` array contains:
| Field | Type | Required | Description |
| ----------- | ------ | -------- | --------------------------------------------------- |
| accountId | string | Yes | The account ID to associate the contact with |
| firstName | string | No | First name of the contact |
| lastName | string | No | Last name of the contact |
| email | string | Yes | Email address of the contact |
| phone | string | No | Phone number of the contact |
| jobTitle | string | No | Job title of the contact |
| contactType | string | No | Type of contact (e.g., primary, billing, technical) |
| metadata | object | No | Additional metadata for the contact |
### Response fields
The response will contain a summary of the bulk creation operation:
Field
Type
Description
total
number
The total number of contacts provided
created
number
The number of contacts successfully created
skipped
number
The number of contacts skipped due to existing contacts with the same email
### Sample response
```json theme={null}
{
"data": {
"total": 3,
"created": 2,
"skipped": 1
},
"status": true,
"message": "Bulk customer contacts created successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool creates new customer contacts in the system. Contacts with duplicate email addresses will be skipped.
***
# Delete account
Source: https://docs.thena.ai/api-reference/mcp/accounts/delete-account
MCP tool to delete an account from the Thena platform.
### MCP tool: `delete_account`
Deletes an account from the Thena platform. This action is permanent and will remove the account along with its associated data.
You must provide the account ID to delete the specific account. This action is irreversible.
### Example prompt
```prompt theme={null}
Delete account with ID ACC001
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the delete\_account tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---- | ------ | -------- | ---------------------------------------------- |
| id | string | Yes | The unique identifier of the account to delete |
### Response fields
The response will be a simple success message indicating the account was deleted.
### Sample response
```json theme={null}
{
"content": [
{
"type": "text",
"text": "Account deleted successfully"
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool permanently deletes accounts and their associated data. This action cannot be undone. Ensure you have the correct account ID before proceeding.
***
# Filter accounts by IDs
Source: https://docs.thena.ai/api-reference/mcp/accounts/filter-accounts-by-ids
MCP tool to filter accounts by a list of account IDs in the Thena platform.
### MCP tool: `filter_accounts_by_ids`
Filters accounts based on a list of account IDs. This tool is useful for retrieving specific accounts when you have their IDs, or for bulk operations on a set of known accounts.
You must provide an array of account IDs to filter accounts by.
### Example prompt
```prompt theme={null}
Filter accounts by IDs ["ACC001", "ACC002", "ACC003"]
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the filter\_accounts\_by\_ids tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---- | --------- | -------- | -------------------------------- |
| ids | string\[] | Yes | List of account IDs to filter by |
### Response fields
Below are the fields you may see in each account object in the response:
Field
Type
Description
id
string
Unique identifier of the account
name
string
Name of the account
description
string
Description of the account
source
string
Source of the account (e.g., "hubspot")
logo
string
URL of the account logo
statusId
string
ID of the account status
status
string
Status of the account
statusConfiguration
object
Configuration of the status
classificationId
string
ID of the account classification
classification
string
Classification of the account
classificationConfiguration
object
Configuration of the classification
healthId
string
ID of the account health
health
string
Health of the account
healthConfiguration
object
Configuration of the health
industryId
string
ID of the account industry
industry
string
Industry of the account
industryConfiguration
object
Configuration of the industry
primaryDomain
string
Primary domain of the account
secondaryDomain
string
Secondary domain of the account
accountOwner
string
Name of the account owner
accountOwnerId
string
ID of the account owner
accountOwnerEmail
string
Email of the account owner
accountOwnerAvatarUrl
string
Avatar URL of the account owner
annualRevenue
number
Annual revenue of the account
employees
number
Number of employees
website
string
Website of the account
billingAddress
string
Billing address of the account
shippingAddress
string
Shipping address of the account
customFieldValues
array
Custom field values for the account
metadata
object
Additional metadata for the account
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "ACC001",
"name": "Acme Corporation",
"description": "Leading technology solutions provider",
"source": "hubspot",
"logo": "https://example.com/logo.png",
"statusId": "STATUS001",
"status": "Active",
"statusConfiguration": {
"id": "STATUS001",
"name": "Active",
"color": "#10B981"
},
"classificationId": "CLASS001",
"classification": "Enterprise",
"classificationConfiguration": {
"id": "CLASS001",
"name": "Enterprise",
"color": "#3B82F6"
},
"healthId": "HEALTH001",
"health": "Good",
"healthConfiguration": {
"id": "HEALTH001",
"name": "Good",
"color": "#10B981"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "acme.com",
"secondaryDomain": "acmecorp.com",
"accountOwner": "John Doe",
"accountOwnerId": "USER001",
"accountOwnerEmail": "john.doe@company.com",
"accountOwnerAvatarUrl": "https://example.com/avatar.jpg",
"annualRevenue": 5000000,
"employees": 250,
"website": "https://acme.com",
"billingAddress": "123 Business St, City, State 12345",
"shippingAddress": "123 Business St, City, State 12345",
"customFieldValues": [],
"metadata": {
"lastContactDate": "2025-07-24T10:00:00Z",
"dealStage": "Negotiation"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "ACC002",
"name": "TechCorp Solutions",
"description": "Technology consulting firm",
"source": "manual",
"logo": "https://example.com/techcorp-logo.png",
"statusId": "STATUS002",
"status": "Prospect",
"statusConfiguration": {
"id": "STATUS002",
"name": "Prospect",
"color": "#F59E0B"
},
"classificationId": "CLASS002",
"classification": "Mid Market",
"classificationConfiguration": {
"id": "CLASS002",
"name": "Mid Market",
"color": "#8B5CF6"
},
"healthId": "HEALTH002",
"health": "Yellow",
"healthConfiguration": {
"id": "HEALTH002",
"name": "Yellow",
"color": "#F59E0B"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "techcorp.com",
"secondaryDomain": null,
"accountOwner": "Jane Smith",
"accountOwnerId": "USER002",
"accountOwnerEmail": "jane.smith@company.com",
"accountOwnerAvatarUrl": "https://example.com/jane-avatar.jpg",
"annualRevenue": 2000000,
"employees": 100,
"website": "https://techcorp.com",
"billingAddress": "456 Tech Ave, Innovation City, CA 94025",
"shippingAddress": "456 Tech Ave, Innovation City, CA 94025",
"customFieldValues": [],
"metadata": {
"leadSource": "Website",
"dealStage": "Qualification"
},
"createdAt": "2025-07-24T08:19:10.258Z",
"updatedAt": "2025-07-24T08:19:10.258Z"
}
],
"status": true,
"message": "Accounts filtered successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Filter accounts by primary domains
Source: https://docs.thena.ai/api-reference/mcp/accounts/filter-accounts-by-primary-domains
MCP tool to filter accounts by a list of primary domains in the Thena platform.
### MCP tool: `filter_accounts_by_primary_domains`
Filters accounts based on a list of primary domains. This tool is useful for finding accounts that match specific domain patterns or for bulk operations on accounts with particular domains.
You must provide an array of primary domains to filter accounts by.
### Example prompt
```prompt theme={null}
Filter accounts by primary domains ["acme.com", "techcorp.com", "example.org"]
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the filter\_accounts\_by\_primary\_domains tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| -------------- | --------- | -------- | --------------------------------------------- |
| primaryDomains | string\[] | Yes | List of primary domains to filter accounts by |
### Response fields
Below are the fields you may see in each account object in the response:
Field
Type
Description
id
string
Unique identifier of the account
name
string
Name of the account
description
string
Description of the account
source
string
Source of the account (e.g., "hubspot")
logo
string
URL of the account logo
statusId
string
ID of the account status
status
string
Status of the account
statusConfiguration
object
Configuration of the status
classificationId
string
ID of the account classification
classification
string
Classification of the account
classificationConfiguration
object
Configuration of the classification
healthId
string
ID of the account health
health
string
Health of the account
healthConfiguration
object
Configuration of the health
industryId
string
ID of the account industry
industry
string
Industry of the account
industryConfiguration
object
Configuration of the industry
primaryDomain
string
Primary domain of the account
secondaryDomain
string
Secondary domain of the account
accountOwner
string
Name of the account owner
accountOwnerId
string
ID of the account owner
accountOwnerEmail
string
Email of the account owner
accountOwnerAvatarUrl
string
Avatar URL of the account owner
annualRevenue
number
Annual revenue of the account
employees
number
Number of employees
website
string
Website of the account
billingAddress
string
Billing address of the account
shippingAddress
string
Shipping address of the account
customFieldValues
array
Custom field values for the account
metadata
object
Additional metadata for the account
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "ACC001",
"name": "Acme Corporation",
"description": "Leading technology solutions provider",
"source": "hubspot",
"logo": "https://example.com/logo.png",
"statusId": "STATUS001",
"status": "Active",
"statusConfiguration": {
"id": "STATUS001",
"name": "Active",
"color": "#10B981"
},
"classificationId": "CLASS001",
"classification": "Enterprise",
"classificationConfiguration": {
"id": "CLASS001",
"name": "Enterprise",
"color": "#3B82F6"
},
"healthId": "HEALTH001",
"health": "Good",
"healthConfiguration": {
"id": "HEALTH001",
"name": "Good",
"color": "#10B981"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "acme.com",
"secondaryDomain": "acmecorp.com",
"accountOwner": "John Doe",
"accountOwnerId": "USER001",
"accountOwnerEmail": "john.doe@company.com",
"accountOwnerAvatarUrl": "https://example.com/avatar.jpg",
"annualRevenue": 5000000,
"employees": 250,
"website": "https://acme.com",
"billingAddress": "123 Business St, City, State 12345",
"shippingAddress": "123 Business St, City, State 12345",
"customFieldValues": [],
"metadata": {
"lastContactDate": "2025-07-24T10:00:00Z",
"dealStage": "Negotiation"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "ACC002",
"name": "TechCorp Solutions",
"description": "Technology consulting firm",
"source": "manual",
"logo": "https://example.com/techcorp-logo.png",
"statusId": "STATUS002",
"status": "Prospect",
"statusConfiguration": {
"id": "STATUS002",
"name": "Prospect",
"color": "#F59E0B"
},
"classificationId": "CLASS002",
"classification": "Mid Market",
"classificationConfiguration": {
"id": "CLASS002",
"name": "Mid Market",
"color": "#8B5CF6"
},
"healthId": "HEALTH002",
"health": "Yellow",
"healthConfiguration": {
"id": "HEALTH002",
"name": "Yellow",
"color": "#F59E0B"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "techcorp.com",
"secondaryDomain": null,
"accountOwner": "Jane Smith",
"accountOwnerId": "USER002",
"accountOwnerEmail": "jane.smith@company.com",
"accountOwnerAvatarUrl": "https://example.com/jane-avatar.jpg",
"annualRevenue": 2000000,
"employees": 100,
"website": "https://techcorp.com",
"billingAddress": "456 Tech Ave, Innovation City, CA 94025",
"shippingAddress": "456 Tech Ave, Innovation City, CA 94025",
"customFieldValues": [],
"metadata": {
"leadSource": "Website",
"dealStage": "Qualification"
},
"createdAt": "2025-07-24T08:19:10.258Z",
"updatedAt": "2025-07-24T08:19:10.258Z"
}
],
"status": true,
"message": "Accounts filtered successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Filter customer contacts by IDs
Source: https://docs.thena.ai/api-reference/mcp/accounts/filter-customer-contacts-by-ids
MCP tool to filter customer contacts by a list of contact IDs in the Thena platform.
### MCP tool: `filter_customer_contacts_by_ids`
Filters customer contacts based on a list of contact IDs. This tool is useful for retrieving specific contacts when you have their IDs, or for bulk operations on a set of known contacts.
You must provide an array of customer contact IDs to filter contacts by.
### Example prompt
```prompt theme={null}
Filter customer contacts by IDs ["CONTACT001", "CONTACT002", "CONTACT003"]
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the filter\_customer\_contacts\_by\_ids tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---- | --------- | -------- | ----------------------------------------- |
| ids | string\[] | Yes | List of customer contact IDs to filter by |
### Response fields
Below are the fields you may see in each customer contact object in the response:
Field
Type
Description
id
string
Unique identifier of the customer contact
firstName
string
First name of the customer contact
lastName
string
Last name of the customer contact
email
string
Email address of the customer contact
phoneNumber
string
Phone number of the customer contact
avatarUrl
string
Avatar URL of the customer contact
accounts
array
Array of associated accounts with id and name
contactTypeId
string
ID of the contact type
contactType
string
Name of the contact type (e.g., "Decision Maker")
customFieldValues
array
Custom field values for the contact
metadata
object
Additional metadata for the contact
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "CONTACT001",
"firstName": "John",
"lastName": "Smith",
"email": "john.smith@acme.com",
"phoneNumber": "+1-555-0123",
"avatarUrl": "https://example.com/avatar.jpg",
"accounts": [
{
"id": "ACC001",
"name": "Acme Corporation"
}
],
"contactTypeId": "TYPE001",
"contactType": "Decision Maker",
"customFieldValues": [
{
"customFieldId": "CUSTOM001",
"data": "Senior Manager",
"metadata": {}
}
],
"metadata": {
"department": "Engineering",
"lastContactDate": "2025-07-24T10:00:00Z"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "CONTACT002",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@acme.com",
"phoneNumber": "+1-555-0456",
"avatarUrl": "https://example.com/jane-avatar.jpg",
"accounts": [
{
"id": "ACC001",
"name": "Acme Corporation"
}
],
"contactTypeId": "TYPE002",
"contactType": "Technical Contact",
"customFieldValues": [],
"metadata": {
"department": "IT",
"lastContactDate": "2025-07-23T14:30:00Z"
},
"createdAt": "2025-07-24T08:19:10.258Z",
"updatedAt": "2025-07-24T08:19:10.258Z"
}
],
"status": true,
"message": "Customer contacts filtered successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get account
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-account
MCP tool to retrieve a specific account by ID from the Thena platform.
### MCP tool: `get_account`
Retrieves detailed information about a specific account by its unique identifier. This tool provides comprehensive account details including status, classification, health, industry, and contact information.
You must provide the account ID to retrieve the specific account details.
### Example prompt
```prompt theme={null}
Get account with ID ACC001
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_account tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---- | ------ | -------- | ------------------------------------------------ |
| id | string | Yes | The unique identifier of the account to retrieve |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Unique identifier of the account
name
string
Name of the account
description
string
Description of the account
source
string
Source of the account (e.g., "hubspot")
logo
string
URL of the account logo
statusId
string
ID of the account status
status
string
Status of the account
statusConfiguration
object
Configuration of the status
classificationId
string
ID of the account classification
classification
string
Classification of the account
classificationConfiguration
object
Configuration of the classification
healthId
string
ID of the account health
health
string
Health of the account
healthConfiguration
object
Configuration of the health
industryId
string
ID of the account industry
industry
string
Industry of the account
industryConfiguration
object
Configuration of the industry
primaryDomain
string
Primary domain of the account
secondaryDomain
string
Secondary domain of the account
accountOwner
string
Name of the account owner
accountOwnerId
string
ID of the account owner
accountOwnerEmail
string
Email of the account owner
accountOwnerAvatarUrl
string
Avatar URL of the account owner
annualRevenue
number
Annual revenue of the account
employees
number
Number of employees
website
string
Website of the account
billingAddress
string
Billing address of the account
shippingAddress
string
Shipping address of the account
customFieldValues
array
Custom field values for the account
metadata
object
Additional metadata for the account
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": {
"id": "ACC001",
"name": "Acme Corporation",
"description": "Leading technology solutions provider",
"source": "hubspot",
"logo": "https://example.com/logo.png",
"statusId": "STATUS001",
"status": "Active",
"statusConfiguration": {
"id": "STATUS001",
"name": "Active",
"color": "#10B981"
},
"classificationId": "CLASS001",
"classification": "Enterprise",
"classificationConfiguration": {
"id": "CLASS001",
"name": "Enterprise",
"color": "#3B82F6"
},
"healthId": "HEALTH001",
"health": "Good",
"healthConfiguration": {
"id": "HEALTH001",
"name": "Good",
"color": "#10B981"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "acme.com",
"secondaryDomain": "acmecorp.com",
"accountOwner": "John Doe",
"accountOwnerId": "USER001",
"accountOwnerEmail": "john.doe@company.com",
"accountOwnerAvatarUrl": "https://example.com/avatar.jpg",
"annualRevenue": 5000000,
"employees": 250,
"website": "https://acme.com",
"billingAddress": "123 Business St, City, State 12345",
"shippingAddress": "123 Business St, City, State 12345",
"customFieldValues": [],
"metadata": {
"lastContactDate": "2025-07-24T10:00:00Z",
"dealStage": "Negotiation"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
"status": true,
"message": "Account retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get account activity
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-account-activity
MCP tool to retrieve a specific account activity by ID from the Thena platform.
### MCP tool: `get_account_activity`
Retrieves detailed information about a specific account activity by its unique identifier. This tool provides comprehensive activity details including type, status, participants, timing, and attachments.
You must provide the activity ID to retrieve the specific account activity details.
### Example prompt
```prompt theme={null}
Get account activity with ID ACTIVITY001
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_account\_activity tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---------- | ------ | -------- | --------------------------------------------------------- |
| activityId | string | Yes | The unique identifier of the account activity to retrieve |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Unique identifier of the activity
accountId
string
ID of the account the activity belongs to
account
string
Name of the account
activityTimestamp
string (ISO8601)
Timestamp when the activity occurred
duration
number
Duration of the activity in minutes
location
string
Location where the activity took place
title
string
Title of the activity
description
string
Description of the activity
type
string
The type of the activity (e.g., "Meeting", "Call", "Email")
typeId
string
ID of the activity type attribute
typeConfiguration
object
Configuration of the activity type
status
string
The status of the activity (e.g., "Completed", "Scheduled")
statusId
string
ID of the activity status attribute
statusConfiguration
object
Configuration of the activity status
participants
array
Array of participant names
creator
string
Name of the activity creator
creatorId
string
ID of the activity creator
creatorEmail
string
Email of the activity creator
attachments
array
Array of file attachments for the activity
metadata
object
Additional metadata for the activity
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": {
"id": "ACTIVITY001",
"accountId": "ACC001",
"account": "Acme Corporation",
"activityTimestamp": "2025-07-24T10:00:00Z",
"duration": 60,
"location": "Conference Room A",
"title": "Quarterly Business Review",
"description": "Q2 2025 business review meeting to discuss performance metrics and strategic initiatives. The meeting covered revenue growth, customer satisfaction scores, and upcoming product roadmap. Key decisions were made regarding resource allocation for Q3 initiatives.",
"type": "Meeting",
"typeId": "TYPE001",
"typeConfiguration": {
"id": "TYPE001",
"name": "Meeting",
"color": "#3B82F6"
},
"status": "Completed",
"statusId": "STATUS001",
"statusConfiguration": {
"id": "STATUS001",
"name": "Completed",
"color": "#10B981"
},
"participants": ["John Smith", "Jane Doe", "Bob Johnson", "Alice Wilson"],
"creator": "John Doe",
"creatorId": "USER001",
"creatorEmail": "john.doe@company.com",
"attachments": [
{
"id": "ATTACH001",
"fileName": "qbr_presentation.pdf",
"fileSize": 2048000,
"fileType": "application/pdf",
"url": "https://example.com/files/qbr_presentation.pdf"
},
{
"id": "ATTACH002",
"fileName": "meeting_notes.docx",
"fileSize": 512000,
"fileType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"url": "https://example.com/files/meeting_notes.docx"
}
],
"metadata": {
"priority": "high",
"tags": ["business-review", "quarterly", "strategic"],
"followUpRequired": true,
"nextSteps": "Schedule follow-up meeting for Q3 planning",
"keyDecisions": ["Approved Q3 budget", "Greenlit new feature development"]
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
"status": true,
"message": "Account activity retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get account note
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-account-note
MCP tool to retrieve a specific account note by ID from the Thena platform.
### MCP tool: `get_account_note`
Retrieves detailed information about a specific account note by its unique identifier. This tool provides comprehensive note details including content, type, visibility, attachments, and author information.
You must provide the note ID to retrieve the specific account note details.
### Example prompt
```prompt theme={null}
Get account note with ID NOTE001
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_account\_note tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | ----------------------------------------------------- |
| noteId | string | Yes | The unique identifier of the account note to retrieve |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Unique identifier of the note
accountId
string
ID of the account the note belongs to
account
string
Name of the account
content
string
The content of the note
type
string
The type of the note (e.g., "Internal", "Customer")
typeId
string
ID of the note type attribute
typeConfiguration
object
Configuration of the note type
visibility
string
The visibility of the note (e.g., "private", "public")
attachments
array
Array of file attachments for the note
author
string
Name of the note author
authorId
string
ID of the note author
authorEmail
string
Email of the note author
metadata
object
Additional metadata for the note
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": {
"id": "NOTE001",
"accountId": "ACC001",
"account": "Acme Corporation",
"content": "Customer has been experiencing intermittent issues over the past month. Consider upgrading their account to premium support tier for better monitoring. The performance metrics show a 15% degradation during peak hours, which aligns with their reported issues. I've scheduled a technical review meeting for next Tuesday to discuss potential solutions.",
"type": "Internal",
"typeId": "TYPE001",
"typeConfiguration": {
"id": "TYPE001",
"name": "Internal",
"color": "#3B82F6"
},
"visibility": "private",
"attachments": [
{
"id": "ATTACH001",
"fileName": "performance_report.pdf",
"fileSize": 1024000,
"fileType": "application/pdf",
"url": "https://example.com/files/performance_report.pdf"
},
{
"id": "ATTACH002",
"fileName": "metrics_dashboard.png",
"fileSize": 512000,
"fileType": "image/png",
"url": "https://example.com/files/metrics_dashboard.png"
}
],
"author": "John Doe",
"authorId": "USER001",
"authorEmail": "john.doe@company.com",
"metadata": {
"priority": "high",
"tags": ["performance", "support", "upgrade"],
"followUpRequired": true,
"escalationLevel": "medium"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
"status": true,
"message": "Account note retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get all account activities
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-all-account-activities
MCP tool to retrieve a paginated list of all activities for a specific account in the Thena platform.
### MCP tool: `get_all_account_activities`
Retrieves a paginated list of all activities for a specific account. This tool supports pagination for efficient data retrieval and provides comprehensive activity information including type, status, participants, and timing details.
This tool requires an account ID and supports pagination for efficient data retrieval.
### Example prompt
```prompt theme={null}
Get all activities for account ACC001
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_all\_account\_activities tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------- | ------ | -------- | ---------------------------------------------------- |
| accountId | string | Yes | The identifier of the account to find activities for |
| page | number | No | Page number for pagination (default: 1) |
| limit | number | No | Number of activities per page (default: 10) |
### Response fields
Below are the fields you may see in each account activity object in the response:
Field
Type
Description
id
string
Unique identifier of the activity
accountId
string
ID of the account the activity belongs to
account
string
Name of the account
activityTimestamp
string (ISO8601)
Timestamp when the activity occurred
duration
number
Duration of the activity in minutes
location
string
Location where the activity took place
title
string
Title of the activity
description
string
Description of the activity
type
string
The type of the activity (e.g., "Meeting", "Call", "Email")
typeId
string
ID of the activity type attribute
typeConfiguration
object
Configuration of the activity type
status
string
The status of the activity (e.g., "Completed", "Scheduled")
statusId
string
ID of the activity status attribute
statusConfiguration
object
Configuration of the activity status
participants
array
Array of participant names
creator
string
Name of the activity creator
creatorId
string
ID of the activity creator
creatorEmail
string
Email of the activity creator
attachments
array
Array of file attachments for the activity
metadata
object
Additional metadata for the activity
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "ACTIVITY001",
"accountId": "ACC001",
"account": "Acme Corporation",
"activityTimestamp": "2025-07-24T10:00:00Z",
"duration": 60,
"location": "Conference Room A",
"title": "Quarterly Business Review",
"description": "Q2 2025 business review meeting to discuss performance metrics and strategic initiatives.",
"type": "Meeting",
"typeId": "TYPE001",
"typeConfiguration": {
"id": "TYPE001",
"name": "Meeting",
"color": "#3B82F6"
},
"status": "Completed",
"statusId": "STATUS001",
"statusConfiguration": {
"id": "STATUS001",
"name": "Completed",
"color": "#10B981"
},
"participants": ["John Smith", "Jane Doe", "Bob Johnson"],
"creator": "John Doe",
"creatorId": "USER001",
"creatorEmail": "john.doe@company.com",
"attachments": [
{
"id": "ATTACH001",
"fileName": "qbr_presentation.pdf",
"fileSize": 2048000,
"fileType": "application/pdf",
"url": "https://example.com/files/qbr_presentation.pdf"
}
],
"metadata": {
"priority": "high",
"tags": ["business-review", "quarterly"],
"followUpRequired": true
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "ACTIVITY002",
"accountId": "ACC001",
"account": "Acme Corporation",
"activityTimestamp": "2025-07-23T14:30:00Z",
"duration": 30,
"location": "Phone Call",
"title": "Follow-up Call",
"description": "Follow-up call to discuss the technical requirements for the new feature implementation.",
"type": "Call",
"typeId": "TYPE002",
"typeConfiguration": {
"id": "TYPE002",
"name": "Call",
"color": "#8B5CF6"
},
"status": "Completed",
"statusId": "STATUS001",
"statusConfiguration": {
"id": "STATUS001",
"name": "Completed",
"color": "#10B981"
},
"participants": ["John Smith", "Jane Doe"],
"creator": "Jane Smith",
"creatorId": "USER002",
"creatorEmail": "jane.smith@company.com",
"attachments": [],
"metadata": {
"priority": "medium",
"tags": ["follow-up", "technical"],
"followUpRequired": false
},
"createdAt": "2025-07-23T08:19:10.258Z",
"updatedAt": "2025-07-23T08:19:10.258Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 2,
"totalPages": 1
},
"status": true,
"message": "Account activities retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get all account notes
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-all-account-notes
MCP tool to retrieve a paginated list of all notes for a specific account in the Thena platform.
### MCP tool: `get_all_account_notes`
Retrieves a paginated list of all notes for a specific account. This tool supports pagination for efficient data retrieval and provides comprehensive note information including content, type, visibility, and author details.
This tool requires an account ID and supports pagination for efficient data retrieval.
### Example prompt
```prompt theme={null}
Get all notes for account ACC001
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_all\_account\_notes tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------- | ------ | -------- | ----------------------------------------------- |
| accountId | string | Yes | The identifier of the account to find notes for |
| page | number | No | Page number for pagination (default: 1) |
| limit | number | No | Number of notes per page (default: 10) |
### Response fields
Below are the fields you may see in each account note object in the response:
Field
Type
Description
id
string
Unique identifier of the note
accountId
string
ID of the account the note belongs to
account
string
Name of the account
content
string
The content of the note
type
string
The type of the note (e.g., "Internal", "Customer")
typeId
string
ID of the note type attribute
typeConfiguration
object
Configuration of the note type
visibility
string
The visibility of the note (e.g., "private", "public")
attachments
array
Array of file attachments for the note
author
string
Name of the note author
authorId
string
ID of the note author
authorEmail
string
Email of the note author
metadata
object
Additional metadata for the note
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "NOTE001",
"accountId": "ACC001",
"account": "Acme Corporation",
"content": "Customer has been experiencing intermittent issues over the past month. Consider upgrading their account to premium support tier for better monitoring.",
"type": "Internal",
"typeId": "TYPE001",
"typeConfiguration": {
"id": "TYPE001",
"name": "Internal",
"color": "#3B82F6"
},
"visibility": "private",
"attachments": [
{
"id": "ATTACH001",
"fileName": "performance_report.pdf",
"fileSize": 1024000,
"fileType": "application/pdf",
"url": "https://example.com/files/performance_report.pdf"
}
],
"author": "John Doe",
"authorId": "USER001",
"authorEmail": "john.doe@company.com",
"metadata": {
"priority": "high",
"tags": ["performance", "support"]
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "NOTE002",
"accountId": "ACC001",
"account": "Acme Corporation",
"content": "Follow-up call scheduled for next week to discuss the new feature requirements.",
"type": "Customer",
"typeId": "TYPE002",
"typeConfiguration": {
"id": "TYPE002",
"name": "Customer",
"color": "#10B981"
},
"visibility": "public",
"attachments": [],
"author": "Jane Smith",
"authorId": "USER002",
"authorEmail": "jane.smith@company.com",
"metadata": {
"priority": "medium",
"tags": ["follow-up", "requirements"]
},
"createdAt": "2025-07-24T08:19:10.258Z",
"updatedAt": "2025-07-24T08:19:10.258Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 2,
"totalPages": 1
},
"status": true,
"message": "Account notes retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get all accounts
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-all-accounts
MCP tool to retrieve a paginated list of all accounts in the Thena platform.
### MCP tool: `get_all_accounts`
Retrieves a paginated list of all accounts in the organization. This tool supports search, sorting, and pagination to help you efficiently browse and filter accounts.
This tool supports pagination, search, and sorting parameters to help you efficiently retrieve accounts.
### Example prompt
```prompt theme={null}
Get all accounts with search term "enterprise" and sort by name in descending order
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_all\_accounts tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | -------------------------------------------- |
| page | number | No | Page number for pagination (default: 1) |
| limit | number | No | Number of accounts per page (default: 10) |
| search | string | No | Search term to filter accounts |
| sort | string | No | Field to sort by (e.g., "name", "createdAt") |
| order | string | No | Sort order: "ASC" or "DESC" (default: "ASC") |
### Response fields
Below are the fields you may see in each account object in the response:
Field
Type
Description
id
string
Unique identifier of the account
name
string
Name of the account
description
string
Description of the account
source
string
Source of the account (e.g., "hubspot")
logo
string
URL of the account logo
statusId
string
ID of the account status
status
string
Status of the account
statusConfiguration
object
Configuration of the status
classificationId
string
ID of the account classification
classification
string
Classification of the account
classificationConfiguration
object
Configuration of the classification
healthId
string
ID of the account health
health
string
Health of the account
healthConfiguration
object
Configuration of the health
industryId
string
ID of the account industry
industry
string
Industry of the account
industryConfiguration
object
Configuration of the industry
primaryDomain
string
Primary domain of the account
secondaryDomain
string
Secondary domain of the account
accountOwner
string
Name of the account owner
accountOwnerId
string
ID of the account owner
accountOwnerEmail
string
Email of the account owner
accountOwnerAvatarUrl
string
Avatar URL of the account owner
annualRevenue
number
Annual revenue of the account
employees
number
Number of employees
website
string
Website of the account
billingAddress
string
Billing address of the account
shippingAddress
string
Shipping address of the account
customFieldValues
array
Custom field values for the account
metadata
object
Additional metadata for the account
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "ACC001",
"name": "Acme Corporation",
"description": "Leading technology solutions provider",
"source": "hubspot",
"logo": "https://example.com/logo.png",
"statusId": "STATUS001",
"status": "Active",
"statusConfiguration": {
"id": "STATUS001",
"name": "Active",
"color": "#10B981"
},
"classificationId": "CLASS001",
"classification": "Enterprise",
"classificationConfiguration": {
"id": "CLASS001",
"name": "Enterprise",
"color": "#3B82F6"
},
"healthId": "HEALTH001",
"health": "Good",
"healthConfiguration": {
"id": "HEALTH001",
"name": "Good",
"color": "#10B981"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "acme.com",
"secondaryDomain": "acmecorp.com",
"accountOwner": "John Doe",
"accountOwnerId": "USER001",
"accountOwnerEmail": "john.doe@company.com",
"accountOwnerAvatarUrl": "https://example.com/avatar.jpg",
"annualRevenue": 5000000,
"employees": 250,
"website": "https://acme.com",
"billingAddress": "123 Business St, City, State 12345",
"shippingAddress": "123 Business St, City, State 12345",
"customFieldValues": [],
"metadata": {
"lastContactDate": "2025-07-24T10:00:00Z",
"dealStage": "Negotiation"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1,
"totalPages": 1
},
"status": true,
"message": "Accounts retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get all customer contacts
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-all-customer-contacts
MCP tool to retrieve a paginated list of all customer contacts in the Thena platform.
### MCP tool: `get_all_customer_contacts`
Retrieves a paginated list of all customer contacts in the organization. This tool supports filtering by account ID and contact type, along with pagination for efficient data retrieval.
This tool supports pagination and optional filtering by account ID and contact type.
### Example prompt
```prompt theme={null}
Get all customer contacts for account ACC001 with contact type "Decision Maker"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_all\_customer\_contacts tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ----------- | ------ | -------- | -------------------------------------------------- |
| accountId | string | No | The identifier of the account to find contacts for |
| contactType | string | No | Contact type of the customer contact to find |
| page | number | No | Page number for pagination (default: 1) |
| limit | number | No | Number of contacts per page (default: 10) |
### Response fields
Below are the fields you may see in each customer contact object in the response:
Field
Type
Description
id
string
Unique identifier of the customer contact
firstName
string
First name of the customer contact
lastName
string
Last name of the customer contact
email
string
Email address of the customer contact
phoneNumber
string
Phone number of the customer contact
avatarUrl
string
Avatar URL of the customer contact
accounts
array
Array of associated accounts with id and name
contactTypeId
string
ID of the contact type
contactType
string
Name of the contact type (e.g., "Decision Maker")
customFieldValues
array
Custom field values for the contact
metadata
object
Additional metadata for the contact
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "CONTACT001",
"firstName": "John",
"lastName": "Smith",
"email": "john.smith@acme.com",
"phoneNumber": "+1-555-0123",
"avatarUrl": "https://example.com/avatar.jpg",
"accounts": [
{
"id": "ACC001",
"name": "Acme Corporation"
}
],
"contactTypeId": "TYPE001",
"contactType": "Decision Maker",
"customFieldValues": [
{
"customFieldId": "CUSTOM001",
"data": "Senior Manager",
"metadata": {}
}
],
"metadata": {
"department": "Engineering",
"lastContactDate": "2025-07-24T10:00:00Z"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "CONTACT002",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@acme.com",
"phoneNumber": "+1-555-0456",
"avatarUrl": "https://example.com/jane-avatar.jpg",
"accounts": [
{
"id": "ACC001",
"name": "Acme Corporation"
}
],
"contactTypeId": "TYPE002",
"contactType": "Technical Contact",
"customFieldValues": [],
"metadata": {
"department": "IT",
"lastContactDate": "2025-07-23T14:30:00Z"
},
"createdAt": "2025-07-24T08:19:10.258Z",
"updatedAt": "2025-07-24T08:19:10.258Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 2,
"totalPages": 1
},
"status": true,
"message": "Customer contacts retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get customer contact
Source: https://docs.thena.ai/api-reference/mcp/accounts/get-customer-contact
MCP tool to retrieve a specific customer contact by ID from the Thena platform.
### MCP tool: `get_customer_contact`
Retrieves detailed information about a specific customer contact by its unique identifier. This tool provides comprehensive contact details including personal information, associated accounts, and contact type.
You must provide the contact ID to retrieve the specific customer contact details.
### Example prompt
```prompt theme={null}
Get customer contact with ID CONTACT001
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_customer\_contact tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------- | ------ | -------- | --------------------------------------------------------- |
| contactId | string | Yes | The unique identifier of the customer contact to retrieve |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Unique identifier of the customer contact
firstName
string
First name of the customer contact
lastName
string
Last name of the customer contact
email
string
Email address of the customer contact
phoneNumber
string
Phone number of the customer contact
avatarUrl
string
Avatar URL of the customer contact
accounts
array
Array of associated accounts with id and name
contactTypeId
string
ID of the contact type
contactType
string
Name of the contact type (e.g., "Decision Maker")
customFieldValues
array
Custom field values for the contact
metadata
object
Additional metadata for the contact
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": {
"id": "CONTACT001",
"firstName": "John",
"lastName": "Smith",
"email": "john.smith@acme.com",
"phoneNumber": "+1-555-0123",
"avatarUrl": "https://example.com/avatar.jpg",
"accounts": [
{
"id": "ACC001",
"name": "Acme Corporation"
},
{
"id": "ACC002",
"name": "Acme Subsidiary"
}
],
"contactTypeId": "TYPE001",
"contactType": "Decision Maker",
"customFieldValues": [
{
"customFieldId": "CUSTOM001",
"data": "Senior Manager",
"metadata": {}
},
{
"customFieldId": "CUSTOM002",
"data": "Engineering",
"metadata": {}
}
],
"metadata": {
"department": "Engineering",
"lastContactDate": "2025-07-24T10:00:00Z",
"preferredContactMethod": "email",
"timezone": "America/New_York"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
"status": true,
"message": "Customer contact retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Introduction
Source: https://docs.thena.ai/api-reference/mcp/accounts/overview
# MCP Account Tools
This section documents the Model Context Protocol (MCP) tools available for working with accounts in the Thena platform. These tools allow you to retrieve, create, and manage accounts, customer contacts, account notes, and account activities via Thena MCP server.
## Available tools
### Core account operations
* [Create Account](./create-account): Create a new account.
* [Delete Account](./delete-account): Delete an account.
* [Filter Accounts by IDs](./filter-accounts-by-ids): Filter accounts by specific IDs.
* [Filter Accounts by Primary Domains](./filter-accounts-by-primary-domains): Filter accounts by primary domain.
* [Get Account](./get-account): Retrieve a specific account by ID.
* [Get All Accounts](./get-all-accounts): Retrieve all accounts in the organization.
* [Update Account](./update-account): Update an existing account.
### Customer contacts
* [Create Bulk Customer Contacts](./create-bulk-customer-contacts): Create multiple customer contacts at once.
* [Filter Customer Contacts by IDs](./filter-customer-contacts-by-ids): Filter customer contacts by specific IDs.
* [Get Customer Contact](./get-customer-contact): Retrieve a specific customer contact by ID.
* [Get All Customer Contacts](./get-all-customer-contacts): Retrieve all customer contacts.
* [Search Customer Contacts](./search-customer-contacts): Search customer contacts with various criteria.
### Account notes
* [Get Account Note](./get-account-note): Retrieve a specific account note by ID.
* [Get All Account Notes](./get-all-account-notes): Retrieve all notes for an account.
### Account activities
* [Get Account Activity](./get-account-activity): Retrieve a specific account activity by ID.
* [Get All Account Activities](./get-all-account-activities): Retrieve all activities for an account.
# Search customer contacts
Source: https://docs.thena.ai/api-reference/mcp/accounts/search-customer-contacts
MCP tool to search for customer contacts by email in the Thena platform.
### MCP tool: `search_customer_contacts`
Searches for customer contacts using an email address. This tool is useful for finding specific contacts when you know their email address.
You must provide an email address to search for customer contacts.
### Example prompt
```prompt theme={null}
Search for customer contact with email john.smith@acme.com
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the search\_customer\_contacts tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ----- | ------ | -------- | -------------------------------------- |
| email | string | Yes | Search for a customer contact by email |
### Response fields
Below are the fields you may see in each customer contact object in the response:
Field
Type
Description
id
string
Unique identifier of the customer contact
firstName
string
First name of the customer contact
lastName
string
Last name of the customer contact
email
string
Email address of the customer contact
phoneNumber
string
Phone number of the customer contact
avatarUrl
string
Avatar URL of the customer contact
accounts
array
Array of associated accounts with id and name
contactTypeId
string
ID of the contact type
contactType
string
Name of the contact type (e.g., "Decision Maker")
customFieldValues
array
Custom field values for the contact
metadata
object
Additional metadata for the contact
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "CONTACT001",
"firstName": "John",
"lastName": "Smith",
"email": "john.smith@acme.com",
"phoneNumber": "+1-555-0123",
"avatarUrl": "https://example.com/avatar.jpg",
"accounts": [
{
"id": "ACC001",
"name": "Acme Corporation"
}
],
"contactTypeId": "TYPE001",
"contactType": "Decision Maker",
"customFieldValues": [
{
"customFieldId": "CUSTOM001",
"data": "Senior Manager",
"metadata": {}
}
],
"metadata": {
"department": "Engineering",
"lastContactDate": "2025-07-24T10:00:00Z"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
}
],
"status": true,
"message": "Customer contacts search completed successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Update account
Source: https://docs.thena.ai/api-reference/mcp/accounts/update-account
MCP tool to update an existing account in the Thena platform.
### MCP tool: `update_account`
Updates an existing account in the Thena platform. This tool allows you to modify any account information including basic details, classification, health status, and custom fields.
You must provide the account ID. All other fields are optional and only the provided fields will be updated.
### Example prompt
```prompt theme={null}
Update account ACC001 to change the status to "Active" and set annual revenue to 7500000
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_account tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------------------------------- | ------- | -------- | ------------------------------------------------------- |
| id | string | Yes | The unique identifier of the account to update |
| name | string | No | The updated name of the account |
| primaryDomain | string | No | The updated primary domain of the account |
| secondaryDomain | string | No | The updated secondary domain of the account |
| website | string | No | The updated website URL of the account |
| industry | string | No | The industry name (e.g., Technology, Finance) |
| description | string | No | An updated description of the account |
| source | string | No | The updated source of the account (e.g., "hubspot") |
| accountOwnerId | string | No | The updated user identifier of the account owner |
| logo | string | No | The updated URL of the account logo |
| status | string | No | The updated account status (e.g., Active) |
| classification | string | No | The updated account classification (e.g., Enterprise) |
| health | string | No | The updated account health status (e.g., Green) |
| annualRevenue | number | No | The updated annual revenue of the account |
| employees | number | No | The updated number of employees of the account |
| billingAddress | string | No | The updated billing address of the account |
| shippingAddress | string | No | The updated shipping address of the account |
| customFieldValues | array | No | The updated custom field values of the account |
| addExistingUsersToAccountContacts | boolean | No | Whether to add existing users matching the email domain |
| metadata | object | No | Updated additional metadata for the account |
#### Custom field values structure
Each custom field value in the `customFieldValues` array contains:
| Field | Type | Description |
| ------- | -------------------------- | ------------------------------ |
| fieldId | string | The ID of the custom field |
| value | string/number/boolean/null | The value for the custom field |
### Response fields
The response will contain the updated account with the same structure as the `get_account` tool.
### Sample response
```json theme={null}
{
"data": {
"id": "ACC001",
"name": "Acme Corporation",
"description": "Updated: Leading technology solutions provider with expanded operations",
"source": "hubspot",
"logo": "https://example.com/logo.png",
"statusId": "STATUS003",
"status": "Active",
"statusConfiguration": {
"id": "STATUS003",
"name": "Active",
"color": "#10B981"
},
"classificationId": "CLASS001",
"classification": "Enterprise",
"classificationConfiguration": {
"id": "CLASS001",
"name": "Enterprise",
"color": "#3B82F6"
},
"healthId": "HEALTH003",
"health": "Green",
"healthConfiguration": {
"id": "HEALTH003",
"name": "Green",
"color": "#10B981"
},
"industryId": "IND001",
"industry": "Technology",
"industryConfiguration": {
"id": "IND001",
"name": "Technology",
"color": "#8B5CF6"
},
"primaryDomain": "acme.com",
"secondaryDomain": "acmecorp.com",
"accountOwner": "John Doe",
"accountOwnerId": "USER001",
"accountOwnerEmail": "john.doe@company.com",
"accountOwnerAvatarUrl": "https://example.com/avatar.jpg",
"annualRevenue": 7500000,
"employees": 300,
"website": "https://acme.com",
"billingAddress": "123 Business St, City, State 12345",
"shippingAddress": "123 Business St, City, State 12345",
"customFieldValues": [
{
"fieldId": "CUSTOM001",
"value": "Premium"
},
{
"fieldId": "CUSTOM002",
"value": "Strategic"
}
],
"metadata": {
"lastContactDate": "2025-07-25T10:00:00Z",
"dealStage": "Closed Won",
"contractRenewalDate": "2026-07-25T00:00:00Z"
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-25T12:50:38.937Z"
},
"status": true,
"message": "Account updated successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool modifies existing account data. Only the fields you provide will be updated; other fields will remain unchanged.
***
# Create comment
Source: https://docs.thena.ai/api-reference/mcp/comments/create-comment
MCP tool to add a new comment to any entity in the Thena platform.
### MCP tool: `create_comment`
Add a new comment to any entity in the Thena platform. This tool allows you to create comments with various content types, visibility settings, and threading capabilities.
You must provide the entity type and entity ID to create a comment.
### Example prompt
```prompt theme={null}
Create a comment on ticket 71XNF90K10YBR86G1AN06KZJJFX40 with content "Customer reported an issue"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_comment tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---------------------- | --------- | -------- | ------------------------------------------------------------------------------------ |
| entityType | string | Yes | The type of entity to comment on (e.g., "ticket", "accountActivity", "note", "task") |
| entityId | string | Yes | The ID of the entity to comment on |
| content | string | No | The plain text content of the comment |
| contentHtml | string | No | The HTML content of the comment |
| contentJson | string | No | The JSON content of the comment (for rich text editors, etc.) |
| parentCommentId | string | No | The ID of the parent comment (for threaded comments) |
| commentVisibility | enum | No | "public" or "private" (default: "public") |
| commentType | string | No | "note", "reply", "comment", etc. (default: "comment") |
| threadName | string | No | The name of the comment thread (for grouping) |
| metadata | object | No | Any additional metadata (e.g., mentions, tags) |
| attachmentIds | string\[] | No | Array of attachment IDs to associate with the comment |
| customerEmail | string | No | The email of the customer (if commenting as a customer) |
| impersonatedUserEmail | string | No | If impersonating a user, their email |
| impersonatedUserName | string | No | If impersonating a user, their name |
| impersonatedUserAvatar | string | No | If impersonating a user, their avatar URL |
## Content types
You can provide comment content in multiple formats:
### Plain text
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "This is a simple text comment"
}
```
### HTML content
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"contentHtml": "
This is an HTML formatted comment
"
}
```
### JSON content (Rich text)
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"contentJson": "{\"blocks\":[{\"text\":\"Rich text content\",\"type\":\"paragraph\"}]}"
}
```
## Visibility settings
### Public comment (Default)
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "This comment is visible to customers",
"commentVisibility": "public"
}
```
### Private comment
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "This is an internal note only visible to team members",
"commentVisibility": "private"
}
```
## Threaded comments
Create a reply to an existing comment:
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "This is a reply to the parent comment",
"parentCommentId": "comment_456"
}
```
## Comment types
Different comment types serve different purposes:
* `comment` - General comment (default)
* `note` - Internal note
* `reply` - Reply to another comment
* `status_update` - Status change notification
* `assignment` - Assignment notification
## Examples
### Basic ticket comment
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "Customer reported the issue. Investigating now.",
"commentType": "note",
"commentVisibility": "private"
}
```
### Public customer response
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "Thank you for reporting this issue. We're working on a fix.",
"commentVisibility": "public"
}
```
### Comment with attachments
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "Screenshot of the error attached",
"attachmentIds": ["att_789", "att_790"]
}
```
### Impersonated user comment
```json theme={null}
{
"entityType": "ticket",
"entityId": "ticket_123",
"content": "Comment from support team",
"impersonatedUserEmail": "support@company.com",
"impersonatedUserName": "Support Team",
"impersonatedUserAvatar": "https://example.com/avatar.png"
}
```
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Comment unique ID
content
string
Plain text content of the comment
contentHtml
string
HTML formatted content
contentMarkdown
string
Markdown formatted content
contentJson
string
JSON formatted content for rich text
isEdited
boolean
Whether the comment has been edited
threadName
string
Name of the comment thread
commentVisibility
string
Visibility setting (public or private)
commentType
string
Type of comment (note, reply, comment, etc.)
isPinned
boolean
Whether the comment is pinned
sourceEmailId
string
Email ID if comment came from email
metadata
object
Additional metadata including mentions
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
author
string
Author display name
authorAvatarUrl
string
Author's avatar URL
attachments
array
Array of attachment IDs
authorId
string
Author's user ID
authorUserType
string
Author's user type (e.g., ORG\_ADMIN)
impersonatedUserEmail
string
Email of impersonated user
impersonatedUserName
string
Name of impersonated user
impersonatedUserAvatar
string
Avatar of impersonated user
deletedAt
string
Deletion timestamp (null if not deleted)
### Sample response
```json theme={null}
{
"data": {
"id": "S5Q6R01K1052NAMN8YGYHYGKZG082",
"content": "hey, this is a test comment",
"contentHtml": "",
"contentMarkdown": "hey, this is a test comment",
"contentJson": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"attrs\":{\"textAlign\":\"left\"}}]}",
"isEdited": false,
"threadName": null,
"commentVisibility": "private",
"commentType": "comment",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": []
},
"createdAt": "2025-07-25T12:16:24.755Z",
"updatedAt": "2025-07-25T12:16:24.754Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"attachments": [],
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
},
"status": true,
"message": "Comment created successfully!",
"timestamp": "2025-07-25T12:16:24.780Z"
}
```
## Error handling
Common error scenarios:
* Invalid entity type or ID
* Missing required content
* Invalid attachment IDs
* Permission denied for the entity
* Network or authentication errors
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Create note
Source: https://docs.thena.ai/api-reference/mcp/comments/create-note
MCP tool to create a private note on an entity in the Thena platform.
### MCP tool: `create_note`
Creates a private note on any entity. Notes are automatically set to private visibility and are useful for internal documentation and team communication.
Notes are automatically set to private visibility and comment type "note".
### Example prompt
```prompt theme={null}
Create a note on ticket 71XNF90K10YBR86G1AN06KZJJFX40 with content "Customer requested urgent resolution"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_note tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------- | --------- | -------- | --------------------------------------------------------------------------------------- |
| entityType | string | Yes | The type of entity to add a note to (e.g., "ticket", "accountActivity", "note", "task") |
| entityId | string | Yes | The ID of the entity to add a note to |
| content | string | No | The plain text content of the note |
| attachmentIds | string\[] | No | Array of attachment IDs to associate with the note |
| metadata | object | No | Any additional metadata (e.g., mentions, tags) |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Note unique ID
content
string
Plain text content of the note
contentHtml
string
HTML formatted content
contentMarkdown
string
Markdown formatted content
contentJson
string
JSON formatted content for rich text
isEdited
boolean
Whether the note has been edited
threadName
string
Name of the comment thread
commentVisibility
string
Always "private"
commentType
string
Always "note"
isPinned
boolean
Whether the note is pinned
sourceEmailId
string
Email ID if note came from email
metadata
object
Additional metadata including mentions
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
author
string
Author display name
authorAvatarUrl
string
Author's avatar URL
attachments
array
Array of attachment IDs
authorId
string
Author's user ID
authorUserType
string
Author's user type (e.g., ORG\_ADMIN)
impersonatedUserEmail
string
Email of impersonated user
impersonatedUserName
string
Name of impersonated user
impersonatedUserAvatar
string
Avatar of impersonated user
deletedAt
string
Deletion timestamp (null if not deleted)
### Sample response
```json theme={null}
{
"data": {
"id": "PEDCR01K10RKS0142W6FR5AYJJMYJ",
"content": "Internal note: Customer has been experiencing intermittent issues over the past month. Consider upgrading their account to premium support tier for better monitoring.",
"contentHtml": "",
"contentMarkdown": "Internal note: Customer has been experiencing intermittent issues over the past month. Consider upgrading their account to premium support tier for better monitoring.",
"contentJson": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"attrs\":{\"textAlign\":\"left\"}}]}",
"isEdited": false,
"threadName": null,
"commentVisibility": "private",
"commentType": "note",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": []
},
"createdAt": "2025-07-25T12:19:31.410Z",
"updatedAt": "2025-07-25T12:19:31.409Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"attachments": [],
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
},
"status": true,
"message": "Comment created successfully!",
"timestamp": "2025-07-25T12:19:31.442Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get comments by user type
Source: https://docs.thena.ai/api-reference/mcp/comments/get-comments-by-user-type
MCP tool to filter comments by user type in the Thena platform.
### MCP tool: `get_comments_by_user_type`
Retrieves comments filtered by user type (internal/external) for a specific entity. Useful for separating internal team comments from customer-facing comments.
You must provide the user type, entity type, and entity ID to filter comments.
### Example prompt
```prompt theme={null}
Get internal comments for ticket 71XNF90K10YBR86G1AN06KZJJFX40
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_comments\_by\_user\_type tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---------- | ------ | -------- | ---------------------------------------------------------------- |
| userType | string | Yes | The type of user to filter comments by |
| entityType | string | Yes | The type of entity to filter comments by (e.g., ticket, account) |
| entityId | string | Yes | The ID of the entity to filter comments by |
### User types
Common user types include:
* `internal` - Team members and internal users
* `external` - Customers and external users
* `agent` - Support agents
* `customer` - End customers
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Comment unique ID
content
string
Plain text content of the comment
contentHtml
string
HTML formatted content
contentMarkdown
string
Markdown formatted content
contentJson
string
JSON formatted content for rich text
isEdited
boolean
Whether the comment has been edited
threadName
string
Name of the comment thread
commentVisibility
string
Visibility setting (public or private)
commentType
string
Type of comment (note, reply, comment, etc.)
isPinned
boolean
Whether the comment is pinned
sourceEmailId
string
Email ID if comment came from email
metadata
object
Additional metadata including mentions
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
author
string
Author display name
authorAvatarUrl
string
Author's avatar URL
authorId
string
Author's user ID
authorUserType
string
Author's user type (e.g., ORG\_ADMIN)
impersonatedUserEmail
string
Email of impersonated user
impersonatedUserName
string
Name of impersonated user
impersonatedUserAvatar
string
Avatar of impersonated user
deletedAt
string
Deletion timestamp (null if not deleted)
### Sample response
```json theme={null}
{
"data": {
"id": "X66KS01K10E5FVTJK7ZVRW3AKVYDD",
"content": "this is a reply",
"contentHtml": "
this is a reply
",
"contentMarkdown": "this is a reply",
"contentJson": "\"{\\"type\\":\\"doc\\",\\"content\\":[{\\"type\\":\\"paragraph\\",\\"attrs\\":{\\"textAlign\\":\\"left\\"},\\"content\\":[{\\"type\\":\\"text\\",\\"text\\":\\"this is a reply\\"}]}]}\"",
"isEdited": false,
"threadName": null,
"commentVisibility": "public",
"commentType": "comment",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": []
},
"createdAt": "2025-07-25T12:40:41.944Z",
"updatedAt": "2025-07-25T12:40:41.941Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
},
"status": true,
"message": "Comments fetched successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get comments on entity
Source: https://docs.thena.ai/api-reference/mcp/comments/get-comments-on-entity
MCP tool to retrieve threaded comment conversations in the Thena platform.
# Get Comments on Entity
Retrieve all comments for a specific entity in the Thena platform.
## Parameters
| Name | Type | Required | Description |
| ---------- | ------ | -------- | ------------------------------------------------------- |
| entityType | string | Yes | The type of the entity (e.g., "ticket", "conversation") |
| entityId | string | Yes | The ID of the entity to get comments for |
| page | number | No | The page number for pagination (default: 0) |
| limit | number | No | Maximum number of comments to return (default: 10) |
### Example prompt
```prompt theme={null}
Get all comments for ticket NYD3S01K100PGBTVWPMTPX8W4W3G6
```
### Response fields
Each item in the `data` array is a comment object with the following fields:
Field
Type
Description
id
string
Comment unique ID
content
string
Plain text content of the comment
contentHtml
string
HTML formatted content
contentMarkdown
string
Markdown formatted content
contentJson
string
JSON formatted content for rich text
isEdited
boolean
Whether the comment has been edited
threadName
string
Name of the comment thread
commentVisibility
string
Visibility setting (public or private)
commentType
string
Type of comment (note, reply, comment, etc.)
isPinned
boolean
Whether the comment is pinned
sourceEmailId
string
Email ID if comment came from email
metadata
object
Additional metadata including mentions, userReactions, and sometimes replies
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
author
string
Author display name
authorAvatarUrl
string
Author's avatar URL
attachments
array
Array of attachment IDs
authorId
string
Author's user ID
authorUserType
string
Author's user type (e.g., ORG\_ADMIN)
impersonatedUserEmail
string
Email of impersonated user
impersonatedUserName
string
Name of impersonated user
impersonatedUserAvatar
string
Avatar of impersonated user
deletedAt
string
Deletion timestamp (null if not deleted)
### Sample response
```json theme={null}
{
"data": [
{
"id": "G727S01K1045B01QRQY2P1ATK3R5F",
"content": "Internal note: This performance issue might be related to the recent deployment we did last Tuesday (v2.4.3). Sarah mentioned in the standup that they noticed some unusual query patterns after that release. \n\nNeed to check:\n- Did we accidentally remove any indexes during the schema migration?\n- The new caching layer might not be working as expected\n- Could be related to the user session timeout changes\n\nAlso, Alex (the requestor) is from our biggest client - BusinessCorp. They're up for renewal next month, so this needs to be prioritized. Marketing has been pushing hard to keep them happy.\n\nI'll coordinate with the DevOps team offline about the maintenance window. Don't want to mention specific timing in public comments until we confirm availability.",
"contentHtml": "",
"contentMarkdown": "...",
"contentJson": "...",
"isEdited": false,
"threadName": null,
"commentVisibility": "private",
"commentType": "note",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": [],
"userReactions": []
},
"createdAt": "2025-07-25T12:34:04.651Z",
"updatedAt": "2025-07-25T12:34:04.650Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"attachments": [],
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
}
],
"status": true,
"message": "Comments fetched successfully!",
"timestamp": "2025-07-25T12:48:11.462Z"
}
```
# Introduction
Source: https://docs.thena.ai/api-reference/mcp/comments/overview
# MCP Comment Tools
This section documents the Model Context Protocol (MCP) tools available for working with comments in the Thena platform. These tools allow you to create, retrieve, and manage comments across various entities via Thena MCP server.
## Available tools
* [Create Comment](./create-comment): Add a new comment to any entity.
* [Create Note](./create-note): Create a note-type comment with specific formatting.
* [Get Comments on Entity](./get-comments-on-entity): Retrieve all comments for a specific entity.
* [Get Comments by User Type](./get-comments-by-user-type): Filter comments by user type (internal/external).
* [Get Comment Threads](./get-comment-threads): Retrieve threaded comment conversations.
* [Search Comments](./search-comments): Search for comments using Thena's powerful search API with advanced filtering capabilities.
* [Update Comment](./update-comment): Modify an existing comment.
# Search comments
Source: https://docs.thena.ai/api-reference/mcp/comments/search-comments
MCP tool to search for comments using Thena's search API with advanced filtering capabilities.
### MCP tool: `search_comments`
Searches for comments using Thena's powerful search API with advanced filtering capabilities. This tool allows you to find comments based on various criteria including content, ticket UID, author, comment type, visibility, and other comment properties.
This tool uses Thena's search API which provides fast, indexed search with support for complex filters and pagination.
### Example prompt
```prompt theme={null}
Search for comments with "test" in their content
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the search\_comments tool with the correct arguments.
### Response fields
The response will contain a `result` object with the following structure:
Field
Type
Description
found
number
Total number of comments found
hits
array
Array of comment objects matching the search criteria
page
number
Current page number
facet\_counts
array
Facet counts for search results
request\_params
object
Parameters used for the search request
search\_cutoff
boolean
Whether the search was cut off due to limits
#### Comment object fields
Each comment in the `hits` array contains a `document` object with the following fields:
Field
Type
Description
id
string
Comment unique identifier
content
string
Comment content (main text)
contentHtml
string
HTML formatted content
contentMarkdown
string
Markdown formatted content
contentJson
string
JSON representation of content
isEdited
boolean
Whether the comment was edited
threadName
string
Comment thread name
commentVisibility
string
Comment visibility (public, private)
commentType
string
Type of comment (comment, reply, note)
isPinned
boolean
Whether the comment is pinned
sourceEmailId
string
Source email ID
metadata
object
Comment metadata (mentions, userReactions, etc.)
createdAt
string (ISO8601)
Comment creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
author
string
Author name
authorAvatarUrl
string
Author avatar URL
attachments
array
Comment attachments
authorId
string
Author's user ID
authorUserType
string
Author's user type
impersonatedUserEmail
string
Impersonated user email
impersonatedUserName
string
Impersonated user name
impersonatedUserAvatar
string
Impersonated user avatar
deletedAt
string (ISO8601)
Deletion timestamp (if applicable)
#### Metadata object fields
The `metadata` object may contain:
Field
Type
Description
mentions
array
List of mentioned users
userReactions
array
User reactions to the comment
replies
array
List of reply comment IDs
lastEditedAt
string (ISO8601)
Last edit timestamp
lastEditedBy
string
User who last edited the comment
### Sample response
```json theme={null}
{
"result": {
"found": 1,
"hits": [
{
"document": {
"id": "S5Q6R01K1052NAMN8YGYHYGKZG082",
"content": "hey, this is a test comment",
"contentHtml": "",
"contentMarkdown": "hey, this is a test comment",
"contentJson": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"attrs\":{\"textAlign\":\"left\"}}]}",
"isEdited": false,
"threadName": null,
"commentVisibility": "private",
"commentType": "comment",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": [],
"userReactions": []
},
"createdAt": "2025-07-25T12:16:24.755Z",
"updatedAt": "2025-07-25T12:16:24.754Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"attachments": [],
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
}
}
],
"page": 1,
"facet_counts": [],
"request_params": {
"search_mode": "fallback",
"q": "*",
"query_by": "content,content_markdown,content_html",
"filter_by": "content:=test"
},
"search_cutoff": false
}
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
The search API provides fast, indexed search results. Use specific filters to narrow down results and improve performance.
Only the core comment fields (content, content\_markdown, content\_html) support direct text search. Other fields require exact value matching.
***
### Notes
* Only authorized users can access this tool; results are scoped to the user's organization.
* The search API supports full-text search on comment content, markdown, and HTML using ILike pattern matching.
* Comment UID searches require exact matches.
* Filters can be combined using AND or OR logic for complex queries.
* Date filters should use ISO 8601 format (e.g., "2025-07-25T12:16:24.755Z").
* Boolean filters use true/false values.
* The search is case-insensitive for text fields.
* Results are paginated with a maximum of 250 items per page.
* Use the `range` operator for date ranges (e.g., "\[2025-07-01..2025-07-31]").
* Related data (metadata, attachments, etc.) is included in the response but not searchable.
# Update comment
Source: https://docs.thena.ai/api-reference/mcp/comments/update-comment
MCP tool to update an existing comment in the Thena platform.
### MCP tool: `update_comment`
Updates an existing comment with new content, visibility settings, or other properties. Useful for correcting typos, updating information, or changing comment visibility.
You must provide the comment ID and at least the content to update the comment.
### Example prompt
```prompt theme={null}
Update comment 60YJS01K10TQY9F7W3V19QZ857TFY with content "Updated: This comment has been modified to include more detailed information about the ticket status. The investigation is ongoing and we expect to have a resolution by end of day today. Thanks for your patience while we work through this performance issue."
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_comment tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ----------------- | --------- | -------- | -------------------------------------------------------- |
| commentId | string | Yes | The ID of the comment to update |
| content | string | Yes | The updated content of the comment (1-5000 chars) |
| contentHtml | string | No | The updated HTML content of the comment (max 5000 chars) |
| contentJson | string | No | The updated JSON content of the comment |
| threadName | string | No | The updated name of the comment thread |
| commentVisibility | enum | No | The visibility of the comment ("public" or "private") |
| commentType | enum | No | The type of the comment ("comment" or "note") |
| isPinned | boolean | No | Whether the comment is pinned |
| preserveMentions | boolean | No | Whether to preserve mentions when updating content |
| attachments | string\[] | No | The attachments of the comment |
| commentAs | string | No | The comment as a string |
| metadata | object | No | The updated metadata of the comment |
| updatedAt | string | No | The update timestamp |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Comment unique ID
content
string
Updated plain text content of the comment
contentHtml
string
Updated HTML formatted content
contentMarkdown
string
Updated Markdown formatted content
contentJson
string
Updated JSON formatted content
isEdited
boolean
Whether the comment has been edited
threadName
string
Name of the comment thread
commentVisibility
string
Updated visibility setting
commentType
string
Updated type of comment
isPinned
boolean
Whether the comment is pinned
sourceEmailId
string
Email ID if comment came from email
metadata
object
Updated metadata (may include mentions, lastEditedAt, lastEditedBy, etc.)
createdAt
string (ISO8601)
Original creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
author
string
Author display name
authorAvatarUrl
string
Author's avatar URL
attachments
array
Updated attachment IDs
authorId
string
Author's user ID
authorUserType
string
Author's user type (e.g., ORG\_ADMIN)
impersonatedUserEmail
string
Email of impersonated user
impersonatedUserName
string
Name of impersonated user
impersonatedUserAvatar
string
Avatar of impersonated user
deletedAt
string
Deletion timestamp (null if not deleted)
### Sample response
```json theme={null}
{
"data": {
"id": "60YJS01K10TQY9F7W3V19QZ857TFY",
"content": "Updated: This comment has been modified to include more detailed information about the ticket status. The investigation is ongoing and we expect to have a resolution by end of day today. Thanks for your patience while we work through this performance issue.",
"contentHtml": "Updated: This comment has been modified to include more detailed information about the ticket status. The investigation is ongoing and we expect to have a resolution by end of day today. Thanks for your patience while we work through this performance issue.",
"contentMarkdown": "Updated: This comment has been modified to include more detailed information about the ticket status. The investigation is ongoing and we expect to have a resolution by end of day today. Thanks for your patience while we work through this performance issue.",
"contentJson": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"attrs\":{\"textAlign\":\"left\"},\"content\":[{\"type\":\"text\",\"text\":\"Updated: This comment has been modified to include more detailed information about the ticket status. The investigation is ongoing and we expect to have a resolution by end of day today. Thanks for your patience while we work through this performance issue.\"}]}]}",
"isEdited": true,
"threadName": null,
"commentVisibility": "public",
"commentType": "comment",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": [],
"lastEditedAt": "2025-07-25T12:54:43.379Z",
"lastEditedBy": "8"
},
"createdAt": "2025-07-25T12:40:33.539Z",
"updatedAt": "2025-07-25T12:54:42.597Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"attachments": [],
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
},
"status": true,
"message": "Comment updated successfully!",
"timestamp": "2025-07-25T12:54:43.666Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Create team routing rule
Source: https://docs.thena.ai/api-reference/mcp/teams/create-team-routing-rule
MCP tool to create a routing rule for a team in the Thena platform.
### MCP tool: `create_team_routing_rule`
Creates a new routing rule for a specific team. Routing rules determine how tickets are automatically assigned and routed within the team based on various conditions and criteria.
You must provide the team ID, rule name, and result team ID to create a routing rule.
### Example prompt
```prompt theme={null}
Create a routing rule for team T88WCYYHPS named "High Priority Tickets" that routes to team T99WCYYHPS
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_team\_routing\_rule tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------------- | --------- | -------- | -------------------------------------------------- |
| teamId | string | Yes | The ID of the team to create a routing rule for |
| name | string | Yes | The name of the routing rule group |
| resultTeamId | string | Yes | The ID of the team that tickets will be routed to |
| description | string | No | The description of the routing rule group |
| evaluationOrder | number | No | The order in which this rule should be evaluated |
| andRules | string\[] | No | Rules that must all match (AND condition) |
| orRules | string\[] | No | Rules where any match is sufficient (OR condition) |
### Response fields
The response will contain the created routing rule with the same structure as the `get_team_routing_rules` tool:
Field
Type
Description
id
string
Routing rule unique ID
name
string
Routing rule name
description
string
Routing rule description
teamId
string
Team ID this rule belongs to
evaluationOrder
number
Priority/order for rule evaluation
resultTeamId
string
Target team ID for routing
fallbackTeamId
string
Fallback team ID if primary routing fails
andRules
array
Array of AND conditions (all must match)
orRules
array
Array of OR conditions (any can match)
createdBy
string
Name of user who created the rule
createdById
string
ID of user who created the rule
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": {
"id": "RR001",
"name": "High Priority Tickets",
"description": "Route high priority tickets to senior team",
"teamId": "T88WCYYHPS",
"evaluationOrder": 1,
"resultTeamId": "T99WCYYHPS",
"fallbackTeamId": null,
"andRules": [
{
"field": "priority",
"operator": "EQUALS",
"value": "high",
"precedence": 1
},
{
"field": "status",
"operator": "NOT_EQUALS",
"value": "closed",
"precedence": 2
}
],
"orRules": [
{
"field": "account",
"operator": "CONTAINS",
"value": "enterprise",
"precedence": 1
}
],
"createdBy": "John Doe",
"createdById": "USER123",
"createdAt": "2025-07-25T12:50:38.937Z",
"updatedAt": "2025-07-25T12:50:38.937Z"
},
"status": true,
"message": "Team routing rule created successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool creates new routing rules that affect ticket assignment. Rules are evaluated in order of `evaluationOrder` (lower numbers = higher priority).
***
# Get subteams
Source: https://docs.thena.ai/api-reference/mcp/teams/get-subteams
MCP tool to retrieve all subteams for a parent team in the Thena platform.
### MCP tool: `get_subteams`
Retrieves all subteams for a specific parent team. This tool is useful for understanding team hierarchy and organizational structure within the Thena platform.
You must provide the parent team ID to retrieve its subteams.
### Example prompt
```prompt theme={null}
Get subteams for team T88WCYYHPS
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_subteams tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | -------------------------------------------------- |
| teamId | string | Yes | The ID of the parent team to retrieve subteams for |
### Response fields
Below are the fields you may see in each subteam object in the response:
Field
Type
Description
id
string
Subteam unique ID
name
string
Subteam name
icon
string
Subteam icon
color
string
Subteam color
parentTeamId
string
ID of the parent team
parentTeamName
string
Name of the parent team
teamId
string
Subteam ID (same as id)
identifier
string
Subteam identifier/code
description
string
Subteam description
teamOwner
string
Name of the subteam owner
teamOwnerId
string
ID of the subteam owner
fallbackSubTeam
string
Fallback sub team ID
createdAt
string (ISO8601)
Creation timestamp
isActive
boolean
Whether the subteam is active
isPrivate
boolean
Whether the subteam is private
archivedAt
string (ISO8601)
Archived timestamp (if archived)
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "T99WCYYHPS",
"name": "Frontend Team",
"icon": "🎨",
"color": "#8B5CF6",
"parentTeamId": "T88WCYYHPS",
"parentTeamName": "Engineering",
"teamId": "T99WCYYHPS",
"identifier": "FE",
"description": "Frontend development subteam",
"teamOwner": "Alice Johnson",
"teamOwnerId": "USER789",
"fallbackSubTeam": null,
"createdAt": "2025-07-24T09:19:10.258Z",
"isActive": true,
"isPrivate": false,
"archivedAt": null,
"updatedAt": "2025-07-24T09:19:10.258Z"
},
{
"id": "TAAWCYYHPS",
"name": "Backend Team",
"icon": "⚙️",
"color": "#F59E0B",
"parentTeamId": "T88WCYYHPS",
"parentTeamName": "Engineering",
"teamId": "TAAWCYYHPS",
"identifier": "BE",
"description": "Backend development subteam",
"teamOwner": "Bob Wilson",
"teamOwnerId": "USER101",
"fallbackSubTeam": null,
"createdAt": "2025-07-24T10:19:10.258Z",
"isActive": true,
"isPrivate": false,
"archivedAt": null,
"updatedAt": "2025-07-24T10:19:10.258Z"
}
],
"status": true,
"message": "Subteams retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get team configurations
Source: https://docs.thena.ai/api-reference/mcp/teams/get-team-configurations
MCP tool to retrieve configurations for a team in the Thena platform.
### MCP tool: `get_team_configurations`
Retrieves detailed configuration settings for a specific team, including timezone settings, business hours, routing preferences, and holidays. This tool is essential for understanding how a team operates and how tickets are routed.
You must provide the team ID to retrieve its configuration settings.
### Example prompt
```prompt theme={null}
Get team configurations for team T88WCYYHPS
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_team\_configurations tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | ------------------------------------------------- |
| teamId | string | Yes | The ID of the team to retrieve configurations for |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
timezone
string
Team timezone (e.g., "America/New\_York")
teamId
string
Team unique identifier
fallbackSubTeam
string
Fallback sub team ID for routing
holidays
string\[]
Array of holiday dates
routingRespectsTimezone
boolean
Whether routing respects team timezone
routingRespectsUserTimezone
boolean
Whether routing respects user timezone
routingRespectsUserAvailability
boolean
Whether routing respects user availability
routingRespectsUserBusinessHours
boolean
Whether routing respects user business hours
userRoutingStrategy
string
User routing strategy (e.g., "ROUND\_ROBIN", "LEAST\_BUSY")
commonDailyConfig
boolean
Whether common daily business hours config is enabled
dailyConfig
object
Business hours configuration for each day
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
#### Daily config fields
The `dailyConfig` object contains business hours for each day:
Field
Type
Description
monday
object
Monday business hours
tuesday
object
Tuesday business hours
wednesday
object
Wednesday business hours
thursday
object
Thursday business hours
friday
object
Friday business hours
saturday
object
Saturday business hours
sunday
object
Sunday business hours
### Sample response
```json theme={null}
{
"data": {
"timezone": "America/New_York",
"teamId": "T88WCYYHPS",
"fallbackSubTeam": "T99WCYYHPS",
"holidays": ["2025-12-25", "2025-01-01"],
"routingRespectsTimezone": true,
"routingRespectsUserTimezone": true,
"routingRespectsUserAvailability": true,
"routingRespectsUserBusinessHours": true,
"userRoutingStrategy": "ROUND_ROBIN",
"commonDailyConfig": true,
"dailyConfig": {
"monday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"tuesday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"wednesday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"thursday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"friday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"saturday": {
"isOpen": false,
"startTime": null,
"endTime": null
},
"sunday": {
"isOpen": false,
"startTime": null,
"endTime": null
}
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
"status": true,
"message": "Team configurations retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get team routing rules
Source: https://docs.thena.ai/api-reference/mcp/teams/get-team-routing-rules
MCP tool to retrieve routing rules for a team in the Thena platform.
### MCP tool: `get_team_routing_rules`
Retrieves all routing rules configured for a specific team. These rules determine how tickets are automatically assigned and routed within the team based on various conditions and criteria.
You must provide the team ID to retrieve its routing rules.
### Example prompt
```prompt theme={null}
Get routing rules for team T88WCYYHPS
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_team\_routing\_rules tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | ------------------------------------------------ |
| teamId | string | Yes | The ID of the team to retrieve routing rules for |
### Response fields
Below are the fields you may see in each routing rule object in the response:
Field
Type
Description
id
string
Routing rule unique ID
name
string
Routing rule name
description
string
Routing rule description
teamId
string
Team ID this rule belongs to
evaluationOrder
number
Priority/order for rule evaluation
resultTeamId
string
Target team ID for routing
fallbackTeamId
string
Fallback team ID if primary routing fails
andRules
array
Array of AND conditions (all must match)
orRules
array
Array of OR conditions (any can match)
createdBy
string
Name of user who created the rule
createdById
string
ID of user who created the rule
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
#### Rule fields (andRules/orRules)
Each rule in the `andRules` and `orRules` arrays contains:
Field
Type
Description
field
string
Field to match against (e.g., "priority", "status")
operator
string
Comparison operator (e.g., "EQUALS", "CONTAINS")
value
string
Value to match against
precedence
number
Rule precedence/priority
### Sample response
```json theme={null}
{
"data": [
{
"id": "RR001",
"name": "High Priority Tickets",
"description": "Route high priority tickets to senior team",
"teamId": "T88WCYYHPS",
"evaluationOrder": 1,
"resultTeamId": "T99WCYYHPS",
"fallbackTeamId": "TAAWCYYHPS",
"andRules": [
{
"field": "priority",
"operator": "EQUALS",
"value": "high",
"precedence": 1
},
{
"field": "status",
"operator": "NOT_EQUALS",
"value": "closed",
"precedence": 2
}
],
"orRules": [
{
"field": "account",
"operator": "CONTAINS",
"value": "enterprise",
"precedence": 1
}
],
"createdBy": "John Doe",
"createdById": "USER123",
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "RR002",
"name": "Bug Reports",
"description": "Route bug reports to QA team",
"teamId": "T88WCYYHPS",
"evaluationOrder": 2,
"resultTeamId": "TBBWCYYHPS",
"fallbackTeamId": null,
"andRules": [
{
"field": "type",
"operator": "EQUALS",
"value": "bug",
"precedence": 1
}
],
"orRules": [],
"createdBy": "Jane Smith",
"createdById": "USER456",
"createdAt": "2025-07-24T08:19:10.258Z",
"updatedAt": "2025-07-24T08:19:10.258Z"
}
],
"status": true,
"message": "Team routing rules retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Introduction
Source: https://docs.thena.ai/api-reference/mcp/teams/overview
# MCP Team Tools
This section documents the Model Context Protocol (MCP) tools available for working with teams in the Thena platform. These tools allow you to retrieve, create, and manage teams, team configurations, and routing rules via Thena MCP server.
## Available tools
* [Create Team Routing Rule](./create-team-routing-rule): Create a new team routing rule.
* [Get Subteams](./get-subteams): Retrieve subteams of a parent team.
* [Get Team Configurations](./get-team-configurations): Retrieve team configurations and settings.
* [Get Team Routing Rules](./get-team-routing-rules): Retrieve routing rules for a team.
* [Search Teams](./search-teams): Search for teams using advanced filtering and query capabilities.
* [Update Team Configurations](./update-team-configurations): Update team configurations and settings.
* [Update Team Routing Rule](./update-team-routing-rule): Update an existing team routing rule.
# Search teams
Source: https://docs.thena.ai/api-reference/mcp/teams/search-teams
MCP tool to search for teams using Thena's search API with advanced filtering capabilities.
### MCP tool: `search_teams`
Searches for teams using Thena's powerful search API with advanced filtering capabilities. This tool allows you to find teams based on various criteria including name, team UID, and other team properties.
This tool uses Thena's search API which provides fast, indexed search with support for complex filters and pagination.
### Example prompt
```prompt theme={null}
Search for teams with "we" in their name
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the search\_teams tool with the correct arguments.
### Response fields
The response will contain a `result` object with the following structure:
Field
Type
Description
found
number
Total number of teams found
hits
array
Array of team objects matching the search criteria
page
number
Current page number
facet\_counts
array
Facet counts for search results
request\_params
object
Parameters used for the search request
search\_cutoff
boolean
Whether the search was cut off due to limits
#### Team object fields
Each team in the `hits` array contains a `document` object with the following fields:
Field
Type
Description
id
string
Team unique identifier
name
string
Team name
icon
string
Team icon
color
string
Team color (RGB format)
identifier
string
Team identifier/code
description
string
Team description
teamOwner
string
Team owner name
teamOwnerId
string
Team owner ID
isActive
boolean
Whether the team is active
isPrivate
boolean
Whether the team is private
createdAt
string (ISO8601)
Team creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
ticketTypes
array
Available ticket types for this team
tags
array
Team tags
priorities
array
Available ticket priorities
sentiments
array
Available ticket sentiments
statuses
array
Available ticket statuses
forms
array
Team forms
subTeams
array
Sub-teams
ticketFields
array
Custom ticket fields
isDefaultTeam
boolean
Whether this is the default team
ticketSources
array
Available ticket sources
#### Nested object fields
**Ticket Types:**
* `id`: Ticket type ID
* `name`: Ticket type name
* `icon`: Ticket type icon
* `color`: Ticket type color
* `autoAssign`: Whether tickets auto-assign
**Priorities:**
* `id`: Priority ID
* `name`: Priority name
* `description`: Priority description
* `isDefault`: Whether this is the default priority
**Sentiments:**
* `id`: Sentiment ID
* `name`: Sentiment name
* `isDefault`: Whether this is the default sentiment
**Statuses:**
* `id`: Status ID
* `name`: Status name
* `description`: Status description
* `isDefault`: Whether this is the default status
**Forms:**
* `id`: Form ID
* `name`: Form name
* `description`: Form description
* `fields`: Array of form fields
**Ticket Sources:**
* `label`: Source label
* `value`: Source value
### Sample response
```json theme={null}
{
"result": {
"found": 1,
"hits": [
{
"document": {
"id": "THETT4QZZD9PPM",
"name": "wed",
"icon": "",
"color": "rgb(155, 135, 245)",
"identifier": "WED",
"description": null,
"teamOwner": "shakthi+1",
"teamOwnerId": "UTH00SEXXFNVVN",
"isActive": true,
"isPrivate": false,
"createdAt": "2025-07-09T09:17:14.954Z",
"updatedAt": "2025-07-09T09:17:14.954Z",
"ticketTypes": [
{
"id": "9W5K7QZJ10DG45E7T1FJHHF2MM32P",
"name": "Bug",
"icon": "",
"color": "#db1f61",
"autoAssign": true
},
{
"id": "MW5K7QZJ106FT03R2JKSBDD9DTGQZ",
"name": "Feature Request",
"icon": "",
"color": "#1f74db",
"autoAssign": true
},
{
"id": "MW5K7QZJ1068644FX44KR04C6801D",
"name": "Question",
"icon": "",
"color": "#1fdb8a",
"autoAssign": true
},
{
"id": "MW5K7QZJ10QHFEJQWXBJHYPG146C3",
"name": "Task",
"icon": "",
"color": "#db7a1f",
"autoAssign": true
}
],
"tags": [],
"priorities": [
{
"id": "WQ5K7QZJ102C4JKG6XE01M2G3HEAQ",
"name": "Low",
"description": "Low priority tickets.",
"isDefault": false
},
{
"id": "GR5K7QZJ10H0300NBSAPN5CG4TN9F",
"name": "Medium",
"description": "Medium priority tickets.",
"isDefault": true
},
{
"id": "GR5K7QZJ105KWTPW1AG052HBVAPNF",
"name": "High",
"description": "High priority tickets.",
"isDefault": false
},
{
"id": "GR5K7QZJ10RPP1CQV6KG57SM7M75E",
"name": "Urgent",
"description": "Urgent priority tickets.",
"isDefault": false
}
],
"sentiments": [
{
"id": "4T5K7QZJ10MR5QR6KZZ43M5G3YKPH",
"name": "Positive",
"isDefault": false
},
{
"id": "JT5K7QZJ1047VQT6M06TMANM3D9TQ",
"name": "Negative",
"isDefault": false
},
{
"id": "JT5K7QZJ107BR5DAKC2HBC4G3NA5A",
"name": "Neutral",
"isDefault": true
}
],
"statuses": [
{
"id": "TN5K7QZJ10AXB995EXD07ZSXBYPM4",
"name": "In progress",
"description": "Tickets that are currently in progress and being worked on.",
"isDefault": false
},
{
"id": "VN5K7QZJ10CJK5E47S8TQSA19XCXA",
"name": "On hold",
"description": "Tickets that are currently on hold.",
"isDefault": false
},
{
"id": "VN5K7QZJ1042MM6W6DF59ZZAK5DTP",
"name": "Closed",
"description": "Tickets that are closed or resolved.",
"isDefault": false
},
{
"id": "YM5K7QZJ10NPP6GZXZTR1C2DB9AG3",
"name": "Open",
"description": "Tickets that are open and awaiting prioritization.",
"isDefault": true
}
],
"forms": [
{
"id": "FODDKPKKXW88L",
"name": "Default team form",
"description": "Default form for the team",
"fields": [
{
"field": "NMW047ZJ10RJHW0W5DB19SEM5W75A",
"fieldType": "thena_restricted",
"defaultValue": null,
"mandatoryOnClose": true,
"visibleToCustomer": true,
"editableByCustomer": true,
"mandatoryOnCreation": true
},
{
"field": "NMW047ZJ109W62PM4FR82YG58KXTN",
"fieldType": "thena_restricted",
"defaultValue": null,
"mandatoryOnClose": true,
"visibleToCustomer": true,
"editableByCustomer": true,
"mandatoryOnCreation": true
},
{
"field": "NMW047ZJ10D2JAMZRM4TGPMVYYG2K",
"fieldType": "thena_restricted",
"defaultValue": null,
"mandatoryOnClose": true,
"visibleToCustomer": true,
"editableByCustomer": true,
"mandatoryOnCreation": true
}
]
},
{
"id": "FOCCGUHH8GEE4",
"name": "Default team escalation form",
"description": "Default escalation form for the team",
"fields": [
{
"field": "3PW047ZJ105ENAGR1BT2NM5PG3ZM5",
"fieldType": "thena_restricted",
"defaultValue": null,
"mandatoryOnClose": false,
"visibleToCustomer": false,
"editableByCustomer": true,
"mandatoryOnCreation": true
}
]
}
],
"subTeams": [],
"ticketFields": [],
"isDefaultTeam": true,
"ticketSources": [
{
"label": "Api",
"value": "api"
},
{
"label": "Manual",
"value": "manual"
},
{
"label": "Web",
"value": "web"
}
]
}
}
],
"page": 1,
"facet_counts": [],
"request_params": {
"search_mode": "fallback",
"q": "*",
"query_by": "*",
"filter_by": "name:=we"
},
"search_cutoff": false
}
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
The search API provides fast, indexed search results. Use specific filters to narrow down results and improve performance.
Only the core team fields (name, teamUid, uid) support direct text search. Other fields require exact value matching.
***
### Notes
* Only authorized users can access this tool; results are scoped to the user's organization.
* The search API supports full-text search on team names using ILike pattern matching.
* Team UID searches require exact matches.
* Filters can be combined using AND or OR logic for complex queries.
* Boolean filters use true/false values.
* The search is case-insensitive for text fields.
* Results are paginated with a maximum of 250 items per page.
* Use the `range` operator for date ranges (e.g., "\[2024-01-01..2024-12-31]").
# Update team configurations
Source: https://docs.thena.ai/api-reference/mcp/teams/update-team-configurations
MCP tool to update configurations for a team in the Thena platform.
### MCP tool: `update_team_configurations`
Updates configuration settings for a specific team, including timezone settings, business hours, routing preferences, and holidays. This tool allows you to modify how a team operates and how tickets are routed.
You must provide the team ID and at least one configuration parameter to update.
### Example prompt
```prompt theme={null}
Update team configurations for team T88WCYYHPS with timezone "America/New_York" and enable routing that respects timezone
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_team\_configurations tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------------------- | --------- | -------- | ---------------------------------------------------- |
| teamId | string | Yes | The ID of the team to update configurations for |
| timezone | string | No | Team timezone (e.g., "America/New\_York") |
| routingRespectsTimezone | boolean | No | Whether routing rules respect the timezone |
| routingRespectsUserCapacity | boolean | No | Whether routing rules respect user capacity |
| fallbackSubTeam | string | No | The fallback sub-team ID |
| holidays | string\[] | No | Array of holiday dates (format: DD-MM or DD-MM-YYYY) |
| routingRespectsUserTimezone | boolean | No | Whether routing rules respect user timezone |
| routingRespectsUserAvailability | boolean | No | Whether routing rules respect user availability |
| userRoutingStrategy | string | No | User routing strategy ("manual" or "round\_robin") |
| commonDailyConfig | boolean | No | Whether to use common daily config |
| commonSlots | array | No | Common time slots for all days |
| dailyConfig | object | No | Day-specific configurations |
#### Time slot structure
Each time slot in `commonSlots` or `dailyConfig` contains:
| Field | Type | Description |
| ----- | ------ | -------------------------- |
| start | string | Start time in format HH:MM |
| end | string | End time in format HH:MM |
#### Daily config structure
The `dailyConfig` object contains day-specific configurations:
| Field | Type | Description |
| -------- | ------- | -------------------------------- |
| isActive | boolean | Whether this day is active |
| slots | array | Array of time slots for this day |
### Response fields
The response will contain the updated team configuration with the same structure as the `get_team_configurations` tool.
### Sample response
```json theme={null}
{
"data": {
"timezone": "America/New_York",
"teamId": "T88WCYYHPS",
"fallbackSubTeam": "T99WCYYHPS",
"holidays": ["25-12", "01-01"],
"routingRespectsTimezone": true,
"routingRespectsUserTimezone": true,
"routingRespectsUserAvailability": true,
"routingRespectsUserBusinessHours": true,
"userRoutingStrategy": "ROUND_ROBIN",
"commonDailyConfig": true,
"dailyConfig": {
"monday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"tuesday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"wednesday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"thursday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"friday": {
"isOpen": true,
"startTime": "09:00",
"endTime": "17:00"
},
"saturday": {
"isOpen": false,
"startTime": null,
"endTime": null
},
"sunday": {
"isOpen": false,
"startTime": null,
"endTime": null
}
},
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-25T12:50:38.937Z"
},
"status": true,
"message": "Team configurations updated successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool modifies team settings that affect ticket routing. Changes may impact how tickets are automatically assigned.
***
# Update team routing rule
Source: https://docs.thena.ai/api-reference/mcp/teams/update-team-routing-rule
MCP tool to update a routing rule for a team in the Thena platform.
### MCP tool: `update_team_routing_rule`
Updates an existing routing rule for a specific team. This tool allows you to modify the conditions, target team, evaluation order, and other properties of routing rules.
You must provide the team ID and rule ID to update a routing rule. All other parameters are optional.
### Example prompt
```prompt theme={null}
Update routing rule RR001 for team T88WCYYHPS to change the evaluation order to 2
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_team\_routing\_rule tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------------- | --------- | -------- | -------------------------------------------------- |
| teamId | string | Yes | The ID of the team the routing rule belongs to |
| ruleId | string | Yes | The ID of the routing rule to update |
| name | string | No | The name of the routing rule group |
| resultTeamId | string | No | The ID of the team that tickets will be routed to |
| description | string | No | The description of the routing rule group |
| evaluationOrder | number | No | The order in which this rule should be evaluated |
| andRules | string\[] | No | Rules that must all match (AND condition) |
| orRules | string\[] | No | Rules where any match is sufficient (OR condition) |
### Response fields
The response will contain the updated routing rule with the same structure as the `get_team_routing_rules` tool:
Field
Type
Description
id
string
Routing rule unique ID
name
string
Routing rule name
description
string
Routing rule description
teamId
string
Team ID this rule belongs to
evaluationOrder
number
Priority/order for rule evaluation
resultTeamId
string
Target team ID for routing
fallbackTeamId
string
Fallback team ID if primary routing fails
andRules
array
Array of AND conditions (all must match)
orRules
array
Array of OR conditions (any can match)
createdBy
string
Name of user who created the rule
createdById
string
ID of user who created the rule
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
### Sample response
```json theme={null}
{
"data": {
"id": "RR001",
"name": "High Priority Tickets",
"description": "Updated: Route high priority tickets to senior team",
"teamId": "T88WCYYHPS",
"evaluationOrder": 2,
"resultTeamId": "T99WCYYHPS",
"fallbackTeamId": null,
"andRules": [
{
"field": "priority",
"operator": "EQUALS",
"value": "high",
"precedence": 1
},
{
"field": "status",
"operator": "NOT_EQUALS",
"value": "closed",
"precedence": 2
},
{
"field": "type",
"operator": "NOT_EQUALS",
"value": "bug",
"precedence": 3
}
],
"orRules": [
{
"field": "account",
"operator": "CONTAINS",
"value": "enterprise",
"precedence": 1
}
],
"createdBy": "John Doe",
"createdById": "USER123",
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-25T12:50:38.937Z"
},
"status": true,
"message": "Team routing rule updated successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool modifies existing routing rules that affect ticket assignment. Changes may impact how tickets are automatically assigned.
***
# Assign ticket
Source: https://docs.thena.ai/api-reference/mcp/tickets/assign-ticket
MCP tool to assign a ticket to a specific agent in the Thena platform.
### MCP tool: `assign_ticket`
Assigns a ticket to a specific agent. Useful for ticket routing, workload balancing, or manual assignment.
You must provide both the ticket ID and the agent ID.
### Example prompt
```prompt theme={null}
Assign ticket 71XNF90K10YBR86G1AN06KZJJFX40 to agent URR9A99BDJ
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the assign\_ticket tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| --------------- | ------ | -------- | ------------------------------------------- |
| id | string | Yes | The ID of the ticket to assign |
| assignedAgentId | string | Yes | The ID of the agent to assign the ticket to |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Ticket unique ID
ticketId
number
Ticket number
title
string
Ticket title
description
string
Ticket description
status
string
Current status
priority
string
Priority
account
string
Account name
accountId
string
Account ID
teamId
string
Team ID
teamName
string
Team name
assignedAgent
string
Assigned agent name
assignedAgentId
string
Assigned agent ID
assignedAgentEmail
string
Assigned agent email
requestorEmail
string
Requestor email
submitterEmail
string
Submitter email
statusId
string
Status ID
priorityId
string
Priority ID
sentimentId
string
Sentiment ID
sentiment
string
Sentiment
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
Other top-level fields in the response:
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | object | The updated ticket object |
| status | boolean | Whether the assignment succeeded |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
### Sample response
```json theme={null}
{
"data": {
"id": "71XNF90K10YBR86G1AN06KZJJFX40",
"ticketId": 1,
"title": "Sample Support Ticket",
"description": "This is a sample ticket created to demonstrate the ticket creation process.",
"source": "api",
"status": "In progress",
"priority": "Medium",
"account": "test",
"accountId": "8PBKJHXJ10YPPEHTQ0682FSNFNAYG",
"teamId": "T88WCYYHPS",
"teamName": "ENG",
"teamIdentifier": "ENG",
"ticketIdentifier": "ENG-1",
"subTeamId": "T88WCYYHPS",
"subTeamName": "ENG",
"subTeamIdentifier": "ENG",
"isPrivate": false,
"formId": "FOCCF4KKYBR",
"assignedAgent": "John",
"assignedAgentId": "URR9A99BDJ",
"assignedAgentEmail": "john.doe@thena.ai",
"assignedAgentAvatar": null,
"requestorEmail": "user@example.com",
"submitterEmail": "user@example.com",
"customFieldValues": [],
"customerContactId": "N0XNF90K10J023R4483XEM0JMD881",
"customerContactFirstName": "User",
"customerContactLastName": "",
"customerContactEmail": "user@example.com",
"statusId": "XKNKDHSJ10YZXC0EMG11F7TQWZRQS",
"priorityId": "0MNKDHSJ106YNEQ19AKG4C1VZQS6G",
"sentimentId": "4MNKDHSJ10HTNG1C7XD40HBANC03Y",
"sentiment": "Neutral",
"storyPoints": null,
"aiGeneratedTitle": null,
"aiGeneratedSummary": null,
"createdAt": "2025-07-16T11:24:53.157Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
"status": true,
"message": "Ticket assigned successfully!",
"timestamp": "2025-07-24T07:19:10.302Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Create ticket
Source: https://docs.thena.ai/api-reference/mcp/tickets/create-ticket
MCP tool to create a new ticket in the Thena platform.
### MCP tool: `create_ticket`
Creates a new ticket in the Thena platform. Useful for support, issue tracking, or workflow automation.
The required fields are title, requestorEmail, and teamId. All other fields are optional.
### Example prompt
```prompt theme={null}
Create a ticket titled "Sample Support Request - Login Issues" for user john.doe@example.com in the ENG team.
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_ticket tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------ | --------- | -------- | --------------------------------------- |
| title | string | Yes | The title of the ticket |
| requestorEmail | string | Yes | The email of the requestor |
| teamId | string | Yes | The team ID to create the ticket in |
| description | string | No | The description of the ticket |
| accountId | string | No | The ID of the account |
| assignedAgentId | string | No | The ID of the assigned agent |
| assignedAgentEmail | string | No | The email of the assigned agent |
| dueDate | string | No | The due date of the ticket (ISO format) |
| submitterEmail | string | No | The email of the submitter |
| statusId | string | No | The ID of the status |
| statusName | string | No | The name of the status |
| priorityId | string | No | The ID of the priority |
| priorityName | string | No | The name of the priority |
| sentimentId | string | No | The ID of the sentiment |
| metadata | object | No | Additional metadata |
| typeId | string | No | The ID of the ticket type |
| isPrivate | boolean | No | Whether the ticket is private |
| source | string | No | The source of the ticket |
| aiGeneratedTitle | string | No | AI generated title |
| aiGeneratedSummary | string | No | AI generated summary |
| attachmentUrls | string\[] | No | URLs of attachments |
| customFieldValues | array | No | Custom field values |
| performRouting | boolean | No | Whether to perform routing |
| formId | string | No | The ID of the form |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
id
string
Ticket unique ID
ticketId
number
Ticket number
title
string
Ticket title
description
string
Ticket description
status
string
Current status
priority
string
Priority
account
string
Account name
accountId
string
Account ID
teamId
string
Team ID
teamName
string
Team name
ticketIdentifier
string
Ticket identifier
isPrivate
boolean
Whether the ticket is private
formId
string
Form ID
requestorEmail
string
Requestor email
submitterEmail
string
Submitter email
customFieldValues
array
Custom field values
customerContactId
string
Customer contact ID
customerContactFirstName
string
Customer contact first name
customerContactLastName
string
Customer contact last name
customerContactEmail
string
Customer contact email
sentimentId
string
Sentiment ID
sentiment
string
Sentiment
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
Other top-level fields in the response:
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | object | The created ticket object |
| status | boolean | Whether the creation succeeded |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
***
### Sample response
```json theme={null}
{
"data": {
"id": "4T62TX0K104VT3S3W9AYN99C6DDVY",
"ticketId": 3,
"title": "Sample Support Request - Login Issues",
"description": "Customer is experiencing difficulty logging into their account. They report receiving an \"invalid credentials\" error message even though they're certain their password is correct. This started happening after the recent system update. Customer has tried resetting password but the issue persists.",
"status": "Open",
"priority": "Medium",
"account": "test",
"accountId": "8PBKJHXJ10YPPEHTQ0682FSNFNAYG",
"teamId": "T88WCYYHPS",
"teamName": "ENG",
"teamIdentifier": "ENG",
"ticketIdentifier": "ENG-3",
"subTeamId": "T88WCYYHPS",
"subTeamName": "ENG",
"subTeamIdentifier": "ENG",
"isPrivate": false,
"formId": "FOCCF4KKYBR",
"requestorEmail": "john.doe@example.com",
"submitterEmail": "john.doe@example.com",
"customFieldValues": [],
"customerContactId": "MS62TX0K10A80KRD8N9JN99THJM3Y",
"customerContactFirstName": "John",
"customerContactLastName": "Doe",
"customerContactEmail": "john.doe@example.com",
"sentimentId": "4MNKDHSJ10HTNG1C7XD40HBANC03Y",
"sentiment": "Neutral",
"createdAt": "2025-07-24T08:51:10.785Z",
"updatedAt": "2025-07-24T08:51:10.785Z"
},
"status": true,
"message": "Ticket created successfully",
"timestamp": "2025-07-24T08:51:10.824Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Create ticket comment
Source: https://docs.thena.ai/api-reference/mcp/tickets/create-ticket-comment
MCP tool to add a comment to a ticket in the Thena platform.
### MCP tool: `create_ticket_comment`
Adds a comment to a ticket in the Thena platform. Useful for collaboration, support, and ticket updates.
The required fields are id (ticket ID) and content (comment text). All other fields are optional.
### Example prompt
```prompt theme={null}
Add a comment "Thank you for reporting this database connection timeout issue. I've escalated this to our database team for investigation. Expected resolution timeframe: 24-48 hours." to ticket SY7BWX0K10YKRDE5FAHNBHFBS986H
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_ticket\_comment tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---------------------- | --------- | -------- | ------------------------------------- |
| id | string | Yes | The ID of the ticket to comment on |
| content | string | Yes | The content of the comment |
| contentHtml | string | No | The HTML content of the comment |
| contentJson | string | No | The JSON content of the comment |
| threadName | string | No | The name of the comment thread |
| parentCommentId | string | No | The ID of the parent comment |
| commentVisibility | string | No | Comment visibility (e.g., "public") |
| commentType | string | No | Type of comment (e.g., "comment") |
| customerEmail | string | No | The email of the customer |
| metadata | object | No | Additional metadata |
| attachmentIds | string\[] | No | IDs of attachments |
| impersonatedUserEmail | string | No | Email of impersonated user |
| impersonatedUserName | string | No | Name of impersonated user |
| impersonatedUserAvatar | string | No | Avatar of impersonated user |
| shouldSendEmail | boolean | No | Whether to send an email notification |
| createdAt | string | No | Creation timestamp (ISO8601) |
### Response fields
Below are the fields you may see in the response:
| Field | Type | Description |
| ---------------------- | ------- | ------------------------------------- |
| id | string | Comment unique ID |
| content | string | Comment text |
| contentHtml | string | HTML content |
| contentMarkdown | string | Markdown content |
| contentJson | string | JSON content |
| isEdited | boolean | Whether the comment was edited |
| threadName | string | Thread name |
| commentVisibility | string | Comment visibility |
| commentType | string | Type of comment |
| isPinned | boolean | Whether the comment is pinned |
| sourceEmailId | string | Source email ID |
| metadata | object | Metadata (e.g., mentions) |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
| author | string | Author username or email |
| authorAvatarUrl | string | Author avatar URL |
| attachments | array | List of attachment objects |
| authorId | string | Author user ID |
| authorUserType | string | Author user type (e.g., "ORG\_ADMIN") |
| impersonatedUserEmail | string | Impersonated user email |
| impersonatedUserName | string | Impersonated user name |
| impersonatedUserAvatar | string | Impersonated user avatar |
| deletedAt | string | Deletion timestamp (if deleted) |
Other top-level fields in the response:
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | object | The created comment object |
| status | boolean | Whether the creation succeeded |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
***
### Sample response
```json theme={null}
{
"data": {
"id": "SY7BWX0K10YKRDE5FAHNBHFBS986H",
"content": "Thank you for reporting this database connection timeout issue. I've escalated this to our database team for investigation. Expected resolution timeframe: 24-48 hours.",
"contentHtml": "",
"contentMarkdown": "Thank you for reporting this database connection timeout issue. I've escalated this to our database team for investigation. Expected resolution timeframe: 24-48 hours.",
"contentJson": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"attrs\":{\"textAlign\":\"left\"}}]}",
"isEdited": false,
"threadName": null,
"commentVisibility": "public",
"commentType": "comment",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": []
},
"createdAt": "2025-07-24T09:31:03.888Z",
"updatedAt": "2025-07-24T09:31:03.887Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"attachments": [],
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
},
"status": true,
"message": "Comment created successfully!",
"timestamp": "2025-07-24T09:31:04.071Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get ticket comments
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-ticket-comments
MCP tool to retrieve all comments for a specific ticket in the Thena platform.
### MCP tool: `get_ticket_comments`
Retrieves all comments for a specific ticket in the Thena platform. Useful for support, collaboration, and audit trails.
You must provide the ticket id.
### Example prompt
```prompt theme={null}
Show me all comments for ticket SY7BWX0K10YKRDE5FAHNBHFBS986H
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_ticket\_comments tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---- | ------ | -------- | ------------------------------------------ |
| id | string | Yes | The ID of the ticket to fetch comments for |
### Response fields
Below are the fields you may see in a ticket comment result:
| Field | Type | Description |
| ---------------------- | ------- | ---------------------------------------- |
| id | string | Comment unique ID |
| content | string | Comment text |
| contentHtml | string | HTML content |
| contentMarkdown | string | Markdown content |
| contentJson | string | JSON content |
| isEdited | boolean | Whether the comment was edited |
| threadName | string | Thread name |
| commentVisibility | string | Comment visibility |
| commentType | string | Type of comment |
| isPinned | boolean | Whether the comment is pinned |
| sourceEmailId | string | Source email ID |
| metadata | object | Metadata (e.g., mentions, userReactions) |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
| author | string | Author username or email |
| authorAvatarUrl | string | Author avatar URL |
| attachments | array | List of attachment objects |
| authorId | string | Author user ID |
| authorUserType | string | Author user type (e.g., "ORG\_ADMIN") |
| impersonatedUserEmail | string | Impersonated user email |
| impersonatedUserName | string | Impersonated user name |
| impersonatedUserAvatar | string | Impersonated user avatar |
| deletedAt | string | Deletion timestamp (if deleted) |
Other top-level fields in the response:
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | array | List of comment objects |
| status | boolean | Whether the request was successful |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
***
### Sample response
```json theme={null}
{
"data": [
{
"id": "SY7BWX0K10YKRDE5FAHNBHFBS986H",
"content": "Thank you for reporting this database connection timeout issue. I've escalated this to our database team for investigation. Expected resolution timeframe: 24-48 hours.",
"contentHtml": "",
"contentMarkdown": "Thank you for reporting this database connection timeout issue. I've escalated this to our database team for investigation. Expected resolution timeframe: 24-48 hours.",
"contentJson": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"attrs\":{\"textAlign\":\"left\"}}]}",
"isEdited": false,
"threadName": null,
"commentVisibility": "public",
"commentType": "comment",
"isPinned": false,
"sourceEmailId": null,
"metadata": {
"mentions": [],
"userReactions": []
},
"createdAt": "2025-07-24T09:31:03.888Z",
"updatedAt": "2025-07-24T09:31:03.887Z",
"author": "shakthi+1",
"authorAvatarUrl": null,
"attachments": [],
"authorId": "UTH00SEXXFNVVN",
"authorUserType": "ORG_ADMIN",
"impersonatedUserEmail": null,
"impersonatedUserName": null,
"impersonatedUserAvatar": null,
"deletedAt": null
}
],
"status": true,
"message": "Comments fetched successfully!",
"timestamp": "2025-07-24T11:32:32.215Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get ticket priorities
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-ticket-priorities
MCP tool to retrieve all possible ticket priorities from the Thena platform, optionally filtered by team.
### MCP tool: `get_ticket_priorities`
Retrieves all possible priorities for tickets in the Thena platform, optionally filtered by team. Useful for building priority dropdowns, validating ticket creation, or analytics.
If no teamId is provided, the tool returns all priorities available to the user.
### Example prompt
```prompt theme={null}
Show me all ticket priorities for team THEWWYV55X0JJL
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_ticket\_priorities tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | ------------------------------------------ |
| teamId | string | No | The team ID to fetch ticket priorities for |
### Response fields
Below are the fields you may see in a ticket priority result:
| Field | Type | Description |
| -------------- | ------- | -------------------------------- |
| id | string | Unique priority ID |
| name | string | Priority name (e.g., "High") |
| displayName | string | Display name for the priority |
| description | string | Description of the priority |
| teamId | string | Team ID this priority belongs to |
| organizationId | string | Organization ID |
| isDefault | boolean | Whether this is the default |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
Other top-level fields in the response:
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | array | List of ticket priority objects |
| status | boolean | Whether the request was successful |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
### Sample response
```json theme={null}
{
"data": [
{
"id": "MA4VETZJ105PJDAZS2KBVVRPPQXDE",
"name": "Low",
"displayName": "Low",
"description": "Low priority tickets.",
"teamId": "THEWWYV55X0JJL",
"organizationId": "ETHPPX4JJ21NNJ",
"isDefault": false,
"createdAt": "2025-07-10T15:21:39.373Z",
"updatedAt": "2025-07-10T15:21:39.373Z"
},
{
"id": "NA4VETZJ101R0M4M13T86JQXB2JXC",
"name": "Medium",
"displayName": "Medium",
"description": "Medium priority tickets.",
"teamId": "THEWWYV55X0JJL",
"organizationId": "ETHPPX4JJ21NNJ",
"isDefault": true,
"createdAt": "2025-07-10T15:21:39.373Z",
"updatedAt": "2025-07-10T15:21:39.373Z"
},
{
"id": "NA4VETZJ10MXCXEDAXBVRZYG5SFSE",
"name": "High",
"displayName": "High",
"description": "High priority tickets.",
"teamId": "THEWWYV55X0JJL",
"organizationId": "ETHPPX4JJ21NNJ",
"isDefault": false,
"createdAt": "2025-07-10T15:21:39.373Z",
"updatedAt": "2025-07-10T15:21:39.373Z"
},
{
"id": "NA4VETZJ100VS1F416QJM1ED93SEQ",
"name": "Urgent",
"displayName": "Urgent",
"description": "Urgent priority tickets.",
"teamId": "THEWWYV55X0JJL",
"organizationId": "ETHPPX4JJ21NNJ",
"isDefault": false,
"createdAt": "2025-07-10T15:21:39.373Z",
"updatedAt": "2025-07-10T15:21:39.373Z"
}
],
"status": true,
"message": "Ticket priorities fetched successfully!",
"timestamp": "2025-07-24T10:16:10.535Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get ticket statuses
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-ticket-statuses
MCP tool to retrieve all possible ticket statuses from the Thena platform, optionally filtered by team.
### MCP tool: `get_ticket_statuses`
Retrieves all possible statuses for tickets in the Thena platform, optionally filtered by team. Useful for building status dropdowns, validating ticket state transitions, or analytics.
If no teamId is provided, the tool returns all statuses available to the user.
### Example prompt
```prompt theme={null}
Show me all ticket statuses for team T88WCYYHPS
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_ticket\_statuses tool with the correct arguments.
#### Example prompt (all statuses, no teamId)
```prompt theme={null}
Show me all ticket statuses
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | ---------------------------------------- |
| teamId | string | No | The team ID to fetch ticket statuses for |
### Response fields
Below are the fields you may see in a ticket status result:
Field
Type
Description
id
string
Unique status ID
name
string
Status name (e.g., "Open")
displayName
string
Display name for the status
description
string
Description of the status
isDefault
boolean
Whether this is the default status
teamId
string
Team ID this status belongs to
organizationId
string
Organization ID this status belongs to
createdAt
string (ISO8601)
Creation timestamp
updatedAt
string (ISO8601)
Last update timestamp
Other top-level fields in the response:
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | array | List of ticket status objects |
| status | boolean | Whether the request was successful |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
### Sample response
```json theme={null}
{
"data": [
{
"id": "XKNKDHSJ1058098FSEG2NHBSD19BT",
"name": "Open",
"displayName": "Open",
"description": "Tickets that are open and awaiting prioritization.",
"isDefault": true,
"teamId": "T88WCYYHPS",
"organizationId": "EYYYXCC853",
"createdAt": "2025-04-23T13:32:45.551Z",
"updatedAt": "2025-04-23T13:32:45.551Z"
},
{
"id": "XKNKDHSJ10YZXC0EMG11F7TQWZRQS",
"name": "In progress",
"displayName": "In progress",
"description": "Tickets that are currently in progress and being worked on.",
"isDefault": false,
"teamId": "T88WCYYHPS",
"organizationId": "EYYYXCC853",
"createdAt": "2025-04-23T13:32:45.551Z",
"updatedAt": "2025-04-23T13:32:45.551Z"
},
{
"id": "XKNKDHSJ10MD9M1JQTKJGXFJK836Q",
"name": "On hold",
"displayName": "On hold",
"description": "Tickets that are currently on hold.",
"isDefault": false,
"teamId": "T88WCYYHPS",
"organizationId": "EYYYXCC853",
"createdAt": "2025-04-23T13:32:45.551Z",
"updatedAt": "2025-04-23T13:32:45.551Z"
},
{
"id": "XKNKDHSJ10ZXBHEXAEPG2KZZSX8JN",
"name": "Closed",
"displayName": "Closed",
"description": "Tickets that are closed or resolved.",
"isDefault": false,
"teamId": "T88WCYYHPS",
"organizationId": "EYYYXCC853",
"createdAt": "2025-04-23T13:32:45.551Z",
"updatedAt": "2025-04-23T13:32:45.551Z"
}
],
"status": true,
"message": "Ticket statuses fetched successfully!",
"timestamp": "2025-07-24T07:13:55.252Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get tickets analytics by account
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-tickets-analytics-by-account
MCP tool to get aggregated ticket analytics data grouped by account for a specific date range.
### MCP tool: `get_tickets_analytics_by_account`
Get aggregated ticket analytics data grouped by account for a specific date range.
This tool provides aggregated analytics data, not individual ticket details. Use the search\_tickets tool for finding specific tickets.
### Example prompt
```prompt theme={null}
Get ticket analytics by account for the last 30 days
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_tickets\_analytics\_by\_account tool with the correct arguments.
### Parameters
Parameter
Type
Required
Description
dateRange
object
Yes
Inclusive date range to aggregate over
dateRange.startDate
string
Yes
Start date in YYYY-MM-DD format
dateRange.endDate
string
Yes
End date in YYYY-MM-DD format
teamIds
array
No
Optional array of team IDs to filter by
includeArchivedTickets
boolean
No
Include archived tickets (default: false)
includeTicketMetadata
boolean
No
Include minimal ticket metadata for drill-down (default: false)
metadataPage
number
No
Page number for metadata pagination (1-based, only used when includeTicketMetadata is true)
metadataLimit
number
No
Limit for metadata results per page (max 200, only used when includeTicketMetadata is true)
### Response fields
The response will contain aggregated analytics data with the following structure:
Field
Type
Description
aggregationType
string
Type of aggregation performed ("account")
totalTickets
number
Total number of tickets in the date range
totalFound
number
Total number of tickets found matching criteria
dateRange
object
The date range used for the analysis
includeArchivedTickets
boolean
Whether archived tickets were included
includeTicketMetadata
boolean
Whether ticket metadata was included
aggregatedData
array
Array of account-based analytics objects
#### Account analytics object fields
Each account in the `aggregatedData` array contains:
Field
Type
Description
accountId
string
Account unique identifier
accountName
string
Account name
accountPrimaryDomain
string
Account primary domain
accountSource
string
Account source
ticketCount
number
Number of tickets for this account
teamBreakdown
object
Breakdown by team with detailed metrics
#### Team breakdown fields
Each team in the `teamBreakdown` object contains:
Field
Type
Description
teamId
string
Team unique identifier
teamName
string
Team name
ticketCount
number
Number of tickets for this team
percentage
number
Percentage of total tickets
statusBreakdown
object
Breakdown by ticket status with counts and percentages
priorityBreakdown
object
Breakdown by ticket priority with counts and percentages
assigneeBreakdown
object
Breakdown by assignee with counts and percentages
### Sample response
```json theme={null}
{
"aggregationType": "account",
"totalTickets": 2,
"totalFound": 2,
"dateRange": {
"startDate": "2025-01-01",
"endDate": "2025-09-16"
},
"includeArchivedTickets": false,
"includeTicketMetadata": false,
"aggregatedData": [
{
"accountId": "CDN7BH2K1020181NADAYN2NJG6GSF",
"accountName": "Acme Corp",
"accountPrimaryDomain": "acme.com",
"accountSource": "Website",
"ticketCount": 2,
"teamBreakdown": {
"THEVVHPCCER33E": {
"teamId": "THEVVHPCCER33E",
"teamName": "Engineering",
"ticketCount": 2,
"statusBreakdown": {
"Open": {
"ticketCount": 2,
"statusId": "3SC6BH2K10X5BSCXF2MFWVYZVYNFX",
"percentage": 100
}
},
"priorityBreakdown": {
"Urgent": {
"ticketCount": 1,
"priorityId": "CSC6BH2K100SATQR0ZS6KHBW1DFPK",
"percentage": 50
},
"Medium": {
"ticketCount": 1,
"priorityId": "CSC6BH2K10XR2ZVVY84VV8506YN80",
"percentage": 50
}
},
"assigneeBreakdown": {
"John Doe": {
"ticketCount": 2,
"assigneeId": "UTHOOQNUUXZQQ3",
"assigneeName": "John Doe",
"percentage": 100
}
},
"percentage": 100
}
}
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool is optimized for analytics and reporting. For individual ticket operations, use the search\_tickets or other ticket management tools.
The date range must be valid and startDate must be less than or equal to endDate. Use ISO 8601 date format (YYYY-MM-DD).
***
# Get tickets analytics by assignee
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-tickets-analytics-by-assignee
MCP tool to fetch comprehensive assignee performance metrics and ticket analytics for a specified date range.
### MCP tool: `get_tickets_analytics_by_assignee`
Fetch comprehensive assignee performance metrics and ticket analytics for a specified date range.
This tool provides aggregated analytics data for assignee performance analysis, not individual ticket details. Use the search\_tickets tool for finding specific tickets.
### Example prompt
```prompt theme={null}
Get assignee performance analytics for the last month
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_tickets\_analytics\_by\_assignee tool with the correct arguments.
### Parameters
Parameter
Type
Required
Description
dateRange
object
Yes
Inclusive date range to aggregate over
dateRange.startDate
string
Yes
Start date in YYYY-MM-DD format
dateRange.endDate
string
Yes
End date in YYYY-MM-DD format
includeArchivedTickets
boolean
No
Include archived tickets (default: false)
includeTicketMetadata
boolean
No
Include minimal ticket metadata for drill-down (default: true)
teamIds
array
No
Optional array of team IDs to filter by
metadataPage
number
No
Page number for metadata pagination (default: 1)
metadataLimit
number
No
Limit for metadata results per page (default: 25)
### Response fields
The response will contain aggregated analytics data with the following structure:
Field
Type
Description
aggregationType
string
Type of aggregation performed ("assignee")
totalTickets
number
Total number of tickets in the date range
totalFound
number
Total number of tickets found matching criteria
dateRange
object
The date range used for the analysis
includeArchivedTickets
boolean
Whether archived tickets were included
includeTicketMetadata
boolean
Whether ticket metadata was included
aggregatedData
array
Array of team-based analytics objects with assignee breakdowns
#### Team analytics object fields
Each team in the `aggregatedData` array contains:
Field
Type
Description
teamId
string
Team unique identifier
teamName
string
Team name
total
number
Total number of tickets for this team
ticketCount
number
Number of tickets for this team
assignees
object
Detailed assignee breakdown with nested analytics
percentage
number
Percentage of total tickets
#### Assignee breakdown fields
Each assignee in the `assignees` object contains:
Field
Type
Description
assigneeId
string
Assignee unique identifier
assigneeName
string
Assignee name
assigneeEmail
string
Assignee email address
ticketCount
number
Number of tickets assigned to this assignee
percentage
number
Percentage of team tickets
statusBreakdown
object
Status breakdown for this assignee's tickets
priorityBreakdown
object
Priority breakdown for this assignee's tickets
sentimentBreakdown
object
Sentiment breakdown for this assignee's tickets
#### Status/Priority/Sentiment breakdown fields
Each status, priority, or sentiment in the breakdowns contains:
Field
Type
Description
ticketCount
number
Number of tickets with this status/priority/sentiment
percentage
number
Percentage of assignee's tickets
statusId/priorityId/sentimentId
string
Unique identifier for the status/priority/sentiment
### Sample response
```json theme={null}
{
"aggregationType": "assignee",
"totalTickets": 2,
"totalFound": 2,
"dateRange": {
"startDate": "2025-01-01",
"endDate": "2025-09-16"
},
"includeArchivedTickets": false,
"includeTicketMetadata": false,
"aggregatedData": [
{
"teamId": "THEVVHPCCER33E",
"teamName": "Engineering",
"total": 2,
"ticketCount": 2,
"assignees": {
"John Doe": {
"assigneeId": "UTHOOQNUUXZQQ3",
"assigneeName": "John Doe",
"assigneeEmail": "john.doe@thena.ai",
"ticketCount": 2,
"percentage": 100,
"statusBreakdown": {
"Open": {
"ticketCount": 2,
"percentage": 100,
"statusId": "3SC6BH2K10X5BSCXF2MFWVYZVYNFX"
}
},
"priorityBreakdown": {
"Urgent": {
"ticketCount": 1,
"percentage": 50,
"priorityId": "CSC6BH2K100SATQR0ZS6KHBW1DFPK"
},
"Medium": {
"ticketCount": 1,
"percentage": 50,
"priorityId": "CSC6BH2K10XR2ZVVY84VV8506YN80"
}
},
"sentimentBreakdown": {
"Neutral": {
"ticketCount": 1,
"percentage": 50,
"sentimentId": "MSC6BH2K1052GKT05M6QTFZVTPQ3S"
},
"Negative": {
"ticketCount": 1,
"percentage": 50,
"sentimentId": "MSC6BH2K10CBVVTXD3Y6J5AC3X8R2"
}
}
}
},
"percentage": 100
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool is optimized for performance analysis and workload distribution assessment. The default behavior includes ticket metadata for drill-down analysis.
The date range must be valid and startDate must be less than or equal to endDate. Use ISO 8601 date format (YYYY-MM-DD).
***
# Get tickets analytics by custom fields
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-tickets-analytics-by-custom-fields
MCP tool to get aggregated ticket analytics data grouped by custom fields for a specific date range and team.
### MCP tool: `get_tickets_analytics_by_custom_fields`
Get aggregated ticket analytics data grouped by custom fields for a specific date range and team.
This tool provides aggregated analytics data based on custom field values, not individual ticket details. Use the search\_tickets tool for finding specific tickets.
### Example prompt
```prompt theme={null}
Get ticket analytics by custom fields for the last quarter
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_tickets\_analytics\_by\_custom\_fields tool with the correct arguments.
### Parameters
Parameter
Type
Required
Description
dateRange
object
Yes
Inclusive date range to aggregate over
dateRange.startDate
string
Yes
Start date in YYYY-MM-DD format
dateRange.endDate
string
Yes
End date in YYYY-MM-DD format
teamIds
string
No
Team ID to filter by (optional)
customFieldUids
string
Yes
Custom field UID(s) to aggregate by. Can be a single UID or comma-separated list of UIDs (e.g., "uid1" or "uid1,uid2,uid3")
includeArchivedTickets
boolean
No
Include archived tickets (default: false)
includeTicketMetadata
boolean
No
Include minimal ticket metadata for drill-down (default: false)
metadataPage
number
No
Page number for metadata pagination (1-based, only used when includeTicketMetadata is true)
metadataLimit
number
No
Limit for metadata results per page (max 500, only used when includeTicketMetadata is true)
### Response fields
The response will contain aggregated analytics data with the following structure:
Field
Type
Description
aggregationType
string
Type of aggregation performed ("custom\_fields")
totalTickets
number
Total number of tickets in the date range
totalFound
number
Total number of tickets found matching criteria
dateRange
object
The date range used for the analysis
includeArchivedTickets
boolean
Whether archived tickets were included
includeTicketMetadata
boolean
Whether ticket metadata was included
aggregatedData
array
Array of team-based analytics objects with custom field breakdowns
#### Team analytics object fields
Each team in the `aggregatedData` array contains:
Field
Type
Description
teamId
string
Team unique identifier
teamName
string
Team name
totalTicketsWithCustomFields
number
Total number of tickets with custom fields
customFieldsBreakdown
array
Array of custom field breakdown objects
#### Custom field breakdown fields
Each custom field in the `customFieldsBreakdown` array contains:
Field
Type
Description
customFieldUid
string
Custom field unique identifier
customFieldName
string
Custom field name
fieldType
string
Type of custom field (e.g., "date", "text", "number")
totalTicketsWithField
number
Total number of tickets with this custom field
values
array
Array of custom field value objects
#### Custom field value object fields
Each value in the `values` array contains:
Field
Type
Description
value
array
Array containing the actual field value
ticketCount
number
Number of tickets with this value
percentage
number
Percentage of total tickets
statusBreakdown
object
Breakdown by ticket status with counts and percentages
metadata
object
Optional ticket metadata with pagination info and ticket details
### Sample response
```json theme={null}
{
"aggregationType": "custom_fields",
"totalTickets": 61,
"totalFound": 61,
"dateRange": {
"startDate": "2025-01-01",
"endDate": "2025-09-16"
},
"includeArchivedTickets": false,
"includeTicketMetadata": true,
"aggregatedData": [
{
"teamId": "TRRCG55TRK",
"teamName": "Engineering",
"totalTicketsWithCustomFields": 61,
"customFieldsBreakdown": [
{
"customFieldUid": "CF33CGNNDCX",
"customFieldName": "Due Date",
"fieldType": "date",
"totalTicketsWithField": 61,
"values": [
{
"value": [
{
"value": "2025-09-04T18:30:00.000Z"
}
],
"ticketCount": 1,
"percentage": 1.6,
"statusBreakdown": {
"Resolved": {
"ticketCount": 1,
"percentage": 100,
"statusId": "VYSFR7XJ10BFV3ZVVAG2HG4G35ENE"
}
},
"metadata": {
"total": 1,
"page": 1,
"limit": 50,
"totalPages": 1,
"tickets": [
{
"uid": "VST3DC4K10KHFTM58AMPG051EFY86",
"title": "Multiple channels in account metadata",
"description": "",
"createdAt": "2025-09-05T07:40:34.489337+00:00",
"updatedAt": "2025-09-12T08:19:02.649333+00:00",
"teamId": "TRRCG55TRK",
"teamName": "Engineering",
"statusId": "VYSFR7XJ10BFV3ZVVAG2HG4G35ENE",
"statusName": "Resolved",
"assigneeId": "UTTFIEEMOB",
"assigneeName": "John Doe",
"priorityId": "EZ8VSHRJ10Y0204YMQSVVC540JH6Q",
"priorityName": "Urgent",
"sentimentId": "GZ8VSHRJ105D86K405FZXZS40843Z",
"sentimentName": "Neutral"
}
]
}
},
{
"value": [
{
"value": "2025-09-07T18:30:00.000Z"
}
],
"ticketCount": 11,
"percentage": 18,
"statusBreakdown": {
"Resolved": {
"ticketCount": 10,
"percentage": 90.9,
"statusId": "VYSFR7XJ10BFV3ZVVAG2HG4G35ENE"
},
"Verify with customer": {
"ticketCount": 1,
"percentage": 9.1,
"statusId": "7KCER7XJ10QW0NAM3X86PW458AQ02"
}
},
"metadata": {
"total": 11,
"page": 1,
"limit": 50,
"totalPages": 1,
"tickets": [
{
"uid": "9JXC474K10QJQ46KTZYAKDBZV3SPQ",
"title": "Add isPrivate to true for all orgs except thena in apps platform",
"description": "",
"createdAt": "2025-09-03T06:32:02.887569+00:00",
"updatedAt": "2025-09-09T09:59:57.089136+00:00",
"teamId": "TRRCG55TRK",
"teamName": "Engineering",
"statusId": "VYSFR7XJ10BFV3ZVVAG2HG4G35ENE",
"statusName": "Resolved",
"assigneeId": "U11QF339UH",
"assigneeName": "Jane Smith",
"priorityId": "DZ8VSHRJ102QW2P9AKXW0025F3YAH",
"priorityName": "Medium",
"sentimentId": "GZ8VSHRJ105D86K405FZXZS40843Z",
"sentimentName": "Neutral"
}
]
}
}
]
}
]
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool is optimized for custom field analysis and data distribution pattern understanding. Multiple custom field UIDs can be provided as a comma-separated list.
The date range must be valid and startDate must be less than or equal to endDate. Use ISO 8601 date format (YYYY-MM-DD). Custom field UIDs must be valid and exist in the system.
***
# Get tickets analytics by standard fields
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-tickets-analytics-by-standard-fields
MCP tool to get aggregated ticket analytics data grouped by multiple standard fields for a specific date range and team.
### MCP tool: `get_tickets_analytics_by_standard_fields`
Get aggregated ticket analytics data grouped by multiple standard fields for a specific date range and team.
This tool provides aggregated analytics data based on combinations of standard field values, not individual ticket details. Use the search\_tickets tool for finding specific tickets.
### Example prompt
```prompt theme={null}
Get ticket analytics by assignee and status for the last month
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_tickets\_analytics\_by\_standard\_fields tool with the correct arguments.
### Parameters
Parameter
Type
Required
Description
dateRange
object
Yes
Inclusive date range to aggregate over
dateRange.startDate
string
Yes
Start date in YYYY-MM-DD format
dateRange.endDate
string
Yes
End date in YYYY-MM-DD format
teamIds
string
No
Team ID to filter by (optional)
selectedFields
string
Yes
Comma-separated list of standard fields to aggregate by (e.g., assignee,status,priority,sentiment)
includeArchivedTickets
boolean
No
Include archived tickets (default: false)
includeTicketMetadata
boolean
No
Include minimal ticket metadata for drill-down (default: false)
metadataPage
number
No
Page number for metadata pagination (1-based, only used when includeTicketMetadata is true)
metadataLimit
number
No
Limit for metadata results per page (max 500, only used when includeTicketMetadata is true)
### Available standard fields
The following standard fields can be used in the `selectedFields` parameter:
* `assignee` - Ticket assignee
* `status` - Ticket status
* `priority` - Ticket priority
* `sentiment` - Ticket sentiment
* `type` - Ticket type
* `team` - Team information
* `account` - Account information
### Response fields
The response will contain aggregated analytics data with the following structure:
Field
Type
Description
aggregationType
string
Type of aggregation performed ("multi\_field")
totalTickets
number
Total number of tickets in the date range
totalFound
number
Total number of tickets found matching criteria
dateRange
object
The date range used for the analysis
includeArchivedTickets
boolean
Whether archived tickets were included
includeTicketMetadata
boolean
Whether ticket metadata was included
aggregatedData
array
Array of team-based analytics objects with field aggregations
#### Team analytics object fields
Each team in the `aggregatedData` array contains:
Field
Type
Description
teamId
string
Team unique identifier
teamName
string
Team name
totalTickets
number
Total number of tickets for this team
percentage
number
Percentage of total tickets
fieldAggregations
object
Individual field aggregations with counts and percentages
crossTabulation
object
Cross-tabulation analysis between selected fields
#### Field aggregation fields
Each field in the `fieldAggregations` object contains an array of field values:
Field
Type
Description
fieldName
string
Name of the field value (e.g., "Open", "John Doe")
fieldUid
string
Unique identifier for the field value
ticketCount
number
Number of tickets with this field value
percentage
number
Percentage of total tickets
#### Cross-tabulation fields
The `crossTabulation` object contains combinations of fields (e.g., "status\_assignee"):
Field
Type
Description
primaryFieldName
string
Name of the primary field value
primaryFieldUid
string
Unique identifier for the primary field value
secondaryFieldBreakdown
object
Breakdown by secondary field with counts and percentages
### Sample response
```json theme={null}
{
"aggregationType": "multi_field",
"totalTickets": 2,
"totalFound": 2,
"dateRange": {
"startDate": "2025-01-01",
"endDate": "2025-09-16"
},
"includeArchivedTickets": false,
"includeTicketMetadata": false,
"aggregatedData": [
{
"teamId": "THEVVHPCCER33E",
"teamName": "Engineering",
"totalTickets": 2,
"percentage": 100,
"fieldAggregations": {
"status": [
{
"statusName": "Open",
"statusUid": "3SC6BH2K10X5BSCXF2MFWVYZVYNFX",
"ticketCount": 2,
"percentage": 100
}
],
"assignee": [
{
"assigneeName": "John Doe",
"assigneeUid": "UTHOOQNUUXZQQ3",
"ticketCount": 2,
"percentage": 100
}
]
},
"crossTabulation": {
"status_assignee": [
{
"statusName": "Open",
"statusUid": "3SC6BH2K10X5BSCXF2MFWVYZVYNFX",
"assigneeBreakdown": {
"John Doe": {
"ticketCount": 2,
"percentage": 100,
"assigneeId": "UTHOOQNUUXZQQ3"
}
}
}
]
}
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool is optimized for multi-dimensional analysis and cross-field correlation studies. You can combine multiple standard fields to get comprehensive insights.
The date range must be valid and startDate must be less than or equal to endDate. Use ISO 8601 date format (YYYY-MM-DD). Field names in selectedFields must be valid standard field names.
***
# Get tickets analytics by status
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-tickets-analytics-by-status
MCP tool to fetch ticket analytics grouped by status for a date range.
### MCP tool: `get_tickets_analytics_by_status`
Fetch ticket analytics grouped by status for a date range.
This tool provides aggregated analytics data grouped by ticket status, not individual ticket details. Use the search\_tickets tool for finding specific tickets.
### Example prompt
```prompt theme={null}
Get ticket analytics by status for the last week
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_tickets\_analytics\_by\_status tool with the correct arguments.
### Parameters
Parameter
Type
Required
Description
dateRange
object
Yes
Inclusive date range to aggregate over
dateRange.startDate
string
Yes
Start date in YYYY-MM-DD format
dateRange.endDate
string
Yes
End date in YYYY-MM-DD format
includeArchivedTickets
boolean
No
Include archived tickets (default: false)
includeTicketMetadata
boolean
No
Include minimal ticket metadata for drill-down
teamIds
array
No
Optional array of team IDs to filter by
metadataPage
number
No
Page number for metadata pagination
metadataLimit
number
No
Limit for metadata results per page
### Response fields
The response will contain aggregated analytics data with the following structure:
Field
Type
Description
aggregationType
string
Type of aggregation performed ("status")
totalTickets
number
Total number of tickets in the date range
totalFound
number
Total number of tickets found matching criteria
dateRange
object
The date range used for the analysis
includeArchivedTickets
boolean
Whether archived tickets were included
includeTicketMetadata
boolean
Whether ticket metadata was included
aggregatedData
array
Array of team-based analytics objects with status breakdowns
#### Team analytics object fields
Each team in the `aggregatedData` array contains:
Field
Type
Description
teamId
string
Team unique identifier
teamName
string
Team name
total
number
Total number of tickets for this team
ticketCount
number
Number of tickets for this team (may be 0 for status aggregation)
assignees
object
Assignee breakdown (empty for status aggregation)
statusBreakdown
object
Status breakdown for this team's tickets
assigneeBreakdown
object
Assignee breakdown for this team's tickets
priorityBreakdown
object
Priority breakdown for this team's tickets
sentimentBreakdown
object
Sentiment breakdown for this team's tickets
#### Status/Assignee/Priority/Sentiment breakdown fields
Each status, assignee, priority, or sentiment in the breakdowns contains:
Field
Type
Description
ticketCount
number
Number of tickets with this status/assignee/priority/sentiment
percentage
number
Percentage of team tickets
statusId/assigneeId/priorityId/sentimentId
string
Unique identifier for the status/assignee/priority/sentiment
### Sample response
```json theme={null}
{
"aggregationType": "status",
"totalTickets": 2,
"totalFound": 2,
"dateRange": {
"startDate": "2025-01-01",
"endDate": "2025-09-16"
},
"includeArchivedTickets": false,
"includeTicketMetadata": false,
"aggregatedData": [
{
"teamId": "THEVVHPCCER33E",
"teamName": "Engineering",
"total": 2,
"ticketCount": 0,
"assignees": {},
"statusBreakdown": {
"Open": {
"ticketCount": 2,
"percentage": 100,
"statusId": "3SC6BH2K10X5BSCXF2MFWVYZVYNFX"
}
},
"assigneeBreakdown": {
"John Doe": {
"ticketCount": 2,
"percentage": 100,
"assigneeId": "UTHOOQNUUXZQQ3"
}
},
"priorityBreakdown": {
"Urgent": {
"ticketCount": 1,
"percentage": 50,
"priorityId": "CSC6BH2K100SATQR0ZS6KHBW1DFPK"
},
"Medium": {
"ticketCount": 1,
"percentage": 50,
"priorityId": "CSC6BH2K10XR2ZVVY84VV8506YN80"
}
},
"sentimentBreakdown": {
"Neutral": {
"ticketCount": 1,
"percentage": 50,
"sentimentId": "MSC6BH2K1052GKT05M6QTFZVTPQ3S"
},
"Negative": {
"ticketCount": 1,
"percentage": 50,
"sentimentId": "MSC6BH2K10CBVVTXD3Y6J5AC3X8R2"
}
}
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool is optimized for workflow analysis and identifying bottlenecks in ticket processing. It provides comprehensive breakdowns by assignee, priority, and team for each status.
The date range must be valid and startDate must be less than or equal to endDate. Use ISO 8601 date format (YYYY-MM-DD).
***
# Get tickets analytics by time
Source: https://docs.thena.ai/api-reference/mcp/tickets/get-tickets-analytics-by-time
MCP tool to get aggregated ticket analytics data grouped by time periods (daily, weekly, monthly, quarterly) for a specific date range.
### MCP tool: `get_tickets_analytics_by_time`
Get aggregated ticket analytics data grouped by time periods (daily, weekly, monthly, quarterly) for a specific date range.
This tool provides time-series analytics data, not individual ticket details. Use the search\_tickets tool for finding specific tickets.
### Example prompt
```prompt theme={null}
Get ticket analytics by time for the last quarter with monthly granularity
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_tickets\_analytics\_by\_time tool with the correct arguments.
### Parameters
Parameter
Type
Required
Description
dateRange
object
Yes
Inclusive date range to aggregate over
dateRange.startDate
string
Yes
Start date in YYYY-MM-DD format
dateRange.endDate
string
Yes
End date in YYYY-MM-DD format
timeGranularity
string
Yes
Time granularity: daily, weekly, monthly, or quarterly
teamIds
array
No
Optional array of team IDs to filter by
includeArchivedTickets
boolean
No
Include archived tickets (default: false)
includeTicketMetadata
boolean
No
Include minimal ticket metadata for drill-down (default: false)
metadataPage
number
No
Page number for metadata pagination (1-based, only used when includeTicketMetadata is true)
metadataLimit
number
No
Limit for metadata results per page (max 200, only used when includeTicketMetadata is true)
### Time granularity options
* `daily` - Group data by day
* `weekly` - Group data by week
* `monthly` - Group data by month
* `quarterly` - Group data by quarter
### Response fields
The response will contain aggregated analytics data with the following structure:
Field
Type
Description
aggregationType
string
Type of aggregation performed ("time")
totalTickets
number
Total number of tickets in the date range
totalFound
number
Total number of tickets found matching criteria
dateRange
object
The date range used for the analysis
includeArchivedTickets
boolean
Whether archived tickets were included
includeTicketMetadata
boolean
Whether ticket metadata was included
summary
object
Summary statistics across all time periods
aggregatedData
array
Array of team-based analytics objects with time breakdowns
#### Summary object fields
The `summary` object contains:
Field
Type
Description
avgTicketsPerPeriod
number
Average number of tickets per time period
peakPeriod
string
Time period with the highest ticket count
peakTicketCount
number
Number of tickets in the peak period
lowestPeriod
string
Time period with the lowest ticket count
lowestTicketCount
number
Number of tickets in the lowest period
#### Team analytics object fields
Each team in the `aggregatedData` array contains:
Field
Type
Description
teamId
string
Team unique identifier
teamName
string
Team name
total
number
Total number of tickets for this team
percentage
number
Percentage of total tickets
timeBreakdown
object
Breakdown by time periods with detailed metrics
#### Time period breakdown fields
Each time period in the `timeBreakdown` object contains:
Field
Type
Description
period
string
The time period identifier (e.g., "2025-08-13")
periodStart
string
Start timestamp of the time period
periodEnd
string
End timestamp of the time period
ticketCount
number
Number of tickets in this time period
createdCount
number
Number of tickets created in this time period
statusBreakdown
object
Breakdown by ticket status with counts and percentages
priorityBreakdown
object
Breakdown by ticket priority with counts and percentages
assigneeBreakdown
object
Breakdown by assignee with counts and percentages
sourceBreakdown
object
Breakdown by ticket source
### Sample response
```json theme={null}
{
"aggregationType": "time",
"totalTickets": 2,
"totalFound": 2,
"dateRange": {
"startDate": "2025-01-01",
"endDate": "2025-09-16"
},
"includeArchivedTickets": false,
"includeTicketMetadata": false,
"summary": {
"avgTicketsPerPeriod": 1,
"peakPeriod": "2025-08-13",
"peakTicketCount": 1,
"lowestPeriod": "2025-08-13",
"lowestTicketCount": 1
},
"aggregatedData": [
{
"teamId": "THEVVHPCCER33E",
"teamName": "Engineering",
"total": 2,
"percentage": 100,
"timeBreakdown": {
"2025-08-13": {
"period": "2025-08-13",
"periodStart": "2025-08-13T00:00:00.000Z",
"periodEnd": "2025-08-14T00:00:00.000Z",
"ticketCount": 1,
"createdCount": 1,
"statusBreakdown": {
"Open": {
"count": 1,
"percentage": 100,
"statusId": "3SC6BH2K10X5BSCXF2MFWVYZVYNFX"
}
},
"priorityBreakdown": {
"Urgent": {
"count": 1,
"percentage": 100,
"priorityId": "CSC6BH2K100SATQR0ZS6KHBW1DFPK"
}
},
"assigneeBreakdown": {
"John Doe": {
"count": 1,
"percentage": 100,
"assigneeId": "UTHOOQNUUXZQQ3",
"assigneeEmail": "john.doe@thena.ai"
}
},
"sourceBreakdown": {
"manual": 1
}
},
"2025-08-20": {
"period": "2025-08-20",
"periodStart": "2025-08-20T00:00:00.000Z",
"periodEnd": "2025-08-21T00:00:00.000Z",
"ticketCount": 1,
"createdCount": 1,
"statusBreakdown": {
"Open": {
"count": 1,
"percentage": 100,
"statusId": "3SC6BH2K10X5BSCXF2MFWVYZVYNFX"
}
},
"priorityBreakdown": {
"Medium": {
"count": 1,
"percentage": 100,
"priorityId": "CSC6BH2K10XR2ZVVY84VV8506YN80"
}
},
"assigneeBreakdown": {
"John Doe": {
"count": 1,
"percentage": 100,
"assigneeId": "UTHOOQNUUXZQQ3",
"assigneeEmail": "john.doe@thena.ai"
}
},
"sourceBreakdown": {
"manual": 1
}
}
}
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool is optimized for trend analysis and performance tracking over time. Choose the appropriate time granularity based on your analysis needs - daily for detailed trends, quarterly for high-level overviews.
The date range must be valid and startDate must be less than or equal to endDate. Use ISO 8601 date format (YYYY-MM-DD). Time granularity must be one of: daily, weekly, monthly, quarterly.
***
# Introduction
Source: https://docs.thena.ai/api-reference/mcp/tickets/overview
# MCP Ticket tools
This section documents the Model Context Protocol (MCP) tools available for working with tickets in the Thena platform. These tools allow you to retrieve, create, and manage ticket statuses and other ticket-related data via Thena MCP server.
## Available tools
### Core Ticket Operations
* [Assign Ticket](./assign-ticket): Assign a ticket to a agent.
* [Create Ticket](./create-ticket): Create a new support ticket.
* [Create Ticket Comment](./create-ticket-comment): Add a comment to a ticket.
* [Get Ticket Comments](./get-ticket-comments): Retrieve all comments for a ticket.
* [Get Ticket Priorities](./get-ticket-priorities): Retrieve all possible ticket priorities from the Thena platform, optionally filtered by team.
* [Get Ticket Statuses](./get-ticket-statuses): Retrieve all possible ticket statuses from the Thena platform, optionally filtered by team.
* [Search Tickets](./search-tickets): Search for tickets using advanced filtering and query capabilities.
* [Update Ticket](./update-ticket): Update a ticket.
* [Update Ticket Priority](./update-ticket-priority): Update the priority of a ticket.
* [Update Ticket Status](./update-ticket-status): Update the status of a ticket.
### Analytics tools
* [Get Tickets Analytics by Account](./get-tickets-analytics-by-account): Get aggregated ticket analytics data grouped by account for a specific date range.
* [Get Tickets Analytics by Assignee](./get-tickets-analytics-by-assignee): Fetch comprehensive assignee performance metrics and ticket analytics for a specified date range.
* [Get Tickets Analytics by Custom Fields](./get-tickets-analytics-by-custom-fields): Get aggregated ticket analytics data grouped by custom fields for a specific date range and team.
* [Get Tickets Analytics by Standard Fields](./get-tickets-analytics-by-standard-fields): Get aggregated ticket analytics data grouped by multiple standard fields for a specific date range and team.
* [Get Tickets Analytics by Status](./get-tickets-analytics-by-status): Fetch ticket analytics grouped by status for a date range.
* [Get Tickets Analytics by Time](./get-tickets-analytics-by-time): Get aggregated ticket analytics data grouped by time periods (daily, weekly, monthly, quarterly) for a specific date range.
# Search tickets
Source: https://docs.thena.ai/api-reference/mcp/tickets/search-tickets
MCP tool to search for tickets using Thena's search API with advanced filtering capabilities.
### MCP tool: `search_tickets`
Searches for tickets using Thena's powerful search API with advanced filtering capabilities. This tool allows you to find tickets based on various criteria including title, description, status, priority, assigned agent, and other ticket properties.
This tool uses Thena's search API which provides fast, indexed search with support for complex filters and pagination.
### Example prompt
```prompt theme={null}
Search for tickets with "test" in their title
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the search\_tickets tool with the correct arguments.
### Response fields
The response will contain a `result` object with the following structure:
Field
Type
Description
found
number
Total number of tickets found
hits
array
Array of ticket objects matching the search criteria
page
number
Current page number
facet\_counts
array
Facet counts for search results
request\_params
object
Parameters used for the search request
search\_cutoff
boolean
Whether the search was cut off due to limits
#### Ticket object fields
Each ticket in the `hits` array contains a `document` object with the following fields:
Field
Type
Description
id
string
Ticket ID
uid
string
Ticket unique identifier
ticketId
string
Ticket number
ticketIdentifier
string
Full ticket identifier (e.g., "WED-5")
title
string
Ticket title
description
string
Ticket description
aiGeneratedSummary
string
AI-generated summary
aiGeneratedTitle
string
AI-generated title
metadata
string
Ticket metadata (JSON string)
ticketRelationshipsAsSource
array
Ticket relationships where this ticket is the source
ticketRelationshipsAsTarget
array
Ticket relationships where this ticket is the target
organizationId
number
Organization ID
organizationUid
string
Organization unique identifier
formId
number
Form ID
formUid
string
Form unique identifier
formName
string
Form name
formCreatedAt
string (ISO8601)
Form creation timestamp
formUpdatedAt
string (ISO8601)
Form last update timestamp
formCreatedBy
number
Form creator ID
formOrder
number
Form order
formTeamId
number
Form team ID
formType
string
Form type
formDefault
boolean
Whether this is the default form
requestorEmail
string
Requestor email
submitterEmail
string
Submitter email
accountId
string
Account ID
accountName
string
Account name
lastCustomerComment
string
Last customer comment
lastVendorComment
string
Last vendor comment
teamId
number
Team ID
teamUid
string
Team unique identifier
teamIdentifier
string
Team identifier
teamName
string
Team name
teamIcon
string
Team icon
teamColor
string
Team color
teamOrganizationId
number
Team organization ID
teamParentTeamId
number
Team parent team ID
teamDescription
string
Team description
teamConfigurationId
number
Team configuration ID
teamTeamOwnerId
number
Team owner ID
teamIsActive
boolean
Whether the team is active
teamIsPrivate
boolean
Whether the team is private
teamCreatedAt
string (ISO8601)
Team creation timestamp
teamUpdatedAt
string (ISO8601)
Team last update timestamp
subTeamId
string
Sub-team ID
subTeamUid
string
Sub-team unique identifier
subTeamName
string
Sub-team name
subTeamIdentifier
string
Sub-team identifier
subTeamIcon
string
Sub-team icon
subTeamColor
string
Sub-team color
subTeamOrganizationId
number
Sub-team organization ID
subTeamParentTeamId
number
Sub-team parent team ID
subTeamDescription
string
Sub-team description
subTeamConfigurationId
number
Sub-team configuration ID
subTeamTeamOwnerId
number
Sub-team owner ID
subTeamIsActive
boolean
Whether the sub-team is active
subTeamIsPrivate
boolean
Whether the sub-team is private
subTeamCreatedAt
string (ISO8601)
Sub-team creation timestamp
subTeamUpdatedAt
string (ISO8601)
Sub-team last update timestamp
assignedAgentId
number
Assigned agent ID
assignedAgentEmail
string
Assigned agent email
assignedAgentName
string
Assigned agent name
assignedAgentUid
string
Assigned agent unique identifier
assignedAgentAvatarUrl
string
Assigned agent avatar URL
statusId
number
Status ID
statusName
string
Status name
statusUid
string
Status unique identifier
priorityId
number
Priority ID
priorityName
string
Priority name
priorityUid
string
Priority unique identifier
typeId
number
Type ID
typeName
string
Type name
typeUid
string
Type unique identifier
typeIcon
string
Type icon
typeColor
string
Type color
customerContactUid
string
Customer contact unique identifier
customerContactName
string
Customer contact name
customerContactEmail
string
Customer contact email
isEscalated
boolean
Whether the ticket is escalated
isPrivate
boolean
Whether the ticket is private
isDraft
boolean
Whether the ticket is a draft
sentimentId
number
Sentiment ID
sentimentUid
string
Sentiment unique identifier
sentimentName
string
Sentiment name
source
string
Ticket source
storyPoints
number
Story points
createdAt
string (ISO8601)
Ticket creation timestamp
updatedAt
string (ISO8601)
Ticket last update timestamp
slaTotalResolutionTimeComplianceState
string
SLA total resolution time compliance state
slaFirstTimeResponseCreatedAt
string
SLA first time response created at
slaFirstTimeResponseScheduledAt
string
SLA first time response scheduled at
slaFirstTimeResponseBreachedAt
string
SLA first time response breached at
slaFirstTimeResponseAchievedAt
string
SLA first time response achieved at
slaFirstTimeResponsePausedAt
string
SLA first time response paused at
slaFirstTimeResponseResumedAt
string
SLA first time response resumed at
slaFirstTimeResponseCancelledAt
string
SLA first time response cancelled at
slaFirstTimeResponseNextAttemptAt
string
SLA first time response next attempt at
slaFirstTimeResponseComplianceState
string
SLA first time response compliance state
slaNextTimeResponseCreatedAt
string
SLA next time response created at
slaNextTimeResponseScheduledAt
string
SLA next time response scheduled at
slaNextTimeResponseBreachedAt
string
SLA next time response breached at
slaNextTimeResponseAchievedAt
string
SLA next time response achieved at
slaNextTimeResponsePausedAt
string
SLA next time response paused at
slaNextTimeResponseCancelledAt
string
SLA next time response cancelled at
slaNextTimeResponseDurationToBreachMinutes
string
SLA next time response duration to breach minutes
slaNextTimeResponsePausedDurationMinutes
string
SLA next time response paused duration minutes
slaNextTimeResponseNextAttemptAt
string
SLA next time response next attempt at
slaNextTimeResponseComplianceState
string
SLA next time response compliance state
slaUpdateTimeCreatedAt
string
SLA update time created at
slaUpdateTimeScheduledAt
string
SLA update time scheduled at
slaUpdateTimeBreachedAt
string
SLA update time breached at
slaUpdateTimeAchievedAt
string
SLA update time achieved at
slaUpdateTimePausedAt
string
SLA update time paused at
slaUpdateTimeResumedAt
string
SLA update time resumed at
slaUpdateTimeCancelledAt
string
SLA update time cancelled at
slaUpdateTimeDurationToBreachMinutes
string
SLA update time duration to breach minutes
slaUpdateTimePausedDurationMinutes
string
SLA update time paused duration minutes
slaUpdateTimeNextAttemptAt
string
SLA update time next attempt at
slaUpdateComplianceState
string
SLA update compliance state
accountPrimaryDomain
string
Account primary domain
accountWebsite
string
Account website
accountSecondaryDomain
string
Account secondary domain
accountBillingAddress
string
Account billing address
accountShippingAddress
string
Account shipping address
accountAnnualRevenue
string
Account annual revenue
accountEmployees
string
Account employees
accountOwnerId
string
Account owner ID
accountOwnerEmail
string
Account owner email
accountOwnerName
string
Account owner name
accountOwnerUserType
string
Account owner user type
accountOwnerStatus
string
Account owner status
accountOwnerTimezone
string
Account owner timezone
accountIsActive
boolean
Whether the account is active
accountSource
string
Account source
accountHealth
string
Account health
accountIndustry
string
Account industry
accountClassification
string
Account classification
accountStatus
string
Account status
accountUid
string
Account unique identifier
accountLogo
string
Account logo
accountOwnerUid
string
Account owner unique identifier
accountHealthUid
string
Account health unique identifier
accountIndustryUid
string
Account industry unique identifier
accountClassificationUid
string
Account classification unique identifier
accountStatusUid
string
Account status unique identifier
accountHealthValue
string
Account health value
accountIndustryValue
string
Account industry value
accountClassificationValue
string
Account classification value
accountStatusValue
string
Account status value
contactEmail
string
Contact email
contactName
string
Contact name
contactAvatarUrl
string
Contact avatar URL
contactPhone
string
Contact phone
accountCustomFields
array
Account custom fields
ticketCustomFieldValues
array
Ticket custom field values
tags
object
Ticket tags
csatRatingValue
number
CSAT rating value
csatCommentText
string
CSAT comment text
csatCompletedAt
string
CSAT completed at
csatMappingStatus
string
CSAT mapping status
csatSamplingStatus
string
CSAT sampling status
csatFeedbackType
string
CSAT feedback type
csatSurveyConfigRatingScale
number
CSAT survey config rating scale
csatDeliveryDetailsRecipient
string
CSAT delivery details recipient
csatDeliveryDetailsLastAttemptAt
string
CSAT delivery details last attempt at
csatDeliveryDetailsDeliveryAttempts
number
CSAT delivery details delivery attempts
parentStatusUid
string
Parent status unique identifier
parentStatusName
string
Parent status name
### Sample response
```json theme={null}
{
"result": {
"facet_counts": [],
"found": 58,
"hits": [
{
"document": {
"id": "11",
"uid": "4SSQPQZJ10QQV6PX91B2GN9G302R3",
"ticketId": "5",
"ticketIdentifier": "WED-5",
"title": "test",
"description": "",
"aiGeneratedSummary": "",
"aiGeneratedTitle": "",
"metadata": "{\"source\":\"manual\"}",
"ticketRelationshipsAsSource": [],
"ticketRelationshipsAsTarget": [],
"organizationId": 4,
"organizationUid": "ETHPPX4JJ21NNJ",
"formId": 13,
"formUid": "FODDKPKKXW88L",
"formName": "Default team form",
"formCreatedAt": "2025-07-09T09:17:15.839Z",
"formUpdatedAt": "2025-07-09T09:17:15.839Z",
"formCreatedBy": 0,
"formOrder": 0,
"formTeamId": 5,
"formType": "ticket_creation",
"formDefault": true,
"requestorEmail": "shakthi@thena.ai",
"submitterEmail": "shakthi+1@thena.ai",
"accountId": "1",
"accountName": "Thena",
"lastCustomerComment": "",
"lastVendorComment": "",
"teamId": 5,
"teamUid": "THETT4QZZD9PPM",
"teamIdentifier": "WED",
"teamName": "wed",
"teamIcon": "",
"teamColor": "rgb(155, 135, 245)",
"teamOrganizationId": 4,
"teamParentTeamId": 0,
"teamDescription": "",
"teamConfigurationId": 3,
"teamTeamOwnerId": 8,
"teamIsActive": true,
"teamIsPrivate": false,
"teamCreatedAt": "2025-07-09T09:17:14.954Z",
"teamUpdatedAt": "2025-07-09T09:17:14.954Z",
"subTeamId": "5",
"subTeamUid": "THETT4QZZD9PPM",
"subTeamName": "wed",
"subTeamIdentifier": "WED",
"subTeamIcon": "",
"subTeamColor": "rgb(155, 135, 245)",
"subTeamOrganizationId": 4,
"subTeamParentTeamId": 0,
"subTeamDescription": "",
"subTeamConfigurationId": 3,
"subTeamTeamOwnerId": 8,
"subTeamIsActive": true,
"subTeamIsPrivate": false,
"subTeamCreatedAt": "2025-07-09T09:17:14.954Z",
"subTeamUpdatedAt": "2025-07-09T09:17:14.954Z",
"assignedAgentId": 0,
"assignedAgentEmail": "",
"assignedAgentName": "",
"assignedAgentUid": "null",
"assignedAgentAvatarUrl": "",
"statusId": 9,
"statusName": "Open",
"statusUid": "YM5K7QZJ10NPP6GZXZTR1C2DB9AG3",
"priorityId": 10,
"priorityName": "Medium",
"priorityUid": "GR5K7QZJ10H0300NBSAPN5CG4TN9F",
"typeId": 0,
"typeName": "",
"typeUid": "",
"typeIcon": "",
"typeColor": "",
"customerContactUid": "FCR9DQZJ10VX8C6R7BXYP99R52K9B",
"customerContactName": "Shakthi",
"customerContactEmail": "shakthi@thena.ai",
"isEscalated": false,
"isPrivate": false,
"isDraft": false,
"sentimentId": 9,
"sentimentUid": "JT5K7QZJ107BR5DAKC2HBC4G3NA5A",
"sentimentName": "Neutral",
"source": "manual",
"storyPoints": 0,
"createdAt": "2025-07-09T13:41:55.611Z",
"updatedAt": "2025-07-09T13:41:55.611Z",
"slaTotalResolutionTimeComplianceState": "NOT_SCHEDULED",
"slaFirstTimeResponseCreatedAt": "",
"slaFirstTimeResponseScheduledAt": "",
"slaFirstTimeResponseBreachedAt": "",
"slaFirstTimeResponseAchievedAt": "",
"slaFirstTimeResponsePausedAt": "",
"slaFirstTimeResponseResumedAt": "",
"slaFirstTimeResponseCancelledAt": "",
"slaFirstTimeResponseNextAttemptAt": "",
"slaFirstTimeResponseComplianceState": "NOT_SCHEDULED",
"slaNextTimeResponseCreatedAt": "",
"slaNextTimeResponseScheduledAt": "",
"slaNextTimeResponseBreachedAt": "",
"slaNextTimeResponseAchievedAt": "",
"slaNextTimeResponsePausedAt": "",
"slaNextTimeResponseCancelledAt": "",
"slaNextTimeResponseDurationToBreachMinutes": "",
"slaNextTimeResponsePausedDurationMinutes": "",
"slaNextTimeResponseNextAttemptAt": "",
"slaNextTimeResponseComplianceState": "NOT_SCHEDULED",
"slaUpdateTimeCreatedAt": "",
"slaUpdateTimeScheduledAt": "",
"slaUpdateTimeBreachedAt": "",
"slaUpdateTimeAchievedAt": "",
"slaUpdateTimePausedAt": "",
"slaUpdateTimeResumedAt": "",
"slaUpdateTimeCancelledAt": "",
"slaUpdateTimeDurationToBreachMinutes": "",
"slaUpdateTimePausedDurationMinutes": "",
"slaUpdateTimeNextAttemptAt": "",
"slaUpdateComplianceState": "NOT_SCHEDULED",
"accountPrimaryDomain": "thena.ai",
"accountWebsite": "",
"accountSecondaryDomain": "",
"accountBillingAddress": "",
"accountShippingAddress": "",
"accountAnnualRevenue": "",
"accountEmployees": "",
"accountOwnerId": "",
"accountOwnerEmail": "",
"accountOwnerName": "",
"accountOwnerUserType": "",
"accountOwnerStatus": "",
"accountOwnerTimezone": "",
"accountIsActive": true,
"accountSource": "Thena",
"accountHealth": "",
"accountIndustry": "",
"accountClassification": "",
"accountStatus": "124",
"accountUid": "87R9DQZJ10F1EM01E42C0JN9B1AC0",
"accountLogo": "",
"accountOwnerUid": "",
"accountHealthUid": "",
"accountIndustryUid": "",
"accountClassificationUid": "",
"accountStatusUid": "8GKAK7ZJ10DW6X9HATH2QYG2KX9KY",
"accountHealthValue": "",
"accountIndustryValue": "",
"accountClassificationValue": "",
"accountStatusValue": "Prospect",
"contactEmail": "shakthi@thena.ai",
"contactName": "Shakthi",
"contactAvatarUrl": "",
"contactPhone": "",
"accountCustomFields": [],
"ticketCustomFieldValues": [],
"tags": {
"values": []
},
"csatRatingValue": 0,
"csatCommentText": "",
"csatCompletedAt": null,
"csatMappingStatus": "processed",
"csatSamplingStatus": "selected",
"csatFeedbackType": "thumbs",
"csatSurveyConfigRatingScale": 0,
"csatDeliveryDetailsRecipient": null,
"csatDeliveryDetailsLastAttemptAt": null,
"csatDeliveryDetailsDeliveryAttempts": 0,
"parentStatusUid": "",
"parentStatusName": ""
}
}
],
"page": 1,
"request_params": {
"search_mode": "fallback",
"q": "*",
"query_by": "*",
"filter_by": "title:=test",
"collection": "tickets"
},
"search_cutoff": false
}
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
The search API provides fast, indexed search results. Use specific filters to narrow down results and improve performance.
Only the core ticket fields (title, description) support direct text search. Other fields require exact value matching.
***
# Update ticket
Source: https://docs.thena.ai/api-reference/mcp/tickets/update-ticket
MCP tool to update a ticket in the Thena platform.
### MCP tool: `update_ticket`
Updates a ticket in the Thena platform. Useful for workflow automation, ticket management, and support operations.
You must provide the ticket id. All other fields are optional and will be updated if provided.
### Example prompt
```prompt theme={null}
Update the title and priority of ticket CT4NVX0K10YJQ3X0185THN9R6H9M3 to "Updated Sample Ticket: Database Performance Issue Resolved" and "Low"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_ticket tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------ | ------- | -------- | --------------------------------------- |
| id | string | Yes | The ID of the ticket to update |
| title | string | No | The title of the ticket |
| assignedAgentId | string | No | The ID of the assigned agent |
| accountId | string | No | The ID of the account |
| assignedAgentEmail | string | No | The email of the assigned agent |
| description | string | No | The description of the ticket |
| dueDate | string | No | The due date of the ticket (ISO format) |
| submitterEmail | string | No | The email of the submitter |
| statusId | string | No | The ID of the status |
| statusName | string | No | The name of the status |
| priorityId | string | No | The ID of the priority |
| priorityName | string | No | The name of the priority |
| sentimentId | string | No | The ID of the sentiment |
| metadata | object | No | Additional metadata |
| typeId | string | No | The ID of the type |
| isPrivate | boolean | No | Whether the ticket is private |
| source | string | No | The source of the ticket |
| aiGeneratedTitle | string | No | AI generated title |
| aiGeneratedSummary | string | No | AI generated summary |
### Response fields
Below are the fields you may see in the response:
| Field | Type | Description |
| ------------------------ | ------- | ------------------------------- |
| id | string | Ticket unique ID |
| ticketId | number | Ticket number |
| title | string | Ticket title |
| description | string | Ticket description |
| source | string | Source of the ticket |
| status | string | Current status |
| priority | string | Priority |
| teamId | string | Team ID |
| teamName | string | Team name |
| teamIdentifier | string | Team identifier |
| ticketIdentifier | string | Ticket identifier |
| subTeamId | string | Subteam ID |
| subTeamName | string | Subteam name |
| subTeamIdentifier | string | Subteam identifier |
| isPrivate | boolean | Whether the ticket is private |
| formId | string | Form ID |
| requestorEmail | string | Requestor email |
| submitterEmail | string | Submitter email |
| customFieldValues | array | Custom field values |
| customerContactId | string | Customer contact ID |
| customerContactFirstName | string | Customer contact first name |
| customerContactLastName | string | Customer contact last name |
| customerContactEmail | string | Customer contact email |
| statusId | string | Status ID |
| priorityId | string | Priority ID |
| sentimentId | string | Sentiment ID |
| sentiment | string | Sentiment |
| storyPoints | number | Story points |
| aiGeneratedTitle | string | AI generated title |
| aiGeneratedSummary | string | AI generated summary |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
Other top-level fields in the response:
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | object | The updated ticket object |
| status | boolean | Whether the update succeeded |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
***
### Sample response
```json theme={null}
{
"data": {
"id": "CT4NVX0K10YJQ3X0185THN9R6H9M3",
"ticketId": 2,
"title": "Updated Sample Ticket: Database Performance Issue Resolved",
"description": "Customer is experiencing intermittent database connection timeouts when running reports. The issue occurs approximately 3-4 times per day and is affecting their ability to generate monthly analytics. Error message shows 'Connection timeout after 30 seconds'. This started after the recent server maintenance window.",
"source": "api",
"status": "Open",
"priority": "Low",
"teamId": "THEWWYV55X0JJL",
"teamName": "team one",
"teamIdentifier": "TON",
"ticketIdentifier": "TON-2",
"subTeamId": "THEWWYV55X0JJL",
"subTeamName": "team one",
"subTeamIdentifier": "TON",
"isPrivate": false,
"formId": "FORR9U22U7IIB",
"requestorEmail": "admin@clientcompany.com",
"submitterEmail": "admin@clientcompany.com",
"customFieldValues": [],
"customerContactId": "RS4NVX0K10ATNQZ5999JKW37R6MTP",
"customerContactFirstName": "Admin",
"customerContactLastName": "",
"customerContactEmail": "admin@clientcompany.com",
"statusId": "EA4VETZJ10ZKY6MKT04C3PM5DPG1C",
"priorityId": "MA4VETZJ105PJDAZS2KBVVRPPQXDE",
"sentimentId": "QA4VETZJ10FKVJQFS2QSBW5QWC3HD",
"sentiment": "Neutral",
"storyPoints": null,
"aiGeneratedTitle": null,
"aiGeneratedSummary": null,
"createdAt": "2025-07-24T09:18:59.914Z",
"updatedAt": "2025-07-24T09:50:17.381Z"
},
"status": true,
"message": "Ticket updated successfully!",
"timestamp": "2025-07-24T09:50:17.443Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Update ticket priority
Source: https://docs.thena.ai/api-reference/mcp/tickets/update-ticket-priority
MCP tool to update the priority of a ticket in the Thena platform.
### MCP tool: `update_ticket_priority`
Updates the priority of a ticket in the Thena platform. Useful for workflow automation, ticket management, and support operations.
You must provide the ticket id and either priorityId or priorityName.
### Example prompt
```prompt theme={null}
Set the priority of ticket CT4NVX0K10YJQ3X0185THN9R6H9M3 to "High"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_ticket\_priority tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------ | ------ | -------- | ------------------------------- |
| id | string | Yes | The ID of the ticket to update |
| priorityId | string | No | The ID of the priority to set |
| priorityName | string | No | The name of the priority to set |
### Response fields
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | object | The updated ticket object |
| status | boolean | Whether the update succeeded |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
***
### Sample response
The response includes the updated ticket object and metadata about the operation.
```json theme={null}
{
"data": {
"id": "CT4NVX0K10YJQ3X0185THN9R6H9M3",
"ticketId": 2,
"title": "Sample Ticket: Database Connection Timeout",
"description": "Customer is experiencing intermittent database connection timeouts when running reports. The issue occurs approximately 3-4 times per day and is affecting their ability to generate monthly analytics. Error message shows 'Connection timeout after 30 seconds'. This started after the recent server maintenance window.",
"source": "api",
"status": "Open",
"priority": "Low",
"teamId": "THEWWYV55X0JJL",
"teamName": "team one",
"teamIdentifier": "TON",
"ticketIdentifier": "TON-2",
"subTeamId": "THEWWYV55X0JJL",
"subTeamName": "team one",
"subTeamIdentifier": "TON",
"isPrivate": false,
"formId": "FORR9U22U7IIB",
"requestorEmail": "admin@clientcompany.com",
"submitterEmail": "admin@clientcompany.com",
"customFieldValues": [],
"customerContactId": "RS4NVX0K10ATNQZ5999JKW37R6MTP",
"customerContactFirstName": "Admin",
"customerContactLastName": "",
"customerContactEmail": "admin@clientcompany.com",
"statusId": "EA4VETZJ10ZKY6MKT04C3PM5DPG1C",
"priorityId": "MA4VETZJ105PJDAZS2KBVVRPPQXDE",
"sentimentId": "QA4VETZJ10FKVJQFS2QSBW5QWC3HD",
"sentiment": "Neutral",
"storyPoints": null,
"aiGeneratedTitle": null,
"aiGeneratedSummary": null,
"createdAt": "2025-07-24T09:18:59.914Z",
"updatedAt": "2025-07-24T09:42:57.723Z"
},
"status": true,
"message": "Ticket updated successfully!",
"timestamp": "2025-07-24T09:42:57.773Z"
}
```
Either priorityId or priorityName must be provided.
***
# Update ticket status
Source: https://docs.thena.ai/api-reference/mcp/tickets/update-ticket-status
MCP tool to update the status of a ticket in the Thena platform.
### MCP tool: `update_ticket_status`
Updates the status of a ticket in the Thena platform. Useful for workflow automation, ticket management, and support operations.
You must provide the ticket id and either statusId or statusName.
### Example prompt
```prompt theme={null}
Set the status of ticket CT4NVX0K10YJQ3X0185THN9R6H9M3 to "Closed"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_ticket\_status tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---------- | ------ | -------- | ------------------------------ |
| id | string | Yes | The ID of the ticket to update |
| statusId | string | No | The ID of the status to set |
| statusName | string | No | The name of the status to set |
### Response fields
| Field | Type | Description |
| --------- | ------- | ----------------------------------------- |
| data | object | The updated ticket object |
| status | boolean | Whether the update succeeded |
| message | string | Status message |
| timestamp | string | Time the response was generated (ISO8601) |
***
### Sample response
The response includes the updated ticket object and metadata about the operation.
```json theme={null}
{
"data": {
"id": "CT4NVX0K10YJQ3X0185THN9R6H9M3",
"ticketId": 2,
"title": "Sample Ticket: Database Connection Timeout",
"description": "Customer is experiencing intermittent database connection timeouts when running reports. The issue occurs approximately 3-4 times per day and is affecting their ability to generate monthly analytics. Error message shows 'Connection timeout after 30 seconds'. This started after the recent server maintenance window.",
"source": "api",
"status": "Closed",
"priority": "High",
"teamId": "THEWWYV55X0JJL",
"teamName": "team one",
"teamIdentifier": "TON",
"ticketIdentifier": "TON-2",
"subTeamId": "THEWWYV55X0JJL",
"subTeamName": "team one",
"subTeamIdentifier": "TON",
"isPrivate": false,
"formId": "FORR9U22U7IIB",
"requestorEmail": "admin@clientcompany.com",
"submitterEmail": "admin@clientcompany.com",
"customFieldValues": [],
"customerContactId": "RS4NVX0K10ATNQZ5999JKW37R6MTP",
"customerContactFirstName": "Admin",
"customerContactLastName": "",
"customerContactEmail": "admin@clientcompany.com",
"statusId": "JA4VETZJ10DFXHB06KTBYAJTQANZT",
"priorityId": "NA4VETZJ10MXCXEDAXBVRZYG5SFSE",
"sentimentId": "QA4VETZJ10FKVJQFS2QSBW5QWC3HD",
"sentiment": "Neutral",
"storyPoints": null,
"aiGeneratedTitle": null,
"aiGeneratedSummary": null,
"createdAt": "2025-07-24T09:18:59.914Z",
"updatedAt": "2025-07-24T09:41:20.842Z"
},
"status": true,
"message": "Ticket updated successfully!",
"timestamp": "2025-07-24T09:41:20.981Z"
}
```
Either statusId or statusName must be provided.
***
# Create workflow
Source: https://docs.thena.ai/api-reference/mcp/workflows/create-workflow
MCP tool to create a new workflow in the Thena platform.
### MCP tool: `create_workflow`
Creates a new workflow with comprehensive definition and configuration. This tool allows you to define workflow steps, activities, triggers, and execution policies.
You must provide a name, team ID, type, trigger event, and workflow definition. All other fields are optional with sensible defaults.
### Example prompt
```prompt theme={null}
Create a workflow for ticket escalation with notification and assignment steps
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the create\_workflow tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------ | ------- | -------- | ---------------------------------------------- |
| name | string | Yes | The name of the workflow |
| teamId | string | Yes | The team ID that owns this workflow |
| type | string | Yes | The type of the workflow |
| subType | string | No | The sub-type of the workflow |
| triggerEvent | object | Yes | The event that triggers this workflow |
| filters | object | No | Filters to apply to the workflow trigger |
| annotations | array | No | Annotations for the workflow |
| workflowDefinition | array | Yes | The definition of workflow steps |
| executingAgent | string | No | The agent that executes this workflow |
| isActive | boolean | No | Whether the workflow is active (default: true) |
| metadata | object | No | Additional metadata for the workflow |
#### Trigger event structure
| Field | Type | Required | Description |
| --------- | ------ | -------- | ------------------------------------------ |
| uid | string | Yes | The unique identifier of the trigger event |
| eventName | string | Yes | The name of the trigger event |
#### Workflow step structure
Each step in the `workflowDefinition` array contains:
| Field | Type | Required | Description |
| ---------------- | ------- | -------- | ------------------------------------------------------- |
| stepIdentifier | number | Yes | The identifier for this step |
| activity | object | Yes | The activity to execute in this step |
| input | object | Yes | The input parameters for this activity |
| retryPolicy | object | No | The retry policy for this step |
| onFailure | string | No | Action to take on failure (CONTINUE, ABORT, COMPENSATE) |
| isSleepActivity | boolean | No | Whether this is a sleep/wait activity |
| executionTimeout | number | No | Timeout for execution in seconds |
| approver | object | No | Approver configuration for this step |
| dependencies | array | No | Step dependencies |
| filters | object | No | Filters for this step |
#### Activity structure
| Field | Type | Required | Description |
| -------------------------- | ------- | -------- | ---------------------------------------------------------------------- |
| uniqueIdentifier | string | Yes | The unique identifier of the activity |
| version | number | No | The version of the activity |
| autoUpgradeToLatestVersion | boolean | No | Whether to automatically upgrade to the latest version (default: true) |
#### Retry policy structure
| Field | Type | Required | Description |
| ------------------ | ------ | -------- | ------------------------------------------- |
| maximumAttempts | number | No | Maximum number of retry attempts |
| initialInterval | number | No | Initial interval between retries in seconds |
| backoffCoefficient | number | No | Backoff coefficient for retry intervals |
#### Approver structure
| Field | Type | Required | Description |
| ------- | ------ | -------- | ------------------------------- |
| type | string | No | Type of approver (TEAM or USER) |
| uid | string | No | ID of the approver |
| timeout | number | No | Timeout for approval in seconds |
### Response fields
The response will contain the created workflow with the same structure as the `get_workflow` tool.
### Sample response
```json theme={null}
{
"data": {
"uid": "WORKFLOW001",
"type": "WORKFLOW",
"subType": "AI_AGENT",
"uniqueIdentifier": "ticket-escalation-workflow",
"name": "Ticket Escalation Workflow",
"version": 1,
"triggerEvent": {
"id": "EVENT001",
"name": "ticket.created",
"description": "Triggered when a new ticket is created"
},
"filters": {
"priority": "high",
"team": "support"
},
"annotations": [
{
"entityType": "workflow",
"data": {
"tags": ["escalation", "automation"]
},
"relations": []
}
],
"workflowDefinition": [
{
"stepIdentifier": 1,
"activity": {
"name": "send-notification",
"uniqueIdentifier": "notification.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"recipients": ["support-team"],
"message": "High priority ticket requires immediate attention",
"priority": "urgent"
},
"retryPolicy": {
"maximumAttempts": 3,
"initialInterval": 1000,
"backoffCoefficient": 2
},
"onFailure": "CONTINUE",
"isSleepActivity": false,
"executionTimeout": 30000,
"dependencies": [],
"filters": {
"notificationType": "escalation"
}
},
{
"stepIdentifier": 2,
"activity": {
"name": "assign-to-senior-agent",
"uniqueIdentifier": "assignment.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"priority": "high",
"skillSet": ["escalation", "technical"],
"autoAssign": true
},
"retryPolicy": {
"maximumAttempts": 2,
"initialInterval": 5000,
"backoffCoefficient": 1.5
},
"onFailure": "ABORT",
"isSleepActivity": false,
"executionTimeout": 60000,
"dependencies": [1],
"filters": {
"agentLevel": "senior"
}
}
],
"executingAgent": "workflow-engine",
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z",
"createdBy": "USER001",
"teamId": "TEAM001",
"metadata": {
"description": "Automated workflow for escalating high-priority tickets",
"tags": ["escalation", "automation", "support"],
"category": "customer-service"
}
},
"status": true,
"message": "Workflow created successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool creates new workflows in the system. Ensure all required fields are properly configured before creation.
***
# Delete workflow
Source: https://docs.thena.ai/api-reference/mcp/workflows/delete-workflow
MCP tool to delete a workflow from the Thena platform.
### MCP tool: `delete_workflow`
Deletes a workflow from the Thena platform. This action is permanent and will remove the workflow along with its associated data.
You must provide the workflow unique identifier to delete the specific workflow. This action is irreversible.
### Example prompt
```prompt theme={null}
Delete workflow with unique identifier "ticket-escalation-workflow"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the delete\_workflow tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------------ | ------ | -------- | ----------------------------------------------- |
| workflowUniqueIdentifier | string | Yes | The unique identifier of the workflow to delete |
### Response fields
The response will be a simple success message indicating the workflow was deleted.
### Sample response
```json theme={null}
{
"content": [
{
"type": "text",
"text": "Workflow deleted successfully"
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool permanently deletes workflows and their associated data. This action cannot be undone. Ensure you have the correct workflow unique identifier before proceeding.
***
# Get activity registry
Source: https://docs.thena.ai/api-reference/mcp/workflows/get-activity-registry
MCP tool to retrieve available activities that can be used in workflows from the Thena platform.
### MCP tool: `get_activity_registry`
Retrieves the activity registry for a specific team, showing all available activities that can be used in workflow steps. This tool helps you discover what actions are available for workflow configuration.
You must provide the team ID to retrieve the activity registry for that specific team.
### Example prompt
```prompt theme={null}
Get activity registry for team "TEAM001"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_activity\_registry tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | ------------------------------------------ |
| teamId | string | Yes | The team ID to fetch activity registry for |
### Response fields
Below are the fields you may see in each activity object in the response:
Field
Type
Description
id
string
The unique identifier of the activity
name
string
The name of the activity
uniqueIdentifier
string
The unique identifier used in workflow definitions
description
string
The description of the activity
category
string
The category of the activity
version
number
The version of the activity
inputSchema
object
The JSON schema for the activity input parameters
outputSchema
object
The JSON schema for the activity output
isActive
boolean
Whether the activity is active and available
createdAt
string (ISO8601)
The creation timestamp
updatedAt
string (ISO8601)
The last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "ACTIVITY001",
"name": "Send Notification",
"uniqueIdentifier": "notification.activity",
"description": "Sends notifications to specified recipients via email, Slack, or other channels",
"category": "communication",
"version": 2,
"inputSchema": {
"type": "object",
"properties": {
"recipients": {
"type": "array",
"items": { "type": "string" },
"description": "List of recipient identifiers (emails, user IDs, or channel names)"
},
"message": {
"type": "string",
"description": "The message content to send"
},
"priority": {
"type": "string",
"enum": ["low", "normal", "high", "urgent"],
"description": "The priority level of the notification"
},
"channel": {
"type": "string",
"enum": ["email", "slack", "sms", "webhook"],
"description": "The notification channel to use"
},
"template": {
"type": "string",
"description": "Optional template ID to use for formatting"
}
},
"required": ["recipients", "message"]
},
"outputSchema": {
"type": "object",
"properties": {
"notificationId": {
"type": "string",
"description": "The unique identifier of the sent notification"
},
"sentTo": {
"type": "array",
"items": { "type": "string" },
"description": "List of recipients who received the notification"
},
"deliveryStatus": {
"type": "string",
"enum": ["sent", "delivered", "failed"],
"description": "The delivery status of the notification"
},
"timestamp": {
"type": "string",
"format": "date-time",
"description": "The timestamp when the notification was sent"
}
}
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "ACTIVITY002",
"name": "Assign Ticket",
"uniqueIdentifier": "assignment.activity",
"description": "Assigns tickets to agents based on skills, availability, and load balancing",
"category": "ticket-management",
"version": 1,
"inputSchema": {
"type": "object",
"properties": {
"ticketId": {
"type": "string",
"description": "The ID of the ticket to assign"
},
"priority": {
"type": "string",
"enum": ["low", "medium", "high", "urgent"],
"description": "The priority level of the ticket"
},
"skillSet": {
"type": "array",
"items": { "type": "string" },
"description": "Required skills for the agent"
},
"autoAssign": {
"type": "boolean",
"description": "Whether to automatically assign or just find candidates"
},
"loadBalancing": {
"type": "boolean",
"description": "Whether to consider current workload in assignment"
}
},
"required": ["ticketId"]
},
"outputSchema": {
"type": "object",
"properties": {
"assignedAgentId": {
"type": "string",
"description": "The ID of the assigned agent"
},
"assignedAgentName": {
"type": "string",
"description": "The name of the assigned agent"
},
"assignmentReason": {
"type": "string",
"description": "The reason for the assignment decision"
},
"candidatesConsidered": {
"type": "number",
"description": "Number of agents considered for assignment"
}
}
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "ACTIVITY003",
"name": "Update Ticket Status",
"uniqueIdentifier": "status-update.activity",
"description": "Updates the status of a ticket with optional comments",
"category": "ticket-management",
"version": 1,
"inputSchema": {
"type": "object",
"properties": {
"ticketId": {
"type": "string",
"description": "The ID of the ticket to update"
},
"status": {
"type": "string",
"description": "The new status to set"
},
"comment": {
"type": "string",
"description": "Optional comment to add with the status update"
},
"addTimestamp": {
"type": "boolean",
"description": "Whether to add a timestamp to the comment"
}
},
"required": ["ticketId", "status"]
},
"outputSchema": {
"type": "object",
"properties": {
"updatedTicketId": {
"type": "string",
"description": "The ID of the updated ticket"
},
"previousStatus": {
"type": "string",
"description": "The previous status of the ticket"
},
"newStatus": {
"type": "string",
"description": "The new status of the ticket"
},
"commentId": {
"type": "string",
"description": "The ID of the added comment (if any)"
}
}
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "ACTIVITY004",
"name": "Sleep/Wait",
"uniqueIdentifier": "sleep.activity",
"description": "Pauses workflow execution for a specified duration",
"category": "control-flow",
"version": 1,
"inputSchema": {
"type": "object",
"properties": {
"duration": {
"type": "number",
"description": "Duration to sleep in seconds"
},
"reason": {
"type": "string",
"description": "Optional reason for the sleep"
}
},
"required": ["duration"]
},
"outputSchema": {
"type": "object",
"properties": {
"sleptFor": {
"type": "number",
"description": "Actual duration slept in seconds"
},
"startTime": {
"type": "string",
"format": "date-time",
"description": "When the sleep started"
},
"endTime": {
"type": "string",
"format": "date-time",
"description": "When the sleep ended"
}
}
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
}
],
"status": true,
"message": "Activity registry retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get all workflows
Source: https://docs.thena.ai/api-reference/mcp/workflows/get-all-workflows
MCP tool to retrieve a paginated list of all workflows in the Thena platform.
### MCP tool: `get_all_workflows`
Retrieves a paginated list of all workflows defined by the organization. This tool supports filtering by team, type, and sub-types, along with pagination for efficient data retrieval.
This tool supports pagination and optional filtering by team ID, workflow type, and sub-types.
### Example prompt
```prompt theme={null}
Get all workflows for team TEAM001 with type "WORKFLOW"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_all\_workflows tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| -------- | ------ | -------- | ---------------------------------------------------------------------------- |
| teamId | string | No | The team ID to fetch workflows for |
| page | number | No | The page number to fetch workflows by |
| limit | number | No | The limit of workflows to fetch |
| type | string | No | The type of workflows to fetch |
| subTypes | string | No | Comma separated sub types of workflows to fetch (e.g., "WORKFLOW,AI\_AGENT") |
### Response fields
Below are the fields you may see in each workflow object in the response:
Field
Type
Description
uid
string
Unique identifier for current version of the workflow
type
string
The type of the workflow
subType
string
The sub type of the workflow
uniqueIdentifier
string
The unique identifier of the workflow
name
string
The name identifier of the workflow
version
number
The version of the workflow
triggerEvent
object
The trigger event of the workflow
filters
object
The filters of the workflow
annotations
array
The annotation for the workflow
workflowDefinition
array
The workflow definition steps
executingAgent
string
The executing agent of the workflow
isActive
boolean
The status of the workflow
createdAt
string (ISO8601)
The created at date of the workflow
updatedAt
string (ISO8601)
The updated at date of the workflow
createdBy
string
The created by of the workflow
teamId
string
The team id of the workflow
metadata
object
The metadata for the workflow
#### Workflow step structure
Each step in the `workflowDefinition` array contains:
Field
Type
Description
stepIdentifier
number
The step identifier of the workflow step
activity
object
The activity of the workflow step
input
object
The input to the activity
retryPolicy
object
The retry policy of the activity
onFailure
string
The action to take on failure (CONTINUE, ABORT, COMPENSATE)
isSleepActivity
boolean
Whether the activity is a sleep activity
executionTimeout
number
The execution timeout of the activity
approver
object
The approver of the activity
dependencies
array
The dependencies of the activity
filters
object
The filters of the activity
compensationActivity
object
The compensation activity of the activity
### Sample response
```json theme={null}
{
"data": {
"results": [
{
"uid": "WORKFLOW001",
"type": "WORKFLOW",
"subType": "AI_AGENT",
"uniqueIdentifier": "ticket-escalation-workflow",
"name": "Ticket Escalation Workflow",
"version": 1,
"triggerEvent": {
"id": "EVENT001",
"name": "ticket.created",
"description": "Triggered when a new ticket is created"
},
"filters": {
"priority": "high",
"team": "support"
},
"annotations": [
{
"entityType": "ticket",
"data": {
"autoEscalate": true
},
"relations": ["escalation"]
}
],
"workflowDefinition": [
{
"stepIdentifier": 1,
"activity": {
"name": "send-notification",
"uniqueIdentifier": "notification.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"recipients": ["support-team"],
"message": "High priority ticket requires immediate attention"
},
"retryPolicy": {
"maximumAttempts": 3,
"initialInterval": 1000,
"backoffCoefficient": 2
},
"onFailure": "CONTINUE",
"isSleepActivity": false,
"executionTimeout": 30000,
"dependencies": [],
"filters": {}
},
{
"stepIdentifier": 2,
"activity": {
"name": "assign-to-senior-agent",
"uniqueIdentifier": "assignment.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"priority": "high",
"skillSet": ["escalation", "technical"]
},
"retryPolicy": {
"maximumAttempts": 2,
"initialInterval": 5000,
"backoffCoefficient": 1.5
},
"onFailure": "ABORT",
"isSleepActivity": false,
"executionTimeout": 60000,
"dependencies": [1],
"filters": {}
}
],
"executingAgent": "workflow-engine",
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z",
"createdBy": "USER001",
"teamId": "TEAM001",
"metadata": {
"description": "Automated workflow for escalating high-priority tickets",
"tags": ["escalation", "automation", "support"]
}
}
],
"total": 1
},
"status": true,
"message": "Workflows retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get available workflow filters
Source: https://docs.thena.ai/api-reference/mcp/workflows/get-available-workflow-filters
MCP tool to retrieve available filter operators and logical operators for workflow filtering from the Thena platform.
### MCP tool: `get_available_workflow_filters`
Retrieves available filter operators and logical operators that can be used in workflow filters. This tool helps you understand what filtering capabilities are available when configuring workflow triggers and conditions.
This tool doesn't require any input parameters and returns all available filter operators and logical operators.
### Example prompt
```prompt theme={null}
Get available workflow filters
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_available\_workflow\_filters tool with the correct arguments.
### Input parameters
This tool doesn't require any input parameters.
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
filterOperators
array
Available filter operators for comparing values
logicalOperators
array
Available logical operators for combining conditions
dataTypes
array
Supported data types for filter values
#### Filter operator structure
Each filter operator contains:
| Field | Type | Description |
| -------------- | ------ | ------------------------------------------------ |
| operator | string | The operator symbol (e.g., "equals", "contains") |
| description | string | Description of what the operator does |
| supportedTypes | array | Data types this operator supports |
#### Logical operator structure
Each logical operator contains:
| Field | Type | Description |
| ----------- | ------ | --------------------------------------- |
| operator | string | The operator symbol (e.g., "AND", "OR") |
| description | string | Description of what the operator does |
### Sample response
```json theme={null}
{
"data": {
"filterOperators": [
{
"operator": "equals",
"description": "Checks if the field value equals the specified value",
"supportedTypes": ["string", "number", "boolean"]
},
{
"operator": "not_equals",
"description": "Checks if the field value does not equal the specified value",
"supportedTypes": ["string", "number", "boolean"]
},
{
"operator": "contains",
"description": "Checks if the field value contains the specified substring",
"supportedTypes": ["string"]
},
{
"operator": "not_contains",
"description": "Checks if the field value does not contain the specified substring",
"supportedTypes": ["string"]
},
{
"operator": "starts_with",
"description": "Checks if the field value starts with the specified prefix",
"supportedTypes": ["string"]
},
{
"operator": "ends_with",
"description": "Checks if the field value ends with the specified suffix",
"supportedTypes": ["string"]
},
{
"operator": "greater_than",
"description": "Checks if the field value is greater than the specified value",
"supportedTypes": ["number", "date"]
},
{
"operator": "greater_than_or_equal",
"description": "Checks if the field value is greater than or equal to the specified value",
"supportedTypes": ["number", "date"]
},
{
"operator": "less_than",
"description": "Checks if the field value is less than the specified value",
"supportedTypes": ["number", "date"]
},
{
"operator": "less_than_or_equal",
"description": "Checks if the field value is less than or equal to the specified value",
"supportedTypes": ["number", "date"]
},
{
"operator": "in",
"description": "Checks if the field value is in the specified array of values",
"supportedTypes": ["string", "number"]
},
{
"operator": "not_in",
"description": "Checks if the field value is not in the specified array of values",
"supportedTypes": ["string", "number"]
},
{
"operator": "is_null",
"description": "Checks if the field value is null or undefined",
"supportedTypes": ["any"]
},
{
"operator": "is_not_null",
"description": "Checks if the field value is not null or undefined",
"supportedTypes": ["any"]
},
{
"operator": "regex",
"description": "Checks if the field value matches the specified regular expression",
"supportedTypes": ["string"]
}
],
"logicalOperators": [
{
"operator": "AND",
"description": "Combines multiple conditions - all must be true"
},
{
"operator": "OR",
"description": "Combines multiple conditions - at least one must be true"
},
{
"operator": "NOT",
"description": "Negates a single condition"
}
],
"dataTypes": [
{
"type": "string",
"description": "Text values"
},
{
"type": "number",
"description": "Numeric values"
},
{
"type": "boolean",
"description": "True/false values"
},
{
"type": "date",
"description": "Date and time values"
},
{
"type": "array",
"description": "Arrays of values"
}
]
},
"status": true,
"message": "Available workflow filters retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get event registry
Source: https://docs.thena.ai/api-reference/mcp/workflows/get-event-registry
MCP tool to retrieve available events that can trigger workflows from the Thena platform.
### MCP tool: `get_event_registry`
Retrieves the event registry for a specific team, showing all available events that can be used to trigger workflows. This tool helps you discover what events are available for workflow configuration.
You must provide the team ID to retrieve the event registry for that specific team.
### Example prompt
```prompt theme={null}
Get event registry for team "TEAM001"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_event\_registry tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------ | ------ | -------- | --------------------------------------- |
| teamId | string | Yes | The team ID to fetch event registry for |
### Response fields
Below are the fields you may see in each event object in the response:
Field
Type
Description
id
string
The unique identifier of the event
name
string
The name of the event
description
string
The description of the event
category
string
The category of the event
schema
object
The JSON schema for the event payload
isActive
boolean
Whether the event is active and available
createdAt
string (ISO8601)
The creation timestamp
updatedAt
string (ISO8601)
The last update timestamp
### Sample response
```json theme={null}
{
"data": [
{
"id": "EVENT001",
"name": "ticket.created",
"description": "Triggered when a new ticket is created",
"category": "ticket",
"schema": {
"type": "object",
"properties": {
"ticketId": {
"type": "string",
"description": "The unique identifier of the ticket"
},
"title": {
"type": "string",
"description": "The title of the ticket"
},
"priority": {
"type": "string",
"enum": ["low", "medium", "high", "urgent"],
"description": "The priority level of the ticket"
},
"team": {
"type": "string",
"description": "The team assigned to the ticket"
},
"accountId": {
"type": "string",
"description": "The account ID associated with the ticket"
},
"createdBy": {
"type": "string",
"description": "The user who created the ticket"
}
},
"required": ["ticketId", "title", "priority", "team"]
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "EVENT002",
"name": "ticket.updated",
"description": "Triggered when a ticket is updated",
"category": "ticket",
"schema": {
"type": "object",
"properties": {
"ticketId": {
"type": "string",
"description": "The unique identifier of the ticket"
},
"changes": {
"type": "object",
"description": "The changes made to the ticket"
},
"updatedBy": {
"type": "string",
"description": "The user who updated the ticket"
}
},
"required": ["ticketId", "changes"]
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "EVENT003",
"name": "comment.created",
"description": "Triggered when a new comment is created",
"category": "comment",
"schema": {
"type": "object",
"properties": {
"commentId": {
"type": "string",
"description": "The unique identifier of the comment"
},
"entityType": {
"type": "string",
"enum": ["ticket", "account", "contact"],
"description": "The type of entity the comment is on"
},
"entityId": {
"type": "string",
"description": "The ID of the entity"
},
"author": {
"type": "string",
"description": "The author of the comment"
},
"visibility": {
"type": "string",
"enum": ["public", "private"],
"description": "The visibility of the comment"
}
},
"required": ["commentId", "entityType", "entityId", "author"]
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
},
{
"id": "EVENT004",
"name": "account.created",
"description": "Triggered when a new account is created",
"category": "account",
"schema": {
"type": "object",
"properties": {
"accountId": {
"type": "string",
"description": "The unique identifier of the account"
},
"name": {
"type": "string",
"description": "The name of the account"
},
"industry": {
"type": "string",
"description": "The industry of the account"
},
"createdBy": {
"type": "string",
"description": "The user who created the account"
}
},
"required": ["accountId", "name"]
},
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z"
}
],
"status": true,
"message": "Event registry retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get workflow
Source: https://docs.thena.ai/api-reference/mcp/workflows/get-workflow
MCP tool to retrieve a specific workflow by its unique identifier from the Thena platform.
### MCP tool: `get_workflow`
Retrieves detailed information about a specific workflow by its unique identifier. This tool provides comprehensive workflow details including definition, configuration, and version information.
You must provide the workflow unique identifier. The version parameter is optional and will retrieve the latest version if not specified.
### Example prompt
```prompt theme={null}
Get workflow with unique identifier "ticket-escalation-workflow"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_workflow tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------------ | ------ | -------- | ------------------------------------------------ |
| workflowUniqueIdentifier | string | Yes | The unique identifier of the workflow |
| version | number | No | The version of the workflow (defaults to latest) |
### Response fields
Below are the fields you may see in the response:
Field
Type
Description
uid
string
Unique identifier for current version of the workflow
type
string
The type of the workflow
subType
string
The sub type of the workflow
uniqueIdentifier
string
The unique identifier of the workflow
name
string
The name identifier of the workflow
version
number
The version of the workflow
triggerEvent
object
The trigger event of the workflow
filters
object
The filters of the workflow
annotations
array
The annotation for the workflow
workflowDefinition
array
The workflow definition steps
executingAgent
string
The executing agent of the workflow
isActive
boolean
The status of the workflow
createdAt
string (ISO8601)
The created at date of the workflow
updatedAt
string (ISO8601)
The updated at date of the workflow
createdBy
string
The created by of the workflow
teamId
string
The team id of the workflow
metadata
object
The metadata for the workflow
### Sample response
```json theme={null}
{
"data": {
"uid": "WORKFLOW001",
"type": "WORKFLOW",
"subType": "AI_AGENT",
"uniqueIdentifier": "ticket-escalation-workflow",
"name": "Ticket Escalation Workflow",
"version": 1,
"triggerEvent": {
"id": "EVENT001",
"name": "ticket.created",
"description": "Triggered when a new ticket is created",
"schema": {
"type": "object",
"properties": {
"ticketId": { "type": "string" },
"priority": { "type": "string" },
"team": { "type": "string" }
}
}
},
"filters": {
"priority": "high",
"team": "support",
"autoEscalate": true
},
"annotations": [
{
"entityType": "ticket",
"data": {
"autoEscalate": true,
"escalationThreshold": 30
},
"relations": ["escalation", "notification"]
}
],
"workflowDefinition": [
{
"stepIdentifier": 1,
"activity": {
"name": "send-notification",
"uniqueIdentifier": "notification.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"recipients": ["support-team", "senior-agents"],
"message": "High priority ticket requires immediate attention",
"priority": "urgent"
},
"retryPolicy": {
"maximumAttempts": 3,
"initialInterval": 1000,
"backoffCoefficient": 2
},
"onFailure": "CONTINUE",
"isSleepActivity": false,
"executionTimeout": 30000,
"dependencies": [],
"filters": {
"notificationType": "escalation"
}
},
{
"stepIdentifier": 2,
"activity": {
"name": "assign-to-senior-agent",
"uniqueIdentifier": "assignment.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"priority": "high",
"skillSet": ["escalation", "technical", "senior"],
"autoAssign": true
},
"retryPolicy": {
"maximumAttempts": 2,
"initialInterval": 5000,
"backoffCoefficient": 1.5
},
"onFailure": "ABORT",
"isSleepActivity": false,
"executionTimeout": 60000,
"dependencies": [1],
"filters": {
"agentLevel": "senior"
}
},
{
"stepIdentifier": 3,
"activity": {
"name": "update-ticket-status",
"uniqueIdentifier": "status-update.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"status": "escalated",
"comment": "Automatically escalated due to high priority"
},
"retryPolicy": {
"maximumAttempts": 1,
"initialInterval": 1000,
"backoffCoefficient": 1
},
"onFailure": "CONTINUE",
"isSleepActivity": false,
"executionTimeout": 15000,
"dependencies": [2],
"filters": {}
}
],
"executingAgent": "workflow-engine",
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-24T07:19:10.258Z",
"createdBy": "USER001",
"teamId": "TEAM001",
"metadata": {
"description": "Automated workflow for escalating high-priority tickets",
"tags": ["escalation", "automation", "support"],
"category": "customer-service",
"priority": "high"
}
},
"status": true,
"message": "Workflow retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get workflow executions
Source: https://docs.thena.ai/api-reference/mcp/workflows/get-workflow-executions
MCP tool to retrieve executions/instances of a specific workflow from the Thena platform.
### MCP tool: `get_workflow_executions`
Retrieves all executions/instances of a specific workflow with optional filtering by status and date range. This tool provides detailed information about workflow execution history and current status.
You must provide the workflow ID. Optional filters include version, status, and date range for more targeted results.
### Example prompt
```prompt theme={null}
Get all executions for workflow "ticket-escalation-workflow" with status "COMPLETED"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_workflow\_executions tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ---------- | ------ | -------- | ------------------------------------------------------------- |
| workflowId | string | Yes | The unique identifier of the workflow |
| version | number | No | The version of the workflow |
| status | string | No | The status of the workflow execution |
| from | string | No | The start date from which to fetch executions (in ISO format) |
| to | string | No | The end date to which to fetch executions (in ISO format) |
### Response fields
Below are the fields you may see in each workflow execution object in the response:
Field
Type
Description
id
string
The identifier of the workflow instance
workflowId
string
The identifier of the workflow
version
number
The version of the workflow
status
string
The status of the workflow instance
context
object
The context of the workflow instance
startedAt
string (ISO8601)
The start date of the workflow instance
lastUpdatedAt
string (ISO8601)
The last updated date of the workflow instance
### Sample response
```json theme={null}
{
"data": [
{
"id": "EXECUTION001",
"workflowId": "ticket-escalation-workflow",
"version": 1,
"status": "COMPLETED",
"context": {
"ticketId": "TICKET123",
"priority": "high",
"team": "support",
"triggeredBy": "ticket.created",
"executionId": "EXECUTION001"
},
"startedAt": "2025-07-24T10:00:00.000Z",
"lastUpdatedAt": "2025-07-24T10:05:30.000Z"
},
{
"id": "EXECUTION002",
"workflowId": "ticket-escalation-workflow",
"version": 1,
"status": "RUNNING",
"context": {
"ticketId": "TICKET124",
"priority": "high",
"team": "support",
"triggeredBy": "ticket.created",
"executionId": "EXECUTION002",
"currentStep": 2,
"stepStatus": "IN_PROGRESS"
},
"startedAt": "2025-07-24T11:15:00.000Z",
"lastUpdatedAt": "2025-07-24T11:16:45.000Z"
},
{
"id": "EXECUTION003",
"workflowId": "ticket-escalation-workflow",
"version": 1,
"status": "FAILED",
"context": {
"ticketId": "TICKET125",
"priority": "high",
"team": "support",
"triggeredBy": "ticket.created",
"executionId": "EXECUTION003",
"error": "Activity assignment.activity failed after 3 retry attempts",
"failedStep": 2,
"errorDetails": {
"code": "ACTIVITY_FAILURE",
"message": "No available agents with required skills",
"timestamp": "2025-07-24T09:30:15.000Z"
}
},
"startedAt": "2025-07-24T09:25:00.000Z",
"lastUpdatedAt": "2025-07-24T09:30:15.000Z"
}
],
"status": true,
"message": "Workflow executions retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Get workflow tasks
Source: https://docs.thena.ai/api-reference/mcp/workflows/get-workflow-tasks
MCP tool to retrieve tasks/activities within a workflow execution from the Thena platform.
### MCP tool: `get_workflow_tasks`
Retrieves all tasks/activities within a specific workflow execution by its instance ID. This tool provides detailed information about individual workflow steps, their execution status, and results.
You must provide the workflow instance ID to retrieve the tasks for that specific execution.
### Example prompt
```prompt theme={null}
Get all tasks for workflow execution "EXECUTION001"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the get\_workflow\_tasks tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------ | ------ | -------- | ----------------------------------------- |
| workflowInstanceId | string | Yes | The instance ID of the workflow execution |
### Response fields
Below are the fields you may see in each workflow task object in the response:
Field
Type
Description
id
string
The identifier of the activity of a workflow instance
stepIdentifier
number
The step identifier of the activity as present in workflow definition
activity
string
The activity of the workflow instance
status
string
The status of the activity of a workflow instance
input
object
The input of the activity of a workflow instance
result
object
The result of the activity of a workflow instance
isRetry
boolean
If the activity is a retry
isCompensation
boolean
If the activity is a compensation
executionTime
number
The execution time of the activity (in seconds)
startedAt
string (ISO8601)
The start date of the activity
lastUpdatedAt
string (ISO8601)
The last updated date of the activity
### Sample response
```json theme={null}
{
"data": [
{
"id": "TASK001",
"stepIdentifier": 1,
"activity": "send-notification",
"status": "COMPLETED",
"input": {
"recipients": ["support-team"],
"message": "High priority ticket requires immediate attention",
"priority": "urgent"
},
"result": {
"notificationId": "NOTIF001",
"sentTo": ["support-team"],
"deliveryStatus": "delivered",
"timestamp": "2025-07-24T10:00:15.000Z"
},
"isRetry": false,
"isCompensation": false,
"executionTime": 2.5,
"startedAt": "2025-07-24T10:00:12.000Z",
"lastUpdatedAt": "2025-07-24T10:00:15.000Z"
},
{
"id": "TASK002",
"stepIdentifier": 2,
"activity": "assign-to-senior-agent",
"status": "RUNNING",
"input": {
"priority": "high",
"skillSet": ["escalation", "technical"],
"autoAssign": true
},
"result": {
"agentSearchInProgress": true,
"candidatesFound": 3,
"currentStep": "evaluating_availability"
},
"isRetry": false,
"isCompensation": false,
"executionTime": 45.2,
"startedAt": "2025-07-24T10:00:16.000Z",
"lastUpdatedAt": "2025-07-24T10:01:01.000Z"
},
{
"id": "TASK003",
"stepIdentifier": 2,
"activity": "assign-to-senior-agent",
"status": "FAILED",
"input": {
"priority": "high",
"skillSet": ["escalation", "technical"],
"autoAssign": true
},
"result": {
"error": "No available agents with required skills",
"attemptsMade": 3,
"lastAttempt": "2025-07-24T10:01:30.000Z"
},
"isRetry": true,
"isCompensation": false,
"executionTime": 120.0,
"startedAt": "2025-07-24T10:01:02.000Z",
"lastUpdatedAt": "2025-07-24T10:03:02.000Z"
},
{
"id": "TASK004",
"stepIdentifier": 3,
"activity": "update-ticket-status",
"status": "PENDING",
"input": {
"status": "escalated",
"comment": "Automatically escalated due to high priority"
},
"result": null,
"isRetry": false,
"isCompensation": false,
"executionTime": 0,
"startedAt": null,
"lastUpdatedAt": "2025-07-24T10:00:16.000Z"
}
],
"status": true,
"message": "Workflow tasks retrieved successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
***
# Introduction
Source: https://docs.thena.ai/api-reference/mcp/workflows/overview
# MCP Workflow Tools
This section documents the Model Context Protocol (MCP) tools available for working with workflows in the Thena platform. These tools allow you to create, manage, and monitor workflow definitions, executions, and activities via Thena MCP server.
## Available tools
### Core workflow management
* [Create Workflow](./create-workflow): Create a new workflow with comprehensive definition and configuration.
* [Delete Workflow](./delete-workflow): Delete a workflow from the system.
* [Get All Workflows](./get-all-workflows): Retrieve a paginated list of all workflows with optional filtering.
* [Get Workflow](./get-workflow): Retrieve a specific workflow by its unique identifier.
* [Toggle Workflow](./toggle-workflow): Enable or disable a workflow.
* [Update Workflow](./update-workflow): Update an existing workflow's definition and configuration.
### Workflow execution & monitoring
* [Get Workflow Executions](./get-workflow-executions): Retrieve executions/instances of a specific workflow.
* [Get Workflow Tasks](./get-workflow-tasks): Retrieve tasks/activities within a workflow execution.
### Registry & configuration
* [Get Activity Registry](./get-activity-registry): Retrieve available activities that can be used in workflows.
* [Get Available Workflow Filters](./get-available-workflow-filters): Retrieve available filters for workflow filtering.
* [Get Event Registry](./get-event-registry): Retrieve available events that can trigger workflows.
# Toggle workflow
Source: https://docs.thena.ai/api-reference/mcp/workflows/toggle-workflow
MCP tool to activate or deactivate a workflow in the Thena platform.
### MCP tool: `toggle_workflow`
Activates or deactivates a workflow by toggling its active status. This tool allows you to enable or disable workflows without deleting them, providing a way to temporarily pause workflow execution.
You must provide the workflow unique identifier and the desired active status (true to activate, false to deactivate).
### Example prompt
```prompt theme={null}
Deactivate workflow "ticket-escalation-workflow"
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the toggle\_workflow tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------------ | ------- | -------- | ------------------------------------------------------------- |
| workflowUniqueIdentifier | string | Yes | The unique identifier of the workflow to toggle |
| isActive | boolean | Yes | Whether to activate (true) or deactivate (false) the workflow |
### Response fields
The response will be a simple success message indicating the workflow was activated or deactivated.
### Sample response
```json theme={null}
{
"content": [
{
"type": "text",
"text": "Workflow deactivated successfully"
}
]
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool provides a safe way to pause workflow execution without losing the workflow definition. Deactivated workflows will not trigger or execute until reactivated.
***
# Update workflow
Source: https://docs.thena.ai/api-reference/mcp/workflows/update-workflow
MCP tool to update an existing workflow in the Thena platform.
### MCP tool: `update_workflow`
Updates an existing workflow's definition and configuration. This tool allows you to modify workflow steps, activities, triggers, and execution policies while preserving the workflow's unique identifier.
You must provide the workflow unique identifier. All other fields are optional and only the provided fields will be updated.
### Example prompt
```prompt theme={null}
Update workflow "ticket-escalation-workflow" to add a new notification step and modify the retry policy
```
When you use this prompt in a chat with the model (with the MCP tool registered), the model will automatically call the update\_workflow tool with the correct arguments.
### Input parameters
| Name | Type | Required | Description |
| ------------------------ | ------- | -------- | ----------------------------------------------- |
| workflowUniqueIdentifier | string | Yes | The unique identifier of the workflow to update |
| name | string | No | The updated name of the workflow |
| teamId | string | No | The team ID that owns this workflow |
| triggerEvent | object | No | The event that triggers this workflow |
| filters | object | No | Filters to apply to the workflow trigger |
| annotations | array | No | Annotations for the workflow |
| workflowDefinition | array | No | The definition of workflow steps |
| executingAgent | string | No | The agent that executes this workflow |
| isActive | boolean | No | Whether the workflow is active |
| metadata | object | No | Additional metadata for the workflow |
#### Trigger event structure
| Field | Type | Required | Description |
| --------- | ------ | -------- | ------------------------------------------ |
| uid | string | Yes | The unique identifier of the trigger event |
| eventName | string | Yes | The name of the trigger event |
#### Workflow step structure
Each step in the `workflowDefinition` array contains:
| Field | Type | Required | Description |
| ---------------- | ------- | -------- | ------------------------------------------------------- |
| stepIdentifier | number | Yes | The identifier for this step |
| activity | object | Yes | The activity to execute in this step |
| input | object | Yes | The input parameters for this activity |
| retryPolicy | object | No | The retry policy for this step |
| onFailure | string | No | Action to take on failure (CONTINUE, ABORT, COMPENSATE) |
| isSleepActivity | boolean | No | Whether this is a sleep/wait activity |
| executionTimeout | number | No | Timeout for execution in seconds |
| approver | object | No | Approver configuration for this step |
| dependencies | array | No | Step dependencies |
| filters | object | No | Filters for this step |
#### Activity structure
| Field | Type | Required | Description |
| -------------------------- | ------- | -------- | ---------------------------------------------------------------------- |
| uniqueIdentifier | string | Yes | The unique identifier of the activity |
| version | number | No | The version of the activity |
| autoUpgradeToLatestVersion | boolean | No | Whether to automatically upgrade to the latest version (default: true) |
#### Retry policy structure
| Field | Type | Required | Description |
| ------------------ | ------ | -------- | ------------------------------------------- |
| maximumAttempts | number | No | Maximum number of retry attempts |
| initialInterval | number | No | Initial interval between retries in seconds |
| backoffCoefficient | number | No | Backoff coefficient for retry intervals |
#### Approver structure
| Field | Type | Required | Description |
| ------- | ------ | -------- | ------------------------------- |
| type | string | No | Type of approver (TEAM or USER) |
| uid | string | No | ID of the approver |
| timeout | number | No | Timeout for approval in seconds |
### Response fields
The response will contain the updated workflow with the same structure as the `get_workflow` tool.
### Sample response
```json theme={null}
{
"data": {
"uid": "WORKFLOW001",
"type": "WORKFLOW",
"subType": "AI_AGENT",
"uniqueIdentifier": "ticket-escalation-workflow",
"name": "Enhanced Ticket Escalation Workflow",
"version": 2,
"triggerEvent": {
"id": "EVENT001",
"name": "ticket.created",
"description": "Triggered when a new ticket is created"
},
"filters": {
"priority": "high",
"team": "support",
"autoEscalate": true,
"escalationThreshold": 15
},
"annotations": [
{
"entityType": "workflow",
"data": {
"tags": ["escalation", "automation", "enhanced"]
},
"relations": []
}
],
"workflowDefinition": [
{
"stepIdentifier": 1,
"activity": {
"name": "send-notification",
"uniqueIdentifier": "notification.activity",
"version": 2,
"autoUpgradeToLatestVersion": true
},
"input": {
"recipients": ["support-team", "senior-agents"],
"message": "High priority ticket requires immediate attention",
"priority": "urgent",
"includeMetrics": true
},
"retryPolicy": {
"maximumAttempts": 5,
"initialInterval": 2000,
"backoffCoefficient": 2.5
},
"onFailure": "CONTINUE",
"isSleepActivity": false,
"executionTimeout": 45000,
"dependencies": [],
"filters": {
"notificationType": "escalation"
}
},
{
"stepIdentifier": 2,
"activity": {
"name": "assign-to-senior-agent",
"uniqueIdentifier": "assignment.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"priority": "high",
"skillSet": ["escalation", "technical", "senior"],
"autoAssign": true,
"loadBalancing": true
},
"retryPolicy": {
"maximumAttempts": 3,
"initialInterval": 5000,
"backoffCoefficient": 1.5
},
"onFailure": "ABORT",
"isSleepActivity": false,
"executionTimeout": 60000,
"dependencies": [1],
"filters": {
"agentLevel": "senior"
}
},
{
"stepIdentifier": 3,
"activity": {
"name": "update-ticket-status",
"uniqueIdentifier": "status-update.activity",
"version": 1,
"autoUpgradeToLatestVersion": true
},
"input": {
"status": "escalated",
"comment": "Automatically escalated due to high priority",
"addTimestamp": true
},
"retryPolicy": {
"maximumAttempts": 2,
"initialInterval": 1000,
"backoffCoefficient": 1
},
"onFailure": "CONTINUE",
"isSleepActivity": false,
"executionTimeout": 15000,
"dependencies": [2],
"filters": {}
}
],
"executingAgent": "workflow-engine-v2",
"isActive": true,
"createdAt": "2025-07-24T07:19:10.258Z",
"updatedAt": "2025-07-25T12:50:38.937Z",
"createdBy": "USER001",
"teamId": "TEAM001",
"metadata": {
"description": "Enhanced automated workflow for escalating high-priority tickets",
"tags": ["escalation", "automation", "support", "enhanced"],
"category": "customer-service",
"version": "2.0",
"lastUpdated": "2025-07-25T12:50:38.937Z"
}
},
"status": true,
"message": "Workflow updated successfully!",
"timestamp": "2025-07-25T12:50:38.937Z"
}
```
Always pass an object as input, even if empty, to avoid errors when calling the tool directly.
This tool modifies existing workflow data. Only the fields you provide will be updated; other fields will remain unchanged. The workflow version will be incremented automatically.
***
# Bulk create account contacts
Source: https://docs.thena.ai/api-reference/platform/accounts/bulk-create-customer-contacts
post /v1/accounts/contacts/bulk
# Create an account contact
Source: https://docs.thena.ai/api-reference/platform/accounts/create-a-customer-contact
post /v1/accounts/contacts
# Create an account
Source: https://docs.thena.ai/api-reference/platform/accounts/create-an-account
post /v1/accounts
# Creates an account activity
Source: https://docs.thena.ai/api-reference/platform/accounts/creates-an-account-activity
post /v1/accounts/activities
# Creates an account note
Source: https://docs.thena.ai/api-reference/platform/accounts/creates-an-account-note
post /v1/accounts/notes
# Creates an account task
Source: https://docs.thena.ai/api-reference/platform/accounts/creates-an-account-task
post /v1/accounts/tasks
# Delete customer contact
Source: https://docs.thena.ai/api-reference/platform/accounts/delete-a-customer-contact
delete /v1/accounts/contacts/{contactId}
# Delete an account
Source: https://docs.thena.ai/api-reference/platform/accounts/delete-an-account
delete /v1/accounts/{id}
# Deletes an account activity
Source: https://docs.thena.ai/api-reference/platform/accounts/deletes-an-account-activity
delete /v1/accounts/activities/{activityId}
# Deletes an account note
Source: https://docs.thena.ai/api-reference/platform/accounts/deletes-an-account-note
delete /v1/accounts/notes/{noteId}
# Deletes an account task
Source: https://docs.thena.ai/api-reference/platform/accounts/deletes-an-account-task
delete /v1/accounts/tasks/{taskId}
# Fetches all account activities
Source: https://docs.thena.ai/api-reference/platform/accounts/fetches-all-account-activities
get /v1/accounts/activities
# Fetches all account notes by account ID or by note ID
Source: https://docs.thena.ai/api-reference/platform/accounts/fetches-all-account-notes-by-account-id-or-by-note-id
get /v1/accounts/notes
# Fetches all account tasks by account ID or by task ID
Source: https://docs.thena.ai/api-reference/platform/accounts/fetches-all-account-tasks-by-account-id-or-by-task-id
get /v1/accounts/tasks
# Filter customer contacts by IDs
Source: https://docs.thena.ai/api-reference/platform/accounts/filter-customer-contacts-by-ids
post /v1/accounts/contacts/filter/ids
# Get account details
Source: https://docs.thena.ai/api-reference/platform/accounts/get-account-details
get /v1/accounts/{id}
#
Source: https://docs.thena.ai/api-reference/platform/accounts/get-accounts-by-ids
post /v1/accounts/filter/ids
Get accounts by IDs
# Gets all account attribute values
Source: https://docs.thena.ai/api-reference/platform/accounts/gets-all-account-attribute-values
get /v1/accounts/attributes
# Ingest customer contacts
Source: https://docs.thena.ai/api-reference/platform/accounts/ingest-users
post /v1/accounts/contacts/ingest
# Removes an attachment from an account activity
Source: https://docs.thena.ai/api-reference/platform/accounts/removes-an-attachment-from-an-account-activity
delete /v1/accounts/activities/{activityId}/attachments/{attachmentId}
# Removes an attachment from an account note
Source: https://docs.thena.ai/api-reference/platform/accounts/removes-an-attachment-from-an-account-note
delete /v1/accounts/notes/{noteId}/attachments/{attachmentId}
# Removes an attachment from an account task
Source: https://docs.thena.ai/api-reference/platform/accounts/removes-an-attachment-from-an-account-task
delete /v1/accounts/tasks/{taskId}/attachments/{attachmentId}
# Update customer contact
Source: https://docs.thena.ai/api-reference/platform/accounts/update-a-customer-contact
put /v1/accounts/contacts/{contactId}
# Update an account
Source: https://docs.thena.ai/api-reference/platform/accounts/update-an-account
put /v1/accounts/{id}
# Updates an account activity
Source: https://docs.thena.ai/api-reference/platform/accounts/updates-an-account-activity
put /v1/accounts/activities/{activityId}
# Updates an account note
Source: https://docs.thena.ai/api-reference/platform/accounts/updates-an-account-note
put /v1/accounts/notes/{noteId}
# Updates an account task
Source: https://docs.thena.ai/api-reference/platform/accounts/updates-an-account-task
put /v1/accounts/tasks/{taskId}
#
Source: https://docs.thena.ai/api-reference/platform/comments/comment-on-an-entity
post /v1/comments
Create a comment on an entity (ticket, account activity, note, or task). This endpoint is only available for standard and enterprise tier organizations.
# Delete a comment
Source: https://docs.thena.ai/api-reference/platform/comments/delete-a-comment
delete /v1/comments/{commentId}
# Get a comment
Source: https://docs.thena.ai/api-reference/platform/comments/get-a-comment
get /v1/comments/{commentId}
# Get comment threads
Source: https://docs.thena.ai/api-reference/platform/comments/get-comment-threads
get /v1/comments/{commentId}/threads
#
Source: https://docs.thena.ai/api-reference/platform/comments/get-comments-for-an-entity-by-user-type
get /v1/comments/user-type
Get comments for an entity filtered by user type (agent, customer, or all). This endpoint is only available for standard and enterprise tier organizations.
#
Source: https://docs.thena.ai/api-reference/platform/comments/get-comments-on-an-entity
get /v1/comments
Get all comments for an entity (ticket, account activity, note, or task). This endpoint is only available for standard and enterprise tier organizations.
# Update a comment
Source: https://docs.thena.ai/api-reference/platform/comments/update-a-comment
patch /v1/comments/{commentId}
# Create a CSAT rule for a team
Source: https://docs.thena.ai/api-reference/platform/csat/create-a-csat-rule-for-a-team
post /v1/csat/rules/{teamUid}
Creates a new rule for a team. If CSAT settings do not exist for the team, they will be created automatically.
# Delete a CSAT rule
Source: https://docs.thena.ai/api-reference/platform/csat/delete-a-csat-rule
delete /v1/csat/rules/{id}
# Get a CSAT rule by ID
Source: https://docs.thena.ai/api-reference/platform/csat/get-a-csat-rule-by-id
get /v1/csat/rules/{id}
# Get CSAT settings by team ID
Source: https://docs.thena.ai/api-reference/platform/csat/get-csat-settings-by-team-id
get /v1/csat/team/{teamUid}
# Reorder the priority of CSAT rules for a team
Source: https://docs.thena.ai/api-reference/platform/csat/reorder-the-priority-of-csat-rules-for-a-team
patch /v1/csat/team/{teamUid}/rules/reorder
# Update a CSAT rule
Source: https://docs.thena.ai/api-reference/platform/csat/update-a-csat-rule
patch /v1/csat/rules/{id}
# null
Source: https://docs.thena.ai/api-reference/platform/csat/update-the-cooldown-period-for-a-team
patch /v1/csat/team/{teamUid}/cooldown
# Update the Csat setting for a team
Source: https://docs.thena.ai/api-reference/platform/csat/update-the-csat-setting-for-a-team
patch /v1/csat/team/{teamUid}/update
# Create a custom field
Source: https://docs.thena.ai/api-reference/platform/custom-fields/create-a-custom-field
post /v1/custom-field
# Delete custom fields
Source: https://docs.thena.ai/api-reference/platform/custom-fields/delete-custom-fields
post /v1/custom-field/delete
# Get all custom field types
Source: https://docs.thena.ai/api-reference/platform/custom-fields/get-all-custom-field-types
get /v1/custom-field/types
# Get all custom fields
Source: https://docs.thena.ai/api-reference/platform/custom-fields/get-all-custom-fields
get /v1/custom-field
#
Source: https://docs.thena.ai/api-reference/platform/custom-fields/get-all-thena-restricted-fields
get /v1/custom-field/thena-restricted-fields
This endpoint is only available for standard and enterprise tier organizations.
# Get custom fields by IDs
Source: https://docs.thena.ai/api-reference/platform/custom-fields/get-custom-fields-by-ids
get /v1/custom-field/fetchByIds
# Search custom field using name
Source: https://docs.thena.ai/api-reference/platform/custom-fields/search-custom-field-using-name
get /v1/custom-field/search
# Update custom fields
Source: https://docs.thena.ai/api-reference/platform/custom-fields/update-custom-fields
patch /v1/custom-field
#
Source: https://docs.thena.ai/api-reference/platform/emoji-actions/delete-an-emoji-action-by-id
delete /v1/emojis/actions/{teamId}/{emojiActionId}
Delete a specific emoji action by ID from a team. This endpoint is only available for standard and enterprise tier organizations.
#
Source: https://docs.thena.ai/api-reference/platform/emoji-actions/get-all-emoji-actions
get /v1/emojis/actions
Get all available emoji actions. This endpoint is only available for standard and enterprise tier organizations.
#
Source: https://docs.thena.ai/api-reference/platform/emoji-actions/get-all-emoji-actions-for-a-team
get /v1/emojis/actions/{teamId}
Get all emoji action mappings for a specific team. This endpoint is only available for standard and enterprise tier organizations.
#
Source: https://docs.thena.ai/api-reference/platform/emoji-actions/map-an-emoji-action
post /v1/emojis/actions/{teamId}
Create emoji action mappings for a team. This endpoint is only available for standard and enterprise tier organizations.
#
Source: https://docs.thena.ai/api-reference/platform/emoji-actions/update-an-emoji-action
patch /v1/emojis/actions/{teamId}
Update multiple emoji actions for a team. This endpoint is only available for standard and enterprise tier organizations.
#
Source: https://docs.thena.ai/api-reference/platform/emoji-actions/update-an-emoji-action-by-id
patch /v1/emojis/actions/{teamId}/{emojiActionId}
Update a specific emoji action by ID for a team. This endpoint is only available for standard and enterprise tier organizations.
# Create a form
Source: https://docs.thena.ai/api-reference/platform/forms/create-a-form
post /v1/forms
# Delete forms
Source: https://docs.thena.ai/api-reference/platform/forms/delete-forms
post /v1/forms/delete
# Get all forms
Source: https://docs.thena.ai/api-reference/platform/forms/get-all-forms
get /v1/forms
# Get forms by IDs
Source: https://docs.thena.ai/api-reference/platform/forms/get-forms-by-ids
get /v1/forms/fetchByIds
#
Source: https://docs.thena.ai/api-reference/platform/forms/order-forms
post /v1/forms/order
This endpoint is only available for standard and enterprise tier organizations.
# Search forms using name
Source: https://docs.thena.ai/api-reference/platform/forms/search-forms-using-name
get /v1/forms/search
# Update form
Source: https://docs.thena.ai/api-reference/platform/forms/update-form
patch /v1/forms
# null
Source: https://docs.thena.ai/api-reference/platform/post-csatsubmissions
post /csat/submissions
# Add a reaction to a comment
Source: https://docs.thena.ai/api-reference/platform/reactions/add-a-reaction-to-a-comment
post /v1/reactions/{commentId}
#
Source: https://docs.thena.ai/api-reference/platform/reactions/get-v1reactionsemojis
get /v1/reactions/emojis
Get all available emojis for reactions. This endpoint is only available for standard and enterprise tier organizations.
# Remove a reaction from a comment
Source: https://docs.thena.ai/api-reference/platform/reactions/remove-a-reaction-from-a-comment
delete /v1/reactions/remove/{commentId}/{reactionName}
# Entity search
Source: https://docs.thena.ai/api-reference/platform/search/entity-search
get /v1/search/{collection}
Search for tickets, accounts, comments, help center, users, organization and teams
# Multi search
Source: https://docs.thena.ai/api-reference/platform/search/federated-search
post /v1/search/multi
Perform multiple searches across different collections
# Upload a single file
Source: https://docs.thena.ai/api-reference/platform/storage/upload-a-single-file
post /storage/upload-file
This endpoint is only available for enterprise tier organizations.
# Create a new tag
Source: https://docs.thena.ai/api-reference/platform/tags/create-a-new-tag
post /v1/tags
# Create a new tag for a particular team
Source: https://docs.thena.ai/api-reference/platform/tags/create-a-new-tag-for-a-particular-team
post /v1/teams/{teamUuid}/tags
# Delete a tag
Source: https://docs.thena.ai/api-reference/platform/tags/delete-a-tag
delete /v1/tags/{tagId}
# Get a specific tag
Source: https://docs.thena.ai/api-reference/platform/tags/get-a-specific-tag
get /v1/tags/{tagId}
# Get all tags
Source: https://docs.thena.ai/api-reference/platform/tags/get-all-tags
get /v1/tags
# Get all tags for a particular team
Source: https://docs.thena.ai/api-reference/platform/tags/get-all-tags-for-a-particular-team
get /v1/teams/{teamUuid}/tags
# Remove a tag from a particular team
Source: https://docs.thena.ai/api-reference/platform/tags/remove-a-tag-from-a-particular-team
delete /v1/teams/{teamUuid}/tags/{tagUuid}
# Update a tag
Source: https://docs.thena.ai/api-reference/platform/tags/update-a-tag
patch /v1/tags/{tagId}
# Update a tag for a particular team
Source: https://docs.thena.ai/api-reference/platform/tags/update-a-tag-for-a-particular-team
put /v1/teams/{teamUuid}/tags/{tagUuid}
# Add a team member
Source: https://docs.thena.ai/api-reference/platform/teams/add-a-team-member
post /v1/teams/{teamId}/members
# Create a team
Source: https://docs.thena.ai/api-reference/platform/teams/create-a-team
post /v1/teams
# Create a team routing rule
Source: https://docs.thena.ai/api-reference/platform/teams/create-a-team-routing-rule
post /v1/teams/{teamId}/routing
# Delete a team
Source: https://docs.thena.ai/api-reference/platform/teams/delete-a-team
delete /v1/teams/{teamId}
# null
Source: https://docs.thena.ai/api-reference/platform/teams/delete-a-team-routing-rule
delete /v1/teams/{teamId}/routing/{ruleId}
# Get a team by ID
Source: https://docs.thena.ai/api-reference/platform/teams/get-a-team-by-id
get /v1/teams/{teamId}
# Get all public teams
Source: https://docs.thena.ai/api-reference/platform/teams/get-all-public-teams
get /v1/teams/public
# Get all team members
Source: https://docs.thena.ai/api-reference/platform/teams/get-all-team-members
get /v1/teams/{teamId}/members
# Get all teams that user is the part of!
Source: https://docs.thena.ai/api-reference/platform/teams/get-all-teams-that-user-is-the-part-of!
get /v1/teams
#
Source: https://docs.thena.ai/api-reference/platform/teams/get-sub-teams-for-a-team
get /v1/teams/{teamId}/sub-teams
This endpoint is only available for standard and enterprise tier organizations.
# Get team configurations
Source: https://docs.thena.ai/api-reference/platform/teams/get-team-configurations
get /v1/teams/{teamId}/configurations
# Get team routing
Source: https://docs.thena.ai/api-reference/platform/teams/get-team-routing
get /v1/teams/{teamId}/routing
# Remove a team member
Source: https://docs.thena.ai/api-reference/platform/teams/remove-a-team-member
delete /v1/teams/{teamId}/members/{memberId}
# Update a team
Source: https://docs.thena.ai/api-reference/platform/teams/update-a-team
patch /v1/teams/{teamId}
# Update team configurations
Source: https://docs.thena.ai/api-reference/platform/teams/update-team-configurations
patch /v1/teams/{teamId}/configurations
# Update team routing
Source: https://docs.thena.ai/api-reference/platform/teams/update-team-routing
patch /v1/teams/{teamId}/routing/{ruleId}
# Get all tags for a ticket
Source: https://docs.thena.ai/api-reference/platform/ticket-tags/get-all-tags-for-a-ticket
get /v1/tickets/{ticketId}/tags
# Remove a tag from a ticket
Source: https://docs.thena.ai/api-reference/platform/ticket-tags/remove-a-tag-from-a-ticket
delete /v1/tickets/{ticketId}/tags/{tagId}
# Tags successfully added to ticket
Source: https://docs.thena.ai/api-reference/platform/ticket-tags/tags-successfully-added-to-ticket
post /v1/tickets/{ticketId}/tags
# Archive a ticket
Source: https://docs.thena.ai/api-reference/platform/tickets/archive-a-ticket
patch /v1/tickets/{id}/archive
# Archive tickets in bulk
Source: https://docs.thena.ai/api-reference/platform/tickets/archive-tickets-in-bulk
patch /v1/tickets/bulk/archive
# Assign a ticket to an agent
Source: https://docs.thena.ai/api-reference/platform/tickets/assign-a-ticket-to-an-agent
patch /v1/tickets/{id}/assign
# Comment on a ticket
Source: https://docs.thena.ai/api-reference/platform/tickets/comment-on-a-ticket
post /v1/tickets/{id}/comment
# Create a new ticket status
Source: https://docs.thena.ai/api-reference/platform/tickets/create-a-new-ticket-status
post /v1/tickets/status
# Create a ticket
Source: https://docs.thena.ai/api-reference/platform/tickets/create-a-ticket
post /v1/tickets
# Create tickets in bulk
Source: https://docs.thena.ai/api-reference/platform/tickets/create-tickets-in-bulk
post /v1/tickets/bulk
# Delete a custom ticket status
Source: https://docs.thena.ai/api-reference/platform/tickets/delete-a-custom-ticket-status
delete /v1/tickets/status/{id}
# Delete a ticket
Source: https://docs.thena.ai/api-reference/platform/tickets/delete-a-ticket
delete /v1/tickets/{id}
# Delete tickets in bulk
Source: https://docs.thena.ai/api-reference/platform/tickets/delete-tickets-in-bulk
post /v1/tickets/bulk/bulk-delete
# Get a ticket
Source: https://docs.thena.ai/api-reference/platform/tickets/get-a-ticket
get /v1/tickets/{id}
# Get a ticket status by its ID
Source: https://docs.thena.ai/api-reference/platform/tickets/get-a-ticket-status-by-its-id
get /v1/tickets/status/{id}
# Get all ticket statuses
Source: https://docs.thena.ai/api-reference/platform/tickets/get-all-ticket-statuses
get /v1/tickets/status
# Get all tickets
Source: https://docs.thena.ai/api-reference/platform/tickets/get-all-tickets
get /v1/tickets
# Get comments for a ticket
Source: https://docs.thena.ai/api-reference/platform/tickets/get-comments-for-a-ticket
get /v1/tickets/{id}/comments
# Get ticket related
Source: https://docs.thena.ai/api-reference/platform/tickets/get-ticket-related
get /v1/tickets/{id}/related
# Reassign a ticket to a team
Source: https://docs.thena.ai/api-reference/platform/tickets/reassign-a-ticket-to-a-team
patch /v1/tickets/{id}/reassign-team
#
Source: https://docs.thena.ai/api-reference/platform/tickets/unarchive-a-ticket
patch /v1/tickets/{id}/unarchive
Unarchive a ticket for standard and enterprise tier organizations.
# Update a ticket
Source: https://docs.thena.ai/api-reference/platform/tickets/update-a-ticket
patch /v1/tickets/{id}
# Update a ticket status
Source: https://docs.thena.ai/api-reference/platform/tickets/update-a-ticket-status
patch /v1/tickets/status/{id}
# Update tickets in bulk
Source: https://docs.thena.ai/api-reference/platform/tickets/update-tickets-in-bulk
patch /v1/tickets/bulk
# Create your time off!
Source: https://docs.thena.ai/api-reference/platform/users/create-your-time-off
post /v1/users/time-off
# Delete your time off!
Source: https://docs.thena.ai/api-reference/platform/users/delete-your-time-off
delete /v1/users/time-off/{id}
#
Source: https://docs.thena.ai/api-reference/platform/users/fetch-all-users
get /v1/users/list
This endpoint is only available for standard and enterprise tier organizations.
# Fetch current user's details
Source: https://docs.thena.ai/api-reference/platform/users/fetch-current-users-details
get /v1/users/details
# Get all your time off!
Source: https://docs.thena.ai/api-reference/platform/users/get-all-your-time-off
get /v1/users/time-off
# Update your availability
Source: https://docs.thena.ai/api-reference/platform/users/update-your-availability
patch /v1/users/availability
# Update your time off!
Source: https://docs.thena.ai/api-reference/platform/users/update-your-time-off
patch /v1/users/time-off/{id}
# Update your user details
Source: https://docs.thena.ai/api-reference/platform/users/update-your-user-details
patch /v1/users
# Update your working hours!
Source: https://docs.thena.ai/api-reference/platform/users/update-your-working-hours
patch /v1/users/business-hours
# null
Source: https://docs.thena.ai/api-reference/search/accounts-search
The account search API lets you find, filter, and analyze customer or company accounts using flexible Typesense-powered queries. You can search by text, filter by any account property, and select exactly which fields you want in the response.
> **Note:** Fallback search mode is not supported for accounts. Only primary search mode is available.
## Example use cases
* **Get all active accounts in the technology industry**
```json theme={null}
{
"query_by": "name,description",
"filter_by": "is_active:=true&&industry:=technology",
"q": "*"
}
```
* **Find accounts with more than 1000 employees**
```json theme={null}
{
"query_by": "name",
"filter_by": "employees:>1000",
"q": "*"
}
```
* **List accounts created in the last 90 days**
```json theme={null}
{
"query_by": "name",
"filter_by": "created_at:>2024-03-01",
"q": "*"
}
```
* **Get accounts with a specific account owner**
```json theme={null}
{
"query_by": "name",
"filter_by": "account_owner_email:=owner@company.com",
"q": "*"
}
```
* **Find accounts with the word 'acme' in the name or description**
```json theme={null}
{
"query_by": "name,description",
"q": "acme"
}
```
***
## Account search response fields
Below are all the fields you may see in an account search result. Many are optional and will only appear if included in your `include_fields` parameter.
| Field | Type | Description |
| -------------------------- | ------- | ------------------------------- |
| uid | string | Unique account identifier |
| name | string | Account name |
| description | string | Account description |
| is\_active | boolean | Whether the account is active |
| logo | string | Logo URL or identifier |
| status | number | Status code |
| classification | number | Classification code |
| health | number | Health score/code |
| industry | number | Industry code |
| source | string | Source of the account |
| primary\_domain | string | Primary domain |
| secondary\_domain | string | Secondary domain |
| annual\_revenue | number | Annual revenue |
| employees | number | Number of employees |
| website | string | Website URL |
| billing\_address | string | Billing address |
| shipping\_address | string | Shipping address |
| account\_owner\_id | number | Account owner ID |
| account\_owner\_email | string | Account owner email |
| account\_owner\_name | string | Account owner name |
| account\_owner\_user\_type | string | Account owner user type |
| account\_owner\_status | string | Account owner status |
| account\_owner\_timezone | string | Account owner timezone |
| metadata | string | Custom metadata |
| organization\_id | number | Organization ID |
| created\_at | string | Creation timestamp (ISO8601) |
| updated\_at | string | Last update timestamp (ISO8601) |
| deleted\_at | string | Deletion timestamp (ISO8601) |
| organization\_uid | string | Organization UID |
> For a full list, see the AccountSearchResponseDto in the API reference.
***
**Tip:** Use the `include_fields` parameter to limit the response to only the fields you need for performance and clarity.
# null
Source: https://docs.thena.ai/api-reference/search/comments-search
The comment search API lets you find, filter, and analyze comments or notes attached to tickets or other entities using flexible Typesense-powered queries. You can search by text, filter by any comment property, and select exactly which fields you want in the response.
> **Note:** Fallback search mode is not supported for comments. Only primary search mode is available.
## Example use cases
* **Get all comments for a specific ticket**
```json theme={null}
{
"query_by": "content",
"filter_by": "ticket_id:=TICKET123",
"q": "*"
}
```
* **Find comments created by a specific user**
```json theme={null}
{
"query_by": "content",
"filter_by": "created_by_email:=user@company.com",
"q": "*"
}
```
* **List all pinned comments in the last 7 days**
```json theme={null}
{
"query_by": "content",
"filter_by": "is_pinned:=true&&created_at:>2024-05-01",
"q": "*"
}
```
* **Get comments containing the word 'urgent'**
```json theme={null}
{
"query_by": "content",
"q": "urgent"
}
```
* **Find edited comments for a specific team**
```json theme={null}
{
"query_by": "content",
"filter_by": "team_uid:=T88S900BHN&&is_edited:=true",
"q": "*"
}
```
***
## Comment search response fields
Below are all the fields you may see in a comment search result. Many are optional and will only appear if included in your `include_fields` parameter.
| Field | Type | Description |
| ------------------- | ------- | -------------------------------- |
| ticket\_id | string | Ticket ID the comment belongs to |
| content | string | Comment content |
| created\_at | string | Creation timestamp (ISO8601) |
| updated\_at | string | Last update timestamp (ISO8601) |
| created\_by\_id | string | Creator's user ID |
| created\_by\_email | string | Creator's email |
| created\_by\_name | string | Creator's name |
| team\_uid | string | Team UID |
| team\_identifier | string | Team identifier |
| ticket\_ticket\_id | string | Ticket's ticket ID |
| comment\_type | string | Type of comment |
| comment\_visibility | string | Comment visibility |
| is\_edited | boolean | Whether the comment was edited |
| is\_pinned | boolean | Whether the comment is pinned |
| content\_markdown | string | Markdown content |
| content\_html | string | HTML content |
| organization\_id | string | Organization ID |
| ticket\_identifier | string | Ticket identifier |
| ticket\_uid | string | Ticket UID |
| organization\_uid | string | Organization UID |
> For a full list, see the CommentSearchResponseDto in the API reference.
***
**Tip:** Use the `include_fields` parameter to limit the response to only the fields you need for performance and clarity.
## Notes
* The `document` in each hit will match the schema for the selected collection (Ticket, Account, or Comment).
* Field names in query parameters can be provided in camelCase and will be mapped to the correct Typesense field names automatically.
* Filtering and sorting support all Typesense operators and syntax.
* Only authorized users can access this endpoint; results are scoped to the user's organization and teams.
For more details on available fields and advanced search options, refer to the [Typesense documentation](https://typesense.org/docs/0.24.0/api/documents.html#search-documents) or your collection's schema.
# null
Source: https://docs.thena.ai/api-reference/search/introduction
# Thena entity search API
Welcome to the Thena entity search API! This API provides powerful, flexible search capabilities across your core business data—tickets, accounts, and comments—using a unified, Typesense-powered interface.
## What can you do with Thena search?
* **Full-text search** across multiple collections
* **Advanced filtering** and faceting using Typesense syntax
* **Customizable field selection** for efficient, tailored responses
* **Sorting and pagination** for large result sets
* **Consistent, secure access** scoped to your organization and teams
## Supported collections
You can search the following collections:
* **tickets**: Support tickets, requests, or issues
* **accounts**: Customer or company accounts
* **comments**: Comments or notes attached to tickets or other entities
* **customer\_contacts**: (Contact support coming soon)
## Endpoint
```
GET /v1/search/{collection}
```
* **collection** (path parameter): The entity collection to search. Must be one of the supported collections above.
## Key query parameters
| Name | Type | Required | Description |
| ---------------- | ------ | -------- | --------------------------------------------------------------------------------------------- |
| `q` | string | Yes | The search query string. Use `*` for a wildcard search. |
| `query_by` | string | Yes | Comma-separated list of fields to search in (e.g. `title,description`). |
| `per_page` | string | No | Number of results per page. Default: 20. |
| `page` | string | No | Page number for pagination. |
| `include_fields` | string | No | Comma-separated list of fields to include in the response. |
| `filter_by` | string | No | Filter expression using Typesense syntax (e.g. `priorityName:=medium&&statusName:=resolved`). |
| `sort_by` | string | No | Sort expression (e.g. `createdAt:desc`). |
| `streaming` | bool | No | If `true`, enables streaming of paginated results. |
> **Tip:** You can use any [Typesense search parameter](https://typesense.org/docs/0.24.0/api/documents.html#search-documents) for advanced use cases, including faceting, typo tolerance, and more.
***
## Streaming Results
Thena's search API supports streaming large result sets for improved performance and responsiveness. To enable streaming, add the `streaming=true` query parameter to your request.
* **How it works:**\
When `streaming=true` is set, the API will stream each page of results as a separate JSON object. Each chunk is a full page of results, using the same structure as a normal (non-streaming) response.
* **Maximum page size:**\
When streaming, the `per_page` parameter cannot exceed 250. If a higher value is provided, it will be capped at 250.
* **End of stream:**\
The stream ends with a final chunk: `{ "done": true }`.
* **Error handling:**\
If an error occurs during streaming, a chunk with `{ "error": "..." }` will be sent, and the stream will close.
### Example request
```bash theme={null}
curl -N -G \
'https://api.thena.com/v1/search/tickets' \
--data-urlencode 'q=*' \
--data-urlencode 'query_by=title,description' \
--data-urlencode 'per_page=100' \
--data-urlencode 'streaming=true' \
-H 'Authorization: Bearer '
```
### Example streamed response
```
{ ...page 1 results... }
{ ...page 2 results... }
...
{ "done": true }
```
> **Note:** Each chunk is a full page of results in the same format as a normal search response. Process each chunk as it arrives for best performance.
#### Additional recommendations for developers
* **Process as you go:** Don't wait for the entire response—process each chunk as it arrives.
* **Respect per\_page limit:** If you request more than 250 results per page, only 250 will be returned per chunk.
* **Detect end of stream:** Always check for the `{ "done": true }` chunk to know when the stream is complete.
* **Handle errors:** Be prepared to handle a chunk with an `error` property.
***
Ready to get started? Explore the [detailed API reference for entity search](../platform/search/entity-search) to see available fields, example queries, and sample responses!
## Best practices
Follow these tips to get the most out of the Thena entity search API:
**Do:**
* Use the `include_fields` parameter to limit results to only the fields you need—this improves performance and reduces payload size.
* Use specific `query_by` fields relevant to your use case for more accurate results.
* Combine multiple filters in `filter_by` using `&&` for precise targeting (e.g. `status:=open&&priority:=high`).
* Use pagination (`per_page` and `page`) for large result sets to avoid timeouts and improve user experience.
* Use Typesense's advanced search parameters (faceting, typo tolerance, etc.) for complex needs.
**Don't:**
* Don't use `*` as your query unless you really want all results—prefer a more specific search string when possible.
* Don't request all fields unless necessary; avoid omitting `include_fields` for large collections.
* Don't use overly broad filters or sort expressions, as this can slow down search performance.
* Don't expose sensitive fields in your `include_fields` or query logic.
## Roadmap
The following features are coming soon:
* **Federated search** (search across multiple collections in a single query)
* **Vector/similarity search** (semantic and embedding-based search)
# null
Source: https://docs.thena.ai/api-reference/search/organization-search
The organization search API lets you retrieve the current user's organization data.
## Example use cases
* **Get current organization**
```json theme={null}
{
"query_by": "*",
"q": "*"
}
```
* **Get organization with custom fields and teams**
```json theme={null}
{
"query_by": "*",
"include_fields": "standardFields,customFields,customFieldValues,teams,sources",
"q": "*"
}
```
***
## Organization search response fields
Below are all the fields you may see in an organization search result. Many are optional and will only appear if included in your `include_fields` parameter.
### Core fields
| Field | Type | Description |
| ------------------- | ------- | ------------------------------------ |
| id | string | Unique organization identifier |
| uid | string | Unique organization UID |
| name | string | Organization name |
| description | string | Organization description |
| logoUrl | string | Logo URL or identifier |
| slug | string | Organization slug |
| allowSameDomainJoin | boolean | Whether to allow same domain join |
| tier | string | Organization tier (e.g., ENTERPRISE) |
| isActive | boolean | Whether the organization is active |
| isVerified | boolean | Whether the organization is verified |
| metadata | object | Custom metadata |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
| deletedAt | string | Deletion timestamp (ISO8601) |
### Extended fields (with include\_fields)
| Field | Type | Description |
| ----------------- | ----- | ----------------------------------- |
| standardFields | array | Array of standard field definitions |
| customFields | array | Array of custom field definitions |
| customFieldValues | array | Array of custom field values |
| teams | array | Array of teams in the organization |
| sources | array | Array of sources configured |
### Standard field structure
When `standardFields` is included, each field object contains:
| Field | Type | Description |
| ------------------- | ------- | --------------------------------------- |
| id | string | Field identifier |
| name | string | Human-readable field name |
| type | string | Field type (string, text, url, boolean) |
| description | string | Field description |
| mandatoryOnCreation | boolean | Whether field is required on creation |
| mandatoryOnClose | boolean | Whether field is required on close |
| visibleToCustomer | boolean | Whether field is visible to customers |
| editableByCustomer | boolean | Whether field is editable by customers |
| isStandard | boolean | Whether this is a standard field |
> For a full list, see the OrganizationSearchResponseDto in the API reference.
***
## Include fields options
Use the `include_fields` parameter to include additional data:
* **`standardFields`**: Include standard field definitions
* **`customFields`**: Include custom field definitions
* **`customFieldValues`**: Include custom field values
* **`teams`**: Include teams in the organization
* **`sources`**: Include configured sources
**Example:**
```json theme={null}
{
"query_by": "name",
"include_fields": "standardFields,customFields,teams",
"q": "*"
}
```
***
**Tip:** Use the `include_fields` parameter to limit the response to only the fields you need for performance and clarity. Only request extended fields when you need the additional data.
# null
Source: https://docs.thena.ai/api-reference/search/teams-search
The teams search API lets you find, filter and analyze teams using flexible Typesense-powered queries. You can search by team name and filter by specific team properties.
## Example use cases
* **Get all teams in the organization**
```json theme={null}
{
"query_by": "*",
"q": "*"
}
```
* **Find teams by name**
```json theme={null}
{
"query_by": "*",
"filter_by": "name:=engineering",
"q": "*"
}
```
* **Search for teams by UID**
```json theme={null}
{
"query_by": "*",
"filter_by": "teamUid:=THEMMQRBBHEPPQ",
"q": "*"
}
```
***
## Teams search response fields
Below are all the fields you may see in a team search result. Teams data is included by default.
### Core fields
| Field | Type | Description |
| -------------- | ------- | ------------------------------- |
| id | string | Unique team identifier |
| uid | string | Unique team UID |
| name | string | Team name |
| description | string | Team description |
| icon | string | Team icon |
| color | string | Team color |
| identifier | string | Team identifier |
| organizationId | string | Organization ID |
| parentTeamId | string | Parent team ID (can be null) |
| teamOwnerId | string | Team owner ID |
| isActive | boolean | Whether the team is active |
| isPrivate | boolean | Whether the team is private |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
| deletedAt | string | Deletion timestamp (ISO8601) |
***
## Filtering options
You can filter teams using the `filter_by` parameter with Typesense syntax. The following filters are available:
### Available filters
* **By team UID**: `teamUid:=THEMMQRBBHEPPQ`
* **By name**: `name:=engineering`
### Combined filters
You can combine multiple filters using `&&`:
```json theme={null}
{
"query_by": "*",
"filter_by": "teamUid:=THEMMQRBBHEPPQ&&name:=engineering",
"q": "*"
}
```
### Filter examples
* **Find team by name only**
```json theme={null}
{
"filter_by": "name:=engineering"
}
```
* **Find team by UID only**
```json theme={null}
{
"filter_by": "teamUid:=THEMMQRBBHEPPQ"
}
```
# null
Source: https://docs.thena.ai/api-reference/search/tickets-search
The ticket search API lets you find, filter, and analyze support tickets using flexible Typesense-powered queries. You can search by text, filter by any ticket property, and select exactly which fields you want in the response.
## Example use cases
* **Get recent tickets assigned to me that are open**
```json theme={null}
{
"query_by": "title,description",
"filter_by": "assignedAgentName:=john.doe@company.com&&statusName:=open",
"sort_by": "createdAt:desc",
"per_page": "10",
"q": "*"
}
```
* **Get all tickets from customer A that are high priority in the last 30 days**
```json theme={null}
{
"query_by": "title,description",
"filter_by": "accountName:=CustomerA&&priorityName:=high&&createdAt:>2024-04-01",
"sort_by": "createdAt:desc",
"q": "*"
}
```
* **Find tickets with the word 'refund' that are unresolved**
```json theme={null}
{
"query_by": "title,description",
"q": "refund",
"filter_by": "statusName:!=resolved"
}
```
* **List all escalated tickets for a specific team**
```json theme={null}
{
"query_by": "title",
"filter_by": "teamUid:=T88S900BHN&&isEscalated:=true",
"q": "*"
}
```
* **Get tickets created by a specific requestor in the last week**
```json theme={null}
{
"query_by": "title,description",
"filter_by": "requestorEmail:=user@company.com&&createdAt:>2024-05-01",
"q": "*"
}
```
***
## Ticket search response fields
Below are all the fields you may see in a ticket search result. Many are optional and will only appear if included in your `include_fields` parameter.
| Field | Type | Description |
| -------------------- | ------ | -------------------------------------------------------------------------- |
| id | string | Unique identifier of the ticket |
| ticketIdentifier | string | Ticket identifier (e.g. SPO-42260) |
| title | string | Title of the ticket |
| description | string | Description of the ticket |
| teamUid | string | Team UID |
| organizationUid | string | Organization UID |
| statusName | string | Status name (e.g. Resolved) |
| priorityName | string | Priority name (e.g. Medium) |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
| assignedAgentName | string | Name of the assigned agent |
| accountName | string | Name of the associated account |
| accountPrimaryDomain | string | Primary domain of the account |
| accountWebsite | string | Website of the account |
| accountAnnualRevenue | string | Annual revenue of the account |
| accountEmployees | string | Number of employees in the account |
| accountOwnerId | string | Account owner ID |
| accountOwnerEmail | string | Account owner email |
| accountOwnerName | string | Account owner name |
| accountOwnerUserType | string | Account owner user type |
| accountOwnerStatus | string | Account owner status |
| accountOwnerTimezone | string | Account owner timezone |
| contactEmail | string | Contact email |
| contactName | string | Contact name |
| contactPhone | string | Contact phone |
| dueDate | string | Due date |
| teamIdentifier | string | Team identifier |
| ... | ... | \[Many more fields, including SLA fields, see API reference for full list] |
> For a full list, see the TicketSearchResponseDto in the API reference.
***
**Tip:** Use the `include_fields` parameter to limit the response to only the fields you need for performance and clarity.
# null
Source: https://docs.thena.ai/api-reference/search/users-search
The users search API lets you find, filter and analyze users within your organization using flexible Typesense-powered queries. You can search by name, email, or user UID.
## Example use cases
* **Get all users in the organization**
```json theme={null}
{
"query_by": "*",
"q": "*"
}
```
* **Find users by email**
```json theme={null}
{
"query_by": "*",
"filter_by": "userEmail:=john.doe@company.com",
"q": "*"
}
```
***
## Searchable fields
Only the following fields can be used for searching:
| Field | Type | Description |
| ----- | ------ | -------------------- |
| name | string | User's full name |
| email | string | User's email address |
| uid | string | Unique user UID |
## User search response fields
Below are all the fields you may see in a user search result. Teams and sidebar preferences are included by default.
### Core fields
| Field | Type | Description |
| ------------------- | ------- | --------------------------------------- |
| id | string | Unique user identifier |
| uid | string | Unique user UID |
| authId | string | Authentication ID |
| organizationId | string | Organization ID |
| name | string | User's full name |
| email | string | User's email address |
| userType | string | User type (ORG\_ADMIN, BOT\_USER, etc.) |
| isActive | boolean | Whether the user is active |
| status | string | User status (ACTIVE, INACTIVE, etc.) |
| primaryTeamId | string | Primary team ID (can be null) |
| lastLoginAt | string | Last login timestamp (ISO8601) |
| metadata | object | Custom metadata |
| avatarUrl | string | User avatar URL |
| timezone | string | User's timezone |
| externalSinks | array | External integrations |
| createdAt | string | Creation timestamp (ISO8601) |
| updatedAt | string | Last update timestamp (ISO8601) |
| deletedAt | string | Deletion timestamp (ISO8601) |
| businessHoursConfig | object | Business hours configuration |
### Default extended fields
These fields are included in every response:
| Field | Type | Description |
| ------------------ | ------ | ---------------------------------- |
| teams | array | Array of teams the user belongs to |
| sidebarPreferences | object | User's sidebar preferences |
### Team structure
When `teams` is included, each team object contains:
| Field | Type | Description |
| ------------- | ------- | -------------------------------- |
| id | string | Team identifier |
| name | string | Team name |
| icon | string | Team icon |
| color | string | Team color |
| identifier | string | Team identifier |
| description | string | Team description |
| teamOwner | string | Team owner name |
| teamOwnerId | string | Team owner ID |
| isActive | boolean | Whether team is active |
| isPrivate | boolean | Whether team is private |
| createdAt | string | Team creation timestamp |
| updatedAt | string | Team update timestamp |
| isDefaultTeam | boolean | Whether this is the default team |
### Sidebar preferences structure
When `sidebarPreferences` is included, it contains:
| Field | Type | Description |
| ----------- | ------ | ------------------------ |
| openTeams | object | Open teams configuration |
| pinnedTeams | array | Array of pinned team IDs |
| teamOrder | array | Team display order |
| lastTeam | string | Last accessed team ID |
> For a full list, see the UserSearchResponseDto in the API reference.
***
## Filtering options
You can filter users using the `filter_by` parameter with Typesense syntax. The following filters are available:
### Available filters
* **By user ID**: `userId:=URR9A99BDJ`
* **By email**: `userEmail:=user@example.com`
* **By name**: `userName:=shakthi`
### Combined filters
You can combine multiple filters using `&&`:
```json theme={null}
{
"query_by": "name",
"filter_by": "userId:=USER123ABC&&userEmail:=john.doe@company.com&&userName:=john",
"q": "*"
}
```
### Filter examples
* **Find user by email only**
```json theme={null}
{
"filter_by": "userEmail:=john.doe@company.com"
}
```
* **Find user by name only**
```json theme={null}
{
"filter_by": "userName:=john"
}
```
* **Find user by UID only**
```json theme={null}
{
"filter_by": "userId:=USER123ABC"
}
```
# Get the duration left for a job
Source: https://docs.thena.ai/api-reference/sla/sla-duration/get-the-duration-left-for-a-job
get /v1/sla/duration
# Override SLA for a job
Source: https://docs.thena.ai/api-reference/sla/sla-duration/override-sla-for-a-job
post /v1/sla/override-sla
# Archive a policy
Source: https://docs.thena.ai/api-reference/sla/sla-policies/archive-a-policy
delete /v1/sla/policy/{id}
# Create a policy
Source: https://docs.thena.ai/api-reference/sla/sla-policies/create-a-policy
post /v1/sla/policy
# Get a policy
Source: https://docs.thena.ai/api-reference/sla/sla-policies/get-a-policy
get /v1/sla/policy/{id}
# Get all policies
Source: https://docs.thena.ai/api-reference/sla/sla-policies/get-all-policies
get /v1/sla/policy
# Manually pause SLA for a ticket
Source: https://docs.thena.ai/api-reference/sla/sla-policies/manually-pause-sla-for-a-ticket
post /v1/sla/pause
# Manually resume SLA for a ticket
Source: https://docs.thena.ai/api-reference/sla/sla-policies/manually-resume-sla-for-a-ticket
post /v1/sla/resume
# Update a policy
Source: https://docs.thena.ai/api-reference/sla/sla-policies/update-a-policy
patch /v1/sla/policy/{id}
# Update priorities
Source: https://docs.thena.ai/api-reference/sla/sla-policies/update-priorities
patch /v1/sla/priorities
# Create a new article
Source: https://docs.thena.ai/api-reference/thena-help-center/article/create-a-new-article
post /articles
# Delete article
Source: https://docs.thena.ai/api-reference/thena-help-center/article/delete-article
delete /articles/{articleId}
# Get all articles
Source: https://docs.thena.ai/api-reference/thena-help-center/article/get-all-articles
get /articles
# Get article by ID
Source: https://docs.thena.ai/api-reference/thena-help-center/article/get-article-by-id
get /articles/{articleId}
# Update article
Source: https://docs.thena.ai/api-reference/thena-help-center/article/update-article
patch /articles/{articleId}
# Create a new collection
Source: https://docs.thena.ai/api-reference/thena-help-center/collection/create-a-new-collection
post /collections
# null
Source: https://docs.thena.ai/api-reference/thena-help-center/collection/delete-collections
delete /collections/{collectionId}
# Get a specific collection
Source: https://docs.thena.ai/api-reference/thena-help-center/collection/get-a-specific-collection
get /collections/{collectionId}
# Get all collections of an organization
Source: https://docs.thena.ai/api-reference/thena-help-center/collection/get-all-collections-of-an-organization
get /collections
# Get collection tree with articles of a help center
Source: https://docs.thena.ai/api-reference/thena-help-center/collection/get-collection-tree-with-articles-of-a-help-center
get /collections/tree
# Update a collection
Source: https://docs.thena.ai/api-reference/thena-help-center/collection/update-a-collection
patch /collections/{collectionId}
# Create a new help center
Source: https://docs.thena.ai/api-reference/thena-help-center/help-centers/create-a-new-help-center
post /help-centers
# Delete a help center
Source: https://docs.thena.ai/api-reference/thena-help-center/help-centers/delete-a-help-center
delete /help-centers/{helpCenterId}
# Get a specific help center by ID
Source: https://docs.thena.ai/api-reference/thena-help-center/help-centers/get-a-specific-help-center-by-id
get /help-centers/{helpCenterId}
# Get all help centers for the user
Source: https://docs.thena.ai/api-reference/thena-help-center/help-centers/get-all-help-centers-for-the-user
get /help-centers
# Update a help center
Source: https://docs.thena.ai/api-reference/thena-help-center/help-centers/update-a-help-center
patch /help-centers/{helpCenterId}
# Update custom domain for a help center
Source: https://docs.thena.ai/api-reference/thena-help-center/help-centers/update-custom-domain-for-a-help-center
patch /help-centers/custom-domain/{helpCenterId}
# Create a new tag
Source: https://docs.thena.ai/api-reference/thena-help-center/tag/create-a-new-tag
post /tags
# Delete a tag
Source: https://docs.thena.ai/api-reference/thena-help-center/tag/delete-a-tag
delete /tags/{tagId}
# Get all tags
Source: https://docs.thena.ai/api-reference/thena-help-center/tag/get-all-tags
get /tags
# Update a tag
Source: https://docs.thena.ai/api-reference/thena-help-center/tag/update-a-tag
patch /tags/{tagId}
# Thena MCP server
Source: https://docs.thena.ai/api-reference/thena-mcp-server
Connect your AI models and agents to Thena data through our MCP server
Your AI models and agents can use our official MCP server to access your Thena data in a simple and secure way.
Connect to our MCP server natively as a new integration in AI assistants, or by using the [mcp-remote](https://github.com/geelen/mcp-remote) module in Cursor, Windsurf, and other clients.
We're following the authenticated remote [MCP spec](https://modelcontextprotocol.io/specification/2025-03-26), so the server is centrally hosted and managed. It has tools available for finding, creating, and updating objects in Thena like tickets, teams, accounts, and more — with additional functionality continuously being added.
## Setup instructions
1. Navigate to settings in the sidebar on web or desktop
2. Scroll to integrations at the bottom and click add more
3. In the prompt enter:
* Integration name: Thena
* Integration URL: `https://mcp.thena.ai/sse`
4. Make sure to enable the tools in any new chats
1. CTRL/CMD+Shift+J to open Cursor settings.
2. Select MCP and Integrations.
3. Select Add a Custom MCP Server.
4. Add the following:
```json theme={null}
{
"mcpServers": {
"Thena": {
"url": "https://mcp.thena.ai/sse",
"headers": {}
}
}
}
```
1. CTRL/CMD+, to open Windsurf settings.
2. Under Cascade scroll to -> MCP servers
3. Select Manage MCPs -> Add custom server
4. Add the following:
```json theme={null}
{
"mcpServers": {
"Thena": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.thena.ai/sse"]
}
}
}
```
1. CMD+, to open Zed settings.
2. Add the following:
```json theme={null}
{
"context_servers": {
"thena": {
"command": {
"path": "npx",
"args": ["-y", "mcp-remote", "https://mcp.thena.ai/sse"],
"env": {}
},
"settings": {}
}
}
}
```
## Available tools
The Thena MCP server provides tools for:
* [Accounts](./mcp/accounts/overview): Tools for retrieving and managing account information and customer data.
* [Comments](./mcp/comments/overview): Tools for retrieving and managing comment threads and related comment data.
* [Teams](./mcp/teams/overview): Tools for retrieving and managing team information, members, and team-related data, including team search capabilities.
* [Tickets](./mcp/tickets/overview): Tools for retrieving and managing ticket statuses and other ticket-related data, including ticket search capabilities and comprehensive analytics.
* [Workflows](./mcp/workflows/overview): Tools for retrieving and managing workflow definitions, executions, and workflow-related data.
## Authentication
The Thena MCP server uses OAuth for authentication, which is handled at the organization level:
1. Authentication is tied to a specific organization in your Thena account
2. If you need to access data from a different organization, you'll need to disconnect and reconnect to the MCP server
### Token validity and refresh
* Authentication tokens are valid for 30 days
* While the server supports token refresh, some MCP clients may not actively implement this feature
* If you start receiving 401 Unauthorized errors from the Platform API, you should re-authorize and reconnect to the MCP server
## Example usage
Once connected, you can use natural language to interact with your Thena data:
* "Show me all open tickets assigned to my team"
* "Create a new ticket for customer support"
* "Find knowledge base articles about password reset"
* "Update the status of ticket #1234 to 'In Progress'"
* "List all accounts in our system"
* "Show me the members of the engineering team"
* "Search for teams with 'engineering' in the name"
* "Find tickets with high priority status"
* "Get the current status of workflow execution #5678"
* "Create a new workflow for customer onboarding"
* "Show me ticket analytics by assignee for the last month"
* "Get ticket trends over time for Q1"
* "Analyze ticket distribution by account"
* "Show me custom field analytics for the engineering team"
## Roadmap
We are actively developing the MCP server to support more capabilities such as:
* **Resources**: Access and manage resources across your organization
* **Prompts**: Create and manage reusable prompts for AI assistants
* **Sampling**: Generate and analyze data samples for training and testing
* **Enhanced Workflow Management**: Advanced workflow orchestration and monitoring capabilities
* **Team Collaboration**: Enhanced team management and collaboration features
* **Account Analytics**: Advanced account insights and reporting tools
Stay tuned for these exciting additions to enhance your Thena integration experience.
## Feedback and support
We're excited to see how you and your agents use Thena data to power your workflows. If you have questions, feedback, or requests for new MCP tools, please contact our support team.
# Available filter operators and logical operators to use in workflow filters
Source: https://docs.thena.ai/api-reference/workflows/workflows/available-filter-operators-and-logical-operators-to-use-in-workflow-filters
get /api/v1/workflows/registry/filters
# Create a new workflow
Source: https://docs.thena.ai/api-reference/workflows/workflows/create-a-new-workflow
post /api/v1/workflows
# Delete a workflow
Source: https://docs.thena.ai/api-reference/workflows/workflows/delete-a-workflow
delete /api/v1/workflows/{workflowUniqueIdentifier}
# Get activity registry
Source: https://docs.thena.ai/api-reference/workflows/workflows/get-activity-registry
get /api/v1/workflows/registry/activities
# Get all the executions of a workflow
Source: https://docs.thena.ai/api-reference/workflows/workflows/get-all-the-executions-of-a-workflow
get /api/v1/workflows/executions
# Get all the tasks of a workflow execution
Source: https://docs.thena.ai/api-reference/workflows/workflows/get-all-the-tasks-of-a-workflow-execution
get /api/v1/workflows/{workflowInstanceId}/tasks
# Get all the workflows defined by the organization
Source: https://docs.thena.ai/api-reference/workflows/workflows/get-all-the-workflows-defined-by-the-organization
get /api/v1/workflows
# Get all the workflows defined by the organization
Source: https://docs.thena.ai/api-reference/workflows/workflows/get-all-the-workflows-defined-by-the-organization-1
get /api/v1/workflows/{workflowUniqueIdentifier}
# Get event registry
Source: https://docs.thena.ai/api-reference/workflows/workflows/get-event-registry
get /api/v1/workflows/registry/events
# Toggle a workflow
Source: https://docs.thena.ai/api-reference/workflows/workflows/toggle-a-workflow
post /api/v1/workflows/{workflowUniqueIdentifier}/toggle
# Update a workflow
Source: https://docs.thena.ai/api-reference/workflows/workflows/update-a-workflow
patch /api/v1/workflows/{workflowUniqueIdentifier}
# App manifest
Source: https://docs.thena.ai/app-framework/core-concepts/manifest
Complete guide to configuring your app manifest
The app manifest is a JSON file that defines your app's configuration, capabilities, and integration points. It serves as the blueprint for how your app interacts with Thena.
## Manifest structure
```typescript theme={null}
{
app: AppInfo;
events: EventDefinitions;
scopes: ScopeDefinitions;
metadata: AppMetadata;
developer: DeveloperInfo;
activities: Activity[];
integration: IntegrationConfig;
configuration: ConfigurationSettings;
}
```
## App information
The `app` section defines the basic information about your app that users will see in the app directory.
### App structure
```typescript theme={null}
interface AppInfo {
name: string;
icons: {
large: string;
small: string;
};
category: string;
description: string;
supported_locales: string[];
}
```
### App fields
#### Name
The display name of your app. Keep it concise and descriptive.
```json theme={null}
{
"name": "My integration"
}
```
#### Icons
URLs to your app's icons. We recommend:
* Large: 512x512px PNG
* Small: 128x128px PNG
```json theme={null}
{
"icons": {
"large": "https://example.com/icon-large.png",
"small": "https://example.com/icon-small.png"
}
}
```
#### Category
The category that best describes your app's primary function:
* `productivity`
* `communication`
* `crm_integration`
* `analytics`
* `automation`
* `custom`
```json theme={null}
{
"category": "crm_integration"
}
```
#### Description
A clear, concise description of what your app does. This appears in the app directory.
```json theme={null}
{
"description": "Seamlessly integrate your CRM data with Thena"
}
```
#### Supported locales
List of locales your app supports. Use standard locale codes.
```json theme={null}
{
"supported_locales": ["en-US", "fr-FR", "de-DE"]
}
```
### Complete app example
```json theme={null}
{
"app": {
"name": "CRM connector",
"icons": {
"large": "https://example.com/crm-icon-large.png",
"small": "https://example.com/crm-icon-small.png"
},
"category": "crm_integration",
"description": "Connect your CRM system to sync contacts, deals, and activities",
"supported_locales": ["en-US"]
}
}
```
## Developer info
The `developer` section contains information about your development team and support resources.
### Developer structure
```typescript theme={null}
interface DeveloperInfo {
name: string;
email: string;
url: string;
privacy_policy_url: string;
terms_of_service_url: string;
support?: {
email?: string;
url?: string;
documentation_url?: string;
};
}
```
### Developer fields
#### Name
Your company or developer name:
```json theme={null}
{
"name": "Acme Corporation"
}
```
#### Email
Primary contact email for app-related communications:
```json theme={null}
{
"email": "apps@acme.com"
}
```
#### URL
Your company or app website:
```json theme={null}
{
"url": "https://acme.com"
}
```
#### Privacy policy URL
Link to your privacy policy:
```json theme={null}
{
"privacy_policy_url": "https://acme.com/privacy"
}
```
#### Terms of service URL
Link to your terms of service:
```json theme={null}
{
"terms_of_service_url": "https://acme.com/terms"
}
```
#### Support (optional)
Additional support resources:
```json theme={null}
{
"support": {
"email": "support@acme.com",
"url": "https://support.acme.com",
"documentation_url": "https://docs.acme.com"
}
}
```
### Developer info example
Here's a full developer info configuration:
```json theme={null}
{
"developer": {
"name": "Acme Corporation",
"email": "apps@acme.com",
"url": "https://acme.com",
"privacy_policy_url": "https://acme.com/privacy",
"terms_of_service_url": "https://acme.com/terms",
"support": {
"email": "support@acme.com",
"url": "https://support.acme.com",
"documentation_url": "https://docs.acme.com"
}
}
}
```
## Events
The `events` section defines how your app interacts with Thena's event system. You can both publish events to notify Thena of changes and subscribe to events to react to changes in Thena.
### Events structure
```typescript theme={null}
interface EventDefinitions {
publish: PublishEvent[];
subscribe: SubscribeEvent[];
}
interface PublishEvent {
event: string;
reason: string;
schema: JSONSchema;
}
interface SubscribeEvent {
event: string;
reason: string;
description: string;
}
```
### Publishing events
Use the `publish` array to define events your app will emit to Thena.
#### Publish fields
* `event`: The event name (use dot notation)
* `reason`: Short description of why this event is published
* `schema`: JSON Schema defining the event payload
#### Publish example
```json theme={null}
{
"publish": [
{
"event": "contact.synced",
"reason": "Notify when contact sync is complete",
"schema": {
"type": "object",
"properties": {
"contact_id": {
"type": "string",
"description": "The contact ID"
},
"sync_status": {
"type": "string",
"enum": ["success", "failed"],
"description": "The sync status"
}
},
"required": ["contact_id", "sync_status"]
}
}
]
}
```
### Subscribing to events
Use the `subscribe` array to define which Thena events your app wants to receive.
#### Subscribe fields
* `event`: The event name to subscribe to
* `reason`: Short description of why you need this event
* `description`: Detailed description of how you'll use this event
#### Subscribe example
```json theme={null}
{
"subscribe": [
{
"event": "contact.created",
"reason": "Sync new contacts to external system",
"description": "When a contact is created in Thena, we sync it to our CRM"
},
{
"event": "contact.updated",
"reason": "Keep contact data in sync",
"description": "When a contact is updated in Thena, we update our CRM"
}
]
}
```
### Common platform events
#### App installation event
When your app is installed, you'll receive an installation event with these details:
```typescript theme={null}
{
"event_type": "app:installation",
"application_id": "APP123456789",
"application_name": "Sample App",
"application_metadata": {
"title": "Sample Integration",
"category": "productivity",
"capabilities": [
"Data Management",
"Workflow Automation"
],
"pricing": {
"monthly": 999,
"yearly": 9990
},
"rating": 4.5
},
"bot_id": "BOT123456",
"bot_token": "pk_live_sample.token123456",
"organization_id": "ORG123456",
"team_ids": ["TEAM123456"],
"created_at": "2024-01-01T12:00:00.000Z",
"created_by": "USER123456"
}
```
#### Ticket comment event
When a ticket comment is added, you'll receive an event with these details:
```typescript theme={null}
{
"message": {
"actor": {
"id": "USER123456",
"email": "user@example.com",
"type": "ORG_ADMIN"
},
"eventType": "ticket:comment:added",
"orgId": "ORG123456",
"payload": {
"comment": {
"id": "COMMENT123456",
"content": "This is a sample comment",
"contentHtml": "
This is a sample comment
",
"contentMarkdown": "This is a sample comment",
"commentType": "comment",
"commentVisibility": "public",
"author": {
"id": "USER123456",
"name": "Sample User",
"email": "user@example.com",
"avatarUrl": "https://example.com/avatar.jpg"
},
"teamId": "TEAM123456",
"createdAt": "2024-01-01T12:00:00.000Z",
"updatedAt": "2024-01-01T12:00:00.000Z"
},
"ticket": {
"id": "TICKET123456",
"title": "Sample support request"
}
},
"eventId": "EVENT123456",
"timestamp": "1704110400000"
},
"xWebhookEvent": true
}
```
## Scopes
The `scopes` section defines the permissions your app needs to function. Each scope grants access to specific Thena APIs and features.
### Scopes structure
```typescript theme={null}
interface AppScopes {
required: string[];
optional?: string[];
}
```
### Available scopes
#### Contact scopes
* `contacts:read` - View contact information
* `contacts:write` - Create and update contacts
* `contacts:delete` - Delete contacts
* `contacts.custom_fields:read` - View contact custom fields
* `contacts.custom_fields:write` - Create and update contact custom fields
#### Accounts scopes
* `companies:read` - View company information
* `companies:write` - Create and update companies
* `companies:delete` - Delete companies
* `companies.custom_fields:read` - View company custom fields
* `companies.custom_fields:write` - Create and update company custom fields
#### Conversation scopes
* `conversations:read` - View conversations
* `conversations:write` - Send and reply to messages
* `conversations:delete` - Delete conversations
* `conversations.attachments:read` - View conversation attachments
* `conversations.attachments:write` - Add attachments to conversations
#### User scopes
* `users:read` - View user information
* `users.preferences:read` - View user preferences
* `users.preferences:write` - Update user preferences
#### Organization scopes
* `workspace:read` - View workspace settings
* `workspace.members:read` - View workspace members
* `workspace.teams:read` - View workspace teams
### Scopes example
```json theme={null}
{
"scopes": {
"required": [
"contacts:read",
"contacts:write",
"companies:read",
"deals:read"
],
"optional": [
"contacts.custom_fields:write",
"companies.custom_fields:write",
"analytics:read",
"analytics.reports:read"
]
}
}
```
## Metadata
The `metadata` section provides additional information about your app that helps users understand its capabilities and pricing.
### Metadata structure
```typescript theme={null}
interface AppMetadata {
title: string;
rating?: number;
pricing?: {
yearly?: number;
monthly?: number;
};
category: string;
capabilities: string[];
}
```
### Metadata fields
#### Title
A concise title that describes your app's main function:
```json theme={null}
{
"title": "CRM & Marketing Integration"
}
```
#### Rating
Optional rating for your app (0-5):
```json theme={null}
{
"rating": 4.8
}
```
#### Pricing
Define your app's pricing structure (in cents):
```json theme={null}
{
"pricing": {
"yearly": 4990, // $49.90/year
"monthly": 499 // $4.99/month
}
}
```
#### Category
The primary category for your app:
```json theme={null}
{
"category": "crm_integration"
}
```
Available categories:
* `crm_integration`
* `productivity`
* `communication`
* `analytics`
* `automation`
* `custom`
#### Capabilities
List of key features your app provides:
```json theme={null}
{
"capabilities": [
"Contact Management",
"Company Sync",
"Deal Pipeline",
"Ticket Management",
"Email Integration",
"Marketing Automation"
]
}
```
## Integration
The `integration` section defines how your app integrates with Thena, including webhook endpoints and entry points.
### Integration structure
```typescript theme={null}
interface IntegrationConfig {
webhooks: {
events: string;
installations: string;
};
entry_points: {
main: string;
configuration?: string;
oauth_redirect?: string;
};
interactivity?: {
request_url?: string;
message_menu_option_url?: string;
};
}
```
### Webhooks
Configure endpoints where Thena will send events and installation notifications:
```json theme={null}
{
"webhooks": {
"events": "https://your-app.com/webhook/events",
"installations": "https://your-app.com/webhook/installation"
}
}
```
#### Events webhook
The `events` webhook receives all events your app subscribes to:
```json theme={null}
{
"event": "contact.created",
"payload": {
"id": "contact-123",
"data": {
"email": "user@example.com",
"name": "John Doe"
}
}
}
```
#### Installation webhook
The `installations` webhook receives notifications when your app is installed or uninstalled:
```json theme={null}
{
"event": "app.installed",
"payload": {
"installation_id": "inst-123",
"bot_token": "bot-token-xyz",
"workspace_id": "workspace-123"
}
}
```
### Entry points
Define URLs for different parts of your app's interface:
```json theme={null}
{
"entry_points": {
"main": "https://your-app.com/app",
"configuration": "https://your-app.com/config",
"oauth_redirect": "https://your-app.com/oauth/callback"
}
}
```
## External select configuration
External select configuration allows you to dynamically fetch options for select fields from your app's API endpoint.
### External select structure
```json theme={null}
{
"configuration": {
"fields": [
{
"type": "external_select",
"key": "project",
"label": "Project",
"description": "Select a project",
"required": true,
"endpoint": "/api/projects"
}
]
}
}
```
### Request format
When a user interacts with an external select field, Thena will make a GET request:
```
GET {your_app_url}{endpoint}?search={search_term}
```
### Response format
Your endpoint should return:
```json theme={null}
{
"options": [
{
"value": "proj-123",
"label": "Project A"
},
{
"value": "proj-456",
"label": "Project B"
}
]
}
```
## Activities
Activities define HTTP-based operations your app can perform. Each activity represents an API endpoint that can be called by Thena.
### Activity structure
```typescript theme={null}
interface Activity {
name: string;
description: string;
http_config: {
headers: Record;
httpVerb: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
endpoint_url: string;
};
request_schema: JSONSchema;
response_schema?: JSONSchema;
}
```
### Activity example
```json theme={null}
{
"activities": [
{
"name": "create_record",
"description": "Creates a new record",
"http_config": {
"headers": {
"Content-Type": "application/json"
},
"httpVerb": "POST",
"endpoint_url": "https://api.example.com/records"
},
"request_schema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the record"
},
"type": {
"type": "string",
"enum": ["contact", "company", "deal"],
"description": "Type of record to create"
}
},
"required": ["name", "type"]
},
"response_schema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "ID of the created record"
},
"created_at": {
"type": "string",
"format": "date-time",
"description": "Creation timestamp"
}
}
}
}
]
}
```
## Configuration
Define settings users can configure:
```json theme={null}
{
"configuration": {
"required_settings": [
{
"key": "api_key",
"type": "secret",
"label": "API Key",
"required": true,
"description": "Your API key"
}
],
"optional_settings": [
{
"key": "sync_interval",
"type": "singleselect",
"label": "Sync Interval",
"options": [
{
"label": "Every 5 minutes",
"value": "5min"
}
]
}
]
}
}
```
## Best practices
### App information
1. **Name**
* Keep it short and memorable
* Avoid unnecessary prefixes
* Use title case
* Focus on clarity and recognition
2. **Icons**
* Use high-quality, recognizable images
* Ensure good contrast
* Test both sizes in the app directory
* Maintain consistent branding
3. **Description**
* Focus on value proposition
* Keep it under 160 characters
* Use active voice
* Highlight key features
4. **Category**
* Choose the most specific category
* Consider user search behavior
* Use only one primary category
* Match user expectations
### Events
1. **Event naming**
* Use lowercase letters
* Use dots for namespacing
* Be specific but concise
* Follow the pattern: `object.action`
2. **Schema design**
* Include all necessary fields
* Add field descriptions
* Mark required fields
* Use appropriate types
3. **Event handling**
* Handle events idempotently
* Implement error handling
* Log event processing
* Consider retry logic
### Scopes
1. **Scope selection**
* Request minimum required permissions
* Make enhanced features optional
* Group related permissions
* Document scope usage clearly
2. **Security**
* Follow principle of least privilege
* Regularly audit scope usage
* Remove unused permissions
* Update scopes with features
3. **Documentation**
* List all required scopes
* Explain optional features
* Document scope dependencies
* Keep scope list updated
### Metadata
1. **Title**
* Keep it clear and concise
* Focus on main functionality
* Use proper capitalization
* Avoid unnecessary words
2. **Pricing**
* Use cents to avoid floating-point issues
* Offer both monthly and yearly options
* Consider volume discounts
* Be transparent about limitations
3. **Capabilities**
* List most important features first
* Use consistent terminology
* Keep descriptions short
* Focus on value proposition
### Integration
1. **Webhooks**
* Use HTTPS endpoints
* Implement proper authentication
* Handle retries gracefully
* Respond quickly (under 3 seconds)
2. **Entry points**
* Use consistent URL structure
* Handle loading states
* Implement error pages
* Support deep linking
3. **Security**
* Validate webhook signatures
* Use HTTPS everywhere
* Implement rate limiting
* Monitor for abuse
### External select
1. **Performance**
* Cache frequently requested options
* Limit the number of options returned (max: 100)
* Implement pagination if needed
* Optimize response time (under 500ms)
2. **Security**
* Validate the API key
* Use HTTPS endpoints only
* Implement rate limiting
* Return only authorized data
3. **User experience**
* Return results quickly
* Handle errors gracefully
* Provide meaningful labels
* Support search functionality
### Activities
1. **Design**
* Use clear, descriptive names
* Document all parameters
* Provide complete schemas
* Include response examples
2. **Implementation**
* Handle errors gracefully
* Validate input data
* Set appropriate timeouts
* Log activity execution
3. **Security**
* Validate authentication
* Sanitize inputs
* Rate limit requests
* Monitor usage patterns
### Developer info
1. **Contact information**
* Use business email addresses
* Monitor support channels regularly
* Keep contact info up to date
* Respond promptly to inquiries
2. **Documentation**
* Provide clear installation guides
* Include troubleshooting steps
* Document all features
* Keep docs current with updates
3. **Legal requirements**
* Keep privacy policy current
* Update terms of service
* Follow data protection laws
* Document data usage clearly
4. **Support resources**
* Offer multiple support channels
* Set clear response times
* Document known issues
* Provide self-help resources
### Configuration
1. **Settings design**
* Use clear, descriptive labels
* Group related settings
* Provide helpful descriptions
* Use appropriate field types
2. **Validation**
* Validate input formats
* Provide clear error messages
* Handle edge cases
* Implement type checking
3. **Security**
* Encrypt sensitive data
* Mask secret fields
* Implement access controls
* Audit configuration changes
# Webhooks
Source: https://docs.thena.ai/app-framework/core-concepts/webhooks
Complete guide to handling app webhooks
Webhooks are HTTP callbacks that allow Thena to notify your app about events in real-time. This guide covers both installation lifecycle events and platform events that your app can receive.
## Types of webhooks
Your app can receive two types of webhooks:
1. **Installation webhooks**: Events related to your app's lifecycle (installation, uninstallation, etc.)
2. **Platform event webhooks**: Events from Thena that your app subscribes to (ticket creation, comments, etc.)
## Installation webhooks
Installation webhooks notify you about events related to the installation lifecycle of your app.
### Event types
The installation webhook receives several event types, indicated by the `event_type` field:
* `app:installation`: Sent when your app is first installed
* `app:reinstall`: Sent when an installation needs reconfiguration
* `app:uninstall`: Sent when your app is uninstalled
* `app:configuration:update`: Sent when settings are updated
* `app:team:added`: Sent when access is granted to new teams
* `app:team:removed`: Sent when team access is revoked
### Installation webhook payload
Example of an `app:installation` event:
```json theme={null}
{
"installation_id": "INSTALL_UID_123",
"team_ids": ["TEAM_ABC", "TEAM_DEF"],
"organization_id": "ORG_XYZ",
"application_id": "APP_UID_456",
"application_name": "My Awesome App",
"application_metadata": {
"category": "productivity",
"external_url": "https://example.com"
},
"bot_id": "BOT_UID_789",
"bot_token": "pk_live_secrettoken...",
"configuration": {
"required_settings": {
"api_key": "secret_value",
"subdomain": "mycompany"
},
"optional_settings": {
"default_channel": "#general"
}
},
"created_by": "USER_INSTALLER_UID",
"created_at": "2024-01-15T10:00:00.000Z",
"event_type": "app:installation"
}
```
Other event types follow a similar structure but may include fields like `updated_by` and `updated_at` instead of `created_by` and `created_at`. The `bot_token` might be redacted in update events.
## Platform event webhooks
Platform event webhooks notify you about events that occur within organizations where your app is installed, based on your app's event subscriptions.
### Event identification
Platform events are identified by the `message.eventType` field in the payload (e.g., `ticket:created`, `ticket:comment:added`).
### Platform event payload
Example of a `ticket:created` event:
```json theme={null}
{
"message": {
"actor": {
"email": "agent@example.com",
"id": "USER_ACTOR_ID_123",
"type": "ORG_MEMBER"
},
"eventId": "EVENT_ID_ABCDEF12345",
"eventType": "ticket:created",
"orgId": "ORG_ID_XYZ789",
"payload": {
"ticket": {
"aiGeneratedSummary": null,
"aiGeneratedTitle": null,
"assignedAgent": {},
"createdAt": "2023-10-26T10:00:00.000Z",
"customFields": [],
"customer": {
"email": "customer@example.com"
},
"customerContactEmail": "customer@example.com",
"customerContactFirstName": "Jane",
"customerContactLastName": "Doe",
"description": null,
"id": "TICKET_ID_789",
"isArchived": false,
"isEscalated": false,
"metadata": {
"source": "web_form"
},
"priorityId": "PRIORITY_ID_MEDIUM",
"priorityName": "Medium",
"sentimentId": "SENTIMENT_ID_NEUTRAL",
"sentimentName": "Neutral",
"source": "web",
"statusId": "STATUS_ID_OPEN",
"statusName": "Open",
"subTeamId": "SUBTEAM_ID_SUPPORT_L1",
"subTeamIdentifier": "SUPPORT_L1",
"subTeamName": "Support Level 1",
"tags": [],
"teamId": "TEAM_ID_SUPPORT",
"teamIdentifier": "SUPPORT",
"teamName": "Customer Support",
"ticketId": 42,
"title": "Sample Ticket: Login Issue"
}
},
"teamId": "TEAM_ID_SUPPORT",
"timestamp": "1698314400000"
},
"xWebhookEvent": true
}
```
## Handling webhooks
Follow these best practices when handling both types of webhooks:
1. **Endpoint setup**
* Configure webhook URLs in your app manifest
* Ensure endpoints are publicly accessible via HTTPS
* Use separate URLs for installation and platform events
2. **Processing events**
* Parse the JSON payload from the request body
* Identify the event type
* Process events asynchronously
* Respond quickly (within 5 seconds) with a 2xx status
3. **Installation webhook handling**
* Store `bot_token`, `installation_id`, and other credentials securely
* Update configuration when settings change
* Clean up resources on uninstallation
* Handle team access changes appropriately
4. **Platform event handling**
* Extract event type from `message.eventType`
* Process relevant data from `message.payload`
* Handle event-specific logic based on type
* Implement idempotency to handle duplicates
## Security best practices
1. **Endpoint security**
* Always use HTTPS
* Implement request verification
* Validate webhook signatures when provided
* Keep endpoints behind authentication
2. **Data handling**
* Store sensitive data (like `bot_token`) securely
* Encrypt data at rest
* Follow data retention policies
* Clean up data when no longer needed
3. **Error handling**
* Implement proper error logging
* Handle retries gracefully
* Set up monitoring for webhook failures
* Have fallback mechanisms for critical operations
4. **Rate limiting**
* Implement rate limiting on your endpoints
* Handle concurrent requests properly
* Queue events for processing if needed
* Monitor webhook traffic patterns
## Best practices
1. **Response time**
* Respond within 5 seconds
* Process events asynchronously
* Queue long-running tasks
* Monitor processing times
2. **Reliability**
* Implement retry mechanisms
* Handle duplicate events
* Log all webhook activities
* Set up alerting for failures
3. **Scalability**
* Design for high throughput
* Use appropriate caching
* Implement proper database indexing
* Consider using message queues
4. **Maintenance**
* Monitor webhook health
* Track success/failure rates
* Set up proper logging
* Regular security audits
# Overview
Source: https://docs.thena.ai/app-framework/overview
Learn how the Thena apps framework works and how to build with it
The Thena Apps framework provides a foundation for building applications that extend and enhance Thena. This guide explains the core concepts and architecture to help you start building.
## Developer quickstart
1. Create an app manifest with minimal fields (name, scopes, events).
2. Host a webhook that accepts platform events and returns 2xx quickly.
3. Use the bot token from the installation event to call Activities/APIs.
4. Store configuration securely and reference it from Activities.
5. Add one Activity and one event handler end-to-end before scaling up.
### Minimal app (manifest + handler)
```json theme={null}
// manifest.json
{
"app": { "name": "Sample App" },
"scopes": { "required": ["tickets:read", "comments:write"] },
"events": { "subscribe": [{ "event": "ticket:created" }] },
"activities": [
{
"name": "notify_assignee",
"description": "Notify the assigned agent",
"http_config": {
"headers": { "Content-Type": "application/json" },
"httpVerb": "POST",
"endpoint_url": "https://example.com/notify"
},
"request_schema": {
"type": "object",
"properties": { "ticketId": { "type": "string" } }
}
}
]
}
```
```javascript theme={null}
// webhook.js
import express from "express";
const app = express();
app.use(express.json());
app.post("/webhook/app", async (req, res) => {
const event = req.body;
if (!event?.eventType) return res.status(400).send("Invalid");
res.status(200).send("OK");
if (event.eventType === "ticket:created") {
await notifyAssignee(event.payload.ticket);
}
});
app.listen(3001);
```
### Production checklist
* Enforce idempotency using `eventId`.
* Process asynchronously; keep webhook fast.
* Store bot tokens and configuration securely.
* Validate event payloads and activity responses.
* Add monitoring for failed events/activities.
## Architecture overview
At its core, the Apps framework uses an event-driven architecture that enables real-time communication between your app and Thena. Here's how the main components work together:
```mermaid theme={null}
%%{init: {'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'fontFamily': 'Inter', 'primaryColor': '#6A00FF', 'primaryTextColor': '#fff' }}}%%
flowchart LR
A[Your App]:::highlight --> B[Event System]
B --> C[Authentication]
B --> D[Authorization]
B --> E[Events]
B --> F[Activities]
classDef default fill:#f4f4f4,stroke:#333,stroke-width:2px,color:#333;
classDef highlight fill:#6A00FF,stroke:#333,stroke-width:2px,color:#fff;
linkStyle default stroke:#6A00FF,stroke-width:2px;
```
### Core components
1. Event system
* Central communication layer
* Handles real-time updates
* Manages app lifecycle events
* Processes user interactions
2. Authentication
* Bot token-based authentication
* Secure installation flow
* Automatic token management
3. Authorization
* Permission-based access control
* Scoped resource access
* User-level permissions
4. Events
* Subscribe to [platform events](/platform/platform-events)
* Publish custom events
* Handle real-time updates
* Process state changes
5. Activities
* HTTP-based operations
* Pre-configured API calls
* Custom business logic
* External service integration
## How events work
The event system is the primary way your app communicates with Thena. Here's a typical event flow:
```mermaid theme={null}
%%{init: {'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'fontFamily': 'Inter', 'primaryColor': '#6A00FF', 'primaryTextColor': '#fff', 'noteBkgColor': '#f4f4f4', 'noteTextColor': '#333' }}}%%
sequenceDiagram
participant App as Your App
participant Events as Event System
participant Thena as Thena Platform
Note over App,Thena: Installation Flow
Thena->>Events: 1. App installation event
Events->>App: 2. Send bot token
Note over App,Thena: Event Subscription
App->>Events: 3. Subscribe to events
Note over App,Thena: Real-time Communication
Thena->>Events: 4. Platform event occurs
Events->>App: 5. Event notification
App->>Events: 6. Process & respond
Events->>Thena: 7. Update platform state
```
### Key events
1. Installation events
When your app is installed in a workspace, you'll receive an installation event with the bot token and other details:
```typescript theme={null}
{
"event_type": "app:installation",
"application_id": "APP123456789",
"application_name": "Sample App",
"application_metadata": {
"title": "Sample Integration",
"category": "productivity",
"capabilities": [
"Data Management",
"Workflow Automation"
],
"pricing": {
"monthly": 999,
"yearly": 9990
},
"rating": 4.5
},
"bot_id": "BOT123456",
"bot_token": "pk_live_sample.token123456",
"organization_id": "ORG123456",
"team_ids": ["TEAM123456"],
"created_at": "2024-01-01T12:00:00.000Z",
"created_by": "USER123456"
}
```
2. Platform events
Your app can subscribe to various platform events. Here's an example of a ticket comment event:
```typescript theme={null}
{
"message": {
"actor": {
"id": "USER123456",
"email": "user@example.com",
"type": "ORG_ADMIN"
},
"eventType": "ticket:comment:added",
"orgId": "ORG123456",
"payload": {
"comment": {
"id": "COMMENT123456",
"content": "This is a sample comment",
"contentHtml": "
This is a sample comment
",
"contentMarkdown": "This is a sample comment",
"commentType": "comment",
"commentVisibility": "public",
"author": {
"id": "USER123456",
"name": "Sample User",
"email": "user@example.com",
"avatarUrl": "https://example.com/avatar.jpg"
},
"teamId": "TEAM123456",
"createdAt": "2024-01-01T12:00:00.000Z",
"updatedAt": "2024-01-01T12:00:00.000Z"
},
"ticket": {
"id": "TICKET123456",
"title": "Sample support request"
}
},
"eventId": "EVENT123456",
"timestamp": "1704110400000"
},
"xWebhookEvent": true
}
```
For a complete list of available events and their payloads, see our [platform events documentation](/platform/platform-events).
## Security model
The Apps framework uses a token-based security model:
1. Installation security
* Secure bot token generation
* Workspace-scoped access
2. Request authentication
* Token validation on each request
* Request signing
* Secure payload transmission
3. Data access control
* Resource-level permissions
* User context validation
* Data encryption in transit
## Building blocks
### Events
Events let you respond to changes in Thena. See our [platform events documentation](/platform/platform-events) for a complete list of available events.
```typescript theme={null}
// Example event subscription
{
events: {
// Installation event handler
'app:installation': async (event) => {
const { bot_token, organization_id, team_ids } = event;
// Store bot token securely
// Initialize app for the organization
},
// Ticket comment event handler
'ticket:comment:added': async (event) => {
const {
payload: {
comment: { content, author },
ticket: { id: ticketId }
}
} = event.message;
// Process new comment
// Update external systems
}
}
}
```
### Activities
Activities are pre-configured HTTP operations:
```json theme={null}
// Example activity definition
{
"name": "create_contact",
"description": "Creates a new contact in Hubspot",
"http_config": {
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer ${configuration.required_settings.hubspot_api_key}"
},
"httpVerb": "POST",
"endpoint_url": "https://api.hubapi.com/crm/v3/objects/contacts"
},
"request_schema": {
"properties": {
"email": {
"type": "string",
"description": "Contact's email address"
},
"company": {
"type": "string",
"description": "Company name"
},
"lastname": {
"type": "string",
"description": "Contact's last name"
},
"firstname": {
"type": "string",
"description": "Contact's first name"
}
}
},
"response_schema": {
"id": {
"type": "string"
},
"metadata": {
"type": "object",
"description": "Additional information about the created contact"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"properties": {
"type": "object"
}
}
}
```
# All entries
Source: https://docs.thena.ai/changelog/all
Complete history of updates and changes to the Thena platform.
## 📢 September 4, 2025
## Broadcasts
Create and manage broadcast campaigns to communicate with your customers simultaneously across multiple channels. Whether you're announcing new features, sharing important updates, or conducting surveys, broadcasts help you reach your entire customer base efficiently and consistently.
### Key features
* **Multi-channel delivery**: Send messages simultaneously via email and Slack with content optimized for each channel.
* **Smart audience targeting**: Create static lists for specific contacts or dynamic audiences that automatically update based on filter criteria.
* **Rich content editor**: Compose engaging messages with text formatting, links, images, code blocks, and pre-built templates for common scenarios.
* **Flexible scheduling**: Send broadcasts immediately or schedule them for future delivery with timezone-aware timing.
* **Comprehensive analytics**: Track opens, clicks, views, reactions, and delivery success with detailed performance metrics and recall functionality for Slack messages.
* **Template library**: Speed up broadcast creation with pre-built templates for product releases, system outages, company updates, and feature announcements.
[Learn more →](/guides/broadcasts/overview)
***
## 🔧 August 28, 2025
## Webhooks integration
Transform your Thena platform into a real-time event hub with comprehensive webhooks integration. Create private webhook apps that automatically send all platform events to your external services, enabling powerful automation and seamless data synchronization.
### Key features
* **Real-time event streaming**: Receive all platform events from Thena in real-time through webhook endpoints.
* **Multiple destinations**: Create multiple webhook apps to send events to different services like Zapier, n8n, Make, or custom applications.
* **Comprehensive event coverage**: Support for ticket, account, comment, user, organization, and custom object events.
* **Custom filtering**: Filter and process events on your end to create custom workflows and automation.
[Learn more →](/platform/apps/webhooks)
## Account saved views
Organize and streamline your account management workflow with customizable saved views. Create personalized or team-wide account views with specific filters, search criteria, and display configurations that can be easily shared and reused across your organization.
### Key features
* **Personal and team views**: Create private views for individual use or shared team views for collaborative account management.
* **Advanced filtering**: Save complex filter combinations including account health, status, custom fields, and date ranges.
[Learn more →](/guides/accounts/accounts-view)
## Upload knowledge source for AI agents via API
Enhance your AI agents' knowledge base programmatically with our new file upload API. Upload documents, PDFs, text files, and other supported formats directly to your agents' knowledge repositories, enabling dynamic knowledge management and automated content ingestion workflows.
### Key features
* **Multipart file upload**: Support for various document formats including PDFs, Word documents, text files, JSON, and XML with background processing.
* **Automatic processing and indexing**: Uploaded files are automatically processed and indexed for AI agent retrieval with search capabilities.
[Learn more →](/api-reference/agent-studio/agent-files/upload-agent-file)
***
## 📋 August 20, 2025
## Snippets
Create and use snippets to streamline your ticket responses with reusable text templates. Maintain consistency across your team's communications while responding faster to common customer inquiries with formatted content, links, and rich text support.
### Key features
* **Private and team snippets**: Choose between personal templates and team-wide shared responses.
* **Rich content support**: Include text formatting, lists, code blocks, links, and other rich content.
* **Quick insertion**: Type `/` or `/snippet` in any ticket reply to browse and insert content instantly.
[Learn more →](/guides/ticketing/snippets)
## Export tickets
Download your tickets as CSV files for comprehensive analysis, reporting, and external processing. Export all ticket data including core fields, customer information, SLA tracking, and custom fields while respecting your current view filters.
### Key features
* **Filtered exports**: Export respects your current view filters and date ranges.
* **Comprehensive data**: Includes core fields, customer data, SLA tracking, and custom fields in CSV format.
[Learn more →](/guides/ticketing/export-tickets)
## Proactive tickets
Initiate conversations with customers by creating tickets that automatically notify them through email. Reach out proactively to share updates, follow up on issues, or provide preemptive support while maintaining seamless conversation threading.
### Key features
* **Email notifications**: Automatically notify customers via email when creating proactive tickets.
* **Bi-directional replies**: Customers can reply directly to emails, with responses appearing in the ticket thread.
* **API support**: Create proactive tickets programmatically using the Thena API.
[Learn more →](/guides/ticketing/proactive-tickets)
## Assigned to me quick filter
Added a new quick filter in the Kanban window and list view that shows only tickets assigned to you. Find it next to the Date range selector as an @ button.
***
## 🔮 August 14, 2025
## AI chat threads
View and manage all AI-powered web-chat conversations across your organization in one centralized interface. This unified dashboard provides complete visibility into automated support operations, helping you monitor AI performance, gather quality insights, and improve customer service.
### Key features
* **Organization-wide visibility**: Monitor all AI chat conversations across every agent and team from a single interface.
* **Advanced filters and search**: Filter by time, feedback, ticket status, and search across conversation content and customer details.
* **Ticket integration**: Automatic conversion tracking with visual indicators when conversations become support tickets.
* **Feedback monitoring**: Team feedback system to improve AI performance with thumbs-up/down ratings and detailed comments.
* **Real-time message viewing**: Complete conversation history with customer information, attachments, and AI response tracking.
[Learn more →](/guides/ai-agents/ai-chat-threads)
## Discord integration
Transform your Discord server into a powerful support hub with native Discord integration. Turn Discord conversations into structured tickets with enterprise-grade automation, while maintaining seamless communication flow within your Discord environment.
### Key features
* **Automated ticket creation**: Convert Discord messages to tickets with configurable modes (all messages, emoji-triggered with 🎫, or none).
* **Channel support**: Full support for both regular and forum channels with team-to-channel mapping.
* **Bidirectional synchronization**: Comments, reactions, and file attachments sync seamlessly between Discord and Thena.
* **Admin command configuration**: Set up and manage integration through Discord bot commands (!admin auth, map-team, set-ticket-mode).
* **API-based setup**: Complete installation and configuration through Thena API and Discord admin commands.
[Learn more →](/guides/sources/discord)
***
## 🎯 August 6, 2025
## Accounts table improvements
We've enhanced the accounts table with new features and improvements to make account management more efficient and insightful. These updates provide better data organization, search capabilities, and actionable insights.
### Key improvements
* **Better search**: Enhanced search functionality with improved accuracy and faster results.
* **Added filters**: New filtering options to quickly find specific accounts based on various criteria.
* **Optimized loading**: Improved performance when loading large numbers of accounts.
* **Added pagination**: Implemented pagination to improve performance and user experience when browsing many accounts.
* **Advanced sorting**: Sort by multiple columns including custom fields, activity dates, and account health.
[Learn more →](/guides/accounts/accounts-view)
## Citations in L1 defection flow
Enhance your L1 agent's credibility and transparency by automatically including citations from your knowledge base in responses. When the AI references specific articles or documentation, it now provides clear citations that customers can follow up on.
### Key features
* **Automatic citation generation**: AI automatically cites relevant knowledge base articles when providing information.
* **Clickable links**: Citations include direct links to the referenced articles for easy access.
[Learn more →](/guides/ai-agents/knowledge)
## Public help center APIs
We're excited to announce the public release of our help center APIs, enabling developers to programmatically manage help centers, collections, articles, and tags. This comprehensive API suite provides full CRUD operations for building custom help center integrations and workflows.
### Key features
* **Help centers management**: Create, update, and manage help centers with custom domains and branding.
* **Collections API**: Organize content with hierarchical collections and nested article structures.
* **Articles CRUD**: Full article lifecycle management with rich content support and versioning.
* **Tags system**: Categorize and organize content with flexible tagging capabilities.
[Learn more →](/api-reference/thena-help-center/help-centers/get-all-help-centers-for-the-user)
## Filter by tags in tickets
Streamline your ticket management with the new tag filtering capability. Quickly find and organize tickets by their associated tags, making it easier to focus on specific categories, priorities, or customer segments.
[Learn more →](/guides/ticketing/tags)
## Improvements to AI sentiment and priority detection
Our AI models and prompts have been enhanced to provide more accurate sentiment analysis and priority detection. These improvements help teams better understand customer emotions and urgency, leading to more appropriate responses and resource allocation.
***
## ⚡ July 30, 2025
## Salesforce integration
Connect Thena with Salesforce to synchronize accounts and contacts seamlessly. Our new integration enables data flow between your CRM and Thena, keeping customer information up-to-date across both systems.
### Key features
* **Account synchronization**: Sync Salesforce accounts with custom field selection and advanced filtering options.
* **Contact synchronization**: Automatically sync contacts with predefined standard fields for consistent data mapping.
* **Advanced filtering**: Use multiple filter operators to control which records are synchronized.
* **Activity monitoring**: Track sync operations with real-time status updates and detailed audit logs.
* **Flexible scheduling**: Configure sync frequency from 4 to 24 hours with manual sync triggers.
[Learn more →](/platform/apps/salesforce)
## Collapse email threads
Keep your kanban view clean and organized by collapsing email threads. This new feature helps reduce visual clutter while maintaining full access to conversation history when needed.
### Key features
* **Clean kanban view**: Show only the main message in the kanban board to reduce clutter.
* **Expandable threads**: Click to expand and see the full conversation history when needed.
* **Context preservation**: Maintain all context and conversation data while keeping the interface clean.
* **Improved focus**: Help teams concentrate on what matters most without getting overwhelmed by thread noise.
[Learn more →](/guides/sources/email)
## New workflow triggers added
We've significantly expanded our workflow trigger library to give you more granular control over automation. These new triggers enable you to build sophisticated workflows that respond to specific changes in tickets, accounts, contacts, and customer satisfaction surveys.
### Ticket triggers
* **Custom field values changed**: Trigger when any custom field value is modified
* **Custom field added**: Trigger when a new custom field is added to a ticket
* **Custom field value removed**: Trigger when a custom field value is cleared
* **Type changed**: Trigger when ticket type is updated
* **Assignee changed**: Trigger when ticket assignment changes
* **Status changed**: Trigger when ticket status is modified
* **Priority changed**: Trigger when ticket priority is updated
* **Sentiment changed**: Trigger when AI-detected sentiment changes
### CSAT triggers
* **Ticket CSAT sent**: Trigger when a CSAT survey is sent to a customer
* **Ticket CSAT received**: Trigger when a customer completes a CSAT survey
### Account triggers
* **Health changed**: Trigger when account health status is updated
* **Status changed**: Trigger when account status is modified
* **Classification changed**: Trigger when account classification is updated
* **Industry changed**: Trigger when account industry is changed
* **Custom field changed**: Trigger when any account custom field is modified
* **Custom field added**: Trigger when a new custom field is added to an account
* **Custom field removed**: Trigger when an account custom field is removed
### Customer contact triggers
* **Custom field changed**: Trigger when any contact custom field is modified
* **Custom field added**: Trigger when a new custom field is added to a contact
* **Custom field removed**: Trigger when a contact custom field is removed
* **Contact type updated**: Trigger when contact type is changed
[Learn more →](/guides/ticketing/workflows)
***
## ✨ July 23, 2025
## Move tickets between teams
Seamlessly transfer tickets between teams when issues require specialized expertise or different departmental ownership. Whether escalating from support to engineering or handing off from sales to success, you can now move tickets while preserving all context, conversation history, and communication continuity.
### Key features
* **Complete context transfer**: All conversation history, attachments, and internal notes are moved to the new ticket.
* **Smart restoration**: Automatically restores original tickets when moving back to a team, preserving the ticket ID for customers.
* **Bulk move**: Select and move multiple tickets at once with a detailed eligibility review and real-time progress monitoring.
* **Communication continuity**: Customers continue interacting on the same channel (Slack, MS Teams, etc.) without interruption.
[Learn more →](/guides/ticketing/move-tickets)
## AI feedback
Your feedback is crucial for improving our AI agents, and now it's easier than ever to provide it. We've integrated feedback mechanisms across the platform to help us refine our models and make our AI more helpful for everyone.
### Where to provide feedback
* **AI copilot**: Give a thumbs up or down on AI-generated responses.
* **L1 agent responses**: Rate the quality of automated L1 messages.
* **AI logs**: Provide feedback on specific actions taken by AI agents in the ticket timeline.
* **Web chat**: Rate the AI's performance after a ticket is created via web chat.
[Learn more →](/guides/ai-agents/feedback)
***
## 🚀 July 16, 2025
## Customer portal
We're excited to launch the Customer portal, a dedicated space for your customers to create, manage, and track their support requests. It provides a branded, self-service experience with secure access and streamlined communication.
### Key features
* **Simplified ticket creation**: A guided flow with dynamic forms ensures the right information is collected.
* **Centralized ticket view**: Customers can see all their requests, filter, and search in one place.
* **Anywhere links**: A single ticket URL works for both vendors and customers, directing them to the appropriate view.
* **User management**: Invite users, assign roles (admin or user), and control access securely.
[Learn more →](/guides/ticketing/customer-portal)
## Linear integration
Connect Thena tickets with Linear issues seamlessly. Our new integration allows you to create, link, and track Linear issues directly from Thena, keeping your support and development teams in sync.
### Key features
* **Link and create issues**: Connect Thena tickets to existing Linear issues or create new ones on the fly.
* **Synchronized updates**: Issue status, priority, and assignee updates are reflected in near real-time.
* **Detailed views**: See comprehensive Linear issue details without leaving Thena.
* **Internal thread linking**: Automatically link Linear issues by pasting a URL in an internal thread.
[Learn more →](/platform/apps/linear)
## Live presence
See who's viewing a ticket in real-time with Live Presence. Avatars of team members appear at the top of a ticket, helping prevent duplicate work and improving collaboration, just like in Google Docs.
[Learn more →](/guides/ticketing/live-presence)
## Unread message notifications on web chat
The web chat widget now shows a badge with the number of unread messages, and a red dot highlights specific chats with new replies, ensuring users never miss an update.
[Learn more →](/guides/sources/web-chat)
## Private collections and help centers
You can now make specific collections or even entire help centers private, requiring users to log in for access. This is perfect for internal knowledge bases or sensitive documentation.
[Learn more →](/guides/knowledge-base/help-centers)
***
## 📱 July 10, 2025
## Attachment support in web chat
Web chat now supports image attachments, allowing users to upload screenshots, product images, or GIFs, giving support agents and AI better context to respond faster and more accurately.
Supported formats include PNG, JPEG/JPG, GIF, WebP, and BMP. We plan to support more file types in upcoming releases.
[Learn more →](/guides/sources/web-chat)
## Slack shortcuts
We’ve added new Slack shortcuts, **Inspect message** and **Assign to** to help teams act faster without leaving Slack. These shortcuts make it easier to confirm if a message is a ticket and turn it into an assigned task instantly.
### New shortcuts
* **Inspect message**: See if a message was detected as a ticket and view its details
* **Assign to**: Create and assign a Thena ticket directly from a Slack message
You’ll find these options in the three-dot menu on any message in a channel where the Thena app is installed.
[Learn more →](/guides/sources/slack)
***
## 🧩 June 25, 2025
## AI logs
We're excited to announce our new AI logs tab, a dedicated view inside each ticket that captures every action taken or attempted by AI agents. This powerful addition provides a transparent audit trail of automated activity, ensuring full visibility into how AI contributes to ticket handling.
### What gets logged
* **Status changes**: When the AI updates ticket status
* **Fallbacks to human agents**: When AI defers due to policy constraints or confidence issues
* **Custom field updates**: Setting fields like "Issue category" or product tags
* **Ticket associations**: Linking related tickets for context
* **Summaries and notes**: AI-generated internal notes or conversation summaries
[Learn more →](/guides/ticketing/ai-logs)
***
## 🔗 June 17, 2025
## Related tickets
We're excited to announce our new Related tickets feature, designed to help support teams connect conversations across departments, issues, and time zones. This powerful addition allows you to link tickets together, creating a complete picture of complex customer issues that span multiple teams or require cross-functional collaboration.
### Key features
* **Connect related conversations** across different teams and departments
* **Link tickets bidirectionally** for complete context awareness
* **Add context notes** to explain relationships between tickets
* **Track resolution progress** across all connected issues
* **Navigate seamlessly** between related tickets
[Learn more →](/guides/ticketing/related-tickets)
***
## 💬 June 10, 2025
## AI web chat
We're excited to announce the release of our new AI web chat feature, an AI-native support experience that can be embedded into any website or web app. This powerful tool empowers your users to engage instantly with an AI agent who can respond using your uploaded documentation, and if needed, gracefully hand off to a human agent by creating a support ticket.
### Key features
* **Instant AI-powered responses** using your own documentation
* **Seamless handoff** to human agents when needed
* **Fully customizable appearance** to match your brand
* **Easy deployment** with a simple JavaScript snippet
### How to enable Web chat
1. Go to Organization > Click Sources
2. Enable Web chat > Select team
3. Once you are in Team settings > Configure how you want Web chat to look like
4. Once that is done, just Copy the script and deploy it in your End of `` tag
[Learn more →](/guides/sources/web-chat)
***
## ⭐ June 9, 2025
We're excited to announce the release of our new Customer Satisfaction (CSAT) feature, designed to help you gather valuable feedback from your customers after ticket resolution.
### Key highlights:
* **Automated delivery**: CSAT surveys delivered via Slack or email
* **Customizable surveys**: Fully customizable appearance and content
* **Advanced filtering**: Target specific tickets based on custom rules
* **Sampling options**: Prevent survey fatigue with intelligent sampling
* **Detailed analytics**: Track customer satisfaction trends over time
[Learn more →](/guides/ticketing/csat)
## 💬 June 3, 2025
### Major update: Introducing Auto-responder
The auto-responder is the most advanced multi-channel response automation built for modern support teams. It gives you precise control over when, how, and where customers receive automatic replies—whether during holidays, after hours, or when assigned agents are unavailable.
[Learn more →](/guides/ticketing/auto-responder)
### Key features:
* **Multi-channel support**: Automatically replies on the original channel—Slack, MS Teams, or email—maintaining a consistent experience.
* **Flexible triggers**: Responds to new tickets or incoming messages on existing tickets.
* **Intelligent conditions**: Rules can be triggered during holidays, outside business hours, or when agents are unavailable.
* **Advanced filtering**: Target responses based on ticket properties, tags, or customer information.
* **Branded messaging**: Messages are sent by a bot named after your organization with its logo.
* **Rich text formatting**: Create professional responses with bold, italics, and lists for better readability.
Auto-responders help set proper expectations with customers while reducing follow-up inquiries and improving overall satisfaction.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
***
## 🤖 May 22, 2025
### Major update: Introducing Thena MCP server
Your AI models and agents can now access your Thena data in a simple and secure way through our official MCP server. This integration follows the authenticated remote [MCP spec](https://modelcontextprotocol.io/specification/2025-03-26), enabling seamless connection between AI assistants and your Thena platform data.
* **Native AI assistant integration**: Connect directly as a new integration in Claude and other AI assistants.
* **Code editor support**: Works with Cursor, Windsurf, Zed, and other clients using the [mcp-remote](https://github.com/geelen/mcp-remote) module.
* **Secure OAuth authentication**: Organization-level authentication ensures your data remains secure.
* **Comprehensive tool suite**: Access and manage tickets, teams, accounts, and customer contacts.
[Learn more →](https://docs.thena.ai/api-reference/thena-mcp-server)
### Integration highlights:
* **Tickets management**: Create, update, and search tickets directly from your AI assistant.
* **Team operations**: Manage team settings and assignments without switching contexts.
* **Account management**: Retrieve account information and activities for better customer context.
* **Contact management**: Access customer contact information to personalize interactions.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
The MCP server integration enables AI assistants to become true members of your support team, with access to the same data and tools as human agents.
***
## 🔗 May 10, 2025
### Major update: Internal threads for team collaboration
Internal threads in Thena give your team a focused space to collaborate on a customer ticket without disrupting the external conversation. You can keep it fully internal or optionally link it to a Slack channel for real-time collaboration.
* **Private team discussions**: Create internal conversations that are only visible to your team—customers never see them.
* **Slack integration**: Connect threads to Slack channels for real-time collaboration with bi-directional sync.
* **Rich media support**: Share files, images, and formatted text directly in threads.
* **Multiple threads per ticket**: Create separate threads for different aspects of a ticket.
Internal threads help teams collaborate efficiently across departments, share knowledge, coordinate escalations, and document important decisions—all without cluttering customer-facing communications.
[Learn more →](https://docs.thena.ai/guides/ticketing/internal-threads)
### Update: Emoji actions for faster workflows
Emoji actions allow your team to perform common ticket operations with a simple emoji reaction, saving time and streamlining your workflow.
* **One-click operations**: Add specific emoji reactions to trigger actions automatically.
* **Default actions**: Use built-in emoji shortcuts for changing ticket status with a simple reaction.
* **Customizable workflows**: Create your own emoji actions with custom triggers and operations.
[Learn more →](https://docs.thena.ai/guides/ticketing/emoji-actions)
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
Both internal threads and emoji actions integrate directly with Slack, allowing your team to collaborate efficiently regardless of which platform they prefer to use.
***
## ⚡ May 1, 2025
### Major update: Advanced APIs release
We're excited to announce the release of our comprehensive API suite, organized into three main sections to serve distinct purposes in the Thena ecosystem:
* **Platform APIs**: Core infrastructure services including authentication, SLA management, workflow orchestration, ticketing, accounts, teams, tags, forms, comments, and more.
* **App Platform APIs**: Create, manage, and distribute custom applications within the Thena ecosystem. Includes app creation, installation, uninstallation, and webhook handling.
* **Workflows APIs**: Automate business processes and orchestrate workflows across the Thena platform. Includes workflow creation, execution, event handling, and activity/task management.
All APIs require authentication using an **x-api-key** header. API keys can be generated from **Dashboard → Organization Settings → Security and Access**.
[Explore the API reference →](https://docs.thena.ai/api-reference/introduction)
### Other updates:
* **Enhanced developer documentation**: Added comprehensive guides, tutorials, and code samples to help developers get started with our APIs.
* **API Explorer tool**: Launched an interactive API testing tool that allows developers to experiment with API calls directly from the documentation.
* **Client libraries**: Released official client libraries for JavaScript, Python, and Ruby to simplify API integration.
* **Webhook improvements**: Enhanced webhook delivery with retry logic and detailed delivery logs.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
API keys should be kept secure and never exposed in client-side code. Use server-side proxies for client applications that need to access Thena APIs.
***
## 🏢 April 24, 2025
### Major update: A new Accounts experience
Thena now brings all your customer accounts into a single, real-time, intelligent view — no manual entry, no switching tools.
* **Unified accounts table**: View, sort, filter, and edit customer accounts with a powerful spreadsheet-like interface.
* **Automated account creation**: Accounts are automatically built from Slack conversations, emails, CRM, and API integrations.
* **Account detail view**: See linked tickets, contacts, notes, tasks, and activities — all in one sidebar for a complete 360° view.
* **Centralized customer intelligence**: Move faster across success, support, solutions, and leadership teams with shared context and insights.
[Learn more →](https://docs.thena.ai/guides/accounts/accounts-view)
### Other updates:
* **Account tasks**: Track and manage customer-related tasks linked to specific accounts — keeping teams aligned on next steps. [Learn more →](https://docs.thena.ai/guides/accounts/tasks)
* **Account notes**: Capture and organize customer notes tied to accounts — accessible to everyone working with that customer. [Learn more →](https://docs.thena.ai/guides/accounts/notes)
* **Account activity**: View a real-time activity feed for every customer — conversations, ticket updates, task completions, and more. [Learn more →](https://docs.thena.ai/guides/accounts/activity)
* **Custom account fields**: Add your own fields to track customer-specific metadata — from industry to renewal dates to custom tags. [Learn more →](https://docs.thena.ai/guides/accounts/account-fields)
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
***
## 🔔 April 17, 2025
### Major update: Smarter, multi-channel notifications
Thena now delivers a modern, flexible notification system across Slack, Email, Inbox, and In-App Toasts — fully customizable to how you work.
* Choose where you want to receive updates: Slack, Email, Inbox, or lightweight in-app Toasts.
* Configure exactly which events trigger notifications — customized per channel.
* Stay on top of ticket updates, SLA breaches, CSAT responses, and internal thread activity.
* Batch notifications intelligently to stay informed without noise.
[Learn more →](https://docs.thena.ai/guides/preferences/notifications)
### Other updates:
* **Multiple internal threads**: Start and manage private conversations inside a single ticket in sync with Slack. [Learn more →](https://docs.thena.ai/guides/ticketing/internal-threads)
* **Customizable themes**: Personalize Thena with light or dark modes to suit your working style. [Learn more →](https://docs.thena.ai/guides/preferences/themes)
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
***
## 🚀 April 10, 2025
Thena is built for how modern teams work today — helping them support, serve, and manage high-value customers through a flexible, AI-native platform.
It brings conversations, ticketing, customer data, and automation together across Slack, email, and web — designed to work at speed and scale without adding complexity.
With Thena, teams can:
* Run multi-channel, multi-team, and multi-group operations out of the box.
* Manage accounts, tickets, tasks, and track CSAT in one place.
* Build custom AI agents and set up proactive workflows tailored to each team's needs.
* Create knowledge bases and help centers without relying on extra tools.
* Collaborate across teams without losing structure or visibility.
Each team can set up its own flows, automations, and AI — while staying connected within the larger system.
Thena gives teams the flexibility to move independently, and the structure to operate together — without the usual friction.
This isn't a support tool refresh. It's the modular, AI-native infrastructure modern companies will build on for the next decade.
### What's new
* **Powerful APIs** to support complex B2B workflows.
* **New core entities**: Organization, Account, Contact, Ticket, Team, and Group.
* **Embedded ticketing concepts**: SLAs, routing, working hours, and ticket fields.
* **Flexible team structure**: Create teams and groups to match your organization.
* **Unified customer view**: Accounts, contacts, tickets, and activity in one place.
* **Multi-channel support**: Slack, email, web chat, and more.
* **AI-native platform**: Build custom AI agents for your specific needs.
* **Knowledge base**: Create and manage help centers and documentation.
* **Workflow automation**: Set up proactive workflows and automations.
* **Reporting and analytics**: Track performance and customer satisfaction.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
# 🚀 April 10, 2025
Source: https://docs.thena.ai/changelog/april-10-2025
Say hello to the new Thena — where AI, service, and scale meet for modern B2B teams.
Thena is built for how modern teams work today — helping them support, serve, and manage high-value customers through a flexible, AI-native platform.
It brings conversations, ticketing, customer data, and automation together across Slack, email, and web — designed to work at speed and scale without adding complexity.
With Thena, teams can:
* Run multi-channel, multi-team, and multi-group operations out of the box.
* Manage accounts, tickets, tasks, and track CSAT in one place.
* Build custom AI agents and set up proactive workflows tailored to each team's needs.
* Create knowledge bases and help centers without relying on extra tools.
* Collaborate across teams without losing structure or visibility.
Each team can set up its own flows, automations, and AI — while staying connected within the larger system.
Thena gives teams the flexibility to move independently, and the structure to operate together — without the usual friction.
This isn't a support tool refresh. It's the modular, AI-native infrastructure modern companies will build on for the next decade.
## What's new
* **Powerful APIs** to support complex B2B workflows.
* **New core entities**: Organization, Account, Contact, Ticket, Team, and Group.
* **Embedded ticketing concepts**: SLAs, routing, working hours, and ticket fields.
* **Custom app framework** to build and extend Thena to fit your needs.
* **AI agents** that act like contextual team members.
* **Modern UI** designed for speed, clarity, and effortless work.
* **Truly omni-channel**: Slack, Microsoft Teams, Email — all connected natively.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
# 🔔 April 17, 2025
Source: https://docs.thena.ai/changelog/april-17-2025
Smarter notifications, internal threads, and customizable themes.
## Major update: Smarter, multi-channel notifications
Thena now delivers a modern, flexible notification system across Slack, Email, Inbox, and In-App Toasts — fully customizable to how you work.
* Choose where you want to receive updates: Slack, Email, Inbox, or lightweight in-app Toasts.
* Configure exactly which events trigger notifications — customized per channel.
* Stay on top of ticket updates, SLA breaches, CSAT responses, and internal thread activity.
* Batch notifications intelligently to stay informed without noise.
[Learn more →](https://docs.thena.ai/guides/preferences/notifications)
## Other updates:
* **Multiple internal threads**: Start and manage private conversations inside a single ticket in sync with Slack. [Learn more →](https://docs.thena.ai/guides/ticketing/internal-threads)
* **Customizable themes**: Personalize Thena with light or dark modes to suit your working style. [Learn more →](https://docs.thena.ai/guides/preferences/themes)
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
# 🏢 April 24, 2025
Source: https://docs.thena.ai/changelog/april-24-2025
A new Accounts experience with unified view, tasks, notes, and custom fields.
## Major update: A new Accounts experience
Thena now brings all your customer accounts into a single, real-time, intelligent view — no manual entry, no switching tools.
* **Unified accounts table**: View, sort, filter, and edit customer accounts with a powerful spreadsheet-like interface.
* **Automated account creation**: Accounts are automatically built from Slack conversations, emails, CRM, and API integrations.
* **Account detail view**: See linked tickets, contacts, notes, tasks, and activities — all in one sidebar for a complete 360° view.
* **Centralized customer intelligence**: Move faster across success, support, solutions, and leadership teams with shared context and insights.
[Learn more →](https://docs.thena.ai/guides/accounts/accounts-view)
## Other updates:
* **Account tasks**: Track and manage customer-related tasks linked to specific accounts — keeping teams aligned on next steps. [Learn more →](https://docs.thena.ai/guides/accounts/tasks)
* **Account notes**: Capture and organize customer notes tied to accounts — accessible to everyone working with that customer. [Learn more →](https://docs.thena.ai/guides/accounts/notes)
* **Account activity**: View a real-time activity feed for every customer — conversations, ticket updates, task completions, and more. [Learn more →](https://docs.thena.ai/guides/accounts/activity)
* **Custom account fields**: Add your own fields to track customer-specific metadata — from industry to renewal dates to custom tags. [Learn more →](https://docs.thena.ai/guides/accounts/account-fields)
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
# 🔮 August 14, 2025
Source: https://docs.thena.ai/changelog/august-14-2025
AI chat threads for persistent AI conversations and Discord integration for community support.
## AI chat threads
View and manage all AI-powered web-chat conversations across your organization in one centralized interface. This unified dashboard provides complete visibility into automated support operations, helping you monitor AI performance, gather quality insights, and improve customer service.
### Key features
* **Organization-wide visibility**: Monitor all AI chat conversations across every agent and team from a single interface.
* **Advanced filters and search**: Filter by time, feedback, ticket status, and search across conversation content and customer details.
* **Ticket integration**: Automatic conversion tracking with visual indicators when conversations become support tickets.
* **Feedback monitoring**: Team feedback system to improve AI performance with thumbs-up/down ratings and detailed comments.
* **Real-time message viewing**: Complete conversation history with customer information, attachments, and AI response tracking.
[Learn more →](/guides/ai-agents/ai-chat-threads)
## Discord integration
Transform your Discord server into a powerful support hub with native Discord integration. Turn Discord conversations into structured tickets with enterprise-grade automation, while maintaining seamless communication flow within your Discord environment.
### Key features
* **Automated ticket creation**: Convert Discord messages to tickets with configurable modes (all messages, emoji-triggered with 🎫, or none).
* **Channel support**: Full support for both regular and forum channels with team-to-channel mapping.
* **Bidirectional synchronization**: Comments, reactions, and file attachments sync seamlessly between Discord and Thena.
* **Admin command configuration**: Set up and manage integration through Discord bot commands (!admin auth, map-team, set-ticket-mode).
* **API-based setup**: Complete installation and configuration through Thena API and Discord admin commands.
[Learn more →](/guides/sources/discord)
# 📋 August 20, 2025
Source: https://docs.thena.ai/changelog/august-20-2025
Snippets for faster responses, ticket exports for analysis, proactive ticket outreach, and quick filter improvements.
## Snippets
Create and use snippets to streamline your ticket responses with reusable text templates. Maintain consistency across your team's communications while responding faster to common customer inquiries with formatted content, links, and rich text support.
### Key features
* **Private and team snippets**: Choose between personal templates and team-wide shared responses.
* **Rich content support**: Include text formatting, lists, code blocks, links, and other rich content.
* **Quick insertion**: Type `/` or `/snippet` in any ticket reply to browse and insert content instantly.
[Learn more →](/guides/ticketing/snippets)
## Export tickets
Download your tickets as CSV files for comprehensive analysis, reporting, and external processing. Export all ticket data including core fields, customer information, SLA tracking, and custom fields while respecting your current view filters.
### Key features
* **Filtered exports**: Export respects your current view filters and date ranges.
* **Comprehensive data**: Includes core fields, customer data, SLA tracking, and custom fields in CSV format.
[Learn more →](/guides/ticketing/export-tickets)
## Proactive tickets
Initiate conversations with customers by creating tickets that automatically notify them through email. Reach out proactively to share updates, follow up on issues, or provide preemptive support while maintaining seamless conversation threading.
### Key features
* **Email notifications**: Automatically notify customers via email when creating proactive tickets.
* **Bi-directional replies**: Customers can reply directly to emails, with responses appearing in the ticket thread.
* **API support**: Create proactive tickets programmatically using the Thena API.
[Learn more →](/guides/ticketing/proactive-tickets)
## Assigned to me quick filter
Added a new quick filter in the Kanban window and list view that shows only tickets assigned to you. Find it next to the Date range selector as an @ button.
# 🔧 August 28, 2025
Source: https://docs.thena.ai/changelog/august-28-2025
Webhooks integration, account saved views for better organization, and programmatic AI agent knowledge management.
## Webhooks integration
Transform your Thena platform into a real-time event hub with comprehensive webhooks integration. Create private webhook apps that automatically send all platform events to your external services, enabling powerful automation and seamless data synchronization.
### Key features
* **Real-time event streaming**: Receive all platform events from Thena in real-time through webhook endpoints.
* **Multiple destinations**: Create multiple webhook apps to send events to different services like Zapier, n8n, Make, or custom applications.
* **Comprehensive event coverage**: Support for ticket, account, comment, user, organization, and custom object events.
* **Custom filtering**: Filter and process events on your end to create custom workflows and automation.
[Learn more →](/platform/apps/webhooks)
## Account saved views
Organize and streamline your account management workflow with customizable saved views. Create personalized or team-wide account views with specific filters, search criteria, and display configurations that can be easily shared and reused across your organization.
### Key features
* **Personal and team views**: Create private views for individual use or shared team views for collaborative account management.
* **Advanced filtering**: Save complex filter combinations including account health, status, custom fields, and date ranges.
[Learn more →](/guides/accounts/accounts-view)
## Upload knowledge source for AI agents via API
Enhance your AI agents' knowledge base programmatically with our new file upload API. Upload documents, PDFs, text files, and other supported formats directly to your agents' knowledge repositories, enabling dynamic knowledge management and automated content ingestion workflows.
### Key features
* **Multipart file upload**: Support for various document formats including PDFs, Word documents, text files, JSON, and XML with background processing.
* **Automatic processing and indexing**: Uploaded files are automatically processed and indexed for AI agent retrieval with search capabilities.
[Learn more →](/api-reference/agent-studio/agent-files/upload-agent-file)
# 🎯 August 6, 2025
Source: https://docs.thena.ai/changelog/august-6-2025
Accounts improvements, citations in L1 defection flow, public help center APIs, tag filtering, and AI sentiment enhancements.
## Accounts table improvements
We've enhanced the accounts table with new features and improvements to make account management more efficient and insightful. These updates provide better data organization, search capabilities, and actionable insights.
### Key improvements
* **Better search**: Enhanced search functionality with improved accuracy and faster results.
* **Added filters**: New filtering options to quickly find specific accounts based on various criteria.
* **Optimized loading**: Improved performance when loading large numbers of accounts.
* **Added pagination**: Implemented pagination to improve performance and user experience when browsing many accounts.
* **Advanced sorting**: Sort by multiple columns including custom fields, activity dates, and account health.
[Learn more →](/guides/accounts/accounts-view)
## Citations in L1 defection flow
Enhance your L1 agent's credibility and transparency by automatically including citations from your knowledge base in responses. When the AI references specific articles or documentation, it now provides clear citations that customers can follow up on.
### Key features
* **Automatic citation generation**: AI automatically cites relevant knowledge base articles when providing information.
* **Clickable links**: Citations include direct links to the referenced articles for easy access.
[Learn more →](/guides/ai-agents/knowledge)
## Public help center APIs
We're excited to announce the public release of our help center APIs, enabling developers to programmatically manage help centers, collections, articles, and tags. This comprehensive API suite provides full CRUD operations for building custom help center integrations and workflows.
### Key features
* **Help centers management**: Create, update, and manage help centers with custom domains and branding.
* **Collections API**: Organize content with hierarchical collections and nested article structures.
* **Articles CRUD**: Full article lifecycle management with rich content support and versioning.
* **Tags system**: Categorize and organize content with flexible tagging capabilities.
[Learn more →](/api-reference/thena-help-center/help-centers/get-all-help-centers-for-the-user)
## Filter by tags in tickets
Streamline your ticket management with the new tag filtering capability. Quickly find and organize tickets by their associated tags, making it easier to focus on specific categories, priorities, or customer segments.
[Learn more →](/guides/ticketing/tags)
## Improvements to AI sentiment and priority detection
Our AI models and prompts have been enhanced to provide more accurate sentiment analysis and priority detection. These improvements help teams better understand customer emotions and urgency, leading to more appropriate responses and resource allocation.
# 📱 July 10, 2025
Source: https://docs.thena.ai/changelog/july-10-2025
Image support in web chat and new Slack shortcuts for tickets.
## Attachment support in web chat
Web chat now supports image attachments, allowing users to upload screenshots, product images, or GIFs, giving support agents and AI better context to respond faster and more accurately.
Supported formats include PNG, JPEG/JPG, GIF, WebP, and BMP. We plan to support more file types in upcoming releases.
[Learn more →](/guides/sources/web-chat)
## Slack shortcuts
We’ve added new Slack shortcuts, **Inspect message** and **Assign to** to help teams act faster without leaving Slack. These shortcuts make it easier to confirm if a message is a ticket and turn it into an assigned task instantly.
### New shortcuts
* **Inspect message**: See if a message was detected as a ticket and view its details
* **Assign to**: Create and assign a Thena ticket directly from a Slack message
You’ll find these options in the three-dot menu on any message in a channel where the Thena app is installed.
[Learn more →](/guides/sources/slack)
# 🚀 July 16, 2025
Source: https://docs.thena.ai/changelog/july-16-2025
Customer portal, Linear integration, Live presence and more.
## Customer portal
We're excited to launch the Customer Portal, a dedicated space for your customers to create, manage, and track their support requests. It provides a branded, self-service experience with secure access and streamlined communication.
### Key features
* **Simplified ticket creation**: A guided flow with dynamic forms ensures the right information is collected.
* **Centralized ticket view**: Customers can see all their requests, filter, and search in one place.
* **Anywhere links**: A single ticket URL works for both vendors and customers, directing them to the appropriate view.
* **User management**: Invite users, assign roles (admin or user), and control access securely.
[Learn more →](/guides/ticketing/customer-portal)
## Linear integration
Connect Thena tickets with Linear issues seamlessly. Our new integration allows you to create, link, and track Linear issues directly from Thena, keeping your support and development teams in sync.
### Key features
* **Link and create issues**: Connect Thena tickets to existing Linear issues or create new ones on the fly.
* **Synchronized updates**: Issue status, priority, and assignee updates are reflected in near real-time.
* **Detailed views**: See comprehensive Linear issue details without leaving Thena.
* **Internal thread linking**: Automatically link Linear issues by pasting a URL in an internal thread.
[Learn more →](/platform/apps/linear)
## Live presence
See who's viewing a ticket in real-time with Live Presence. Avatars of team members appear at the top of a ticket, helping prevent duplicate work and improving collaboration, just like in Google Docs.
[Learn more →](/guides/ticketing/live-presence)
## Unread message notifications on web chat
The web chat widget now shows a badge with the number of unread messages, and a red dot highlights specific chats with new replies, ensuring users never miss an update.
[Learn more →](/guides/sources/web-chat)
## Private collections and help centers
You can now make specific collections or even entire help centers private, requiring users to log in for access. This is perfect for internal knowledge bases or sensitive documentation.
[Learn more →](/guides/knowledge-base/help-centers)
# ✨ July 23, 2025
Source: https://docs.thena.ai/changelog/july-23-2025
Move tickets between teams and provide feedback on AI actions.
## Move tickets between teams
Seamlessly transfer tickets between teams when issues require specialized expertise or different departmental ownership. Whether escalating from support to engineering or handing off from sales to success, you can now move tickets while preserving all context, conversation history, and communication continuity.
### Key features
* **Complete context transfer**: All conversation history, attachments, and internal notes are moved to the new ticket.
* **Smart restoration**: Automatically restores original tickets when moving back to a team, preserving the ticket ID for customers.
* **Bulk move**: Select and move multiple tickets at once with a detailed eligibility review and real-time progress monitoring.
* **Communication continuity**: Customers continue interacting on the same channel (Slack, MS Teams, etc.) without interruption.
[Learn more →](/guides/ticketing/move-tickets)
## AI feedback
Your feedback is crucial for improving our AI agents, and now it's easier than ever to provide it. We've integrated feedback mechanisms across the platform to help us refine our models and make our AI more helpful for everyone.
### Where to provide feedback
* **AI copilot**: Give a thumbs up or down on AI-generated responses.
* **L1 agent responses**: Rate the quality of automated L1 messages.
* **AI logs**: Provide feedback on specific actions taken by AI agents in the ticket timeline.
* **Web chat**: Rate the AI's performance after a ticket is created via web chat.
[Learn more →](/guides/ai-agents/feedback)
# ⚡ July 30, 2025
Source: https://docs.thena.ai/changelog/july-30-2025
Salesforce integration, collapse email threads new workflow triggers.
## Salesforce integration
Connect Thena with Salesforce to synchronize accounts and contacts seamlessly. Our new integration enables data flow between your CRM and Thena, keeping customer information up-to-date across both systems.
### Key features
* **Account synchronization**: Sync Salesforce accounts with custom field selection and advanced filtering options.
* **Contact synchronization**: Automatically sync contacts with predefined standard fields for consistent data mapping.
* **Advanced filtering**: Use multiple filter operators to control which records are synchronized.
* **Activity monitoring**: Track sync operations with real-time status updates and detailed audit logs.
* **Flexible scheduling**: Configure sync frequency from 4 to 24 hours with manual sync triggers.
[Learn more →](/platform/apps/salesforce)
## Collapse email threads
Keep your kanban view clean and organized by collapsing email threads. This new feature helps reduce visual clutter while maintaining full access to conversation history when needed.
### Key features
* **Clean kanban view**: Show only the main message in the kanban board to reduce clutter.
* **Expandable threads**: Click to expand and see the full conversation history when needed.
* **Context preservation**: Maintain all context and conversation data while keeping the interface clean.
* **Improved focus**: Help teams concentrate on what matters most without getting overwhelmed by thread noise.
[Learn more →](/guides/sources/email)
## New workflow triggers added
We've significantly expanded our workflow trigger library to give you more granular control over automation. These new triggers enable you to build sophisticated workflows that respond to specific changes in tickets, accounts, contacts, and customer satisfaction surveys.
### Ticket triggers
* **Custom field values changed**: Trigger when any custom field value is modified
* **Custom field added**: Trigger when a new custom field is added to a ticket
* **Custom field value removed**: Trigger when a custom field value is cleared
* **Type changed**: Trigger when ticket type is updated
* **Assignee changed**: Trigger when ticket assignment changes
* **Status changed**: Trigger when ticket status is modified
* **Priority changed**: Trigger when ticket priority is updated
* **Sentiment changed**: Trigger when AI-detected sentiment changes
### CSAT triggers
* **Ticket CSAT sent**: Trigger when a CSAT survey is sent to a customer
* **Ticket CSAT received**: Trigger when a customer completes a CSAT survey
### Account triggers
* **Health changed**: Trigger when account health status is updated
* **Status changed**: Trigger when account status is modified
* **Classification changed**: Trigger when account classification is updated
* **Industry changed**: Trigger when account industry is changed
* **Custom field changed**: Trigger when any account custom field is modified
* **Custom field added**: Trigger when a new custom field is added to an account
* **Custom field removed**: Trigger when an account custom field is removed
### Customer contact triggers
* **Custom field changed**: Trigger when any contact custom field is modified
* **Custom field added**: Trigger when a new custom field is added to a contact
* **Custom field removed**: Trigger when a contact custom field is removed
* **Contact type updated**: Trigger when contact type is changed
[Learn more →](/guides/ticketing/workflows)
# 🤖 June 10, 2025
Source: https://docs.thena.ai/changelog/june-10-2025
AI Web chat
## AI web chat
We're excited to announce the release of our new Web chat feature, an AI-native support experience that can be embedded into any website or web app. This powerful tool empowers your users to engage instantly with an AI agent who can respond using your uploaded documentation, and if needed, gracefully hand off to a human agent by creating a support ticket.
### Key features
* **Instant AI-powered responses** using your own documentation
* **Seamless handoff** to human agents when needed
* **Fully customizable appearance** to match your brand
* **Easy deployment** with a simple JavaScript snippet
### How to enable Web chat
1. Go to Organization > Click Sources
2. Enable Web chat > Select team
3. Once you are in Team settings > Configure how you want Web chat to look like
4. Once that is done, just Copy the script and deploy it in your End of `` tag
[Learn more about Web chat](/guides/sources/web-chat)
# 🔗 June 17, 2025
Source: https://docs.thena.ai/changelog/june-17-2025
Related tickets
## Related tickets
We're excited to announce our new Related tickets feature, designed to help support teams connect conversations across departments, issues, and time zones. This powerful addition allows you to link tickets together, creating a complete picture of complex customer issues that span multiple teams or require cross-functional collaboration.
### Key features
* **Connect related conversations** across different teams and departments
* **Link tickets bidirectionally** for complete context awareness
* **Add context notes** to explain relationships between tickets
* **Track resolution progress** across all connected issues
* **Navigate seamlessly** between related tickets
### How to use Related tickets
1. Open any ticket in your workspace
2. Click the "Related tickets" button in the ticket sidebar
3. Search for and select tickets you want to connect
4. Add an optional note explaining the relationship
5. Save to create the connection
[Learn more about Related tickets](/guides/ticketing/related-tickets)
# null
Source: https://docs.thena.ai/changelog/june-25-2025
## AI logs
We're excited to announce our new AI logs tab, a dedicated view inside each ticket that captures every action taken or attempted by AI agents. This powerful addition provides a transparent audit trail of automated activity, ensuring full visibility into how AI contributes to ticket handling.
### What gets logged
* **Status changes**: When the AI updates ticket status
* **Fallbacks to human agents**: When AI defers due to policy constraints or confidence issues
* **Custom field updates**: Setting fields like "Issue category" or product tags
* **Ticket associations**: Linking related tickets for context
* **Summaries and notes**: AI-generated internal notes or conversation summaries
Each entry includes who (or what) acted, when it happened, and often, why—via the Show reasoning link that reveals the AI's internal decision path.
For more detailed information, check out our [AI logs guide](/guides/ticketing/ai-logs).
# 💬 June 3, 2025
Source: https://docs.thena.ai/changelog/june-3-2025
Introducing Auto-responder: Advanced multi-channel response automation.
## Major update: Introducing Auto-responder
The auto-responder is the most advanced multi-channel response automation built for modern support teams. It gives you precise control over when, how, and where customers receive automatic replies—whether during holidays, after hours, or when assigned agents are unavailable.
[Learn more →](/guides/ticketing/auto-responder)
## Key features:
* **Multi-channel support**: Automatically replies on the original channel—Slack, MS Teams, or email—maintaining a consistent experience.
* **Flexible triggers**: Responds to new tickets or incoming messages on existing tickets.
* **Intelligent conditions**: Rules can be triggered during holidays, outside business hours, or when agents are unavailable.
* **Advanced filtering**: Target responses based on ticket properties, tags, or customer information.
* **Branded messaging**: Messages are sent by a bot named after your organization with its logo.
* **Rich text formatting**: Create professional responses with bold, italics, and lists for better readability.
Auto-responders help set proper expectations with customers while reducing follow-up inquiries and improving overall satisfaction.
## Example use cases:
* **Holiday notifications**: Inform customers when your team is away for holidays.
* **After-hours communication**: Let customers know when they can expect a response during business hours.
* **Plan-based response times**: Set expectations based on customer account plan levels.
* **Ticket acknowledgments**: Confirm receipt of new support requests automatically.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
# ⭐ June 9, 2025
Source: https://docs.thena.ai/changelog/june-9-2025
Customer satisfaction surveys
## CSAT
We're excited to announce the release of our new Customer Satisfaction (CSAT) feature, designed to help you gather valuable feedback from your customers after ticket resolution.
Automated CSAT surveys delivered via Slack or email
Customizable survey appearance and content
Advanced filtering rules to target specific tickets
Sampling options to prevent survey fatigue
Detailed analytics to track customer satisfaction trends
### How it works
CSAT surveys are automatically sent to customers after ticket resolution based on your configured rules. Customers can rate their satisfaction and provide optional comments, giving you valuable insights into your support quality.
### Getting started
To start using CSAT surveys:
1. Navigate to **Settings > Ticketing > CSAT**
2. Enable CSAT surveys
3. Configure your delivery settings, filters, and survey appearance
4. Start collecting valuable customer feedback!
Check out our [comprehensive CSAT guide](/guides/ticketing/csat) for detailed setup instructions and best practices.
### Additional improvements
* Enhanced CSAT analytics dashboard
* Integration with existing reporting tools
* Customizable cooldown periods to prevent survey fatigue
* Email override option for consistent delivery method
# ⚡ May 1, 2025
Source: https://docs.thena.ai/changelog/may-1-2025
Advanced APIs release and enhanced Kanban board with row pivoting.
## Major update: Advanced APIs release
We're excited to announce the release of our comprehensive API suite, organized into three main sections to serve distinct purposes in the Thena ecosystem:
* **Platform APIs**: Core infrastructure services including authentication, SLA management, workflow orchestration, ticketing, accounts, teams, tags, forms, comments, and more.
* **App Platform APIs**: Create, manage, and distribute custom applications within the Thena ecosystem. Includes app creation, installation, uninstallation, and webhook handling.
* **Workflows APIs**: Automate business processes and orchestrate workflows across the Thena platform. Includes workflow creation, execution, event handling, and activity/task management.
All APIs require authentication using an **x-api-key** header. API keys can be generated from **Dashboard → Organization Settings → Security and Access**.
[Explore the API reference →](https://docs.thena.ai/api-reference/introduction)
## Other updates:
* **Enhanced developer documentation**: Added comprehensive guides, tutorials, and code samples to help developers get started with our APIs.
* **API Explorer tool**: Launched an interactive API testing tool that allows developers to experiment with API calls directly from the documentation.
* **Client libraries**: Released official client libraries for JavaScript, Python, and Ruby to simplify API integration.
* **Webhook improvements**: Enhanced webhook delivery with retry logic and detailed delivery logs.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
Remember to check our rate limits and implement appropriate error handling in your applications when using our new APIs. For production deployments, consider implementing retry logic with exponential backoff.
# 🔗 May 10, 2025
Source: https://docs.thena.ai/changelog/may-10-2025
Introducing internal threads and emoji actions for faster team collaboration.
## Major update: Internal threads for team collaboration
Internal threads in Thena give your team a focused space to collaborate on a customer ticket without disrupting the external conversation. You can keep it fully internal or optionally link it to a Slack channel for real-time collaboration.
* **Private team discussions**: Create internal conversations that are only visible to your team—customers never see them.
* **Slack integration**: Connect threads to Slack channels for real-time collaboration with bi-directional sync.
* **Rich media support**: Share files, images, and formatted text directly in threads.
* **Multiple threads per ticket**: Create separate threads for different aspects of a ticket.
Internal threads help teams collaborate efficiently across departments, share knowledge, coordinate escalations, and document important decisions—all without cluttering customer-facing communications.
[Learn more →](https://docs.thena.ai/guides/ticketing/internal-threads)
## Update: Emoji actions for faster workflows
Emoji actions allow your team to perform common ticket operations with a simple emoji reaction, saving time and streamlining your workflow.
* **One-click operations**: Add specific emoji reactions to trigger actions automatically.
* **Default actions**: Use built-in emoji shortcuts for changing ticket status with a simple reaction.
* **Customizable workflows**: Create your own emoji actions with custom triggers and operations.
[Learn more →](https://docs.thena.ai/guides/ticketing/emoji-actions)
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
Both internal threads and emoji actions integrate directly with Slack, allowing your team to collaborate efficiently regardless of which platform they prefer to use.
# 🤖 May 22, 2025
Source: https://docs.thena.ai/changelog/may-22-2025
Introducing Thena MCP server for AI model integration.
## Major update: Introducing Thena MCP server
Your AI models and agents can now access your Thena data in a simple and secure way through our official MCP server. This integration follows the authenticated remote [MCP spec](https://modelcontextprotocol.io/specification/2025-03-26), enabling seamless connection between AI assistants and your Thena platform data.
* **Native AI assistant integration**: Connect directly as a new integration in Claude and other AI assistants.
* **Code editor support**: Works with Cursor, Windsurf, Zed, and other clients using the [mcp-remote](https://github.com/geelen/mcp-remote) module.
* **Secure OAuth authentication**: Organization-level authentication ensures your data remains secure.
* **Comprehensive tool suite**: Access and manage tickets, teams, accounts, and customer contacts.
[Learn more →](https://docs.thena.ai/api-reference/thena-mcp-server)
## Integration highlights:
* **Tickets management**: Create, update, and search tickets directly from your AI assistant.
* **Team operations**: Manage team settings and assignments without switching contexts.
* **Account management**: Retrieve account information and activities for better customer context.
* **Contact management**: Access customer contact information to personalize interactions.
*The new Thena is currently in beta, with access limited to select customers. If you're an existing customer interested in exploring the new platform, please request beta access. General availability release is coming soon.*
The MCP server integration enables AI assistants to become true members of your support team, with access to the same data and tools as human agents.
# 📢 September 4, 2025
Source: https://docs.thena.ai/changelog/september-4-2025
Broadcast campaigns to communicate with customers across email and Slack channels with comprehensive analytics and audience management.
## Broadcasts
Create and manage broadcast campaigns to communicate with your customers simultaneously across multiple channels. Whether you're announcing new features, sharing important updates, or conducting surveys, broadcasts help you reach your entire customer base efficiently and consistently.
### Key features
* **Multi-channel delivery**: Send messages simultaneously via email and Slack with content optimized for each channel.
* **Smart audience targeting**: Create static lists for specific contacts or dynamic audiences that automatically update based on filter criteria.
* **Rich content editor**: Compose engaging messages with text formatting, links, images, code blocks, and pre-built templates for common scenarios.
* **Flexible scheduling**: Send broadcasts immediately or schedule them for future delivery with timezone-aware timing.
* **Comprehensive analytics**: Track opens, clicks, views, reactions, and delivery success with detailed performance metrics and recall functionality for Slack messages.
* **Template library**: Speed up broadcast creation with pre-built templates for product releases, system outages, company updates, and feature announcements.
[Learn more →](/guides/broadcasts/overview)
# Account fields
Source: https://docs.thena.ai/guides/accounts/account-fields
Structure what matters. Automate what follows.
## Overview
Account fields in Thena give you a powerful way to structure, organize, and personalize your account-level data. From customer health to business classification, these fields act as the foundational layer for smarter workflows, personalized automation, and AI-assisted insights.
There are two types of fields available:
* Standard fields: Built-in, foundational fields that apply to all accounts
* Custom fields: Fully configurable fields you can create to fit your business logic
Whether you're segmenting accounts by region, revenue, lifecycle, or implementation status—Thena gives you full control.
## Standard fields
These fields are preconfigured and come with built-in default values. You can use them right away, no setup required.
🔮Status
Trial, Active, Churned, Acquired, Alpha, Prospect
📚Classification
Mid market, SMB, Strategic, Enterprise
🔋Health
Yellow, Green, Red
📊Industry
Finance, Healthcare, Retail, Technology
## Non-editable standard fields
While you can fully customize certain fields like Status, Classification, Health, and Industry, Thena also provides a set of non-editable standard fields to power core platform capabilities and integrations.
ID, Name, Description, Logo
Source, Primary domain, Secondary domain
Annual revenue, Employees count, Website
Billing address, Shipping address
Created at, Updated at
These fields are preconfigured with specific data types (e.g., text, date, currency, integer) and are crucial for automation, API mapping, data syncs, and reporting. While you can't edit their structure or add icons/colors to them, they are foundational to account-level insights and operations across Thena.
They work similarly to contact fields like Email, Phone number, or Is active—ensuring consistency, reliability, and system-level intelligence.
## Custom fields
Need to track something unique customized to your process? Create a custom field in seconds:
Single line, Multi line, Rich text
Integer, Decimal, Currency
Date, Date & time, Time
Single choice, Multi choice, Radio buttons, Checkboxes
File upload, Email, Phone number, URL, Address, Rating, Coordinates, IP address, Regex, Password
Calculated, Lookup, Toggle / Boolean
With this range of field types, your team can model customer data however it's needed—no engineering work required.
## Connect accounts and tickets via workflows and AI
Thena account fields aren't static—they're deeply integrated into the platform's automation and intelligence engine:
* Use field values to trigger workflows (e.g., route escalations if Health = Red)
* Power AI agent decisions based on fields like Industry or Status
* Enrich tickets with account-level context in real-time
* Personalize outbound comms based on field data (e.g., Classification = Strategic)
## Use cases
Automatically trigger CSM check-ins for Churned or Red health accounts
Add a custom field for CRM Sync Status to manage integrations
Track renewal risk with a checkbox or status field
Segment outreach or SLAs based on Annual revenue or Employees count
Store onboarding stage with a multi-choice custom field
## Summary
Account fields in Thena bring order to your data and intelligence to your workflows. With rich customization, native integrations, and AI-ready design, they become a critical layer for driving action and alignment across the customer journey.
# Accounts view
Source: https://docs.thena.ai/guides/accounts/accounts-view
Real-time account updates. Zero clutter.
All your customer accounts, finally in one intelligent place.
## Overview
The accounts view in Thena is the single source of truth for managing all your customer
accounts—automatically created from your team's real-world interactions across Slack,
email, API, and other integrated systems.
It transforms scattered customer conversations into structured records, giving go-to-
market teams full visibility and control without switching tools. Whether you're in
customer success, support, solutions, or product, the accounts view brings context and
collaboration into sharp focus.
## Key features
### Unified accounts table
At the core of the accounts view is a powerful, spreadsheet-like table that displays every
account your team is engaging with. This is where customer data lives, breathes, and
stays fresh.
View every account across your organization in one place
* See high-level attributes like status, health, industry, classification, and more
* Sort, filter, and customize the table layout based on what's relevant to your workflow
* Edit both standard and custom fields directly in the table—no need to dig through
forms or click into separate tools
* This isn't your typical CRM view. It's collaborative, real-time, and fully in tune with
the pace of your business.
### Automated account creation
No more manual data entry or stitching systems together. Thena automatically creates
accounts based on your actual customer interactions. That includes:
* Slack channels with external customers
* Emails with unique customer domains
* API or CRM integrations with your internal systems
This ensures your accounts are always up to date with zero overhead. If your team is
talking to a customer, they're already in the system. Simple as that.
### Account detail view
Clicking on any row in the accounts table opens the account detail view—a rich, context-
packed sidebar that shows everything happening with that account, across teams.
You'll see:
* All tickets (open, in progress, on hold, etc.) linked to that account, across
departments
* Contacts and stakeholders tied to the account
* Notes, tasks, and activity logs that help teams stay aligned
* Account metadata like domain, billing address, classification, source, and health
status
This creates a full 360° view of the customer, so teams can act fast and stay informed.
Whether it's a renewal, an upsell, or a support escalation, you'll have the full picture
before making a move.
### Why it matters
Thena's accounts view isn't just a database—it's a live operating system for your
customer-facing teams. It gives you:
A structured record of every customer engagement in one place
Complete insight into account health, activity, and ownership
Scale personalized customer management without increasing headcount
A bridge between teams—no more information stuck in silos
With accounts view, everyone on your team—from support to sales—can operate from
the same playbook. It's the foundation for more intelligent, responsive, and customer-
centric operations.
## Use cases
Track account health and intervene before issues escalate with real-time visibility
Prioritize tickets based on strategic account classification and importance
Manage onboarding and implementation workflows in one centralized place
Monitor key accounts and quickly get up to speed for QBRs or executive calls
If your customer journey starts on Slack, lives in email, and sprawls across platforms, Thena brings it all back home.
# Activity
Source: https://docs.thena.ai/guides/accounts/activity
Calls. Meetings. Logged, not lost.
## Overview
The Activities feature in Thena lets your team log key customer interactions—calls, meetings, site visits, emails—right inside the account. It acts as a real-time activity timeline, giving everyone in the org visibility into how, when, and why a customer was engaged.
And the best part? Activities can be added manually, through APIs, workflows, or even your AI agents. No lost calls. No forgotten meetings. Just rich interaction data—exactly where it belongs.
## Key features
### Log real-world interactions
From onboarding meetings to check-in calls and site visits, you can log:
* 📞 Calls
* 👥 Meetings
* 📧 Emails
* 📍 Site visits
* And more, through custom activity types
Capture time, duration, participants, location, and description—all directly within the account view.
### Multiple ways to feed in activities
* 💻 API-based ingestion
Use Thena's APIs to log activities from any external system—CRM, calendar, call platform, or your own product.
* ⚙️ Workflow automation
Trigger activity logging through workflows based on actions like:
* A ticket status change
* A completed task
* A Slack message or email received
* 🤖 AI-powered capture
Your AI agents can automatically log key activities from customer interactions in Slack or email—turning conversations into structured insights without lifting a finger.
### Configurable attributes for activities
Each activity is classified using two system-level attributes:
* Activity type (e.g., Call, Meeting, Site Visit, Email)
* Activity status (e.g., Pending, Completed, Cancelled)
You can add, edit, or delete values, assign custom icons, and use them for filtering, reporting, and automations.
### Smart visibility and context
* View all activities in a single, filterable timeline
* Use activity metadata to drive workflows, reminders, and insights
* Link key engagements to upcoming renewals, onboarding milestones, or red-flag escalations
Activities make your accounts not just data-rich—but engagement-aware.
## Use cases
Log a solutions engineer's onsite visit with implementation details
Capture pre-renewal calls with success teams and key outcomes
Record sales-to-CS handoff meetings to ensure smooth transitions
Automatically log an activity when a support ticket is escalated
Track every engagement leading up to a QBR or executive sync
## Summary
Activities under accounts ensure no touchpoint goes untracked. With flexible logging methods, customizable attributes, and automation-friendly design, this isn't just a timeline—it's a live, actionable engagement history that drives better decisions, faster handoffs, and stronger relationships.
With Thena, your team no longer asks "when did we last speak with this account?"—they already know.
# Contact fields
Source: https://docs.thena.ai/guides/accounts/contact-fields
Structure and personalize your contact data.
## Overview
Contact fields allow you to structure, enrich, and extend information about individual contacts in your workspace. While Account fields operate at the organization level, Contact fields give you control at the person level—ideal for segmentation, personalization, and automation.
## Standard fields
Thena provides one editable standard field for contacts:
Primary, Billing, Legal, Executive, Other
You can edit the values of the Type field, assign icons, and apply colors to visually differentiate contact types. Whether you're tagging a VP, billing coordinator, or legal signatory—this helps ensure clarity and precision.
Other standard contact fields—like Email, Phone Number, Is Active, etc.—come built-in and are non-editable. These fields power core functionality and integrations within Thena.
## Custom fields
For everything else, Thena lets you define your own custom fields. You can choose from a wide variety of data types:
Single line, Multi line, Rich text
Integer, Decimal, Currency
Date, Date & time, Time
Single choice, Multi choice, Radio buttons, Checkboxes
File upload, Email, Phone number, URL, Address, Rating, Coordinates, IP address, Regex, Password
Calculated, Lookup, Toggle / Boolean
## Powered by automation and AI
You can use contact fields in:
* Workflows to trigger automations (e.g. auto-assign contacts based on type)
* AI agents to customize engagement based on rich contact metadata
## Why it matters
Contact fields make your customer data smarter. With structured attributes at your fingertips, you can slice and dice your contact base, personalize outreach, route tickets intelligently, and build automations that feel human.
# Notes
Source: https://docs.thena.ai/guides/accounts/notes
Collaborative notes. Context stays close.
## Overview
The notes feature in Thena lets you capture key insights, updates, or customer-specific actions directly under an account. Whether it's internal prep for a QBR, strategic decisions from a support call, or reminders from onboarding—notes bring critical context into the account timeline.
With flexible privacy settings, editable note types, and multi-user collaboration, notes are more than comments—they're structured knowledge assets.
## Key features
### Create and assign notes
* Add a note directly from the account view
* Assign it to a specific teammate or leave it unassigned
* Great for ownership handoffs, strategic plans, and account prep
* Works across GTM teams (support, success, product, solutions)
### Make it public or private
Notes can be toggled between:
* Public (visible to everyone with access to the account)
* Private (visible only to the note creator and assigned users)
This gives you control over sensitive information, while keeping the broader context open when needed.
### Editable note types
Thena includes a built-in note type attribute. Default value is General, but you can:
* Add custom note types (e.g., QBR prep, onboarding, legal, roadmap)
* Edit or delete existing ones
* Use icons and color-coding for quick visual context
Note types help teams organize and search notes more effectively.
### Threaded replies for collaboration
Notes aren't static—they're collaborative.
* Anyone with access can reply to a note, creating a mini-thread
* Perfect for async follow-ups, clarifications, or tagging in teammates
Keeps all discussion in one place, linked to the right customer.
### Automate note creation via workflows or AI agents
Notes can also be:
* ✨ Automatically created by AI agents (e.g., summary from a support thread)
* 🔄 Triggered through workflows based on ticket events, customer behavior, or task completion
This means notes don't just capture what already happened—they can proactively drive your process forward.
## Use cases
Summarize customer conversations or meeting outcomes with context
Prep and assign follow-up items before quarterly business reviews
Leave strategic notes on renewals or escalations for team alignment
Add onboarding notes from solutions engineers to track implementation
Auto-generate notes from AI agents summarizing Slack/email activity
## Summary
Notes under accounts give teams a structured way to capture, organize, and act on insights. With support for privacy, ownership, collaboration, and automation—Thena turns notes into a living layer of customer intelligence.
It's your team's shared memory, built into every account.
# Tasks
Source: https://docs.thena.ai/guides/accounts/tasks
Actionable tasks. Account context maintained.
## Overview
Tasks in Thena allow customer-facing teams to manage ongoing actions directly from each account. Whether you're setting up onboarding milestones, following up on escalations, or coordinating implementation timelines, tasks help you stay on top of what needs to happen—right from the account view.
No separate tools. No disconnected workflows. Just everything in context.
## Key features
### Account-level task management
Tasks live within each account, giving you:
* A clear view of pending actions per customer
* Visibility across tickets, notes, and tasks in a single pane
* Cross-team collaboration without the back-and-forth
Perfect for customer success, solutions, onboarding, and account management teams.
### Two powerful task attributes
Thena supports two attributes for tasks by default:
#### Task type
Helps categorize the nature of the task. Default values include:
* 👁️ Review
* ✏️ Custom
* ✅ Approval
* 💬 Follow up
You can add, remove, or rename task types as needed—and assign custom icons to each for visual clarity.
#### Task status
Tracks the progress of each task. Default statuses include:
* ❌ Cancelled
* 🔄 In progress
* ✅ Completed
* ⏳ Pending
Admins can fully customize these values—change labels, assign icons, and tailor status flows to fit your team's process.
### Fully customizable with icons and color coding
Every task type and status value can be:
* Assigned a unique icon
* Color-coded for quick recognition
* Modified or deleted based on your evolving workflow
* This gives you a rich, intuitive visual system without overcomplicating setup.
### Filter, automate, and notify
Tasks aren't just static checklists—they're dynamic entities that power automation and visibility:
* Filter tasks by type or status inside the account
* Trigger workflows (e.g., reminders, escalations, handoffs)
* Notify team members based on task conditions or updates
* Set ownership, due dates, and priorities
* Tasks become an operational layer that scales with your team.
## Use cases
Track implementation steps during customer onboarding to ensure smooth adoption
Assign and track action items from quarterly business reviews
Review ticket patterns across strategic accounts to identify trends
Manage custom solutions or integration timelines with clear ownership
Create pre-renewal checklists to reduce churn and increase expansion
## Summary
Tasks in Thena make account-level execution simple, structured, and scalable. With flexible attributes, icon support, and workflow integration, they bring clarity to customer operations and make sure nothing slips through the cracks.
It's more than task tracking—it's intelligent execution, embedded directly in your customer workflow.
# AI chat threads
Source: https://docs.thena.ai/guides/ai-agents/ai-chat-threads
View and manage all AI-powered web-chat conversations across your organization in one centralized interface.
AI chat threads provide a unified view of all AI-powered web-chat conversations happening across your organization. This centralized interface allows you to monitor, analyze, and manage every AI interaction with customers, giving you complete visibility into your automated support operations.
## What are AI chat threads?
AI chat threads are real-time conversations between your AI agents and customers through web chat widgets. Unlike traditional support tickets, these conversations happen in a conversational flow where the AI can provide instant responses, escalate to human agents when needed, and seamlessly convert to tickets for complex issues.
## Key features
### Organization-wide visibility
View all AI chat conversations across every agent and team in your organization from a single interface. No need to switch between different agent dashboards—everything is centralized for easy monitoring.
### Advanced filters and search
Sort conversations by newest or oldest first to prioritize your review.
View conversations with positive, negative, or any team feedback.
Filter by conversations that have been converted to tickets or remain as chat-only.
Search across conversation content, customer names, and thread titles.
Find conversations by customer name or email address for specific user interactions.
Find conversations about specific topics or issues.
### Ticket integration
When AI conversations need human intervention, they can be automatically converted to support tickets. The interface shows:
* **Ticket badges**: Clear indicators when conversations have associated tickets
* **Direct navigation**: One-click access to view the full ticket in the platform
* **Conversion tracking**: Visual banners showing when and how conversations became tickets
### Feedback monitoring
Monitor thumbs-up/down feedback and detailed comments from your team reviewing AI conversations.
Use feedback data to improve AI performance and identify training opportunities for Thena's fine-tuning.
The feedback system helps Thena continuously improve the web chat widget. When your team reviews conversations and provides feedback:
* **Positive feedback** helps identify what's working well and should be maintained
* **Negative feedback** highlights areas where the AI needs improvement
* **Detailed comments** provide specific context for fine-tuning responses
This feedback is sent to us to fine-tune AI response quality, improve conversation flow, enhance user experience, and address common pain points.
### Real-time message viewing
When you select a conversation thread, you can:
View the complete conversation history in chronological order
See customer information including name, email, and verification status
Monitor AI agent responses
Track message attachments and file uploads
Provide feedback on AI responses
## Understanding the interface
The left side shows all conversations with key information at a glance:
Customer avatar and name (or "Anonymous user" for unidentified visitors)
Conversation title automatically generated from the discussion topic
Timestamp showing when the conversation was last updated
Ticket badges for conversations that have been converted to support tickets
Verification status for customers who have been identified
When you select a thread, the right panel displays:
Customer header with name, email, and total message count
Message history with proper formatting for text, code, and links
Attachment previews for files and images shared during the conversation
Feedback indicators showing team feedback on AI responses for improvement
## Use cases
Review AI responses to ensure they meet your quality standards and brand voice.
Check AI chat threads daily to stay aware of customer sentiment and common issues.
Use team feedback to identify areas where your AI agents need improvement or additional training for Thena's fine-tuning.
Use conversation patterns to identify knowledge gaps and improve AI training.
Track AI effectiveness through resolution rates and team feedback scores for continuous improvement.
Monitor which conversations convert to tickets to understand when AI reaches its limits.
# Executions
Source: https://docs.thena.ai/guides/ai-agents/executions
Track your AI agent's activity flow by flow.
The Executions page gives you full visibility into your AI agent's activity—flow by flow.
This is where you can track exactly how your agents are operating, what they're doing, and why.
## What you can see
Execution details
Each execution log provides:
Flow name – Which flow was triggered (e.g. L1 Deflection, Title Generation).
Trigger source – What caused the flow to run (e.g. new ticket, workflow condition met).
Input value – The actual content, message, or field that triggered the flow.
Output value – What the agent generated as a result (summary, title, status update, etc.).
Execution time – When the flow was triggered.
## Why it matters
Review what your AI is doing in real time.
Debug or refine prompts and workflows.
Improve quality by analyzing outputs at scale.
Maintain transparency and governance around automation.
## Workflow integration
Connected views
Executions that are triggered via workflows will also appear in the Workflow Execution History—giving you visibility from both the agent and workflow lenses.
# Feedback
Source: https://docs.thena.ai/guides/ai-agents/feedback
Help us improve our AI by providing feedback on its actions.
Your feedback is crucial for improving the performance and accuracy of our AI agents. By telling us what works and what doesn't, you help us refine our models and make our AI more helpful for everyone.
## Where to provide feedback
We've integrated feedback mechanisms across all the places where you interact with our AI.
When the AI copilot provides a response, you can give a thumbs up or thumbs down to indicate its usefulness.
For L1 agent responses, hover over the message to see feedback buttons and rate the response.
Inside the ticket window, you can view AI logs and provide feedback on specific actions taken by the agent.
After a ticket is created via web chat, you can provide feedback on whether and when it should have been created.
When you provide a thumbs up or thumbs down, you can also include a reason for your feedback. This additional context helps us understand what worked well or what went wrong, giving us clear direction for improvement.
You can update your feedback at any time, as many times as needed.
## How we use your feedback
We take your feedback seriously. Here's what happens when you submit it:
**Capture and store:** Your feedback is stored along with the context of the AI's action. This includes the input it received and the output it generated.
**Review and analyze:** Our team periodically reviews the feedback to identify patterns and areas for improvement.
**Iterate and improve:** Your insights directly influence the development of our AI, helping us make it smarter and more effective over time.
# Flows
Source: https://docs.thena.ai/guides/ai-agents/flows
The core building blocks of AI agents in Thena.
Flows are the core building blocks of every AI agent in Thena. Each flow defines a specific task the agent can perform—from generating titles to deflecting tickets—with full control, customization, and observability.
## What are flows?
* Each AI agent can have **multiple flows**, representing different capabilities
* Every flow is defined by a **prompt** — the instructions that guide how the agent performs the task
* Flows are tied to **workflows** — you decide when and where they run using triggers and filters
* They are powered by **native LLMs** with support for additional knowledge via uploaded files or external links
* All flows use the **agent's tone, language, and personality** settings to ensure brand alignment
## Prompt-driven intelligence
Every flow has a prompt that acts as its instruction manual. You can customize these prompts to:
* Define the agent's behavior
* Control the structure and tone of the output
* Add constraints or formatting rules
This allows teams to fine-tune flows for different products, teams, or customer segments.
## Knowledge + LLM
Flows are powered by a built-in large language model (LLM), but that's just the start. You can enhance flows by uploading:
* Files (PDF, TXT, CSV, DOCX)
* URLs (documentation, internal help, knowledge base)
This gives every flow access to the right information, making its output more accurate and contextual.
Learn more about how to enhance your agents with domain-specific information in the [Knowledge](/guides/ai-agents/knowledge) guide.
## Workflow-based execution
Flows are not always-on. You control when and where a flow is triggered using Thena Workflows. This gives you:
* Granular control based on fields like priority, channel, tags, sentiment, assignee, and more
* The ability to scope flows to specific accounts or segments (e.g., "only for commercial tickets on email")
* Smart automation that blends AI with your business logic
## Execution logs & observability
Every time a flow is triggered, Thena logs:
* When it ran
* What triggered it
* Which input it used
* What output it generated
You can track these executions both from the **Agent panel** and the **Workflow execution view**.
This gives you full visibility into how your agents operate—and confidence that your automation is working as expected.
For a detailed view of execution history and analytics, check out the [Executions](/guides/ai-agents/executions) guide.
# Knowledge
Source: https://docs.thena.ai/guides/ai-agents/knowledge
Train AI agents with your company's unique knowledge.
Every AI agent in Thena can be trained on your company's unique knowledge. This gives your agent context, accuracy, and the ability to speak with authority—whether responding to customers or assisting internal teams.
## AI agent capabilities
Memory
Maintains account-level memory, allowing the agent to recall aggregate account history and context across multiple conversations.
Entitlements
The agent has its own authorizations across services it has access to, allowing for more granular control on the actions that the agent can take.
Knowledge retrieval
Implements standard RAG (Retrieval-Augmented Generation) to access company knowledge, with capabilities to scrape URLs and upload files for comprehensive information access.
Multi-channel deployments
Currently available as a web deployment, with upcoming support for Slack and additional communication channels (Phone, Discord etc).
## Agent knowledge sources
Your agent learns from two primary types of content:
Files
You can upload documents directly to your agent's knowledge hub. Supported file types include:
PDFs
DOCX (Word)
File upload limits:
Max size: 100MB per file.
Files are processed instantly and made available to the agent in real time.
The agent will begin using this content immediately in relevant flows like L1 deflection, summarization, or internal queries.
URLs
Provide public URLs to web pages and documentation sites. When a URL is added, the agent will:
Scan the primary page
Automatically crawl and index all publicly linked sub-pages
Continuously stream and refresh that content in the background
Only public URLs are supported. Pages requiring authentication or login will be skipped.
## What the agent uses
Knowledge capabilities
Once sources are added, the agent can:
Access the full content of uploaded documents
Read and reference all linked public pages under each URL
Use this information to answer questions, deflect tickets, summarize threads, or inform other flows
You can view, manage, or remove knowledge sources at any time.
## Why it matters
Benefits
Giving your agent access to the right knowledge:
Increases the accuracy and relevance of responses
Ensures consistency with your brand and documentation
Powers smarter AI flows with richer context
With just a few uploads or links, you turn your agent into a true expert on your business.
Knowledge fuels intelligence. And your agent gets smarter with every file and link you add.
# Recruitment
Source: https://docs.thena.ai/guides/ai-agents/recruitment
Your AI team, on your terms.
In Thena, you can recruit AI agents that are operational from day one—ready to take on real work with enterprise-level control. These agents aren't generic chatbots; they're smart, brand-aligned digital teammates trained on your knowledge and configured for your workflows.
## Built for control and customization
Pick and enable flows relevant to your team's needs.
Upload documentation, guides, and structured knowledge into a dedicated knowledge hub.
Control exactly where and when agents act using conditions in workflows (e.g., only for commercial accounts or Slack-only tickets).
Fine-tune how they respond with customized prompts per flow.
Grant agents selective access to tools and platforms they need to operate.
## Meet Jamie
Jamie is our first AI agent—built for frontline ticket workflows. He's capable of:
Automatically resolves low-complexity tickets based on existing knowledge.
Use case:
Deflect common "how-to" or informational queries for specific customer segments via email channel only. You maintain full control over which audiences this applies to.
Workflow condition:
If account = commercial and source = email → Enable Jamie's L1 deflection
Generates concise, useful titles based on the ticket conversation.
Use case:
Enable title generation only for Slack channels tagged with #product-feedback. Keeps inbound feedback organized and readable for PMs.
Workflow condition:
If source = Slack and tag = product feedback → Enable AI title generation
Jamie reads entire conversations and generates quick summaries.
Use case:
Activate summaries only when tickets are escalated to Tier 2. Helps senior agents get up to speed fast.
Workflow condition:
If group = Tier 2 → Enable ticket summarization
Jamie detects context and automatically updates ticket statuses (e.g., to "Waiting on customer").
Use case:
Enable for customer-facing tickets to automatically reflect engagement status and improve SLA tracking. Jamie can shift statuses based on intent and replies.
Workflow condition:
If type = customer support → Enable status update flow
## The flow-to-workflow bridge
Each agent flow can be linked to Thena workflows, giving you granular control.
You can control:
When it activates
For which accounts or channels
Under what priority, sentiment, or other conditions
This means agents don't just act—they act intelligently within the bounds you define.
# Pricing plans
Source: https://docs.thena.ai/guides/billing/pricing
Comprehensive overview of Thena pricing plans, features, and capabilities for every team size.
Thena offers flexible pricing plans designed to scale with your team—from startups to enterprise organizations. Every plan includes AI capabilities as the baseline, ensuring you get intelligent customer support features regardless of your tier.
## ✨ Starter plan
**Perfect for getting started with human-only support**
* **Price**: \$29/user/month
* **User limit**: Up to 5 user seats
* **Ticket volume**: Up to 1,000 tickets/month
* **Channels**: Slack & Email
### Starter plan features
Full ticketing platform with account management and basic workflows
AI ticket detection, title, descripton, priority, sentiment for Slack tickets
Native Slack and email support for seamless communication
**Ideal for**: Small teams, startups, or organizations testing Thena's capabilities.
***
## ⭐ Standard plan
**Advanced AI capabilities with comprehensive features**
* **Price**:
* \$79/user/month (billed annually)
* \$99/user/month (billed monthly)
* **Everything in Starter plan**, plus:
### Standard plan features
Intelligent automated responses to common customer inquiries
Advanced AI assistance for agents with contextual suggestions and insights
Model Context Protocol for enhanced AI capabilities
Additional Channels - AI native Web chat
API access for custom integrations
Webhook capabilities for real-time integrations
**Ideal for**: Growing teams that need advanced AI features and multi-channel support.
***
## 🏢 Enterprise plan
**Enterprise-grade security with dedicated support and unlimited AI capabilities**
* **Price**: Custom pricing (contact sales)
* **Everything in Standard plan**, plus:
### Enterprise plan features
No limits on Model Context Protocol usage and integrations
Native Microsoft Teams integration for enterprise workflows
Advanced API capabilities with enterprise-grade security
Advanced security features, compliance, and audit trails
Priority support with dedicated account management
Dedicated account owner for personalized service and guidance
**Ideal for**: Large organizations requiring advanced security, full API access and unlimited AI capabilities.
***
## 💡 Getting started
Schedule a personalized demo for enterprise features
Ready to transform your customer support with AI-powered capabilities?
***
## 📞 Need help choosing?
Our team is here to help you select the perfect plan for your organization's needs. Whether you're a startup looking to scale or an enterprise requiring custom solutions, we'll work with you to find the right fit.
**Contact our sales team**: [Book a demo](https://cal.com/team/thena-sales/product-walkthrough) or reach out to discuss your specific requirements.
For the most up-to-date pricing information and detailed feature comparisons, refer to our official pricing page: [https://www.thena.ai/pricing](https://www.thena.ai/pricing)
# Analytics
Source: https://docs.thena.ai/guides/broadcasts/analytics
Track broadcast performance with comprehensive analytics, delivery metrics, and recall functionality.
## 📊 What are broadcast analytics?
Broadcast analytics provide comprehensive insights into your campaign performance, helping you understand how recipients engage with your messages across different channels. With detailed metrics, delivery tracking, and recall capabilities, you can optimize your communication strategy and measure the impact of your broadcasts. Learn how to [create broadcasts](/guides/broadcasts/overview) and [manage audiences](/guides/broadcasts/audiences) to get the most from your analytics.
Analytics include:
* **Engagement metrics** like opens, clicks, views, and reactions
* **Delivery tracking** with success and failure rates
* **Channel-specific insights** for email and Slack performance
* **Recall functionality** to remove messages when needed for Slack
* **Real-time monitoring** of broadcast delivery and engagement
Review analytics regularly to understand which content types, timing, and channels work best for your audience.
## 📈 Analytics overview
### Analytics dashboard
Access broadcast analytics by clicking the "Analytics" button on any sent broadcast. The dashboard provides channel-specific insights:
Track opens, clicks
Recipient-level delivery status
Failed tracking for invalid addresses
Direct links to view messages
Monitor views, reactions, replies
Channel delivery success
Real-time delivery confirmation
Direct links to view messages in Slack
### Key performance indicators
* **Total delivery attempts**: Number of individual delivery attempts across all recipients
* **Unique accounts**: Count of distinct customer accounts that received the broadcast
* **Failed deliveries**: Number of delivery attempts that encountered errors or failures
## 🔄 Recall functionality
### Message recall overview
Recall allows you to remove broadcast messages from Slack channels after they've been sent:
Message recall is currently available for Slack broadcasts only. Email messages cannot be recalled once delivered to recipient inboxes.
### How recall works
The recall process removes messages from Slack channels:
1. **Identify sent messages**: View all successfully delivered Slack messages in the analytics table
2. **Select for recall**: Choose individual messages or use "Recall all" for complete removal
3. **Confirmation**: Confirm the recall action to permanently delete messages from Slack
4. **Status update**: Analytics table updates to show recalled message status
## ✅ Best practices
Use analytics insights to improve future broadcasts:
* **Content refinement**: Adjust messaging based on engagement patterns
* **Channel optimization**: Focus on channels with higher engagement rates
* **Timing adjustments**: Schedule broadcasts when your audience is most active
* **Audience targeting**: Refine [audience criteria](/guides/broadcasts/audiences) based on response data
# Audiences
Source: https://docs.thena.ai/guides/broadcasts/audiences
Create and manage broadcast audiences with static lists and dynamic filters to target the right customers.
## 👥 What are broadcast audiences?
Broadcast audiences define who receives your communication campaigns. They act as reusable recipient lists that can be applied to multiple broadcasts, ensuring consistent targeting and efficient campaign management. Once you've created your audiences, you can use them in your [broadcast campaigns](/guides/broadcasts/overview) and track their performance with [detailed analytics](/guides/broadcasts/analytics).
Thena supports two powerful audience types:
* **Static audiences**: Fixed lists of specific contacts and channels you manually select
* **Dynamic audiences**: Automatically updating lists based on filter criteria that evolve with your customer data
Create multiple audiences for different customer segments (e.g., "Enterprise Customers," "Beta Users," "Support Team") to streamline your broadcast targeting.
## 📋 Creating audiences
### How to create static audiences?
Navigate to [Audiences](https://dashboard.thena.ai/broadcasts/audiences) in the left navbar and click "+ Create audience" to start the audience creation process.
Enter the name of the audience list and then a description (optional).
Select "Static list" as the audience type.
Browse your contact database using search and filters to find specific customers, then select them using bulk selection controls.
Review your selected contacts in the preview, then click "Create audience" to save your static list.
We automatically add the Slack channels that the contact is associated with. If you want to select more Slack channels, you can select the Slack tab and choose them manually.
### How to create dynamic audiences?
Navigate to Audiences in the left navbar and click "+ Create audience" to start the audience creation process.
Enter the name of the audience list and then a description (optional).
Select "Dynamic list" as the audience type.
Create filter conditions using contact properties, account data, or custom fields with operators like "is", "contains", or "is in".
Use AND/OR logic to combine multiple conditions for precise targeting rules.
Preview the matching contacts and channels, then click "Create audience" to save your dynamic filter-based list.
Dynamic audiences automatically include Slack channels associated with contacts that match your filter criteria. The audience will update automatically as your contact data changes.
## 🔧 Audience management
### Audience dashboard
The audience management interface provides comprehensive control over your recipient lists:
View all created audiences with names, types, and recipient counts
Edit or delete audiences directly from the list view
See how many Slack channels and contacts each list contains
Search and filter using audience list type and name
# Overview
Source: https://docs.thena.ai/guides/broadcasts/overview
Create and manage broadcast campaigns to communicate with your customers across email and Slack channels.
## 📢 What are broadcasts?
Broadcasts in Thena are powerful communication campaigns that let you send messages to multiple customers simultaneously across different channels. Whether you're announcing new features, sharing important updates, or conducting surveys, broadcasts help you reach your entire customer base efficiently and consistently.
A broadcast campaign includes:
* **Rich content** created with an intuitive editor
* **Templates** to speed up broadcast creation for common scenarios
* **Multi-channel delivery** via email and Slack
* **Audience targeting** with static or dynamic lists
* **Scheduling options** for immediate or future delivery
* **Analytics tracking** to measure engagement and success
Start with a simple broadcast to one channel, then expand to multi-channel campaigns as you become more comfortable with the platform.
## 🚀 Getting started
### How to create a broadcast?
Navigate to the [Broadcasts section](https://dashboard.thena.ai/broadcasts) and click "+ Create new" to launch the broadcast wizard. The creation process is organized into clear steps:
Write your message using the rich text editor with formatting, links, and templates. Choose from pre-built templates or start from scratch with the intuitive editor.
Set up your broadcast name, sender details, delivery channels (email and/or Slack), and schedule for immediate or future delivery.
Choose who receives your broadcast using static lists of specific contacts or dynamic filters that automatically update based on your criteria. [Learn more about audience management →](/guides/broadcasts/audiences)
Preview your broadcast content, review the recipient list, and confirm all settings before sending your campaign to your audience.
## 🎯 Content creation
### Rich text editor
The broadcast composer provides a full-featured editor for creating engaging content:
* **Text formatting**: Bold, italic, strikethrough, blockquotes, superscript, subscript, underline, and horizontal rules
* **Lists**: Bulleted lists, numbered lists, and checklists for structured information
* **Links**: Direct links to documentation, resources, or external sites
* **Headings**: Structure longer messages with clear section headers
* **Code blocks**: Both inline code and code blocks to share technical information with proper formatting
* **Media**: Add images and videos via URL or file uploads
* **Undo/Redo**: Full undo and redo functionality for easy editing
### Preview functionality
Test how your broadcast appears across different channels:
* **Email preview**: See exactly how your message renders in email clients
* **Slack preview**: View your content as it appears in Slack channels
## 📨 Multi-channel delivery
### Email broadcasts
Email broadcasts deliver rich HTML content directly to customer inboxes:
* **Custom sender details**: Set sender name and email address
* **Subject line optimization**: Craft compelling subject lines for better open rates
* **HTML formatting**: Full rich text formatting preserved in email delivery
* **Responsive design**: Content automatically uses 60% width in emails and adapts to different screen sizes
### Slack broadcasts
Slack broadcasts send messages to connected Slack channels:
* **Channel targeting**: Send to specific channels or all connected channels
* **User authentication**: Messages can appear from verified users or as app notifications
* **Interactive content**: Slack-optimized formatting with rich text and media support
You can send to both email and Slack simultaneously, with content automatically optimized for each channel.
## ⚙️ Broadcast settings
### Channel selection
Select which communication channels to use:
* **Email only**: Traditional email campaign delivery
* **Slack only**: Internal team or customer Slack channel messaging
* **Multi-channel**: Simultaneous delivery across both email and Slack
### Sender configuration
Control how your broadcasts appear to recipients:
* **Email sender settings**: Configure broadcast subject, sender, and email address for professional email delivery.
* **Slack sender settings**: Choose between sending as a verified user or as the Thena app.
Messages will display as sent by "App" if the selected user has not authorized their Slack account with Thena.
### Delivery scheduling
Choose when your broadcast reaches your audience:
* **Send immediately**: Deliver the broadcast as soon as you confirm sending
* **Schedule for later**: Set a specific date and time for automatic delivery
* **Timezone handling**: All scheduling respects your local timezone settings
## 📊 Broadcast management
### Broadcast dashboard
Your broadcast dashboard provides complete visibility into all campaigns:
Monitor draft, scheduled, sent, and failed broadcasts in real-time
Edit drafts, cancel scheduled broadcasts, or duplicate successful campaigns
Find specific broadcasts by name or sender
Access detailed performance metrics for sent broadcasts. [Learn more about analytics →](/guides/broadcasts/analytics)
### Broadcast statuses
Understanding broadcast lifecycle states:
* 📅 **Scheduled**: Broadcast is queued for future delivery
* ✅ **Sent**: Broadcast has been successfully delivered
* ✏️ **Draft**: Broadcast is being created or edited
* 🔄 **Processing**: Broadcast is currently being sent to recipients
* 🚫 **Cancelled**: Scheduled broadcast was cancelled before sending
* ❌ **Failed**: Broadcast encountered errors during delivery
## 🧠 Best practices
Always preview and test broadcasts with a small group before full deployment
Schedule broadcasts for optimal engagement times in your customers' time zones
Include specific, actionable next steps to drive desired customer behavior
Track analytics to understand what content and timing work best for your audience
# Articles
Source: https://docs.thena.ai/guides/knowledge-base/articles
Create and manage knowledge base articles
Articles are the backbone of your help center — designed for clarity, structure, and easy collaboration.
## Creating and managing articles
Articles provide structured knowledge that your customers can access through your help center. They support rich formatting, collaboration features, and version control to ensure your content stays accurate and up-to-date.
## Advanced article features
Create professional content with tables, images, and formatting tools that ensure consistent presentation.
Work together with your team by adding collaborators or assigning specific authors to articles.
Track changes, compare versions, and restore previous content when needed.
Leave feedback directly on specific sections of an article without changing the content.
## Creating an article
Navigate to the help center and select the collection where you want to create an article.
Click the "+" button to create a new article in the selected collection.
Use the WYSIWYG editor to add and format your content. The editor supports:
* Text formatting (bold, italic, headings)
* Tables for structured data
* Images and media
* Dividers and other layout elements
Add tags to improve discoverability and categorization of your article.
Save the article as a draft if you're still working on it, or publish it to make it immediately available.
## Article states and workflow
Save work-in-progress articles without making them public. Drafts are only visible to your team members.
Access a complete history of all changes made to an article. You can view, compare, and restore previous versions as needed.
Articles can be published individually or as part of a coordinated help center launch. You control exactly when your content becomes available to users.
## Best practices
Use clear, concise titles that describe the content.
Break content into logical sections with appropriate headings.
Include step-by-step instructions for processes.
Add screenshots or videos for visual clarity.
Use consistent formatting across all articles.
Include diagrams for complex concepts.
Add relevant tags to improve searchability.
Link related articles to create a knowledge network.
Use consistent terminology throughout your help center.
# Help centers
Source: https://docs.thena.ai/guides/knowledge-base/help-centers
Create and manage customizable knowledge bases for your users.
Help centers allow you to create, manage, and deliver a self-service knowledge base tailored for your users. They support multiple independent knowledge spaces, deep customization, and structured publishing workflows.
## Create multiple help centers
Segment your knowledge base into distinct help centers. Each can serve a unique audience, product, or region.
Customize each help center's branding, layout, and domain independently.
### Step-by-step: creating a help center
Click on new help center from the help centers menu.
Upload a logo and enter a name.
Click create to launch the new help center.
## Customizable public help center
Design and launch a fully hosted, public-facing help center.
You can customize:
Fonts - choose typography that matches your brand.
Colors - apply your brand colors throughout the help center.
Hero section - create an engaging welcome area.
Homepage layout - organize content for optimal navigation.
Collection and article page styles - consistent reading experience.
Footer content - add important links and information.
Other configuration options include:
Custom domain setup
SEO meta fields
Open graph image configuration
Analytics integrations (e.g. Google Analytics)
## Help center publication options
Keep your help center private for internal review before publishing.
Configure meta titles, descriptions, and OG images on a per-article level.
Review how your help center will look before making changes live.
## Use cases
Create comprehensive guides for your product features and functionality.
Reduce support ticket volume with self-service troubleshooting resources.
Help new users get started with step-by-step tutorials and guides.
Build a private help center for your team's internal processes and resources.
## Access control
You can control the visibility of your help center content at both the collection and the global level.
You can restrict access to specific collections, requiring users to log in to view the articles within them.
From the help center view, locate the collection you want to make private.
Click the three-dot menu icon next to the collection's name and select **Edit**.
In the settings modal, check the box for **Require authentication to access this collection**.
Click **Save** to apply the new setting. The collection will now be private.
For internal-only knowledge bases, you can require authentication for the entire help center.
Navigate to the main **Help center** page and click on the **Settings** tab.
In the settings menu, go to the **Authentication** section and find **Access Control**.
Turn on the toggle for **Require authentication to access this help center**.
Once enabled, all collections and articles in the help center will require users to log in before they can be viewed.
# Live collaboration
Source: https://docs.thena.ai/guides/knowledge-base/live-collaboration
Enable team-wide productivity with real-time collaboration tools.
Enable team-wide productivity with real-time collaboration tools built right into the editor.
## Real-time collaboration features
Multiple team members can edit an article at once, increasing productivity and reducing bottlenecks.
Instantly view changes as they're being made, ensuring everyone stays in sync.
Provide contextual feedback without needing separate tools, keeping discussions focused.
Collaborate efficiently and keep momentum up with minimal back-and-forth.
## How collaboration works
Invite team members to collaborate on the article by clicking the "Share" button in the article editor.
Multiple team members can make changes to the document at the same time. Each person's cursor is color-coded and labeled with their name.
Highlight text and click the comment icon to add inline comments. Tag team members with @ mentions to notify them.
See edits and updates as they happen with visual indicators showing who made which changes.
Mark comments as resolved once the feedback has been addressed. Resolved comments can be filtered or hidden.
## Collaboration best practices
Use @ mentions to draw attention to specific team members.
Be specific in your comments about what needs to be changed.
Provide context for why changes are needed.
Establish clear roles before starting collaboration (e.g., who is the final approver).
Set expectations for response times to comments.
Use the version history to compare changes over time.
If multiple people are editing the same section, communicate in real-time.
Use comments to discuss conflicting approaches rather than repeatedly changing the same content.
Consider using the article's internal thread for longer discussions.
## Permissions and access control
Collaboration permissions are based on team member roles and can be customized for each article:
Viewers
Can read articles but cannot make edits or add comments.
Commenters
Can read articles and add comments, but cannot make direct edits.
Editors
Can read, comment on, and edit articles.
Admins
Can read, comment, edit, and manage permissions for articles.
# Tags
Source: https://docs.thena.ai/guides/knowledge-base/tags
Enhance categorization and searchability across your knowledge base.
Tags enhance categorization and searchability across your knowledge base.
## Why use tags
Enhance article discovery using targeted keywords that match user search patterns.
Group content logically without changing your knowledge base hierarchy or structure.
Enable smart filters and related content surfacing to help users find what they need.
## Adding tags to articles
While creating or editing an article, locate the tags section in the article editor.
Add one or more relevant tags that accurately describe the article content. You can use existing tags or create new ones.
Save or publish your article. Tags will be immediately indexed for search and filtering.
## Tag best practices
Use a consistent naming convention for all tags (e.g., singular nouns).
Reuse existing tags when possible instead of creating similar variations.
Consider creating a controlled vocabulary of approved tags.
Choose tags that directly relate to the article content.
Avoid overly generic tags that could apply to most articles.
Include both technical terms and common language alternatives when appropriate.
Aim for 3-5 tags per article for optimal searchability.
Too few tags limit discoverability; too many dilute relevance.
Prioritize the most important concepts rather than tagging every minor topic.
## Managing tags
Tag management tools.
Access tag management from the knowledge base settings:
View all tags currently in use across your knowledge base.
Merge similar tags to reduce duplication.
Rename tags to improve clarity or consistency.
Delete unused or irrelevant tags.
See which articles use each tag.
## Using tags for navigation
Display popular tags in your help center to guide users toward common topics.
Automatically suggest related content based on shared tags.
Allow users to filter article lists by selecting one or more tags.
Create dedicated pages that list all content with a specific tag.
# Getting started
Source: https://docs.thena.ai/guides/onboarding/getting-started
Everything you need to go live with Thena in minutes.
Thena is your intelligent platform for customer collaboration, purpose-built for the modern enterprise. Whether you're streamlining support, accelerating success, or aligning teams across functions — you're in the right place. Let's get you up and running in no time.
## Step 1: Sign up
Visit [thena.ai](https://thena.ai) and click Sign up to create your account. All you need is your work email address to get started. Make sure to use your official domain email (e.g. [yourname@company.com](mailto:yourname@company.com)) so we can connect you to the right organization.
## Step 2: Receive verification email
After signing up, you'll receive a verification email. Open your inbox and click the Verify email button to confirm your account. This step secures your identity and unlocks the next stage of setup.
Didn't receive the email? Check your spam folder or request a resend from the login page.
## Step 3: Join an existing organization
Thena auto-detects existing organizations under your email domain. If your company already has a presence on Thena:
* You'll be shown a list of public organizations tied to your domain
* Simply choose the one you want to join
## Step 4: Create a new organization
If there are no existing organizations under your domain, or you prefer to start fresh, you'll be prompted to create a new organization.
* If your domain is whitelisted by Thena team, you'll be allowed to proceed
* Give your organization a name
## Step 5: Set up your first team
Once your organization is ready, it's time to build your first team. Teams in Thena are where collaboration happens — they can be based on departments like support, sales, success, or even projects.
You'll be able to:
* Name your team (e.g. "Customer support" or "Onboarding team")
* Choose [team-level settings](/guides/ticketing/teams) and permissions
* Set up sources like Slack, email, or CRM integrations (optional)
## Step 6: Invite your team members
Now, bring your crew on board. Invite teammates by email to start working together in real time. You can assign roles, control access levels, and start collaborating instantly.
## You're in 🎉
Once you're in, you can explore:
Start managing customer inquiries and track issues with a powerful ticketing system.
Build custom forms to collect structured information from your customers.
Integrate your Slack workspace to collaborate with your team seamlessly.
Set up email channels to manage customer communications in one place.
Deploy AI agents to automate repetitive tasks and enhance customer interactions.
Automate processes with customizable workflows that save time and reduce errors.
View and organize customer accounts to keep track of all your relationships.
# Introduction
Source: https://docs.thena.ai/guides/onboarding/introduction
The most advanced platform designed for B2B customer support and service.
## Overview
Welcome to Thena — the AI-native platform built for modern B2B teams, providing unmatched flexibility and power to manage tickets, workflows, and customer operations.
With 150+ APIs and core concepts like `Organization`, `Account`, `Contact`, `Ticket`, `Team`, and `Group`, Thena is engineered from the ground up to be modular, scalable, and deeply customizable. From smart forms with cascading rules, next-gen routing and SLAs, and a strong Slack experience, to advanced email integration and a canvas-style workflow builder, Thena is purpose-built for B2B customer support and service.
Whether it's multi-channel notifications, AI agents with layered capabilities, or a fully modern UI, every part of Thena is optimized for performance and clarity. Add in a robust Apps platform, data insights, and super-fast onboarding—you've got the most modern support infrastructure for scaling organizations.
# Members
Source: https://docs.thena.ai/guides/organization/members
Manage who is part of your Thena organization.
The Members page gives you full visibility into who's part of your Thena organization—and allows you to grow your team seamlessly.
## 👥 View and manage members
From this page, you can:
* See all members currently in your organization.
* Invite new members by email to join and collaborate instantly.
## 🚧 Roles (coming soon)
Today, all members have equal access across the workspace. Everyone can collaborate, view, and interact with all shared resources.
Role-based permissions are on the roadmap—soon you'll be able to assign different roles (e.g., Admin, Viewer, Contributor) to better control access and responsibilities.
For now, it's all-hands-on-deck access.
# Setup
Source: https://docs.thena.ai/guides/organization/setup
Configure the foundation for your teams, members, and access controls.
Your organization in Thena is the foundation for everything—teams, members, and access controls. Here's how it's structured and what you can customize:
## 🏷️ Organization name
Every organization has a name that helps your teams identify the workspace. You can update this name anytime to match your branding or internal naming conventions.
## 🌐 Organization URL
Thena automatically generates a unique URL for your org. This is useful for easy access and sharing—especially for larger teams.
If your organization is set to Open, anyone with a matching domain (e.g., @acme.com) can access the org and join any non-private teams.
If your organization is set to Restricted, the org URL will not work for self-joins. Users must be invited explicitly by existing members.
## 🔒 Access settings
Choose how users can access your org:
Only invited members can join.
Anyone with the link and a verified domain can enter and collaborate (except on private teams).
This setup ensures your organization is both easy to find for the right people and securely segmented where needed.
# API keys
Source: https://docs.thena.ai/guides/preferences/api-key
Securely access the Thena platform programmatically.
## Overview
Thena provides flexible API key options for developers and teams to securely interact with our platform.
## Personal API key
🔐 Every Thena user has access to a personal API key.
Your API key is unique to your account and tied to your user-level permissions.
You can view and regenerate your key by heading to Settings → Security & access.
After regenerating, your old key will be deactivated immediately.
Keep your API key secure. Treat it like a password—don't expose it in client-side code or version control.
## App-based API key
🧱 If you prefer not to use your personal key—or want to build integrations that aren't tied to a specific user—you can create an app in Thena:
Go to Settings → Apps and click Create app.
Each app comes with its own API key and can be scoped with specific permissions.
This is recommended for long-term integrations, third-party services, or production environments.
## Best practices
🛠 Follow these guidelines to keep your API keys secure:
Use environment variables to store and reference API keys in your code.
Rotate your keys periodically for security.
Create separate apps for staging, dev, and production environments to isolate access.
Audit access regularly through the Thena dashboard.
# Notifications
Source: https://docs.thena.ai/guides/preferences/notifications
Configure how you receive updates from Thena.
Thena brings you a modern, multi-channel notification system designed to keep you in the loop—whether you're deep in Slack, heads-down in the app, or offline for the day. It's flexible, intuitive, and fully customizable to your preferences.
## 💬 Multi-channel delivery
Choose how and where you want to stay informed. Thena supports:
Ideal for real-time updates while working with your team.
Great for catching up asynchronously or staying informed when you're not in Slack.
A personal notification center right inside Thena.
Lightweight in-app popups that keep you informed without breaking your flow.
## ⚙️ Configurable by event and channel
You can customize:
* Which events trigger notifications.
* Where they're delivered – toggle each event's delivery channel individually.
For example:
* Get ticket assignment alerts in Slack while collaborating.
* Review SLA warnings via Inbox after being away.
* Use email summaries if you're not always in Slack.
* Opt into Toasts for subtle, real-time nudges inside Thena.
## 📋 Supported notification events
Here's a list of every event that can trigger notifications in Thena:
### Ticket lifecycle
A new ticket has been created in the system.
You (or someone) have been assigned to a ticket.
A ticket's status has changed (e.g., Open → In Progress).
A ticket's priority has been updated.
A ticket has been escalated for faster resolution.
A ticket has been archived and is no longer active.
### SLA & CSAT
The ticket is approaching its SLA deadline.
The SLA for the ticket has been missed.
A customer satisfaction (CSAT) rating was submitted.
A previously submitted CSAT rating was updated.
### Communication
A customer has replied in a ticket thread.
A customer mentioned you in a thread.
A teammate has replied in an internal note.
A teammate mentioned you in an internal thread.
A comment was made on a note you've interacted with.
You were mentioned in a note comment.
### Metadata
A custom field on a ticket has been modified.
A tag was added, removed, or changed on a ticket.
## 🔁 Real-time vs. batched
Some events (like mentions or assignments) are always real-time when delivered via Toasts and Inbox. For Slack and Email, you can batch updates together to reduce noise.
You control the batching interval and keep the signal high.
## 🌟 Why it matters
This isn't just notifications—it's your signal layer. Configurable, contextual, and cross-channel. Built for high-performing customer teams.
# Profile
Source: https://docs.thena.ai/guides/preferences/profile
Your identity across every conversation, ticket, note, and task.
Your profile in Thena is more than just a label—it's your identity across every conversation, ticket, note, and task.
## ✍️ Set your name
Give yourself a name that your teammates and customers will recognize. Whether it's your full name, a preferred nickname, or something fun for internal use—this is how you'll appear across the platform.
## 📸 Upload a profile photo
Add a photo to personalize your presence. Your image will be visible wherever you take action in Thena—so people always know it's you behind that reply, note, or task.
## 📧 View your email
Your email address is tied to your account identity and workspace activity in Thena. It is visible here for reference, but editing is not supported. If you need to use a different email, please contact your admin or create a new account.
## 🌐 Where your profile appears
Your name and photo will show up:
In messages and replies
On internal notes and comments
Across tasks, tickets, and activity logs
Anywhere you leave your mark in Thena
## 🚀 Why it matters
Consistency builds trust. With a name and photo that reflect you, your team knows who's handling what, and customers get a seamless, human experience—even in a high-scale, fast-paced support environment.
# Reset password
Source: https://docs.thena.ai/guides/preferences/reset-password
How to reset your password in Thena, whether logged in or logged out.
## Overview
Whether you're logged in or logged out, resetting your password on Thena is quick and hassle-free.
## If you're logged in
🔑 If you're logged in, you can reset your password anytime from your account settings:
Go to Organization settings → Personal → Security & access.
Click Reset password.
Enter your current password, then choose a new one.
✅ This method ensures you're in control of your password while actively logged in.
## If you're logged out
📧 Forgot your password or can't log in? No worries.
Go to the sign-in page.
Click Reset password.
Enter your email address.
You'll receive a reset link via email.
Click the link to set a new password and regain access.
⏳ Reset links expire in 48 hours. If yours has expired, just click Resend on the sign-in page to get a fresh one instantly.
## Pro tips
🛡 Follow these best practices for password security:
Use a strong password—we recommend at least 12 characters with a mix of letters, numbers, and symbols.
Reset your password regularly for improved security.
Reach out to your admin or support if you're having trouble accessing your email.
# Slack authorization
Source: https://docs.thena.ai/guides/preferences/slack-authorization
Reply as yourself in Slack—no bots, no branding gaps.
Thena's Slack authorization makes your customer communication smoother, more human, and completely seamless—no bots, no branding gaps, just you, replying from Thena directly as yourself in Slack.
## ✅ What is Slack authorization?
Slack authorization allows you to link your personal Slack profile with Thena. Once authorized, all replies sent from Thena appear as you in Slack—no more whitelabeled bots or confusion for the recipient. This ensures conversations maintain their native feel and authenticity for the person on the other end.
## 🧠 Why it matters
Without authorization, replies from Thena might appear through a bot or system user. With authorization, you:
Respond as yourself in Slack
Maintain the native look & feel for your customers
Enable smoother collaboration and personal engagement
Eliminate ambiguity about who's replying
## 🌍 Multi-workspace support
Thena supports complex setups too:
* Have multiple Slack workspaces across your teams? No problem.
* Authorize your Slack profile per team in Thena.
Example: If you have a Sales team in one Slack workspace and a Support team in another—you can authenticate for both and reply natively from each.
## 🛠️ How to connect
1. Navigate to Preferences in your Thena account.
2. Scroll to the Slack Authorization section.
3. Click Connect Slack workspace.
4. Follow the Slack prompt to approve permissions.
5. That's it—you're now replying as yourself.
## 🧼 Pro tip
No bots. No branding handoffs. Just you, your team, and a clean, professional experience for your customers—across any Slack workspace.
# Themes
Source: https://docs.thena.ai/guides/preferences/themes
Personalize your workspace, your way.
Thena offers a curated set of themes designed for every mood, lighting condition, and workflow. Each theme comes with its own personality — crafted to enhance focus, reduce fatigue, or simply match your aesthetic.
## Explore the options
A light, airy palette with soft whites and subtle grays for clarity and calm.
Deep blacks and moody tones — perfect for late-night productivity.
Bright and energetic UI with vibrance and visibility for maximum impact.
A dark, sleek interface that reduces glare and helps you focus on what matters.
Gentle colors with a breezy feel — minimalist, and refreshingly clean.
Futuristic and bold design that adds cosmic energy to your daily workflow.
## Accessing theme settings
To access theme settings:
1. Log in to your Thena dashboard.
2. Click on your profile icon in the top right corner.
3. Select "Preferences" from the dropdown menu.
4. Click on the "Themes" tab.
## Light and dark modes
You can switch between light and dark modes:
1. Navigate to the "Themes" tab in your preferences.
2. In the "Mode" section, select one of the following options:
* Light mode: Bright background with dark text.
* Dark mode: Dark background with light text.
* System default: Automatically matches your device's settings.
* Auto (time-based): Switches between light and dark based on time of day.
3. Click "Save" to apply your selection.
## Best practices
* Choose a theme that reduces eye strain for your working environment.
* Consider switching to dark mode for evening work.
* Ensure sufficient contrast between text and background colors.
* Test your selected theme across different parts of the interface.
* Use accessibility settings if you have specific visual needs.
# Discord
Source: https://docs.thena.ai/guides/sources/discord
Connect Thena to your Discord server for seamless support and community management.
## Overview
Transform your Discord server into a powerful support hub with Thena's native Discord integration. Built for modern teams and communities, this integration turns Discord conversations into structured tickets, enables intelligent automation, and provides comprehensive customer support capabilities—all within your Discord environment.
Whether you're managing a gaming community, providing technical support, or handling customer inquiries, Thena brings enterprise-grade ticketing and workflow automation directly to Discord.
**Setup Requirements**: The Discord integration currently requires setup through the Thena API and Discord bot commands. There is no user interface available for configuration at this time. All setup must be completed using API calls and admin commands within your Discord server.
## Key features
Convert Discord channel messages into organized tickets on Thena with flexible creation modes.
Support for regular and forum channels with bidirectional syncing of comments, reactions, and attachments between Discord and Thena.
Bidirectional emoji reactions sync between Discord messages and Thena comments for seamless interaction.
Automatic handling of file uploads, downloads, and synchronization between Discord and Thena platform.
## Setup guide
### Step 1: Add Thena bot to your Discord server
Click the following link to add the Thena bot to your Discord server:
[**Add Thena bot to Discord**](https://discord.com/oauth2/authorize?client_id=1404455972025405470\&scope=bot+applications.commands\&permissions=8)
This will redirect you to Discord where you can select your server and add the Thena bot.
### Step 2: Installing the Discord app for your organization
After adding the bot to your Discord server, you need to create the installation in your Thena organization to connect your teams.
Create a POST request to install the Discord app with the following:
```bash theme={null}
curl --location 'https://apps-studio.thena.ai/apps/install' \
--header 'Content-Type: application/json' \
--header 'x-api-key: YOUR_API_KEY' \
--data '{
"teamIds": [
"team-1-id",
"team-2-id",
"team-3-id"
],
"appId": "RHT98D2K10NW3M086YJ5CKVBYPGBS",
"appConfiguration": {
"required_settings": [],
"optional_settings": []
}
}'
```
Include your API key in the request headers:
```
x-api-key: YOUR_API_KEY
```
**Adding all teams**: To give all your Thena teams access to Discord integration, include all relevant team IDs in the `teamIds` array.
**Finding Team IDs**: You can find your team ID from the URL when you're in the team dashboard in Thena. For example, if the URL is `https://dashboard.thena.ai/dashboard/T123NHFDRF`, then the team ID is `T123NHFDRF`.
The `appId` must be exactly `RHT98D2K10NW3M086YJ5CKVBYPGBS` for Discord integration.
Use the [Install an App API](/api-reference/apps-platform/app-installation/install-an-app) to create the installation with the prepared request body.
The API endpoint will handle connecting your Discord server to the specified Thena teams.
Once the installation is successful, you will receive an API response containing:
* `botToken`: This token should be used as the `apiKey` parameter in the authentication command in discord (you'll need this in Step 3)
* `installedByOrgId`: This is your Organization ID (something like `EYGF098765`) that you'll need for authentication in Step 3
Save these values as you'll need them for the next step.
### Step 3: Configure Discord server with admin commands
After successful installation, use Discord admin commands to configure your server.
In your Discord server, type the following command to see all available admin commands:
```
!admin list
```
This will show you all available admin commands:
```
Available Admin Commands:
Authentication:
!admin auth - Authenticate this server with organization
Team Mapping:
!admin map-team [Regular|Forum] - Map a team to a channel
!admin view-teams - View all team-channel mappings for this server
Ticket Creation Settings:
!admin set-ticket-mode all|emoji|none - Set ticket creation mode for a channel
!admin view-config - View configuration for server
Utility Commands:
!admin view-channels - List all channels in the server with their types
Help:
!admin list - Show this help message
```
Use the API key from the installation response and your organization ID from the Thena dashboard to authenticate your server:
```
!admin auth YOUR_API_KEY YOUR_ORG_ID
```
**Example:**
```
!admin auth pk_live_Q6Ed... ELLG711ICF
```
Replace `YOUR_API_KEY` with the value from the installation API response and `YOUR_ORG_ID` with your organization ID from the API response.
First, check which teams are available from your installation:
```
!admin view-teams
```
This will show all teams that were configured during installation.
Next, view all channels in your Discord server:
```
!admin view-channels
```
This will list all channels with their IDs and types (Regular or Forum).
Connect your Thena teams to specific Discord channels using the IDs from the previous step:
```
!admin map-team [Regular|Forum]
```
**Example:**
```
!admin map-team TTTZ733Q77 123456789012345678 Forum
```
Use the team IDs shown in `!admin view-teams` and channel IDs from `!admin view-channels`. Make sure to specify the correct channel type (Regular or Forum).
For **Regular channels**, you can configure when tickets should be created:
```
!admin set-ticket-mode all|emoji|none
```
**Options:**
* `all`: Every message creates a ticket
* `emoji`: Only messages with specific emoji reactions create tickets (🎫 ticket emoji)
* `none`: No automatic ticket creation
**Example:**
```
!admin set-ticket-mode 123456789012345678 emoji
```
**Default mode**: Regular channels are set to `emoji` mode by default. Users need to start a message with the 🎫 ticket emoji to create a ticket from a message.
**Forum channels**: All posts in Forum channels automatically create tickets by default. You don't need to configure ticket creation modes for Forum channels.
Check your server configuration along with all team-channel mappings:
```
!admin view-config
```
## What's next?
After completing the initial setup, you can configure advanced features:
Set up which Discord channels should create tickets and how they should be routed to your teams.
Configure automated responses, ticket routing rules, and AI-powered insights for your Discord integration.
Create custom workflows for different types of Discord interactions and support scenarios.
Track support metrics, response times, and customer satisfaction across your Discord community.
## Important considerations
**Team access**: Make sure to add all relevant teams to the `teamIds` array during installation. Teams not included in this array won't have access to Discord integration features.
**Testing**: After setup, test the integration by sending a message in a configured channel to ensure tickets are being created properly in Thena.
# Email
Source: https://docs.thena.ai/guides/sources/email
Powerful, flexible email workflows—natively inside Thena.
Thena offers robust, native email integration that enables teams to manage, respond to,
and automate customer conversations directly from the platform—without ever leaving
the ticket view.
## Key features
Every workspace in Thena gets a default email address that can be used out of the
box. No setup required. Share it with your customers, and any email sent to that
address automatically creates a ticket.
* Great for getting started quickly
* Ideal for shared inboxes like support@ or info@
* All replies stay threaded in one place
For a more branded and controlled experience, you can connect custom email
domains to Thena.
* Add one or multiple domains (e.g., [support@yourcompany.com](mailto:support@yourcompany.com))
* DNS verification ensures domain ownership
* Emails can be received and sent directly via your verified domain
Each custom domain is fully configurable and can be managed from the Email
settings page.
Once a custom domain is connected, you can personalize how emails appear to
customers by choosing your sender identity:
* Your profile name (e.g., Jane from Thena)
* Profile name + custom sender name (e.g., Jane | Customer Support)
* Custom sender name only (e.g., Thena Support)
This gives you full control over how your communication is perceived—enterprise-
grade, but still human.
Each team can have:
* Multiple connected domains
* Multiple email addresses per domain
* Different addresses for different workflows (e.g., billing@, escalations@,
partnerships@)
This lets large organizations manage email at scale with precision and clarity.
When a customer sends an email:
* A ticket is created in Thena
* The sender becomes the Requester
* Cc and Bcc fields are captured where relevant
* All email replies stay threaded under the ticket
* Agents can reply directly from Thena
Your inbox just got supercharged.
Agents and managers can easily search tickets using email addresses. Whether
you're tracking conversations from a specific domain or need to find a customer's
message fast—email is a first-class citizen in Thena search.
Agents can reply to emails with:
* Rich text formatting
* File uploads and attachments
* Inline threads and quoted messages
* Full visibility into the original sender and recipients
No need to switch tools. Everything you need is already here.
Keep your kanban view clean and organized by collapsing email threads:
* Show only the main message in the kanban board
* Collapse lengthy email threads to reduce visual clutter
* Expand threads when you need to see the full conversation
* Maintain context while keeping the interface clean
Focus on what matters most without getting overwhelmed by thread noise.
Thena lets you build automations and workflows based on the email source. You
can:
* Auto-route emails to specific teams
* Trigger replies, escalations, or tagging based on content
* Set up SLAs and alerts
* Auto-close stale threads or follow up proactively
Email becomes not just a channel—but a trigger for intelligent action.
## Prerequisites
•
Access to your domain's DNS settings (via GoDaddy, Cloudflare, AWS Route 53, etc.)
•
Admin access to your email provider (Gmail, Outlook, etc.)
## Setup guide
### Organization-level setup
Go to Organization settings → Sources → Email → Manage connection.
Enter your domain name and click Add domain.
Thena will generate the necessary DNS records for your domain. You'll need to add these to your domain hosting provider:
* Copy the TXT and CNAME values provided by Thena
* Log in to your DNS provider (GoDaddy, Cloudflare, AWS Route 53, etc.)
* Add the records exactly as shown in Thena
Depending on your DNS provider, you may need to remove your domain name from the hostname when copying from Thena. For example, if your domain is yourdomain.com, use `pm.bounces` instead of `pm.bounces.yourdomain.com`.
Once you've added the DNS records, click "Verify" in Thena. The system will check if the records have been properly configured.
DNS changes can take up to 24-48 hours to propagate, though they often take effect much sooner.
### Team-level setup
Once your domain is verified at the organization level, you can set up custom email addresses for each team.
Choose how emails will appear to your customers by selecting a sender identity option:
* Your profile name (e.g., Jane)
* Profile name + custom sender name (e.g., Jane | Thena Support)
* Custom sender name only (e.g., Thena Support)
For each team email address (e.g., [support@yourdomain.com](mailto:support@yourdomain.com)):
* Copy the forwarding email address provided by Thena
* Go to your email provider settings
* Add a forwarding rule to send emails to the Thena provided address
* You'll receive a confirmation email from your provider—click **Confirm** in that message.
* Return to your email-forwarding settings and paste the forwarding address again.
* Choose how you want forwarded emails **handled** in your inbox.
Return to Thena and click "Verify" to complete the setup process.
### DNS provider-specific instructions
To add DNS records in Cloudflare:
1. Log in to your Cloudflare account
2. Select your domain from the dashboard
3. Navigate to the **DNS** tab
4. Click **Add record**
5. For each record provided by Thena:
* Select the record type (TXT or CNAME)
* Enter the hostname (without your domain name)
* Enter the value provided by Thena
* Toggle the proxy status to **DNS only** (gray cloud)
* Click **Save**
In Cloudflare, when entering the hostname, you only need the subdomain portion without your domain name. For example, if Thena shows `pm.bounces.yourdomain.com`, only enter `pm.bounces` in Cloudflare.
For email-related DNS records, always set the proxy status to **DNS only** (gray cloud) rather than proxied (orange cloud) to ensure proper email delivery.
To add DNS records in GoDaddy:
1. Log in to your GoDaddy account
2. Navigate to **My Products** → Select your domain → **DNS**
3. Scroll down to the **Records** section
4. For each record provided by Thena:
* Click **Add** button
* Select the record type (TXT or CNAME)
* Enter the hostname (usually just the subdomain portion)
* Enter the value provided by Thena
* Set TTL to 1 Hour (or as recommended)
* Click **Save**
GoDaddy's interface typically shows the hostname field as "Name" or "Host". You'll usually only need to enter the subdomain portion (e.g., `pm.bounces`). If you're unsure, try entering the hostname without your domain and check the preview that GoDaddy shows.
To add DNS records in Squarespace:
1. Log in to your Squarespace account
2. Navigate to **Settings** → **Domains** → Select your domain
3. Scroll down to **DNS Settings**
4. For each record provided by Thena:
* Click **Add** → Select the record type (TXT or CNAME)
* Enter the hostname (without your domain name)
* Enter the value provided by Thena
* Click **Save**
In Squarespace, the domain name is automatically appended to the hostname field. When copying hostnames from Thena, remove your domain name from the end.
For example, if Thena shows `pm.bounces.yourdomain.com`, only enter `pm.bounces` in the Squarespace hostname field.
To add DNS records in AWS Route 53:
1. Log in to the AWS Management Console
2. Navigate to **Route 53** → **Hosted zones** → Select your domain
3. Click **Create record**
4. For each record provided by Thena:
* Select the record type (TXT or CNAME)
* Enter the hostname (without your domain name)
* Enter the value provided by Thena
* Keep TTL as default (or set to 300 seconds)
* Click **Create records**
In Route 53, the domain name is automatically appended to the hostname field. When copying hostnames from Thena, remove your domain name from the end.
For example, if Thena shows `pm.bounces.yourdomain.com`, only enter `pm.bounces` in the Route 53 hostname field.
To add DNS records in Namecheap:
1. Log in to your Namecheap account
2. Go to **Domain List** and click **Manage** next to your domain
3. Navigate to the **Advanced DNS** tab
4. For each record provided by Thena:
* Click **Add New Record**
* Select the record type (TXT or CNAME)
* For TXT records: Enter the hostname in the "Host" field (without your domain name)
* For CNAME records: Enter the subdomain in the "Host" field
* Enter the value provided by Thena in the "Value" field
* Set TTL to "Automatic" or 1 Hour
* Click the checkmark to save
In Namecheap, you only need to enter the subdomain portion in the "Host" field. For example, if Thena shows `pm.bounces.yourdomain.com`, only enter `pm.bounces` in Namecheap.
To add DNS records in Vercel:
1. Log in to your Vercel dashboard
2. Select your project or team
3. Go to **Settings** → **Domains**
4. Select the domain you want to configure
5. Navigate to the **DNS Records** tab
6. Click **Add** for each record provided by Thena:
* Select the record type (TXT or CNAME)
* Enter the hostname (without your domain name) in the "Name" field
* Enter the value provided by Thena
* Set TTL to 86400 (default)
* Click **Add**
In Vercel, when entering the hostname in the "Name" field, you only need the subdomain portion without your domain name. For example, if Thena shows `pm.bounces.yourdomain.com`, only enter `pm.bounces` in the Name field.
To add DNS records in Hostinger:
1. Log in to your Hostinger control panel (hPanel)
2. Go to **Domains** → Select your domain
3. Click on **DNS / Nameservers**
4. Scroll down to the **DNS Records** section
5. For each record provided by Thena:
* Click **Add Record**
* Select the record type (TXT or CNAME)
* Enter the hostname (without your domain name) in the "Name" field
* For TXT records: Enter the value provided by Thena in the "TXT Value" field
* For CNAME records: Enter the value provided by Thena in the "Target" field
* Set TTL to 14400 (default) or 3600
* Click **Save**
In Hostinger, you only need to enter the subdomain portion in the "Name" field. For example, if Thena shows `pm.bounces.yourdomain.com`, only enter `pm.bounces` in Hostinger.
To add DNS records in IONOS:
1. Log in to your IONOS account
2. Navigate to **Domains & SSL** → Select your domain
3. Click on **DNS** in the left sidebar
4. For each record provided by Thena:
* Click **Add Record**
* Select the record type (TXT or CNAME)
* For the prefix field, enter the subdomain portion of the hostname
* Enter the value provided by Thena
* Set TTL to 3600 seconds (1 hour)
* Click **Save**
In IONOS, the domain name is automatically appended to the prefix field. When copying hostnames from Thena, remove your domain name from the end. For example, if Thena shows `pm.bounces.yourdomain.com`, only enter `pm.bounces` in the prefix field.
### Email provider-specific instructions
To set up email forwarding in Gmail:
1. Navigate to Gmail settings
2. Go to "See all settings" → "Forwarding and POP/IMAP"
3. Click "Add a forwarding address" and enter the Thena provided address
4. Gmail will send a verification email that you'll need to authorize
5. Return to the "Forwarding and POP/IMAP" tab and add the address again
6. Choose how you want forwarded mail handled in your inbox
If you're using Google Workspace, you may need administrator permissions to set up forwarding or to allow forwarding to external domains.
To use a Google Group email (e.g., [support@yourdomain.com](mailto:support@yourdomain.com)) with Thena:
1. Log in to your Google Workspace admin account
2. Navigate to **Groups** → Select your target group or create a new one
3. Click on **Group settings**
4. Under General → Allow external members, select People outside the organization can be members as Yes
5. Under Allow external members, ensure the following minimum permissions are set:
* **Who can view conversations**: Group members
* **Who can post**: Anyone on the web (for receiving external emails)
* **Who can view members**: Group managers
6. Under **Posting policies**, ensure:
* **Allow email posting** is checked
* **Allow web posting** is checked
* **Message moderation** is set to "None" or appropriate for your needs
7. Save changes
8. Click **Members** in the left sidebar
9. Click **Add members** at the top
10. Enter the Thena-provided email address that was given during team setup
11. Set the member role as "Member" (not "Manager" or "Owner")
12. Click **Add**
When using a Google Group, you don't need to set up separate email forwarding rules. Adding the Thena-provided email as a member of the group automatically forwards all group emails to Thena.
Ensure your Google Workspace admin settings allow external forwarding. Go to **Apps** → **Google Workspace** → **Gmail** → **Routing** and verify that "Allow users to automatically forward messages to addresses outside this organization" is enabled.
To set up email forwarding in Outlook:
1. Navigate to Admin Panel → Click Show All → Select Exchange
2. Navigate to Mail flow → Click Rules → Add a Rule
3. In Set rule conditions, enter a name for the rule
4. Apply this rule if "The recipient" → is this person [support@yourdomain.com](mailto:support@yourdomain.com)
5. Redirect the message to → is this person \[Thena-provided address]
6. Click Next → Set Rule Settings → Next → Review and Finish
7. Enable the rule by clicking on it in the Rules page
You may need to whitelist Thena's domain and enable auto-forwarding to external domains in your organization's security settings.
## Summary
Email that works for modern support teams
Thena's email integration transforms legacy communication into a modern, structured workflow—fully embedded in your ticketing and customer support operations.
✓
Works out of the box
No complex setup required
✓
Scales with custom domains
Brand your communications
✓
Powered by smart workflows
Automate routine tasks
✓
Seamless across teams
Collaborate without friction
# MS Teams
Source: https://docs.thena.ai/guides/sources/ms-teams
Collaborate with customers on Microsoft Teams with Thena.
## Overview
With Microsoft Teams integration, your team can seamlessly chat with customers who use Teams from within Thena . No more juggling apps. No more missed messages. This guide will walk you through the setup process and explain the features available with the integration.
**🔒 Admin access required**
If you're not a global admin, share the setup link with someone who is.
## Key features
Messages sent in Teams are instantly mirrored to Thena, and vice versa. This
creates a seamless conversation experience where:
* Customers stay in their preferred Teams environment
* Support agents work entirely from Thena
* All messages sync in real-time between platforms
* Conversations remain threaded and organized
Threaded conversations are fully supported between Teams and Thena:
* Replies stay organized in the correct thread
* Thread context is preserved across platforms
* Agents can follow multiple conversation threads simultaneously
* Historical thread navigation works as expected
Map specific MS Teams channels to Thena teams for organized communication:
* Connect multiple Teams channels to different Thena teams
* Supports standard, shared, and private channel types
* Route messages to the right team automatically
* Maintain separate conversation spaces for different departments
Emoji support is partially implemented between platforms:
* Basic emoji reactions (👍, ❤️, 😂) sync between platforms
* Custom emoji reactions from Teams appear as text in Thena
* Emoji in message text is preserved in both directions
Share files seamlessly between Teams and Thena:
* Images, PDFs, and common file types fully supported
* Office documents (Word, Excel, PowerPoint) supported from Teams to Thena
* File previews available where supported by the platforms
* Large file transfers handled efficiently
Most rich text formatting is preserved between platforms:
* Bold, italic, and underline formatting
* Bulleted and numbered lists
* Code blocks and quotes
* Links with proper formatting
Some advanced formatting like tables may not transfer perfectly between platforms.
## Pre-requisites
•
Microsoft Teams license for each user.
•
Global admin privileges (for Graph API access).
## Setup guide
**Enterprise plan required**
MS Teams is available on the Enterprise plan. If you don't have an Enterprise plan, contact sales to learn more.
Go to the Thena web app → Organization settings → Sources → MS-Teams → Enable.
Click download to download a zip file containing the Thena custom app.
In Microsoft Teams, under the 'Apps' section, select 'Manage your Apps' → Click on 'Upload an app' → Select 'Upload a custom app' and upload the downloaded Thena zip file.
Head over to the 'Chat' section on Microsoft Teams → Find and send 'login' to the 'thena-ai-bot'.
Click on the Login button returned by the bot → Click on 'Accept' on the permissions requested by Thena.
Return to Thena and check the "I have installed the application and configured the above steps" checkbox → Click Connect to complete the setup.
Select which Thena teams you want to enable Microsoft Teams integration for.
### Team-level setup
Go to your team's Settings → Sources → MS Teams.
In the Channels and accounts mapping section, you'll see tabs for Available teams and Configured teams.
Under Available teams, you'll see a list of MS Teams teams that you can configure.
Click on a team to view its channels.
Select the channels you want to map to your Thena team and click Add Thena.
The selected channels will now appear under the Configured teams tab.
You can only sync channels you've created—not ones created by customers.
## Frequently asked questions
The integration requires two levels of permissions:
**App scopes (organization level):**
* Read/write access to Teams, channels, messages, and files
* Permission to manage app installations
* Access to user profiles and organization data
**User scopes (for message syncing):**
* Read/write messages permissions
* File upload capabilities
* Offline access for token refresh
Messages are handled differently depending on direction:
**Thena to Teams:**
* Messages try to post as the authenticated user first
* If the user isn't authorized, Thena posts as the bot
* If the bot isn't in the channel, Thena tries posting as the admin
* Users see an ephemeral message in Thena if a fallback occurs
**Teams to Thena:**
* Messages are posted via the Thena bot with the original sender details preserved
If your email addresses in Thena and Microsoft Teams don't match:
1. Contact your administrator to update your email address in either Thena or MS Teams
2. Ensure your email addresses match across both platforms
3. The integration relies on matching email addresses for proper user identification
If messages aren't appearing in Teams, check these common issues:
* Confirm the channel is properly mapped in Thena team settings
* Make sure the Thena bot has been added to the correct Teams channel
* Check that you have the necessary permissions in both platforms
Thena may update messages after they're initially posted to Teams. This is normal behavior for real-time synchronization and doesn't affect the message content or functionality.
You'll need to re-authenticate in the Thena web app if you've:
* Changed your Microsoft Teams password
* Lost or had your Teams access re-added
* Had your Microsoft license reassigned
* Been inactive for an extended period
Go to Organization settings → Sources → MS Teams to re-authenticate.
Yes. Having proper licenses ensures messages appear from actual users rather than the Thena bot, providing a better experience for your customers.
Thena supports all major Microsoft Teams channel types:
* **Standard channels**: Recommended with full bot support
* **Shared channels**: Requires all users to be synced (no fallback bot)
* **Private channels**: Limited support for posting as admin or Thena bot
Note that you can only sync channels you've created—not ones created by customers.
Most common formatting is supported between platforms:
* Bold, italic, and strikethrough text
* Bulleted and numbered lists
* Code blocks and quoted text
* Basic emoji reactions
Some advanced formatting like underline, colors, and complex tables may not transfer perfectly between platforms.
# Slack
Source: https://docs.thena.ai/guides/sources/slack
Connect Thena to your Slack workspace for seamless support.
## Overview
Thena has the most powerful Slack integration in the world—period. Built for high-velocity, modern teams that live in Slack, it turns your conversations into structured workflows, intelligent automation, and instant collaboration. Whether you're supporting customers, managing internal operations, or streamlining cross-functional feedback loops—Thena makes Slack your command center.
No more swivel-chairing between tools. No more missed messages. Just total control, tailored automation, and deep configurability—all where your team already works.
**Important**: You must complete Steps 1-2 (installing to the organization and connecting workspaces to teams) before you can access the team-specific Slack configuration settings in Steps 3-7.
## Step 1: Connect your Slack workspace
Organization > Sources
Navigate to Organization settings > Sources > Slack. From here:
* Click Install to set up the Slack app.
* Once installed, connect one or more Slack workspaces to Thena.
## Step 2: Assign Slack workspaces to teams
Organization > Sources
Each team in Thena (like Customer Support, Solutions, or Product) can connect to one or more Slack workspaces.
* You can assign a single Slack workspace to multiple Thena teams.
* Each team will then manage its own Slack configuration independently.
**Why this matters:**
Different teams have different workflows. Support might want auto-ticketing from shared customer channels, while Product prefers structured form-based creation. Thena gives every team their own control panel.
## Step 3: Configure Slack channels
Teams settings > Sources > Slack
Each team can now configure Slack channels. You can:
* Select customer channels – messages from customers become tickets.
* Configure internal helpdesk channels – handle employee requests.
* Set up triage channels – receive updates, not ticket creation.
**Why this matters:**
By defining channel roles, you eliminate clutter and create a focused, intentional ticketing experience. Only the right messages become tickets.
## Step 4: Choose ticket creation strategies
Teams settings > Sources > Slack
You control how tickets get created:
Every new message triggers a ticket.
React to start ticketing.
Use a mention to open a ticket.
Open a form to create a ticket.
Enforce structured input.
You can also define a conversation grouping window, so multiple related messages in a short timeframe get merged into one ticket.
**Why this matters:**
One size never fits all. This gives teams the precision to create structure when needed, and speed when it matters. Whether you're tracking bugs or routing partner requests, you decide how the work begins.
## Step 5: Map Slack groups to Thena groups
Teams settings > Sources > Slack
Route tickets directly to the right Thena group when someone tags a Slack group.
* Map Slack user groups (e.g., @support-engineers) to Thena groups (e.g., Tier 2).
* When that group is tagged, Thena automatically assigns the ticket.
**Why this matters:**
Automate routing without adding process overhead. Group mentions now double as smart assignment tools. That's efficient.
## Step 6: Set up triage rules
Teams settings > Sources > Slack
Triage channels give you a powerful notification layer inside Slack:
* Send ticket notifications to specific Slack channels.
* Define rules using conditions like priority, sentiment, tags, account owner, and more.
* Route to multiple triage channels.
* Create separate threads in each for internal collaboration.
**Why this matters:**
Triage isn't just visibility—it's collaboration. Get the right eyeballs on the right tickets, instantly. And keep your internal discussions focused and in-thread.
## Step 7: Use AI prompts to automate ticket enrichment
Teams settings > Sources > Slack
Enable the AI prompts section to:
* Detect ticket-worthy messages.
* Automatically generate a clean, clear title.
* Fill in description based on the conversation.
* Predict sentiment (positive, neutral, negative).
* Determine urgency level.
**Why this matters:**
Your agents should solve problems—not fill out forms. Thena's AI handles the busywork, so your team can focus on outcomes.
## Summary
Thena's Slack integration doesn't just check boxes—it rewrites the rulebook. With team-level config, channel-based logic, smart creation modes, rule-based triage, intelligent group routing, and AI-powered enrichment, Thena gives you the deepest Slack integration available today.
Modern teams deserve tools that move as fast as they do. Thena turns Slack into your team's powerhouse engine for customer experience, operations, and success—built natively for how the best work gets done.
## Frequently asked questions
Yes, you can create a ticket from any Slack message by:
1. Hover over the message.
2. Click the three-dots menu.
3. Select the “Assign to” or “Inspect message” shortcut.
4. Choose a team member in Thena.
This will automatically create a ticket and assign it to the selected member, streamlining your support workflow without leaving Slack.
Yes, you can verify if a message has been detected as a ticket by:
1. Hover over the Slack message.
2. Click the three-dots menu.
3. Select the "Inspect message" shortcut.\
You'll see ticket details including:
* Ticket ID
* Status
* Priority
* Team
* Assignee
* Creation date
* Requester
* Form details
* Link to the ticket
If the message hasn't been detected as a ticket (typically because it was sent by a team member), you'll see an option to create a ticket instead.
If automatic ticket creation is enabled but tickets aren't being created, this is likely due to missing mandatory fields in your team's default form. Here's what happens:
**The issue:** Your default form for the team in Thena has certain fields marked as mandatory at the time of ticket creation. Since you've enabled automatic ticket creation without requiring forms for Slack ticket creation, a message could not be auto-converted because of the missing mandatory field.
**Example:** If the "Organization ID" field is marked as mandatory in your team form and automatic ticket detection is on, but the form requirement is off, then Slack has no way to fill this Organization ID data on its own.
**Recommended actions:**
1. Update the default form for your team so those fields are no longer mandatory at the time of ticket creation, or
2. Enable "Require forms" for Slack ticket creation to ensure all mandatory fields are filled before creating tickets.
This ensures either the fields are optional for automatic creation or users are prompted to fill them via forms.
If you receive a "Permission Denied" error when attempting to create a ticket via Thena, this indicates that your account does not have the required privileges for ticket creation.
**Root cause:** This typically occurs when you are on a Lite user role, which does not include ticket creation permissions.
**What happens:** When a lite user attempts to create a ticket, the system returns a status 403: Forbidden error and sends an ephemeral message in the channel:
> ⚠️ **Permission Denied**\
> @user, you attempted to create a ticket via Thena, but your account does not have the required privileges. You are currently on a Lite user role, which does not include ticket creation permissions. Please reach out to your workspace administrator for assistance.
**Solution:** Contact your workspace administrator to upgrade your user role or request the necessary permissions for ticket creation.
# Web chat
Source: https://docs.thena.ai/guides/sources/web-chat
AI-native support experience embedded into any website or web app
The Web Chat widget is an AI-native support experience that can be embedded into any website or web app. It empowers users to engage instantly with an AI agent who can respond using your uploaded documentation, and if needed, gracefully hand off to a human agent by creating a support ticket.
Instant AI-powered responses using your own documentation
Seamless handoff to human agents when needed
Fully customizable appearance to match your brand
Easy deployment with a simple JavaScript snippet
## Setup guide
Follow these simple steps to enable Web chat for your organization:
1. Go to Organization > Click Sources
2. Enable Web chat > Select team
3. Once you are in Team settings > Configure how you want Web chat to look like
4. Once that is done, just Copy the script and deploy it in your End of `` tag
You can configure how the widget looks to match your brand's identity and design guidelines.
Logo
Add your company's logo using a public URL. Supported formats include SVG, PNG, JPG, JPEG, and WebP. This logo appears at the top of the chat interface for a fully branded experience.
Theme color
Set a start and end hex color to define your theme gradient. You can use a solid color (by leaving the end color empty) or a gradient with a custom direction (e.g., 135deg).
Position on screen
Choose where the chat widget appears. The default is bottom right, but other positions are available depending on your site layout.
Widget type
Select between Thena's default widget or link the chat experience to a custom launcher on your site.
Behavior toggles
Use custom launcher button: Replace the default launcher with your own UI element.
Initial dark mode: Automatically open the widget in dark mode.
Auto-close on outside click: Automatically close the chat when users click outside the widget.
You can shape how the AI agent interacts by configuring its prompt under the "Agent configuration prompt" section. This allows you to:
Define the tone and style of communication: Ensure the AI's personality aligns with your brand voice.
Set boundaries: Control what the AI can and cannot discuss to keep conversations on-topic.
Guide responses: Instruct the AI on how to handle specific types of queries for consistent support.
The prompt acts as instructions for your AI agent, making it feel less robotic and more like a genuine brand ambassador for your company.
Allowed domains
You must specify allowed domains to secure your deployment. These should include the full URL (http or https) for each site where the widget will be embedded.
Installation code
Once you've configured the widget, you'll get a JavaScript snippet to add to your website. This code includes:
Your unique widget ID
Color configuration and UI behavior (e.g., gradient direction, dark mode)
Optionally, HMAC-based verification for secure identity handling
HMAC Authentication for User Identity
For enhanced security, you can use HMAC (Hash-based Message Authentication Code) to verify user identities. This prevents unauthorized users from impersonating others in your chat widget.
Step 1: Generate the HMAC hash on your server
You need to hash the pair of email:username with your HMAC secret. Here's a sample implementation:
Step 2: Include the hash in your widget configuration
This hash is then sent in the SDK initialization code as shown below:
```html theme={null}
```
The HMAC hash must be generated server-side using the format `email:username` and your secret key. Never expose your HMAC secret in client-side code.
Security considerations
The HMAC secret key is shown only once and must never be exposed in client-side code. Store it securely on your server and use it to generate valid hashes.
Chat Widget
Once the widget is deployed, your users can interact with it directly from your website.
AI-native interactions
The AI agent responds using your uploaded documentation and custom prompt. Whether it's FAQs, onboarding steps, or advanced product guidance, your AI agent becomes a 24/7 frontline support companion.
Human agent handoff
When needed, the AI can initiate a handoff by creating a support ticket. Once a ticket is created:
The conversation is logged.
A human agent can take over the chat seamlessly from within the same widget.
The user experiences no disruption in their conversation.
As seen in the example with James, the AI agent gathered initial input, created a ticket, and handed it off to Jackson, a real human agent.
Image attachments
The Web chat widget supports image attachments, allowing users to share visuals for clearer communication. Supported formats include PNG, JPEG/JPG, GIF (non-animated), WebP, and BMP (partial support).
We'll be expanding support for additional file types in future updates.
Unread message notifications
The widget helps users stay updated with unread message notifications. A badge on the floating widget shows the number of conversations with new replies.
Inside the widget, a red dot highlights the specific chats that have new messages.
## A well-rounded AI-native chat experience
Delivers immediate responses based on your own documentation and content.
Reflects your brand visually and conversationally with customizable appearance and tone.
Knows when to escalate to a human agent and does so with full context preserved.
Blends automation and empathy—users get help quickly, and your team focuses on conversations that matter.
# AI logs
Source: https://docs.thena.ai/guides/ticketing/ai-logs
Transparent, traceable AI agents.
The AI logs tab is a dedicated view inside each ticket, shown alongside the Conversation, Notes, and Activity tabs. It captures every action taken or attempted by AI agents, providing a transparent audit trail of automated activity.
This tab ensures full visibility into how AI contributes to ticket handling—from small updates to high-impact decisions.
## Why it matters
AI agents can streamline and accelerate customer support, but transparency is non-negotiable. The AI logs tab gives your team a reliable source of truth for everything the AI touches—making it easy to review, verify, and trust automation at scale.
It's not just about documenting actions; it's about accountability and explainability.
## What gets logged
AI logs are designed to record everything an AI agent does—from operational tasks to decision-making attempts. The current examples include:
* **Status changes**\
When the AI updates the ticket status, such as moving it to Pending customer reply.
* **Fallbacks to human agents**\
If the AI defers to a human due to a policy constraint, confidence issue, or unknown intent.
* **Custom field updates**\
Setting fields like "Issue category" or product tags.
* **Ticket associations**\
Linking related tickets to provide context or history.
* **Summaries and notes**\
When the AI generates internal notes or conversation summaries.
These are just the beginning. As AI agents evolve, this tab will continue to capture a growing range of intelligent behaviors—such as automated escalations, workflow triggers, multi-language responses, proactive outreach, and more. If the AI does it, it gets logged here.
Each entry includes who (or what) acted, when it happened, and often, why—via the Show reasoning link.
## Show reasoning
When enabled, the Show reasoning option reveals the AI's internal decision path—whether it was a confidence threshold check, a policy application, or a fallback rationale. This gives support managers and admins the insight they need to improve AI performance and tune behavior over time.
## Use cases
Track and audit AI performance just like you would with human agents.
Meet auditability standards with a log of who did what, and why—even when "who" is an AI.
Surface decision-making blind spots or overly strict policies that block automation.
Help new support reps quickly understand the AI's activity before jumping into a ticket.
# Auto-responder
Source: https://docs.thena.ai/guides/ticketing/auto-responder
The most advanced multi-channel response automation for modern support teams.
The auto-responder is the most advanced multi-channel response automation built for modern support teams. It gives you precise control over when, how, and where customers receive automatic replies—whether during holidays, after hours, or when assigned agents are unavailable.
Auto-responses are sent directly on the same channel the ticket originated from—Slack, MS Teams, or email. They are sent by a bot that adopts your organization's name and icon by default, so make sure those are configured before you turn it on.
## What makes it powerful
Supports both ticket created and message received as trigger types, giving you precise control over when responses are sent.
Automatically replies based on the original channel—Slack, MS Teams, or email—maintaining a consistent experience for customers.
Messages are sent by a bot named after your organization with its logo, ensuring professional and consistent communication.
Rules can be triggered during holidays, outside business hours, or when an agent or group is unavailable.
Target responses based on priority, tags, assignee, or ticket title to tailor messages for specific scenarios.
Configure holiday-specific auto-responders in advance, so they activate automatically when needed.
All rules are visible in one place and can be easily managed, providing a clear overview of your automation.
Auto-response messages support rich text formatting like bold, italics, and lists for more effective communication.
## Step-by-step: how to create an auto-responder rule
Navigate to Settings → Customer support → Auto-responder.
If no rules exist, you'll see a blank state. Click the button to begin.
Give the rule a clear name, like "Memorial Day autoresponder".
Pick one:
When a ticket is created: responds when a new ticket is submitted.
When a message is received: responds when a message is sent on an assigned ticket.
Apply conditions to control when the response is sent:
Outside business hours.
During holidays (you can select specific holidays).
When assigned member is unavailable or on leave.
When assigned group is unavailable or on holiday.
Add targeting filters such as:
Ticket status, priority, or type.
Tags, assignee, or escalation status.
Customer email, account, or AI-generated summaries.
Use rich text to format your message.
Example:
Thanks for your message!
Our team is currently out for Memorial Day and will return on Tuesday. We'll get back to you shortly.
Your rule is now live and will respond based on the conditions you set.
## Example use cases
Trigger: When a ticket is created
Message: "Thanks for reaching out. We've received your request."
Trigger: Ticket created
Condition: During holidays → July 4th
Message: "We're offline today for Independence Day. We'll respond as soon as we're back."
Trigger: Message received
Condition: Outside business hours
Message: "Hey! Our team is currently offline. We'll get back to you during our working hours."
Trigger: Ticket created
Filter: Account plan field is "Basic"
Message: "Thank you for contacting us. As a Basic plan user, your request will be addressed within 48 hours. To receive faster support, consider upgrading to our Premium plan."
# CSAT
Source: https://docs.thena.ai/guides/ticketing/csat
Measure customer satisfaction and improve your support quality.
## Overview
Customer Satisfaction (CSAT) surveys help you gather valuable feedback from customers after support interactions, providing insights to improve your service quality.
✨Comprehensive CSAT solution
Create targeted rules to collect feedback at the right time from the right customers.
Trigger surveys based on ticket properties like status, priority, or sentiment
Deliver surveys via Slack or email based on ticket source
Customize survey content, delivery cadence, and sampling logic
Add cooldowns to prevent survey fatigue
## Creating CSAT rules
Go to the CSAT section and click "Create new rule." You'll be guided through five sections: basic information, filters, survey delivery, feedback form, and preview.
This section defines the metadata of your CSAT rule:
Rule name: Give your rule a recognizable name, such as "High priority tickets."
Description: (optional) Add any context for your team.
Active toggle: Only active rules will send CSAT surveys. Inactive rules will be saved but not executed.
Filters define which tickets are eligible to receive a CSAT survey.
Match all conditions
All conditions in this group must be true to trigger a survey. For example:
Priority equals High
Status equals Resolved
Type equals Incident
You can apply filters on ticket, account, or contact fields.
Match any conditions
If any condition in this group is true, the survey will be triggered. For example:
Sentiment contains Positive
This is useful when you want broader but still targeted coverage.
This section defines how often CSAT surveys are sent once tickets meet the filter conditions.
Random sampling
Send CSATs to a subset of eligible tickets:
1 out of 10 tickets (10%)
1 out of 5 tickets (20%)
Use this to reduce survey fatigue or for A/B testing.
Always send
Send a CSAT for every ticket that meets the criteria—no sampling involved.
This section lets you define the survey format and appearance.
Choose feedback type
5-star rating: Ask customers to rate their experience from 1 to 5 stars.
Thumbs up/down: Ask for a simple positive or negative response.
Choose delivery channel
Source-based delivery:
If the ticket is from Slack, the CSAT survey is sent in the ticket thread as an ephemeral message that mentions the requester.
If the ticket is from email, the survey is delivered via email.
Email override:
You can force all CSATs to be delivered via email, regardless of where the ticket originated.
Customize survey content
You can modify the following elements:
Survey title (e.g., "How would you rate your experience?")
Survey message (e.g., "Please let us know how we did with your recent support request.")
Thank you message
Branding color: This controls the primary color used for buttons and rating icons.
Comment field: You can enable an optional open-text field for additional feedback.
Customize the field label and placeholder text.
Click the "Preview" tab to see how your CSAT survey will appear to customers.
Email preview shows the subject, ticket details, rating component, and optional comment field.
Slack preview shows how the survey will be delivered as a message in the requester's thread.
You can switch between email and Slack views to compare formats.
Click "Settings" from the CSAT overview screen to configure global rules that apply to all CSATs.
Delivery delay
Set how many days after a ticket is closed a CSAT survey should be sent (e.g., 14 days). This gives customers breathing room before being asked for feedback.
Customer cooldown
Set a cooldown period (e.g., 10 days) to ensure a customer doesn't receive multiple CSATs within a short timeframe. This prevents survey fatigue.
Trigger statuses
Choose which ticket status triggers the CSAT survey. By default, surveys trigger on Closed tickets.
Sender email
Decide which email address will be used to send CSAT surveys. You can use the default or configure a custom one.
Once everything is configured:
Click "Create rule" to save your setup.
Make sure the rule toggle is set to Active if you want it to go live immediately.
## Key features
Delivered in the ticket thread as an ephemeral message with a requester mention.
Sent directly to the requester's email with customizable design.
Option to always send CSATs via email, regardless of ticket source.
Prevents the same customer from receiving CSATs too frequently.
Controls how soon after ticket closure the CSAT is sent.
Target specific tickets based on custom logic (e.g., sentiment, priority).
Choose between 100%, 20%, or 10% of qualifying tickets.
Fully customizable survey content, colors, and comment settings.
## Best practices
Set appropriate delivery delays to give customers time to experience the full impact of your solution.
Use cooldown periods to prevent survey fatigue.
Consider sending surveys shortly after resolution for technical issues, but allow more time for complex solutions.
Use filters to target specific ticket types that would benefit most from feedback.
Consider sampling for high-volume, low-complexity tickets.
Always survey after critical incidents or high-priority tickets.
Keep surveys short and focused.
Use the right delivery channel based on where the customer is most engaged.
Personalize the survey message to increase relevance.
Make the comment field optional to reduce friction.
# Customer portal
Source: https://docs.thena.ai/guides/ticketing/customer-portal
Empower your customers with a dedicated portal to create, view, and manage their requests.
## What is the customer portal?
The customer portal in Thena provides a dedicated, secure space for your customers to create, manage, and track their support requests. It streamlines communication, ensures transparency, and empowers customers to find the information they need, when they need it.
With the portal, you can:
* Offer a branded, self-service experience
* Control which teams and forms customers can access
* Manage user access with role-based permissions
* Centralize all customer communication in one place
## Enabling the customer portal
To get started, you'll need to enable the customer portal for specific accounts.
1. **Navigate to Accounts page**: Click on an account from the accounts list.
2. **Find customer portal settings**: Look for the Customer Portal section.
3. **Enable and configure**: Toggle the portal on and select the teams the customer should have access to. This ensures they can only submit tickets to the relevant teams.
You can update team access anytime, giving you full control over what your customers can see and do.
Only admins on the vendor side have the ability to enable the customer portal for an account.
## User management
Managing who has access is simple and secure.
You can invite customer contacts to the portal directly from the account table or from the account page. They will receive an email invitation to set up their password and log in.
Only admins on the vendor side can invite users to the customer portal.
The portal supports two user roles:
* **Customer admin**: Can invite other users from their organization and has full visibility into all tickets for their organization.
* **Customer user**: Can create and view their own tickets. Cannot invite other users.
Access is managed at the account level. You can easily revoke access or resend invitations as needed. All user management is handled securely, ensuring only authorized individuals can access the portal.
## Logging into the portal
Customers can log in to the portal by navigating to [dashboard.thena.ai](https://dashboard.thena.ai). They can use their username and password or sign in with an SSO provider like Google.
## Key features for customers
### Simplified ticket creation
Customers can create new tickets through a streamlined and intuitive process:
* **Guided flow**: The "New ticket" dialog guides users through selecting the right account and team.
* **Dynamic forms**: Based on the team selected, the appropriate form is shown, ensuring the right information is collected upfront.
* **File attachments**: Users can easily attach files, screenshots, or logs to provide additional context.
### Centralized ticket view
All tickets are centralized in a clean, easy-to-navigate list view. Customers can:
* See all their requests in one place
* Filter tickets by team or search for specific requests
* View ticket details and the latest updates
### Anywhere links
Thena makes link sharing simple with unified URLs. A single ticket link, like `https://dashboard.thena.ai/dashboard/T54BFQRJAY?ticketId=R12AB34C56DEF78G90HIJ12KL34MN56O`, works for everyone.
* **For vendors**: The link opens the ticket in the standard Thena dashboard.
* **For customers**: The same link directs them to the ticket view in their customer portal.
This eliminates confusion and ensures everyone gets to the right place with a single click.
### Seamless communication
Customers can interact with your team directly on the ticket, ensuring all communication is tracked and centralized. Replies are updated in real-time, and notifications keep everyone in the loop.
## Why use the customer portal?
Provide a professional, branded, and easy-to-use portal for your customers to interact with your support team.
Streamline your support process by collecting the right information upfront and ensuring tickets are routed to the correct teams.
Give customers full visibility into the status of their requests, reducing the need for follow-up emails and calls.
Ensure customers only see the information relevant to them with robust access controls and permissions.
# Emoji actions
Source: https://docs.thena.ai/guides/ticketing/emoji-actions
Use emoji reactions to quickly perform common ticket actions.
Emoji actions in Thena allow your team to perform common ticket operations with a simple emoji reaction, saving time and streamlining your workflow.
## How emoji actions work
✨ Add specific emoji reactions to ticket messages to trigger actions automatically.
Change ticket status.
Status changes are performed instantly and recorded in the ticket timeline for transparency.
Mark the ticket as resolved.
Change a resolved ticket back to open status.
## Customizing emoji actions
Navigate to Settings → Ticketing → Emoji actions in your Thena dashboard.
See the list of all configured emoji actions and their associated operations.
Click "Add new action" to create a custom emoji-triggered workflow.
Select an emoji, define the action it should trigger, and set any additional parameters.
Try your new emoji action on a test ticket to ensure it works as expected.
## Status change with emoji
Use emoji reactions to change ticket status.
Quickly move tickets between open and resolved states.
Status changes are recorded in the ticket timeline.
Configure status change emoji actions for different teams.
Customize status workflows based on team needs.
## Popular use cases
Streamline status changes.
Teams use emoji actions to speed up these common scenarios:
Quickly resolving completed tickets.
Reopening tickets that require additional attention.
Managing ticket status transitions efficiently.
## Tips for emoji action success
Choose emoji that naturally represent the action they trigger.
Create a quick reference guide for your team's emoji actions.
Begin with a few essential actions before adding more complex ones.
Regularly ask your team which actions would be most helpful.
See how emoji actions help streamline status changes.
Measure efficiency gains from using emoji shortcuts for status changes.
# Export tickets
Source: https://docs.thena.ai/guides/ticketing/export-tickets
Export your tickets to CSV format for analysis, reporting, and external processing in Thena.
## Overview
The ticket export feature in Thena allows you to download all tickets from your current view as a CSV file. This powerful tool enables you to analyze ticket data, create reports, and integrate with external systems for comprehensive support management.
Export all ticket information including core fields, customer data, SLA tracking, and custom fields in a single CSV file.
Export respects your current view filters and date ranges for targeted data analysis and reporting.
## Accessing the export feature
The export functionality is available in the secondary header of your ticket dashboard:
1. Navigate to your team's ticket dashboard.
2. Apply any filters or views to narrow down your ticket selection.
3. Look for the download icon in the top-right corner of the secondary header.
4. Click the download button to initiate the export process.
The export will include all tickets currently visible in your view, respecting any active filters, or date ranges you've applied.
## What gets exported
All core ticket information is included automatically in every export.
Team-specific custom fields are dynamically added based on your configuration.
When you export tickets, the CSV file includes comprehensive ticket data with the following information:
* **Ticket ID**: Unique identifier for each ticket
* **Title**: The ticket subject line
* **Description**: Full ticket description content
* **Status**: Current ticket status
* **Priority**: Assigned priority level
* **Type**: Ticket type classification
* **Source**: Channel where the ticket originated
* **Assigned Agent**: Name of the assigned support agent
* **Assigned Agent Email**: Contact email of the assigned agent
* **Team**: The team handling the ticket
* **Account Name**: Associated customer account
* **Contact Name**: Primary contact person
* **Contact Email**: Customer's email address
* **Account Owner**: Account owner information
* **Account Website**: Customer's website
* **Account Industry**: Industry classification
* **Created At**: When the ticket was first created
* **Updated At**: Last modification timestamp
* **Due Date**: SLA due date if applicable
* **SLA First Response Status**: First response SLA compliance
* **SLA Resolution Status**: Resolution SLA compliance
* **Is Escalated**: Whether the ticket has been escalated
* **Is Private**: Privacy status of the ticket
* **Story Points**: Effort estimation if configured
* **Tags**: All associated ticket tags
* **CSAT Rating**: Customer satisfaction rating
* **CSAT Comment**: Customer feedback comments
All custom fields configured for your team are automatically included in the export, with the following considerations:
* **Field values**: Actual values for text, number, and selection fields
* **Option mapping**: For dropdown and radio fields, exports show the display values rather than internal IDs
* **Multi-value support**: Fields with multiple selections are separated by semicolons
* **File exclusion**: File upload fields are excluded from exports for security and size considerations
## File format and compatibility
* **File naming**: Exported files are automatically named using the pattern:`{team-name}-{date}-{time}.csv`
* **Encoding**: UTF-8 with BOM for maximum compatibility
* **Delimiter**: Comma-separated values
* **Text handling**: Automatic escaping of special characters and line breaks
* **Date format**: Standardized YYYY-MM-DD HH:mm:ss format
If no tickets match your current filters or view, you'll receive an error message and no file will be generated.
For large datasets, consider exporting in smaller batches using date ranges or status filters to improve processing speed and file manageability.
# Forms
Source: https://docs.thena.ai/guides/ticketing/forms
Define what information is collected when a ticket is created.
Forms in Thena allow teams to define what information is collected when a ticket is created. From capturing customer inputs to internal triage details, Forms help ensure every ticket starts with the right context.
## What are forms
Forms are customizable layouts used to collect structured data from users—whether customers, agents, or teammates. Each form consists of one or more fields, and you can define who can view, edit, or be required to fill them.
Forms are used:
During ticket creation (web, Slack, chat, or API).
To control what appears in the ticket view.
To guide agents and customers through dynamic data capture.
To power downstream automation, workflows, and analytics.
## Fields in forms
Before creating a form, you need fields.
Standard fields (built-in by Thena)
Requester (mandatory)
Title (mandatory)
Status
Assignee
Account
These are common across all tickets.
Custom fields (user-defined)
You can define custom fields to match your specific workflow:
Text inputs
Dropdowns
Date pickers
Multi-selects
Toggles
Cascading fields based on logic
For detailed information on standard fields and how to create custom fields, see the Ticket fields guide.
## How to create a form
Navigate to Settings → Forms.
Click "Create form".
Name your form.
Give a description.
Requester and Title are mandatory.
Add any standard or custom fields needed for your workflow.
Use drag-and-drop to reorder.
For each field, configure:
Visible in customer portal
Editable by requester
Required on creation
Required on close
Add logic to dynamically show or hide fields.
Example: Show "Escalation reason" if Priority = High.
Conditions override default field settings.
Instantly toggle between Agent view and Requester view.
Once saved, the form becomes selectable during ticket creation.
## Where forms are used
Agents can choose team and form at ticket creation.
Form is shown as per visibility rules.
Slack modal opens if enabled.
Form questions embedded in chat.
Submit structured form data programmatically.
## What happens after a form is used
Forms unify the ticket creation experience—no matter where it starts.
Once a ticket is created with a form:
The form appears on the right-hand panel of the ticket.
Agents can view or switch forms.
Fields reflect form-level visibility, permissions, and logic.
Customers can update editable fields via the customer portal.
All updates sync in real time and are fully auditable.
## Best practices
Use forms to enforce consistent ticket intake across teams.
Create templates for common ticket types.
Establish naming conventions for fields and forms.
Use field descriptions to guide users.
Keep forms as short as possible while capturing necessary information.
Group related fields together for better user experience.
Use conditional fields to show relevant fields based on input.
Create team-specific forms (e.g., Customer Support vs IT).
Regularly review and prune unused fields/forms.
Align forms with the metrics you want to report on.
Include fields that will help with categorization and analysis.
Consider how form data will be used in dashboards and reports.
## Example use cases
Product version
Type of issue (bug, feature request, feedback)
Customer segment
Steps to reproduce
Urgency level
Preferred contact time
Device or asset ID
Affected system or app
Error message or code
Is this blocking work? (Yes/No)
Location (onsite or remote)
Desired resolution time
Forms in Thena are your system of record for clean, contextual, and actionable support data—across every channel and every team. Whether you're scaling customer operations or managing internal IT requests, Forms give you structure, clarity, and measurable insight.
# Groups
Source: https://docs.thena.ai/guides/ticketing/groups
Split teams into specialization and timezones.
Groups are sub-teams within a Team—built for structure, specialization, and smart routing.
Use Groups to segment team members by skill, function, or region. Each group runs on its own rules for availability and assignment.
## Configuration
Every group has its own:
* 👥 **Members**\
Add specific users to each group. A user can belong to multiple groups.
* 🕒 **Working hours**\
Set custom hours to reflect when the group is active and available for assignments.
* 🌐 **Timezone**\
Align working hours with the group's local time.
* 📅 **Holidays**\
Define regional or team-specific non-working days.
* 🎯 **Assignment logic**\
Choose how tickets are distributed within the group—round-robin, load-based, or manual.
## Why use Groups?
Regional support teams (e.g. APAC, EMEA, NA)
Function-based squads (e.g. Billing, Technical, Licensing)
Managing SLAs and load distribution across large teams
Groups ensure the right request lands with the right people—on time, every time.
# Internal threads
Source: https://docs.thena.ai/guides/ticketing/internal-threads
Move faster with internal conversations linked directly to tickets.
Internal threads in Thena give your team a focused space to collaborate on a customer ticket without disrupting the external conversation. You can keep it fully internal or optionally link it to a Slack channel for real-time collaboration.
## What are internal threads?
✨ Internal threads live within a ticket and are meant for internal discussion. You can:
Loop in other teams like engineering or product.
Share updates or decisions.
Attach files or media.
Link discussions to Slack channels.
These threads are only visible to your internal team—customers never see them.
## How internal threads work
⚙️ From Thena:
Open any ticket from your Customer support → Tickets view.
Click on the Internal threads tab.
Start a new thread or view existing ones.
Optionally connect the thread to a Slack channel for live triage.
If triage is enabled on your workspace, a default internal thread is auto-created and connected to the appropriate Slack channel.
## Connecting to Slack
A triage block appears in the Slack channel with a summary of the customer request.
The Slack thread under that triage block becomes the internal thread.
You can reply in Slack or Thena—messages stay fully synced.
🔍
View ticket
Open the ticket directly in Thena.
📊
See metadata
View ticket details and context.
⚡
Take action
Assign, resolve, or update status.
## Supported features in internal threads
Format messages with bold, italic, lists, and more.
Share documents and files directly in threads.
Include screenshots and visual references.
Tag teammates to loop them into discussions.
Update or remove messages after sending.
Connect threads to Slack for real-time collaboration.
Create separate threads for different aspects of a ticket.
Automatic thread creation for triage-enabled tickets.
## Real-time sync with Slack
Send messages from either platform.
Update messages after sending.
Remove messages from either platform.
Share documents and visual content.
Tag teammates in discussions.
Post as yourself when authorized.
If someone is mentioned in an internal thread, they'll receive a notification (as long as they've enabled notifications in their settings).
## Pro tips
Use internal threads to handle complex issues without cluttering customer-facing messages.
Keep your Slack channel selection purposeful (e.g. #eng-bugs, #product-feedback).
Ensure Slack auth is enabled to maintain your identity across platforms.
## Use cases
Loop in engineering teams to troubleshoot technical issues without exposing technical details to customers.
Document solutions and workarounds for similar issues that might arise in the future.
Coordinate escalation paths and gather necessary context before transferring tickets to specialized teams.
Use threads to provide feedback to team members on their customer interactions without customers seeing it.
Record why certain decisions were made for future reference and accountability.
# Move tickets
Source: https://docs.thena.ai/guides/ticketing/move-tickets
Transfer tickets between teams while preserving context and maintaining communication continuity.
Moving tickets between teams in Thena enables seamless handoffs when customer issues require specialized expertise, escalation, or different departmental ownership. Whether it's escalating a support ticket to engineering or transferring a billing inquiry to finance, ticket moves preserve all context while ensuring the right team takes ownership.
## What ticket moving does
When you move a ticket between teams, Thena creates a new ticket in the destination team while preserving all conversation history, attachments, and context from the original ticket while archiving the current ticket.
The process ensures:
* Complete conversation history transfers to the new team.
* Customer communication continues seamlessly on the same channel.
* Both tickets are linked as related for a full audit trail.
* Team-specific workflows and SLAs are applied immediately.
## Why move tickets between teams
Route complex technical issues from support to engineering teams for deeper analysis.
Transfer billing questions from support to finance, or product feedback to product teams.
Move high-priority issues to specialized teams with faster SLAs or senior expertise.
Each team's performance is measured independently without cross-team SLA confusion.
## How to move a ticket
Navigate to any ticket that needs to be transferred to another team.
This is located in the top-center of the ticket view.
A dialog will appear showing compatible destination teams.
Select from the list of teams where you have permission to move tickets. Private teams require membership.
Click "Move ticket" to start the migration process. You'll be redirected to the new ticket automatically.
Use Shift + M to quickly open the move ticket dialog on any ticket.
You can only move tickets to teams that you are a part of. If you want to move a ticket to a team you don't have access to, join the team first, and then move the ticket.
## Bulk move tickets
When you need to move multiple tickets at once, Thena provides a bulk move feature that lets you select and migrate several tickets to the same destination team in one operation.
Switch to list view and use the checkboxes on each ticket card to select the tickets you want to move.
Once you have tickets selected, click the "Move" button that appears in the bulk actions toolbar at the bottom.
The dialog shows a summary of your selected tickets with their eligibility status. You'll see which tickets can be moved and which cannot, along with reasons for any restrictions.
Select the destination team from the dropdown. Only teams compatible with all eligible tickets will be available.
Click "Move X Tickets" to start the process. You'll see real-time progress as each ticket is migrated.
You can close the migration dialog and let bulk moves run in the background. The system will continue processing all eligible tickets even if you navigate away.
## What happens during a move
A new ticket is created in the destination team with a new ticket number.
The original ticket is archived and marked with migration details.
Both tickets are automatically linked as related for a complete audit trail.
All conversation history is copied to the new ticket.
File attachments and internal notes are transferred.
Internal threads from both Slack and the platform are also transferred.
Custom field values specific to a team are not transferred.
Ticket activity records the migration for both tickets.
The destination team's SLA timeline starts fresh.
The source team's SLA is paused and CSAT surveys are cancelled.
The new team's auto-responders and workflows are applied.
Team-specific statuses, priorities, and types are mapped.
## Smart ticket restoration
**Returning to original teams**
When moving a ticket back to a team it was previously in, Thena intelligently restores the original ticket instead of creating a new one. This maintains the original ticket number for customers and resumes the SLA from where it was paused.
For example: SUP-123 → SEC-456 → SUP-123 (restored)
## Real-world examples
Scenario: A customer reports a login issue that appears to be a backend bug.
The support team creates the initial ticket SUP-245.
After initial triage, they move it to Engineering as ENG-892.
The engineering team gets the full context and can reproduce the issue.
The customer continues communicating in the same Slack thread.
Both teams maintain separate SLA and performance metrics.
Scenario: A customer requests a refund through general support.
Support receives the request as SUP-156.
They move it to the Billing team as BILL-089.
The billing team sees all previous customer communication.
The customer receives the Billing team's auto-responder with updated expectations.
Finance processes the refund with complete context.
Scenario: A customer suggests a feature improvement during a support interaction.
Support documents the feedback in SUP-301.
They move it to the Product team as PROD-78.
The product team can analyze the feature request with customer context.
The original support ticket is resolved, and the product ticket continues internally.
The customer stays informed about their feature request.
## Important considerations
🎯 Ticket number changes
Customers will see a new ticket number when communicating about the issue (e.g., SUP-123 becomes SEC-456). However, they continue using the same communication channel.
⏰ SLA timeline reset
The destination team gets a fresh SLA timeline, which may extend the total resolution time from the customer's perspective.
🔐 Team permissions required
You can only move tickets to teams where you have access. Private teams require membership.
📋 Form compatibility
Custom field values transfer when compatible between team forms. Incompatible fields are preserved in the archived ticket.
# Proactive tickets
Source: https://docs.thena.ai/guides/ticketing/proactive-tickets
Reach out to customers proactively with tickets that initiate conversations.
## Overview
Proactive tickets allow your team to initiate conversations with customers by creating tickets that automatically notify them through email or other channels. Unlike regular tickets that respond to incoming requests, proactive tickets let you reach out first—whether to share updates, follow up on issues, or provide proactive support.
Instantly notify customers via email when you create proactive tickets, ensuring immediate delivery of your outreach.
Customers can reply directly to proactive emails, creating new comments in the ticket for seamless conversation threading.
Create proactive tickets programmatically using the Thena API with customizable parameters for automated customer outreach.
Flexible email handling with specialized threading and unified ticket experience for all message types.
## Creating proactive tickets
You cannot send proactive tickets without an email configuration. Set up your team's email configuration to send proactive emails to customers. Navigate to **Team settings > Sources > Email** to configure your email settings.
1. **Click the "Create ticket" button in your dashboard**
2. **Select team and form**
* Choose the team that will handle the proactive ticket
* Select the appropriate form for your outreach
3. **Toggle the "Private" switch to OFF to make it a public proactive ticket**
* If email configuration is missing, you'll see a warning with setup instructions
4. **Fill out ticket details**
* Complete all required fields in the form
* Include the customer's email in the "Requester" field
* Add your message content and any relevant attachments
5. **Create and send**
* Click "Create" to generate the ticket and send the initial notification
* The customer will receive an email with your message immediately
The "Private" toggle controls ticket visibility. When OFF (public), the ticket becomes proactive and triggers an email. When ON (private), the ticket remains internal only.
## Email handling for proactive tickets
Proactive tickets have specialized email handling:
* **First message notification**: The first comment in a proactive ticket automatically triggers an email with the title, description, and ticket ID
* **Standard threading**: Subsequent replies follow normal email conversation rules
* **Bi-directional**: Customers can reply via email, creating new comments in the ticket
* **Unified experience**: All messages appear in the same ticket thread
## Creating proactive tickets via API
You can also create proactive tickets programmatically using the Thena API. Set the following parameters to trigger proactive ticket behavior:
* `isPrivate`: `false` (makes the ticket public)
* `isProactive`: `true` (enables proactive functionality)
* `proactiveChannels`: `["email"]` (specifies the notification channel)
### API example
```bash theme={null}
curl --request POST \
--url https://platform.thena.ai/v1/tickets \
--header 'Content-Type: application/json' \
--header 'x-api-key: enter x-api-key' \
--data '{
"isProactive": true,
"title": "Add the ticket title here",
"description": "Add the optional description here",
"requestorEmail": "requestor.email@example.com",
"teamId": "ACBD1234",
"isPrivate": false,
"proactiveChannels": [
"email"
]
}'
```
Replace `enter x-api-key` with your thena API key and update the `teamId` with your team's identifier that you can find in the URL.
# Related tickets
Source: https://docs.thena.ai/guides/ticketing/related-tickets
Connect conversations across departments, issues, and time zones.
Thena's related tickets feature makes it incredibly easy to connect conversations across departments, issues, and time zones—without breaking a sweat.
## What is it?
Related tickets lets you link any ticket with another ticket across your entire organization, regardless of team or origin (e.g., support, billing, product, sales).
This creates a unified thread of context, so no matter where a conversation starts, it never gets siloed.
## Why it matters
Link internal and external threads to keep teams aligned.
Sales → support → billing? Keep the context alive.
Fewer repeats, faster follow-ups.
Reduce duplication and increase clarity when multiple teams are involved.
## How to use it
Go to the ticket view where you're managing a customer or internal request.
Located in the top-right corner of the ticket view.
A search modal will appear.
Search for another ticket by ID, title, or keywords. You'll also see recent tickets.
Once selected, the related ticket will appear in the related tickets panel on the right.
## Real-world examples
A customer support ticket about a failed login can be linked to a backend bug tracked internally.
A customer request about a refund can be connected to a billing ticket for finance to handle.
A product feature request from a user can be linked to an internal roadmap item or initiative.
## Pro tip
You can relate multiple tickets and remove links just as easily. It's built for scale—whether you're stitching together 2 threads or 20.
# Routing
Source: https://docs.thena.ai/guides/ticketing/routing
Rule based routing to groups and members.
Routing automates how tickets are distributed across your team. With rules and fallback logic, Thena ensures every ticket lands in the right hands.
## Rule-based assignment
Use Routing rules to auto-assign tickets to specific groups based on defined conditions. Rules can be built using events and fields inside Thena—like form selections, tags, or ticket sources.
* Set ALL and ANY conditions
* Match on multiple criteria
* Route to a specific group
Tickets that don't match any rule will stay unassigned unless a default is set.
Assign a fallback Default group to catch any tickets that don't match existing rules—keeping your triage clean and uninterrupted.
## Group-level strategy
Once a ticket is routed to a group using a routing rule, the group's assignment strategy takes over.
Each group controls how tickets are distributed among its members—ensuring clear ownership and faster responses.
Only members of the group are eligible to receive tickets.
## No groups? No problem
If groups haven't been created yet, you can enable an assignment strategy at the team level. This allows tickets to be distributed across all team members until groups are set up.
# SLAs
Source: https://docs.thena.ai/guides/ticketing/slas
SLA automation built for accountability.
## 🔍 What's an SLA policy?
Service Level Agreements (SLAs) in Thena help you define and track response expectations, ensuring your team delivers timely, consistent support. An SLA policy in Thena includes:
* Conditions to define when it applies
* Target metrics for performance tracking
* Advanced options to pause timers when needed
You can create multiple SLA policies tailored to ticket type, priority, or source.
Give your SLA policy a clear, recognizable name to manage and differentiate easily across teams.
## ⚙️ Conditions
Conditions define when an SLA policy should be applied. You can build rules based on any event or field in Thena, giving you complete flexibility.
Common options include:
* Priority
* Sentiment
* Status
* Account
* Custom field
Use match all or match any logic to fine-tune when a policy is triggered.
Whether it's based on form input, ticket source, priority, or sentiment—conditions can be as broad or specific as your workflows require.
## 🎯 Target metrics
Choose which response times matter and set time-based goals for each:
How quickly your team responds to new tickets.
Total time to resolve the ticket completely.
How frequently updates are provided during the resolution process.
How quickly you respond to customer replies.
You can define targets in minutes, hours, or days.
## 🧠 Advanced options
Use pause conditions to temporarily stop the SLA timer. Great for situations like:
* Waiting on customer response
* Internal review
* Blockers outside your team's control
Conditions can be layered using ALL/ANY logic for flexibility.
## 🔔 Live SLA tracking
Once applied, SLAs show up directly on tickets—both in notifications and ticket details:
* ✅ SLA met (e.g., Achieved in 14m)
* 🟨 SLA due soon (e.g., Due in 16m)
* 🔴 SLA breached (e.g., Overdue by 9m)
Your team always knows where things stand—and can take action before it's too late.
# Snippets
Source: https://docs.thena.ai/guides/ticketing/snippets
Create and use snippets to streamline your ticket responses in Thena.
## Overview
Snippets in Thena are reusable text templates that help agents respond to tickets faster and maintain consistency across communications. They can contain formatted text, links, lists, and other rich content that can be quickly inserted into ticket replies.
Team snippets enable standardized responses across your support organization with consistent messaging and faster onboarding for new team members.
Rich content support including text formatting, lists, code blocks, links, headings, and blockquotes for comprehensive responses.
## Create and manage snippets
Admins and agents can create snippets under Team settings > Snippets. Each snippet includes:
* **Name**: A descriptive identifier for easy searching
* **Content**: Rich text content with formatting, links, and lists
* **Accessibility**: Control who can use the snippet (Private or Team)
Only visible to you—perfect for personal templates and frequently used responses.
Shared across your entire team—ideal for standardized responses and company policies.
## Creating your snippets
1. Navigate to Settings > Snippets in your team dashboard
2. Click "Create snippet" to build your first template
3. Add a descriptive name and your content
4. Choose Private for personal use or Team to share
5. Start using snippets in ticket replies with `/snippet`
## Managing your snippets
The snippet management interface provides full control over your templates:
Preview the full content and formatting of any snippet before using it.
Update content, change accessibility, or rename snippets as needed.
Remove outdated or unused snippets to keep your library organized.
Quickly find specific snippets by name using the built-in search functionality.
## Using snippets in conversations
1. In any ticket reply field, type `/` and select the snippet option from the dropdown or type `/snippet`
2. A popup will display all available snippets
3. Search by name to quickly find the right snippet
4. Click to insert the content directly into your message
Use descriptive names for your snippets to make them easier to find when you need them most.
## Rich content support
Snippets support all the formatting options available in Thena's rich text editor:
* **Text formatting**: Bold, italic, strikethrough
* **Lists**: Bulleted and numbered lists
* **Code blocks**: For technical responses
* **Links**: Direct links to resources or documentation
* **Headings**: Structure longer responses
* **Blockquotes**: Highlight important information
# Statuses
Source: https://docs.thena.ai/guides/ticketing/statuses
Learn how to configure and use ticket statuses in Thena.
Statuses define how tickets move through their lifecycle—from creation to closure. They
help your team organize work, track progress, and power automation.
Thena supports custom statuses grouped under four fixed parent categories.
## Parent status categories
Every status must belong to one of these system-defined parents:
Newly created tickets waiting to be processed
Tickets actively being worked on by your team
Tickets temporarily paused or waiting for something
Tickets that have been completed or resolved
### Examples under In progress:
Default status when your team needs to take action
Paused while awaiting customer response
Blocked on technical work or development
Custom statuses let you reflect real ticket states while keeping your board structured.
## Board and swim lanes
Each parent status becomes a swim lane on your ticket board:
* Custom statuses act as filters within each lane
* Tickets can be easily dragged and dropped across statuses
Your team gets a live view of what's active, delayed, or done.
## Updating ticket status
Change status by dragging tickets between columns
Update via dropdown menu in the ticket details
Find the right status with searchable dropdown
Automate status changes based on triggers like customer responses or field updates
Let AI change status based on context and programmed behaviors
## Workflows and automation
Statuses integrate across Thena to automate and streamline your support ops:
Start automations when tickets change status
Set time-based targets for different status types
Create filtered views based on status categories
Track metrics and performance by status
# Tags
Source: https://docs.thena.ai/guides/ticketing/tags
Learn how to use tags to organize and categorize tickets in Thena.
Tags in Thena help you organize and categorize tickets in a flexible, lightweight way—
without needing to rely on rigid fields or workflows. You can tag tickets by theme, issue
type, team context, customer segment, or any other custom label that fits your
operation.
## Create and manage tags
Admins can create new tags under Settings > Tags. Each tag can be:
* Named and color-coded
* Edited or deleted anytime
* Easily searchable from the tag manager
This helps keep your tagging system clean and consistent across teams.
## Where tags show up
Once created, tags can be applied to any ticket. Tags appear in two key places:
Tags show up prominently in boards and lists, making it easy to identify ticket categories at a glance.
Tags are editable within the right sidebar, allowing agents to quickly update categorization.
This makes them perfect for quickly filtering and scanning across large volumes of
tickets.
## Tag usage in workflows
Tags aren't just for visuals—they also work behind the scenes. You can use tags to:
Start workflows and automations based on specific tag combinations.
Create routing rules or SLA conditions based on ticket tags.
Group and analyze tickets in reports and analytics dashboards.
Enable mass updates across filtered views of similarly tagged tickets.
## Searching and filtering by tags
Use the search bar or board-level filters to view all tickets associated with a specific tag.
This makes it easy to isolate patterns, monitor special projects, or escalate critical
topics.
## Best practices
Use short, intuitive tag names that are easy to recognize and remember.
Apply consistent colors to visually group related tags for faster recognition.
Periodically review and remove unused tags to prevent tag sprawl.
Train your team on when and how to apply specific tags for consistency.
# Teams
Source: https://docs.thena.ai/guides/ticketing/teams
Organize teams by goals and mission.
## Overview
Thena supports multiple teams, each with its own dedicated workspace. Whether it's Support, Success, or Solutions, every team gets its own board, settings, and identity—designed for how they work.
🚀Built for multi-team operations
Each with its own triage, automation, and reporting setup.
Centralized ticketing for Customer support
Escalation workflows for Solutions engineers
Proactive touchpoints for Customer success
Set your team's visual identity.
Short code for ticket IDs and cross-tool tracking.
Public (org-wide) or private (invite-only) access.
Permanent deletion removes all team data.
## Configuration
Each team has its own configuration for:
Manage users and roles.
Split teams by functions and regions.
Customize statuses.
Add context with labels.
Customize ticket data points.
Collect structured responses.
Direct tickets to groups and members with logic.
Set response time goals.
Trigger actions with emoji.
Automate with custom logic.
Integrated Slack-based support.
Support via direct email.
# Ticket fields
Source: https://docs.thena.ai/guides/ticketing/ticket-fields
Learn how to configure and manage ticket fields in the Thena ticketing system.
Ticket fields are one of the most powerful and flexible features on the Thena platform.
They let you collect, structure, and act on the right data across your support workflows.
Thena supports both standard fields and custom fields, giving teams full control over
what data is tracked—without compromising speed or usability.
## Types of fields
### Standard fields
These are built-in and come with every ticket. They cover essential metadata and
identification info. Examples include:
ID, Ticket ID, Title, AI-generated title, Description, AI-generated summary
Created at, Updated at, Due date
Is escalated, Is draft, Private, Sentiment, Story points, Source, Team, Parent team,
Assigned agent
Account, Team, Source, Assigned agent, Sentiment, Customer contact
### Custom fields
Use these to collect additional structured inputs. You can create any number of fields
with various data types.
#### Custom field types
Single line, Multi line, Rich text
Integer, Decimal, Currency
Date, Date & time, Time
Single choice, Multi choice, Radio buttons, Checkboxes
File upload, Email, Phone number, URL, Address, Rating, Coordinates, IP address,
Regex, Password
Calculated, Lookup, Toggle / Boolean
## Field settings
Customize each field with powerful controls:
* Required settings
* Mandatory on creation
* Mandatory on close
* Visibility settings
* Visible to customers
* Editable by customers
* Field settings
* Placeholder text
* Hint/help text
* Form behavior
* Auto-add to all forms
This allows fine-grained control of how fields behave across workflows and customer-
facing forms.
## Managing fields
You can search, manage, and update fields anytime from the Ticket fields settings page.
Each field is clearly labeled by type and whether it's standard or custom.
## Why ticket fields matter
Collect the right information upfront to automatically route tickets to the right teams and prioritize effectively.
Build powerful SLAs and automated workflows based on field values to streamline support processes.
Generate insightful reports and track performance metrics with structured ticket data.
Collect only what matters, when it matters, creating a better experience for both agents and customers.
# Tickets
Source: https://docs.thena.ai/guides/ticketing/tickets
Everything you need to understand about Tickets in Thena
Tickets are the foundational entity in the Thena Platform, representing every customer inquiry, internal task, and collaborative work item that flows through your organization.
## 🎫 What is a Ticket in Thena
A ticket in Thena is more than just a support request—it's a structured data entity that serves as:
for customer interactions and internal processes
where teams coordinate across departments and time zones
that captures context, relationships, and operational history
that powers workflows, SLAs, and intelligent routing
## 🧩 What are the core ticket components
### 💬 Conversations
The primary communication channel between customers and support agents. This is where the actual customer service happens - questions are asked, solutions are provided, and relationships are built.
* Rich text messaging with formatting, attachments, and media support
* Real-time bidirectional communication between customers and agents
* Thread continuity across multiple channels (email, Slack, web chat, etc.)
* Message history and conversation context preservation
* Support for mentions, reactions, and collaborative features
### 📝 Notes
Internal comments and observations that support agents can add to tickets for documentation, context sharing, and knowledge preservation. Notes are invisible to customers and serve as the internal knowledge base for each ticket.
* Private internal commentary system for agents and teams
* Rich text support with formatting, links, and attachments
* Timestamped entries with author attribution
### 🧵 Internal threads
Private team collaboration spaces linked directly to tickets, enabling focused discussions without disrupting customer-facing conversations. Internal threads can optionally connect to Slack channels for real-time cross-platform collaboration.
* Dedicated private communication channels within tickets
* Bi-directional sync with Slack for seamless team collaboration
* Rich messaging with file attachments, images, and user mentions
* Multiple threads per ticket for different discussion topics
* Real-time notifications and message editing capabilities
* Auto-thread creation for triage-enabled tickets
[Learn more about Internal threads →](/guides/ticketing/internal-threads)
### 📊 Activity
A comprehensive audit log that tracks everything that happens to a ticket throughout its lifecycle. The activity feed provides complete transparency and accountability for all ticket modifications, status changes, and system events.
* Chronological log of all ticket events and modifications
* Automated tracking of status changes, assignments, and field updates
* User attribution for all manual actions and system events
* Integration events from connected tools and automation
* Real-time updates as events occur
### 🤖 AI logs
A transparent record of all AI agent actions and decisions within tickets. AI logs provide visibility into automated processes, ensuring accountability and explainability for AI-driven ticket handling.
* Comprehensive logging of all AI agent actions and decisions
* Reasoning transparency with "Show reasoning" links for decision context
* Tracking of status changes, field updates, and automated responses
* Fallback logging when AI defers to human agents
* Audit trail for compliance and quality assurance
[Learn more about AI logs →](/guides/ticketing/ai-logs)
### 📋 AI summary
Intelligent, automatically generated overviews that distill complex ticket conversations and context into concise, actionable summaries. AI summaries help agents quickly understand ticket status and history without reading through entire conversation threads.
* Automated generation of ticket context and status summaries
* Real-time updates as conversations and ticket details evolve
* Key issue identification and resolution status tracking
* Context extraction from conversations, notes, internal threads and related activities
* Customizable summary formats for different team needs
### 📄 Forms
Structured data collection systems that define what information is captured when tickets are created or updated. Forms ensure consistent data gathering across all channels and enable powerful automation and routing capabilities.
* Customizable field layouts with various input types (text, dropdowns, dates, etc.)
* Dynamic form behavior with conditional field visibility
* Multi-channel support (web, Slack, API, customer portal)
* Field-level permissions and validation rules
[Learn more about Forms →](/guides/ticketing/forms) | [Ticket Fields →](/guides/ticketing/ticket-fields)
### 🏢 Account details
Comprehensive customer account information that provides the business context and relationship background for each ticket. Account details are automatically created from real-world interactions across Slack, email, API, and other integrated systems.
* Automatically created from customer interactions across all channels
* Status, Classification, Health, Industry categorization
* Associated contacts, stakeholders, and their roles within the account
* Domain, revenue, employee count, website, billing/shipping addresses
* Fully configurable fields for business-specific data
* Logged interactions including calls, meetings, emails, and site visits
* Team notes with privacy controls and threaded discussions
* Integration with CRM systems to import data to Thena
[Learn more about Accounts →](/guides/accounts/accounts-view)
### ⏱️ SLAs
Service level tracking and commitment systems that define, monitor, and enforce response and resolution time expectations for consistent service delivery.
* Flexible policy configuration with condition-based application
* Multiple metric tracking (first response, next response, resolution, update times)
* Business hours and holiday awareness for accurate calculations
* Automated timer management with pause/resume capabilities
* Real-time breach warnings and escalation triggers
* Performance analytics and SLA achievement reporting
[Learn more about SLAs →](/guides/ticketing/slas)
### ⭐ CSAT
Customer Satisfaction survey system that collects valuable feedback from customers after support interactions to measure service quality and identify improvement opportunities.
* Rule-based survey triggering with customizable filter conditions
* Multi-channel delivery via Slack threads or email based on ticket source
* Flexible survey formats including 5-star ratings and thumbs up/down responses
* Intelligent sampling options to prevent survey fatigue and optimize response rates
* Customizable survey content, branding, and optional comment fields
* Global settings for delivery delays, cooldown periods, and trigger statuses
[Learn more about CSAT →](/guides/ticketing/csat)
### 🏷️ Tags
Flexible labeling system for organizing and categorizing tickets without rigid field constraints. Tags provide lightweight metadata that enables powerful filtering, automation, and analytics capabilities.
* Color-coded label system for visual organization
* Flexible application across any ticket regardless of form or type
* Integration with search, filtering, and reporting systems
* Workflow trigger capabilities for automation
[Learn more about Tags →](/guides/ticketing/tags)
### 🔗 Related tickets
Connection system that links tickets across departments, teams, and time periods to maintain context and prevent information silos.
* Cross-team ticket linking regardless of team or source
* Bidirectional relationship visibility and navigation across teams
* Support for multiple relationship types and connection contexts
* Search and discovery tools for finding relevant connections
[Learn more about Related tickets →](/guides/ticketing/related-tickets)
### 🕒 Recent tickets
Quick access system that surfaces historically similar or related tickets to provide agents with immediate context and potential solutions.
* Intelligent ticket similarity detection and matching
* Customer-specific ticket history and interaction patterns
* Quick access to previous solutions and resolution approaches
* Integration with knowledge base and solution documentation
* Contextual recommendations based on current ticket characteristics
* Learning algorithms that improve matching accuracy over time
### 🔌 Custom apps
Integration framework that extends ticket functionality through connections with external tools and systems.
* Native integration framework for popular business tools (Jira, Linear)
* Custom application development capabilities for organization-specific needs
* Bidirectional data synchronization with external systems
* Embedded views and actions within the ticket interface
* Webhook and API integration for real-time data exchange
* App marketplace for third-party integrations and extensions
[Learn more about Custom apps →](/platform/apps)
## 📍 Where can you create tickets from
* **[Email](/guides/sources/email)** - Automatic ticket creation from configured email
* **[Slack](/guides/sources/slack)** - Direct integration with Slack workspaces
* **[Microsoft Teams](/guides/sources/ms-teams)** - Teams app integration for ticket management
* **[Web chat](/guides/sources/web-chat)** - Real-time chat widget for websites
* **[Discord](/guides/sources/discord)** - Discord server integration for community support
* **Manual** - Team member created tickets through the dashboard
* **[API](/api-reference/platform/tickets/create-a-ticket)** - Programmatic ticket creation via APIs
* **[Customer Portal](/guides/ticketing/customer-portal)** - Self-service ticket creation by customers
* **[Workflow](/guides/ticketing/workflows)** - Tickets created by automated workflows
* **Integration** - External system integrations
* **AI Agent** - AI agents creating tickets based on analysis or prompts
## ➕ How to create tickets in Thena
* **Auto ticket creation from [Slack](/guides/sources/slack) using AI** - AI automatically analyzes Slack conversations and creates tickets when it detects customer support requests or issues that require tracking
* **Ticket creation using [ticket emoji](/guides/ticketing/emoji-actions) from Slack** - Use 🎫 emoji reactions on Slack messages to instantly convert them into tickets
* **Ticket creation by mentioning @thena** - Create tickets directly in Slack by mentioning @thena in any message or thread
* **Ticket creation using Slack shortcut 'Inspect message > Create ticket'** - Right-click on any Slack message and select "Inspect message" followed by "Create ticket" to convert specific messages into tracked tickets
* **/ticket command on Slack** - Use the /ticket slash command in Slack to create tickets
* **Ticket creation when [email](/guides/sources/email) reaches configured email address** - Automatically generate tickets when emails are sent to your team's configured support email address
* **Message in [web chat](/guides/sources/web-chat) after it has been created as a ticket** - Web chat conversations automatically convert into tickets once initiated by AI, ensuring all customer interactions are captured and tracked
* **Message in configured [MS Teams](/guides/sources/ms-teams) channel** - Create tickets from Microsoft Teams messages in configured channels
* **Message in configured [Discord](/guides/sources/discord) channel** - Generate tickets from Discord messages in configured channels for community support
* **Via [APIs](/api-reference/platform/tickets/create-a-ticket)** - Create tickets programmatically using Thena's API endpoints for integration with external systems and automated workflows
* **Via [customer portal](/guides/ticketing/customer-portal)** - Allow customers to create tickets directly through the self-service customer portal
* **Via manual ticket creation option in Thena** - Create tickets manually through Thena's interface using the dedicated ticket creation form
## ⚡ What actions can you take on a ticket
Archive completed or resolved tickets to maintain a clean active workspace while preserving historical data for future reference. Archived tickets remain searchable and accessible but are removed from active views, helping teams focus on current work while maintaining complete audit trails.
Permanently remove tickets from the system when they are no longer needed or were created in error. This action is irreversible and should be used carefully, as it completely removes all ticket data, conversations, and associated metadata from the platform.
Transfer ticket ownership between teams while preserving complete conversation history and context. The system creates a new ticket in the destination team, archives the original, and links both tickets as related, ensuring seamless handoffs with appropriate SLA and workflow applications.
[Learn more about Move tickets →](/guides/ticketing/move-tickets)
Initiate customer conversations by creating tickets that automatically notify customers via email or other channels. Proactive tickets enable teams to reach out first for updates, follow-ups, or proactive support, with customers able to reply directly to continue the conversation.
[Learn more about Proactive tickets →](/guides/ticketing/proactive-tickets)
Configure automated responses triggered by ticket creation or message receipt, with intelligent conditions for business hours, holidays, or agent availability. Auto-responders maintain professional communication standards and set appropriate expectations during off-hours or high-volume periods.
[Learn more about Auto responder →](/guides/ticketing/auto-responder)
Enable quick ticket operations through emoji reactions, allowing team members to change ticket status or trigger workflows with simple emoji responses. This streamlines common actions like resolving tickets or reopening issues, making ticket management faster and more intuitive.
[Learn more about Emoji actions →](/guides/ticketing/emoji-actions)
Download comprehensive ticket information as CSV files for external analysis, reporting, and integration with other business systems. Exports include all ticket fields, customer data, SLA tracking, and custom fields, respecting current view filters for targeted data extraction.
[Learn more about Export tickets →](/guides/ticketing/export-tickets)
Create powerful automation rules that respond to ticket events with configurable triggers, conditions, and activities. Workflows can handle everything from ticket routing and escalation to notifications and data updates, streamlining repetitive tasks and ensuring consistent processes.
[Learn more about Workflows →](/guides/ticketing/workflows)
Associate tickets with customer accounts to provide comprehensive business context and relationship background. Account mapping enables personalized service by connecting tickets to account health, classification, contact information, and historical interaction patterns for more effective support.
[Learn more about Accounts →](/guides/accounts/accounts-view)
## 👀 Where can I view tickets in Thena?
View tickets organized in visual columns representing different status categories. This board-style layout enables drag-and-drop ticket management, making it easy to track workflow progression and manage ticket status transitions with visual clarity.
Access tickets in a traditional tabular format with bulk selection capabilities. This view provides detailed information at a glance and supports efficient ticket management operations across large volumes of tickets.
View all tickets associated with a specific customer account directly within the account detail page. This contextual view shows the complete ticket history for that customer, enabling agents to understand the full relationship and provide more informed, personalized support based on previous interactions.
Create and save personalized ticket views by applying specific filter combinations and saving them for future use. Any view with custom filters can be saved as a reusable saved view, allowing teams to quickly access frequently used ticket segments like high-priority issues, specific customer accounts, or tickets assigned to particular agents.
## 🔍 How to search and filter tickets
* **Full-text search**: Title, description
* **Metadata search**: Tags, properties
* **Account search**: Account name
* **Equality filters**: Exact matches for status, priority, type, custom fields etc.
* **Range filters**: Date ranges, numeric comparisons
* **Set operations**: Multiple value selection with AND/OR logic
* **Negation filters**: Exclude specific values or conditions
## ✅ Best practices
Use consistent ticket creation processes across all channels and teams.
Establish clear naming conventions for ticket titles and tags.
Create standardized forms for common ticket types to ensure data consistency.
Implement uniform SLA policies based on ticket priority and customer tier.
Use tags strategically for categorization and easy filtering across large ticket volumes.
Link related tickets to maintain context across complex multi-part issues.
Leverage account mapping to provide agents with customer context and history.
Create custom views for different team workflows and save frequently used filter combinations.
Use internal threads for cross-team discussions without cluttering customer-facing conversations.
Document decisions and solutions in notes to build institutional knowledge.
Set up proper team routing and assignment rules to ensure tickets reach the right expertise.
Establish clear escalation paths and use ticket moves when specialized knowledge is needed.
Configure workflows to automate repetitive tasks and ensure consistent processes.
Set up auto-responders to manage customer expectations during off-hours or high-volume periods.
Use AI-powered ticket creation to capture issues automatically from communication channels.
Implement CSAT surveys to gather feedback and continuously improve service quality.
Track SLA performance and set up alerts for potential breaches to maintain service levels.
Monitor ticket volume patterns to optimize team capacity and resource allocation.
Use activity logs and AI logs to identify process improvements and training opportunities.
Regularly review and clean up unused tags, forms, and workflows to maintain system efficiency.
## 💡 Example use cases
Set up forms with product version, issue type, and customer tier fields for consistent intake
Configure SLA policies based on customer classification (Enterprise, Pro, Basic) with different response times
Enable email integration and Slack channels for automatic ticket creation from customer inquiries
Create routing rules to assign tickets to specialized teams based on product or issue type
Implement escalation workflows that move high-priority tickets to senior agents after SLA thresholds
Use internal threads to collaborate with engineering teams on technical issues without exposing discussions to customers
Set up CSAT surveys to automatically collect feedback after ticket resolution
Create custom views for agents to track their assigned tickets, urgent issues, and pending customer responses
Create forms with asset ID, location, department, and business impact fields for comprehensive issue tracking
Set up routing rules to assign tickets based on location (on-site vs remote) and expertise required
Configure SLA policies with different response times for critical systems vs general requests
Use tags to categorize tickets by system type (network, hardware, software, security) for reporting
Implement approval workflows for change requests that require management sign-off
Create related ticket workflows to link incidents to underlying problems or planned maintenance
Set up auto-responders for after-hours requests with expected response timeframes
Use custom fields to track asset warranties, maintenance schedules, and resolution documentation
Configure forms to capture lead information, company size, budget, and timeline for qualification
Set up account mapping to link all sales interactions to prospect accounts for relationship visibility
Create routing rules to assign demo requests to appropriate sales engineers based on product expertise
Use internal threads to coordinate between sales, solutions engineering, and legal teams during deals
Implement workflows to automatically create follow-up tasks and schedule check-ins after demos
Set up custom views to track pipeline stages, upcoming renewals, and high-value opportunities
Configure handoff processes to move won deals from sales to customer success with complete context
Use tags to categorize prospects by industry, use case, and deal size for targeted outreach
Create custom forms for feature requests with fields for use case, business impact, and affected users
Set up routing to automatically assign product feedback tickets to product managers by feature area
Use tags to categorize feedback by product area, priority level, and development effort required
Implement workflows to create related tickets in engineering systems (Jira, Linear) for accepted features
Configure internal threads to facilitate discussions between product, engineering, and design teams
Set up custom views to track feature request volume, top requested features, and customer impact
Use account mapping to prioritize feedback from high-value customers and strategic accounts
Create workflows to automatically notify customers when requested features are released
Tickets in Thena provide the foundation for comprehensive business operations, enabling teams to deliver exceptional support experiences while maintaining operational efficiency and continuous improvement through data-driven insights.
# Window
Source: https://docs.thena.ai/guides/ticketing/window
Full ticket context. No clutter.
## Overview
The ticket window is where agents manage every aspect of a ticket. From conversation to resolution, it's the heart of the support experience in Thena.
Every window brings full context, live updates, and customizable fields—designed to help your team work faster, stay aligned, and delight customers.
## Title & description
The top of the ticket gives you immediate clarity.
* Title: Often auto-generated using AI, but editable by agents.
* Description: A long-form explanation, capturing the problem, request, or issue in detail.
Perfect for organizing complex customer communication into a structured format.
## Conversation
Your main chat interface.
* Engage with the requester using rich text
* Use internal threads for async teammate collaboration
* Add emojis, mentions, or insert links
Every message is time-stamped, threaded, and part of a single timeline.
## Forms & fields
Each ticket is attached to a form. These forms determine what custom or standard fields appear in the ticket window.
* Fields can be text, date, checkbox, dropdown, or lookup types
* Fields are fully editable
* Supports auto-updated fields from integrations or user input
This makes every ticket flexible, adaptable, and rich in metadata.
## Account details
See the customer behind the ticket.
* View account name, owner, domains, and current status
* Useful for determining SLAs, support tiers, or internal routing
* Links to full account and contact profiles
Agents no longer need to tab-hop or guess who the requester is.
## Recent tickets
Display a list of tickets recently submitted by the same customer or account.
* Helps identify repeat issues
* Surface open or overdue items
* Prioritize based on history
Stay one step ahead in every conversation.
## Tags
Tags are used to categorize and organize tickets by topic, department, or priority.
* Color-coded and easy to scan
* Shown on both the ticket card and ticket window
* Tags are fully customizable in Settings
Use tags to filter views, trigger workflows, or analyze trends.
## Internal threads
Private discussions within the ticket.
* Only visible to your internal team
* Used for manager escalations, side questions, and handoffs
* Supports mentions and rich formatting
Think of it as Slack inside every ticket.
## Notes
Notes are used to capture context that doesn't belong in the main thread.
* Record call summaries, resolution steps, or follow-up plans
* Private by default
* Time-stamped and user-attributed
Helps any agent picking up the ticket to understand what happened.
## Activity
The activity panel is a changelog for the ticket.
* See who changed what and when
* Tracks updates to assignee, group, status, priority, fields, and more
* Keeps your team accountable and in sync
No more guessing what happened or when.
## Fullscreen mode
Click the expand icon to go fullscreen.
* Focused view for long conversations
* Clean interface for high-touch customers
* Helps you power through queues without distractions
Perfect for deep work.
## Next steps
After learning about the window feature, you may want to explore [triage](/guides/ticketing/triage) to efficiently manage incoming tickets.
# Workflows
Source: https://docs.thena.ai/guides/ticketing/workflows
Automate your support processes with powerful workflow automation.
## 🔄 What's a workflow?
Workflows in Thena are powerful automation tools that help you streamline repetitive tasks, ensure consistency, and improve your team's efficiency. A workflow consists of:
* **Trigger events** that start the automation
* **Conditions** that determine when it should run
* **Activities** that perform the actual work
* **Status controls** to activate or pause automation
You can create workflows to handle everything from ticket routing and escalation to notifications and data updates across your entire support process.
Start with simple workflows and gradually add complexity as your team becomes more comfortable with automation.
## ⚡ Trigger events
Trigger events are what kick off your workflows. Thena supports a wide range of events from both the platform and integrated applications.
### Common trigger events
• Ticket created
• Ticket updated
• Ticket status changed
• Ticket comment added
• Ticket assigned/reassigned
• Slack message sent
• Email received
• Form submission
• External app events
• Scheduled/timer events
Whether it's a new high-priority ticket or a customer reply, events give you precise control over when automation should activate.
## 🎯 Workflow conditions
Conditions let you create smart filters that determine exactly when your workflow should run. You can build rules using any field or property available in the trigger event.
Filter based on priority, status, assignee, account, custom fields, or any ticket data.
Target workflows based on user type, permissions, team membership, or custom properties.
Use sentiment, keywords, or message content to trigger specialized workflows.
Consider business hours, timezone, or historical data when deciding to activate.
Use **match all** (AND) or **match any** (OR) logic to create precise targeting for your automation needs.
## 🛠️ Activities and actions
Activities are the actual work your workflow performs. Thena provides a rich library of built-in activities plus support for custom integrations.
### Built-in activities
• Create or update tickets
• Change status or priority
• Assign to agents or teams
• Add comments or notes
• Set due dates
• Send Slack notifications
• Email stakeholders
• Create announcements
• Update external systems
• Log activity
• Update account information
• Create or modify records
• Sync with external databases
• Generate reports
• Archive data
• Add delays or wait periods
• Branch based on conditions
• Loop through data sets
• Error handling and retries
• Workflow orchestration
### Visual workflow builder
Create workflows using Thena's intuitive drag-and-drop interface:
* **Visual canvas** for designing workflow logic
* **Activity library** with all available actions
* **Connection lines** showing the flow between activities
* **Real-time validation** to catch configuration issues
* **Testing tools** to verify your workflow before activation
## 📋 Managing workflows
### Workflow dashboard
Your workflow dashboard gives you complete visibility and control:
See which workflows are running and their current status
Enable or disable workflows with a single click
Monitor execution times and success rates
### Workflow actions
Modify workflow logic, update conditions, or add new activities
Review past runs, debug issues, and track performance metrics
Clone existing workflows as templates for new automation
Track changes and roll back to previous versions when needed
## 🔗 Integration and automation
Workflows integrate seamlessly with your existing tools and processes:
### Cross-platform automation
Automatically notify channels, create threads, or update status messages
Send personalized responses, escalation notices, or status updates
Connect to any external system via webhooks or API calls
Keep information current across all your business systems
### Advanced features
Built-in retry logic and compensation strategies for failed activities
Automatic throttling to respect API limits and system resources
Create complex logic flows with multiple paths and decision points
Use dynamic variables and liquid templates for personalized content
## 📊 Workflow examples
### High-priority ticket escalation
**Trigger**: Ticket created with priority = "High"\
**Conditions**: Business hours AND account tier = "Enterprise"\
**Activities**:
1. Assign to senior support team
2. Notify team lead via Slack
3. Set due date to 2 hours
4. Add escalation tag
### Customer response automation
**Trigger**: Ticket comment added\
**Conditions**: Comment author = customer AND ticket status = "Waiting on customer"\
**Activities**:
1. Change status to "In progress"
2. Assign to available agent
3. Remove "waiting" labels
4. Log response time
### Weekly report generation
**Trigger**: Schedule (every Monday 9 AM)\
**Conditions**: Team has active tickets\
**Activities**:
1. Generate ticket summary
2. Calculate team metrics
3. Send report to stakeholders
4. Update dashboard widgets
## 🧠 Best practices
Begin with basic workflows and add complexity gradually as your team learns
Use the testing tools to verify workflows before activating in production
Regularly check execution logs and success rates to optimize workflows
Give workflows clear names and descriptions so your team understands their purpose
## 🔔 Workflow status and monitoring
Once active, workflows provide real-time feedback and monitoring:
* ✅ **Successfully executed** (e.g., Completed in 1.2s)
* 🟨 **In progress** (e.g., Running activity 2 of 5)
* 🔴 **Failed execution** (e.g., Error: API timeout)
* ⏸️ **Paused workflow** (e.g., Manually disabled)
Your team always knows the status of automation—and can intervene when needed to ensure smooth operations.
# Working hours
Source: https://docs.thena.ai/guides/ticketing/working-hours
Multi-level availability, fully customizable.
## Overview
Working hours in Thena define when your team, groups, and individuals are available to work on tickets. This feature is ideal for distributed teams across time zones, support teams with shifts, or any operation managing response times. Configure working hours to route tickets to available staff, set customer expectations, and prevent burnout by respecting scheduled availability.
The system handles timezone differences automatically, making it effective for global teams. Working hours integrate with Thena's routing, assignment, and automation features to create support operations that balance customer needs with team wellbeing.
## Key features
### Multi-level availability
Thena supports working hours at three levels:
* Personal: Set by individual users.
* Group: Shared across members of a group.
* Team: Applies to the entire team.
### Smart operations
Working hours are used to power smart operations across Thena:
* Routing: Route tickets only to available groups.
* Assignment: Assign tickets based on who's online.
* Auto-responders: Trigger responses when requests come in outside working hours.
Thena adapts to global teams with timezone-aware logic, so no ticket goes unseen.
## Use cases
Route region-specific tickets only to groups active in that timezone.
Avoid assigning tickets to teammates outside their working hours.
Trigger "We'll get back to you soon" messages when no one's online.
Manage global coverage by blending team-level and personal availability.
Respect non-working days for each group or region automatically.
# HubSpot
Source: https://docs.thena.ai/platform/apps/hubspot
Synchronize contacts and companies between HubSpot and Thena for seamless customer data management.
## Overview
The HubSpot integration enables synchronization of contacts and companies from HubSpot CRM to Thena. This integration helps you maintain consistent customer data across both platforms, streamline your customer relationship management, and enhance your team's ability to provide personalized service.
* **Contact synchronization**: Automatically sync contacts from HubSpot to Thena
* **Company synchronization**: Automatically sync companies from HubSpot to Thena
* **Custom field mapping**: Map custom fields between HubSpot and Thena
* **Filtered synchronization**: Control which contacts and companies are synchronized
* **Audit logging**: Track all synchronization activities for troubleshooting
## Key features
* Sync contact details
* Map standard and custom fields
* Filter contacts based on criteria
* Track sync status and history
* Keep company records in sync
* Map company properties
* Filter companies by criteria
* Maintain data consistency
* Map standard fields automatically
* Configure custom field mappings
* Support for various field types
* Flexible mapping options
* Track all sync activities
* View detailed error messages
* Monitor sync performance
* Troubleshoot integration issues
* Set up complex filter rules
* Include or exclude specific records
* Filter by any field value
* Combine multiple filter conditions
## Setup
You need admin permissions in HubSpot to install the HubSpot integration.
Install the HubSpot integration at the organization level since this feature will be accessible to all teams, as Accounts is an organization-level feature.
1. Navigate to the [Apps studio](https://dashboard.thena.ai/organization/settings/apps-studio) in your Thena dashboard
2. Find the HubSpot integration in the available apps
3. Click the "Install" button to begin the installation process
1. Review the permissions and scopes required by the integration
2. Select "No team" to install HubSpot
1. After configuration, click "Complete HubSpot authorization"
2. You'll be redirected to HubSpot to authorize the connection
3. Sign in with your HubSpot account and grant the requested permissions
4. You'll be redirected back to Thena once authorization is complete
1. Navigate to the HubSpot configuration page
2. Verify that company and contact sync is enabled
3. Review the custom fields to import
4. Optionally set up Filters to import selective data
5. Click "Save changes" to apply your configuration
## How to configure synchronization
For both companies and contacts, you can select which fields to synchronize:
1. Navigate to the HubSpot configuration page in App Studio
2. Select either the Companies or Contacts tab
3. Find the "Selected fields" section
4. Click on the field selector to see available fields
5. Select the fields you want to synchronize
6. Click outside the selector to confirm your selection
7. Click "Save changes" to apply your configuration
Some standard fields are synchronized by default and cannot be deselected, such as name, email, and phone number for contacts.
You can set up filters to control which records are synchronized:
1. Navigate to the HubSpot configuration page
2. Select either the Companies or Contacts tab
3. Find the "Filters" section
4. Click "Add filter" to create a new filter
5. Select the field to filter on
6. Choose an operator (equals, contains, greater than, etc.)
7. Enter the filter value
8. Add additional filters as needed
9. Click "Save changes" to apply your filters
Filters support various operators:
* Equals / Not equals
* Contains / Does not contain
* Greater than / Less than
* Is empty / Is not empty
* Starts with / Ends with
* Is any of / Is none of
Use filters to exclude test or internal records from synchronization. Multiple filters are combined with AND logic.
You can monitor the synchronization status:
1. Navigate to the HubSpot configuration page
2. Select either the Companies or Contacts tab
3. Find the "Sync status" section
4. View the total count of records in HubSpot
5. View the count of records synchronized to Thena
6. Check the status of recent synchronization jobs
## Permission scopes
The HubSpot app requires specific permissions to function properly and processes events to keep data synchronized between systems.
Manage HubSpot contacts including:
* Read contact information
* Create new contacts
* Update existing contacts
* Access contact properties
Access to contact schemas:
* View contact property definitions
* Access custom property configurations
* Map custom fields between systems
Manage HubSpot companies including:
* Read company information
* Create new companies
* Update existing companies
* Access company properties
Access to company schemas:
* View company property definitions
* Access custom property configurations
* Map custom fields between systems
Processes contact changes in Thena:
* Creates new contacts in HubSpot when added to Thena
* Updates existing HubSpot contacts when modified in Thena
* Synchronizes standard and custom field values
Processes account changes in Thena:
* Creates new companies in HubSpot when added to Thena
* Updates existing HubSpot companies when modified in Thena
* Maintains consistent data between platforms
Notifies Thena about contact synchronization:
* Confirms successful contact creation or updates
* Provides synchronization status information
* Includes reference IDs from both systems
Notifies Thena about company synchronization:
* Confirms successful company creation or updates
* Provides synchronization status information
* Includes reference IDs from both systems
## FAQs
The synchronization process is done everytime there's a change in the synced record in HubSpot. Or you can manually trigger a synchronization at any time from the configuration page using the sync button.
Yes, custom fields can be synchronized between HubSpot and Thena. You'll need to select these fields in the field selection section of the configuration page.
The integration supports mapping both standard and custom fields. When a custom field exists in HubSpot but not in Thena, the system can create it in Thena automatically based on the field mapping configuration.
Currently, the integration does not automatically handle deletions from HubSpot. When a record is deleted in HubSpot, it will remain unchanged in Thena.
There is no specific limit imposed by Thena on the number of HubSpot records you can synchronize. However, the integration respects HubSpot's API rate limits.
For large data sets, synchronization may take longer due to these rate limits, but the system implements rate limiting and retry mechanisms to handle this gracefully.
Yes, you can use filters to exclude specific records from synchronization. Configure these filters in the `filters` section of the configuration page.
The integration supports various filter operators including:
* Equals
* Not equals
* Greater than
* Less than
* Contains
* In list
Filters are validated to ensure they reference valid fields that are selected for synchronization.
If you're experiencing authentication issues:
1. Check if your HubSpot OAuth token has expired
2. Verify that your HubSpot subscription is active
3. Try uninstalling and reconnecting the integration:
* Go to the integration settings page
* Click "Uninstall"
* After uninstalling, click "Install" to restart the OAuth flow
The system will automatically attempt to refresh expired OAuth tokens, but if the refresh token is also invalid, you'll need to reconnect the integration.
If synchronization is failing:
1. Check the audit logs for specific error messages (look for entries with status "FAILED")
2. Verify that your filters are valid and not too restrictive
3. Check for HubSpot API rate limit issues
4. Verify network connectivity between Thena and HubSpot
The system implements retry mechanisms for failed jobs, but persistent issues may require manual intervention.
If data is missing after synchronization:
1. Confirm that the fields are selected for synchronization in the field mapping configuration
2. Check if filters are unintentionally excluding the expected records
3. Verify that the records exist in HubSpot
4. Ensure field mapping is correctly configured for the missing data
5. Check the audit logs for any errors related to specific records
Note that some complex field types may not be supported by the integration.
# Jira
Source: https://docs.thena.ai/platform/apps/jira
Connect your Thena tickets with Jira issues for seamless project management and enhanced workflow coordination.
## Overview
The Jira integration connects your Thena platform with Atlassian Jira, enabling seamless collaboration between customer support and development teams. This integration provides the following capabilities:
* **Ticket linking**: Connect Thena tickets with Jira issues for complete traceability
* **Issue creation**: Create new Jira issues directly from Thena tickets
* **Issue search**: Find and link existing Jira issues without leaving Thena
* **Synchronized updates**: Keep your project management and customer support systems in sync
* **Comment synchronization**: View and add comments across both Thena tickets and Jira issues
## Key features
* Connect Thena tickets to Jira issues
* View linked issues in ticket details
* Maintain bi-directional references
* Find existing Jira issues
* Filter by project and status
* Quick access to issue details
* Create new Jira issues from Thena
* Auto-populate fields from ticket data
* Select appropriate issue types
* View real-time Jira issue status
* Track priority and assignees
* Monitor issue progress
* View Jira comments in Thena tickets
* Add comments from Thena to Jira issues
* Maintain conversation context across systems
## Setup
The Jira integration uses the token of the user who authenticated it. New Jira tickets, comments will default to this user. If re-authenticated by a different user, subsequent tickets will reflect the new user. We recommend using a service account (e.g., [thena@yourdomain.com](mailto:thena@yourdomain.com), [integration-user@yourdomain.com](mailto:integration-user@yourdomain.com)) for easier identification.
1. Navigate to the [Apps studio](https://dashboard.thena.ai/organization/settings/apps-studio) in your Thena dashboard
2. Find the Jira integration in the available apps
3. Click the "Install" button to begin the installation process
1. Review the permissions and scopes required by the integration
2. Add your Jira cloud URL (e.g., [https://your-domain.atlassian.net](https://your-domain.atlassian.net))
3. Select the teams in Thena where you want to install Jira
1. After configuration, click "Complete Jira authorization"
2. You'll be redirected to Jira to authorize the connection
3. Grant the necessary permissions for the integration
4. You'll be redirected back to Thena once authorization is complete
1. Open a ticket in Thena
2. Navigate to the Jira section in the ticket details
3. Search for a Jira issue to confirm the connection is working
4. Verify that issue data is correctly displayed
## How to link a Jira issue
1. Open a ticket in Thena
2. Navigate to the Jira section in the ticket details panel
3. Click the "Search issue" button
4. Enter the Jira issue key or search by keywords
5. Select the appropriate issue from the search results
6. Click "Link" to connect the Thena ticket with the Jira issue
1. Open a ticket in Thena
2. Add a comment in any internal thread
3. Include a Jira issue link or key (e.g., PROJECT-123 or [https://your-domain.atlassian.net/browse/PROJECT-123](https://your-domain.atlassian.net/browse/PROJECT-123))
4. The system will automatically detect and link the Jira issue to your ticket
5. The linked issue will appear in the Jira section of the ticket details
If you know the exact Jira issue key (e.g., PROJECT-123):
1. Open the ticket in Thena
2. Navigate to the Jira section
3. Click "Search issue"
4. Enter the Jira issue key directly
5. Click "Link" to connect the ticket with the issue
Once linked:
* The Jira issue will appear in the ticket details panel
* You'll see the issue summary, status, priority, and assignee
* Click on the issue to open it directly in Jira
* You can also view and interact with the issue in the internal thread where the link was added
## How to search for a Jira issue
1. Open a ticket in Thena
2. Navigate to the Jira section in the ticket details
3. Click the "Search issue" button
You can search by:
* Jira issue key (e.g., PROJECT-123)
* Keywords in the issue summary or description
* Project name or key
1. Review the search results showing issue summaries and statuses
2. Click "Link" to connect the selected issue with your Thena ticket
## How to create a Jira issue
1. Open a ticket in Thena
2. Navigate to the Jira section in the ticket details
3. Click the "Create issue" button
1. Choose the appropriate Jira project from the dropdown
2. Select the issue type (Bug, Task, Story, etc.)
3. The available fields will update based on your selections
1. Enter the issue summary
2. Provide a detailed description
3. Set priority, status, and other required fields
4. Add any custom fields specific to your Jira configuration
1. Review all entered information
2. Click "Create issue" to submit to Jira
3. The new issue will be automatically linked to your Thena ticket
4. You'll see the issue details in the ticket panel once created
5. An internal thread will be created where you can add comments to the Jira issue directly from Thena
## How to synchronize comments
1. Open a ticket with a linked Jira issue in Thena
2. Navigate to the internal thread created for the Jira issue
3. Type your comment in the message field (supports rich text)
4. Send the message
5. Your comment will appear in both the Thena thread and the Jira issue
6. In Jira, the comment will be prefixed with "Message from \[your-name] via Thena"
1. When someone adds a comment to a linked Jira issue
2. The comment will automatically appear in the corresponding Thena thread
3. The comment will show the Jira user's name who created it
4. All team members with access to the ticket can view these comments
1. Text-based comments synchronize in both directions
2. Attachments added in Jira will be visible in Thena as inline attachments
3. Attachments added in Thena will be visible in Jira as a link
4. To add attachments to Jira, use the Jira slash (/) command
## Permission scopes
The Jira app requires specific permissions to function properly. When authorizing the app, you'll be asked to grant the following permission scopes:
Take Jira administration actions including:
* Create projects and custom fields
* View workflows
* Configure integration settings
Create and edit project settings and project-level objects such as:
* Versions and components
* Project configurations
* Project-specific settings
Manage Jira webhooks to enable real-time updates:
* Fetch and register webhooks
* Refresh webhook configurations
* Delete webhooks when no longer needed
Read access to Jira data including:
* Project information and structure
* Issue data and metadata
* Attachments and worklogs
* Search functionality
Access to view comment properties:
* Comment metadata
* Comment relationships
* Comment visibility settings
Write access to Jira data including:
* Create and edit issues
* Post comments as the authenticated user
* Create worklogs for time tracking
* Delete issues when necessary
Ability to manage comment properties:
* Create new comment properties
* Update existing properties
* Manage comment metadata
## FAQs
Yes, you can link multiple Jira issues to a single Thena ticket. Each linked issue will appear in the Jira section of the ticket details panel, allowing you to track multiple related issues.
When a linked Jira issue is updated, the changes will be reflected in the Thena ticket details. This includes updates to status, priority, assignee, and other issue details. The synchronization happens in real-time, ensuring you always have the latest information.
Currently, the integration displays standard Jira fields including summary, description, status, priority, and assignee. Custom field display options may be available in future updates.
You need:
* View permissions for the projects you want to access
* Create issue permissions if you want to create new issues
* Edit permissions if you want to update existing issues
The integration will respect the permissions of the authenticated Jira user.
Yes, you can unlink a Jira issue from a Thena ticket by clicking the unlink button next to the linked issue in the ticket details panel. This will remove the reference in Thena but will not affect the Jira issue itself.
There is no specific limit imposed by the Thena integration on the number of Jira issues you can link or create. However, be mindful of any API rate limits that may be enforced by your Jira instance.
Jira does not allow sending messages via bots, so comments will be sent as the user who integrated the app. We recommend using a generic user for the integration such as integration-user or Thena.
The messages going to Jira will be prefixed with "Message from \[user-name] via Thena" for easy identification.
Comments from Jira will appear in Thena as messages from the Jira integration, with the name of the Jira user who created the comment clearly indicated.
# Linear
Source: https://docs.thena.ai/platform/apps/linear
Connect your Thena tickets with Linear issues for seamless project management and enhanced workflow coordination.
## Overview
The Linear integration connects your Thena platform with Linear, enabling seamless collaboration between customer support and development teams. This integration provides the following capabilities:
* **Ticket linking**: Connect Thena tickets with Linear issues for complete traceability
* **Issue creation**: Create new Linear issues directly from Thena tickets
* **Issue search**: Find and link existing Linear issues without leaving Thena
* **Synchronized updates**: Keep your project management and customer support systems in sync
## Key features
* Connect Thena tickets to Linear issues
* View linked issues in ticket details
* Unlink issues when needed
* Find existing Linear issues
* Search by title or ID
* Link issues directly from search results
* Create new Linear issues from Thena
* Select team, template, and issue details
* Set status, priority, assignee, and labels
* View basic issue details in card view (ID, status, priority, assignee)
* Access comprehensive details when clicking on issues
* Updates reflected in near real-time
## Setup
The Linear integration uses the API key of the user who authenticated it. New Linear issues will be created as this user. If re-authenticated by a different user, subsequent issues will reflect the new user. We recommend using a dedicated Linear account for the integration.
1. Navigate to the [Apps studio](https://dashboard.thena.ai/organization/settings/apps-studio) in your Thena dashboard
2. Find the Linear integration in the available apps
3. Click the "Install" button to begin the installation process
1. Review the permissions and scopes required by the integration
2. Select the teams in Thena where you want to install Linear
1. After configuration, click "Complete Linear authorization"
2. You'll be redirected to Linear to authorize the connection
3. Grant the necessary permissions for the integration
4. You'll be redirected back to Thena once authorization is complete
1. Open a ticket in Thena
2. Navigate to the Linear section in the ticket details
3. Search for a Linear issue to confirm the connection is working
4. Verify that issue data is correctly displayed
## How to link a Linear issue
1. Open a ticket in Thena
2. Navigate to the Linear section in the ticket details panel
3. Click the "Search issue" button
4. Enter the Linear issue key or search by keywords
5. Select the appropriate issue from the search results
6. Click "Link" to connect the Thena ticket with the Linear issue
1. Open a ticket in Thena
2. Add a comment in any internal thread
3. Include a Linear issue link or key (e.g., PRJ-123 or [https://linear.app/your-org/issue/PRJ-123](https://linear.app/your-org/issue/PRJ-123))
4. The system will automatically detect and link the Linear issue to your ticket
When a Linear issue is linked through an internal thread:
* You'll see the issue summary, status, priority, and assignee
* Click on the issue to open it directly in Linear
## How to search for a Linear issue
1. Open a ticket in Thena
2. Navigate to the Linear section in the ticket details
3. Click the "Search issue" button
1. Type your search query in the search field
2. You can search by issue key (e.g., PRJ-123) for exact matches
3. Or search by keywords to find relevant issues
4. You can also filter by project using the dropdown menu
1. Review the search results showing issue summaries and statuses
2. Click "Link" to connect the selected issue with your Thena ticket
## How to create a Linear issue
1. Open a ticket in Thena
2. Navigate to the Linear section in the ticket details
3. Click the "Create issue" button
1. At the top of the issue creation window, choose the Linear team where you want to create the issue
* This indicates the Linear project to which the new issue will be added
* Use the dropdown to change the project to a different one within your Linear workspace
2. If your Linear workspace has templates set up, you can select one to pre-fill specific fields
3. Click "Next" to proceed
1. **Issue title**: Enter a title that summarizes the problem or task
2. **Description**: Provide detailed information such as steps to reproduce or expected outcomes
3. **Status**: Select from statuses fetched from the relevant Linear team's configuration
4. **Priority**: Assign a priority level (Urgent, High, Medium, Low, No priority)
5. **Assignee**: Designate a team member responsible for this issue (list shows assignees from Linear)
6. **Labels**: Add relevant labels to categorize and filter issues within your project
7. **Project**: Confirm the correct project assignment (pre-selected based on team choice)
8. **Cycle**: Confirm the correct cycle assignment (pre-selected based on team choice)
9. Click "Create" to finalize the issue
1. The newly created issue will be automatically linked to your Thena ticket
2. You'll see the issue details in the Linear section of the ticket panel once created
3. The issue details will show ID, status, priority, and assignee
## Viewing Linear issue details
1. Open a ticket with a linked Linear issue in Thena
2. Navigate to the Linear section in the ticket details panel
The Linear issue details include:
1. **Status**: Current workflow status of the issue
2. **Priority**: Issue priority level (Urgent, High, Medium, Low, No priority)
3. **Assignee**: Team member responsible for the issue
1. Click on the issue card to open it in Thena
2. Or, click on the 'Open in Linear' button to open it directly in Linear
3. Make any necessary updates directly in Linear
4. Changes will be reflected in Thena in near real-time
## Permission scopes
The Linear app requires specific permissions to function properly. When authorizing the app, you'll be asked to grant the following permission scopes:
Access to read ticket information from Thena:
* Read ticket data for synchronization with Linear
* Access ticket details for linking with Linear issues
* View ticket metadata for proper integration
Access to Linear teams:
* Get teams and team information
* Set default teams for issue creation
* Access team-specific configurations
Full issue management capabilities:
* Create new issues with detailed metadata
* Search existing issues
* Link and unlink issues with Thena tickets
* View issue details including status, priority, and assignee
File handling capabilities:
* Upload files to Linear
* Attach files to issues
## FAQs
Yes, you can link multiple Linear issues to a single Thena ticket. Each linked issue will appear in the Linear section of the ticket details panel, allowing you to track multiple related issues.
When a linked Linear issue is updated, the changes will be reflected in the Thena ticket details. This includes updates to status, priority, assignee, labels, and other issue details. The synchronization happens near real-time, ensuring you always have the latest information.
In the card view, the integration displays basic Linear issue information:
* ID and title
* Status
* Priority
* Assignee
When you click on the issue card, you'll see comprehensive details including:
* Title and description
* Status with all available options from the Linear team's configuration
* Priority levels
* Assignee options
* Labels
* Project assignment
* Cycle assignment
You need:
* View permissions for the teams you want to access
* Create issue permissions if you want to create new issues
* Edit permissions if you want to update existing issues
The integration will respect the permissions of the authenticated Linear user.
Yes, you can unlink a Linear issue from a Thena ticket by clicking the unlink button next to the linked issue in the ticket details panel. This will remove the reference in Thena.
There is no specific limit imposed by the Thena integration on the number of Linear issues you can link or create. However, be mindful of any API rate limits that may be enforced by Linear.
# Salesforce
Source: https://docs.thena.ai/platform/apps/salesforce
Synchronize accounts and contacts between Salesforce and Thena for seamless customer data management.
## Overview
The Salesforce integration enables synchronization of accounts and contacts from Salesforce CRM to Thena. This integration helps you maintain consistent customer data across both platforms, streamline your customer relationship management, and enhance your team's ability to provide personalized service.
* **Account synchronization**: Automatically sync accounts from Salesforce to Thena with custom field selection
* **Contact synchronization**: Automatically sync contacts from Salesforce to Thena with predefined fields
* **Advanced filtering**: Control which accounts and contacts are synchronized with multiple filter operators
* **Manual sync triggers**: Trigger immediate synchronization for accounts or contacts
* **Activity monitoring**: Track all synchronization activities with detailed audit logs and sync status
* **Flexible sync frequency**: Configure sync intervals from 4 to 24 hours
* **Data preservation**: Deletions in Salesforce are not automatically handled to prevent data loss in Thena
## Key features
* Sync account fields
* Choose from available Salesforce fields
* Apply complex filtering rules
* Manual sync triggers available
* Sync contacts with predefined standard fields
* Link contacts to associated accounts
* Track sync status and history
* Multiple filter operators (equals, contains, greater than, etc.)
* Filter by any selected field
* Include/exclude specific records
* Real-time sync status tracking
* Detailed audit logs
* Monitor sync operations progress
* View sync history and errors
* Configure sync frequency (4, 8, 12, or 24 hours)
* Manual sync triggers for immediate updates
* Track last sync timestamps
* Predefined field mappings
* Account fields mapping
* Contact fields mapping
* Automatic field creation in Thena
## Setup
You need admin permissions in Salesforce to install the Salesforce integration.
Install the Salesforce integration at the organization level since this feature will be accessible to all teams, as Accounts is an organization-level feature.
1. Navigate to the [Apps studio](https://dashboard.thena.ai/organization/settings/apps-studio) in your Thena dashboard
2. Find the Salesforce integration in the available apps
3. Click the "Install" button to begin the installation process
1. Review the permissions and scopes required by the integration
2. Select "No team" to install Salesforce at the organization level
1. After configuration, click "Complete Salesforce authorization"
2. You'll be redirected to Salesforce to authorize the connection
3. Sign in with your Salesforce account and grant the requested permissions
4. You'll be redirected back to Thena once authorization is complete
1. Navigate to the Salesforce configuration page
2. Verify that account and contact sync is enabled
3. Configure custom fields for accounts (contacts use predefined fields)
4. Set up sync frequency for both accounts and contacts
5. Optionally set up filters to sync selective data
6. Click "Save changes" to apply your configuration
## How to configure synchronization
For accounts, you can select which custom fields to synchronize (default fields are always included):
1. Navigate to the Salesforce configuration page in App Studio
2. Open the "Accounts" section
3. Find the "Custom fields" section
4. Type at least 2 characters in the search box to find available fields
5. Select the custom fields you want to synchronize
6. Default fields (Name, Website, OwnerId, Description, Id, Type, Industry) are always included
7. Click "Save changes" to apply your configuration
Default account fields are always synchronized and cannot be deselected. These include Name (maps to Thena account name), Website (maps to primaryDomain), OwnerId (maps to accountOwnerId), and others with specific mappings to Thena properties.
Account sync allows custom field selection beyond default fields and supports advanced filtering with multiple operators. Custom fields must be searched and selected, and filters can only be applied to selected custom fields.
Contact synchronization uses predefined standard fields:
1. Navigate to the Salesforce configuration page in App Studio
2. Open the "Contacts" section
3. View the predefined fields that will be synchronized:
* **FirstName**: Maps to Thena contact firstName
* **LastName**: Maps to Thena contact lastName
* **Email**: Maps to Thena contact email (required)
* **Phone**: Maps to Thena contact phoneNumber
* **Title**: Contact title/position
* **Department**: Contact department
* **AccountId**: Links contact to associated Salesforce account
Contact fields are predefined and cannot be customized. This ensures consistent data mapping between Salesforce and Thena.
Contact sync uses predefined standard fields only with no custom field selection available. This ensures consistent data mapping between systems and links contacts to their associated Salesforce accounts.
You can set up advanced filters to control which account records are synchronized:
1. Navigate to the Salesforce configuration page
2. Open the "Accounts" section
3. Find the "Filters" section (available only for accounts with selected custom fields)
4. Click "Add filter" to create a new filter
5. Select the field to filter on (from your selected fields)
6. Choose from multiple available operators
7. Enter the filter value(s)
8. Add additional filters as needed
9. Click "Save changes" to apply your filters
Available filter operators include:
* **Equals / Not equals**: Exact value matching
* **Contains / Does not contain**: Partial text matching
* **Greater than / Less than**: Numeric/date comparisons
* **Greater than or equal / Less than or equal**: Inclusive comparisons
* **Is empty / Is not empty**: Check for null/empty values
* **Is true / Is false**: Boolean value checks
* **Starts with / Ends with**: Text pattern matching
* **Is one of / Is not one of**: Multiple value matching (comma-separated)
* **Has property / Does not have property**: Property existence checks
Multiple filters are combined with AND logic. Use filters to exclude test data, inactive records, or records that don't meet your criteria.
Configure how often data is synchronized:
1. Navigate to the Salesforce configuration page
2. Open either the "Accounts" or "Contacts" section
3. Find the "Sync frequency" dropdown
4. Choose from available options:
* **Every 4 hours**: More frequent updates
* **Every 8 hours**: Balanced frequency
* **Every 12 hours**: Less frequent updates
* **Every 24 hours (Daily)**: Once per day
You can also trigger manual synchronization using the refresh button next to each sync section for immediate updates.
There is no specific limit imposed by Thena on the number of Salesforce records you can synchronize. However, the integration respects Salesforce's API rate limits and governor limits. For large data sets, synchronization may take longer due to these rate limits, but the system implements rate limiting and retry mechanisms to handle this gracefully.
Monitor synchronization activities and troubleshoot issues:
1. Navigate to the Salesforce configuration page
2. Open the "Sync status" section
3. Switch between two tabs:
* **Sync Status**: View active, completed, and failed sync operations
* **Audit Logs**: Search and view detailed activity logs
**Sync Status features:**
* Real-time status of sync operations
* Progress tracking for active syncs
* Completion times and error information
* Auto-refresh during active operations
**Audit Logs features:**
* Searchable log entries with detailed information
* Filter by entity type (accounts, contacts, webhooks)
* View specific actions (created, updated, fetched)
* Error details for troubleshooting
* Pagination for large log sets
Use the search functionality in audit logs to quickly find specific records or error messages. Logs are automatically refreshed and provide comprehensive tracking of all integration activities.
If data is missing after synchronization, check that custom fields are selected for accounts, verify records contain required predefined fields for contacts, ensure filters aren't excluding expected records, and check audit logs for specific errors. Some complex field types may not be supported by the integration.
## Permission scopes
The Salesforce app requires specific permissions to function properly and processes events to keep data synchronized between systems.
Read account information:
* Access account data for synchronization
* Query account records from Thena
* Retrieve account properties and metadata
Create and update accounts:
* Sync account data with Salesforce
* Create new accounts in Thena from Salesforce
* Update existing account information
Read contact information:
* Access contact data for synchronization
* Query contact records from Thena
* Retrieve contact properties and metadata
Create and update contacts:
* Sync contact data with Salesforce
* Create new contacts in Thena from Salesforce
* Update existing contact information
Read custom field definitions:
* Access custom field configurations for sync mapping
* Retrieve field metadata and types
* Support field search functionality
Create custom fields for sync tracking:
* Create sf\_account\_id and sf\_contact\_id fields for sync tracking
* Automatically create custom fields in Thena when needed
* Maintain field mapping relationships
Sync new accounts from Thena to Salesforce:
* Creates a contact in Salesforce when a new account is added in Thena
* Only active in bidirectional sync mode
* Synchronizes standard and custom field values
Sync account updates from Thena to Salesforce:
* Updates the account in Salesforce when account details are modified in Thena
* Only active in bidirectional sync mode
* Maintains data consistency between platforms
Sync new contacts from Thena to Salesforce:
* Creates a contact in Salesforce when a new contact is added in Thena
* Only active in bidirectional sync mode
* Synchronizes predefined contact fields
Sync contact updates from Thena to Salesforce:
* Updates the contact in Salesforce when contact details are modified in Thena
* Only active in bidirectional sync mode
* Links contacts to associated accounts
Notifies Thena about account synchronization:
* Provides account\_id, sync\_status, and salesforce\_id
* Confirms successful account creation or updates
* Tracks sync operation status
Notifies Thena about contact synchronization:
* Provides contact\_id, sync\_status, and salesforce\_id
* Confirms successful contact creation or updates
* Tracks sync operation status
# Webhooks
Source: https://docs.thena.ai/platform/apps/webhooks
Create a private webhook app to receive all platform events from Thena.
Create a dedicated private webhook app which sends all the platform events from Thena to the webhook URL you add while creating the app. This is a secure way to ensure your data is sent to the receiving app.
## What are webhooks?
Webhooks are HTTP callbacks that automatically send data from one application to another when specific events occur. Think of them as "reverse APIs" - instead of your application requesting data from a service, the service automatically sends data to your application when something happens.
A webhook app in Thena allows you to receive all platform events in real-time and send them to multiple destinations. This approach gives you complete control over how you receive and process Thena platform events while maintaining the flexibility to send them to multiple destinations.
## What events are supported?
Thena publishes a comprehensive set of platform events that you can receive through webhooks. These events cover all major platform activities and are organized into logical categories:
* **ticket:created** - New ticket creation
* **ticket:updated** - Ticket modifications
* **ticket:deleted** - Ticket deletion
* **ticket:archived** - Ticket archiving
* **ticket:assigned** - Agent assignment
* **ticket:status:changed** - Status updates
* **ticket:priority:changed** - Priority changes
* **account:created** - New account creation
* **account:updated** - Account modifications
* **account:deleted** - Account deletion
* **account-health:changed** - Health status changes
* **account-status:changed** - Account status updates
* **account-custom\_field\_value:added** - Custom field additions
* **account-custom\_field\_value:removed** - Custom field removals
* **ticket:comment:created** - New ticket comments
* **ticket:comment:updated** - Comment modifications
* **ticket:comment:deleted** - Comment deletion
* **account-task:comment:created** - Task comment creation
* **account-activity:comment:created** - Activity comment creation
* **account-note:comment:created** - Note comment creation
* **user:mentioned** - User mentions in comments
* **user:created** - New user creation
* **user:updated** - User profile updates
* **user:deleted** - User deletion
* **organization:created** - New organization setup
* **organization:updated** - Organization changes
* **organization:deleted** - Organization deletion
* **organization:member-joined** - New member additions
* **organization:member-left** - Member departures
* **organization:plan-changed** - Subscription plan updates
* **custom-object::created** - Custom object creation
* **custom-object::updated** - Custom object updates
* **custom-object::deleted** - Custom object deletion
* **custom-object::field-changed** - Field value changes
**Note**: Custom object events use dynamic event types based on your custom object definitions. Replace with your actual custom object names (e.g., "deal", "opportunity", "lead").
## Key features
Receive all platform events from Thena in real-time through webhook endpoints.
Create multiple webhook apps to send events to different services and systems.
Filter and process events on your end to create custom workflows and automation.
Maintain complete control over event processing logic and data handling.
## How to set up webhooks in Thena
**Setup requirements**: The webhook app creation requires setup through the Thena API. There is no user interface available for configuration at this time. All setup must be completed using API calls.
You need to make **2 API calls** for this setup:
1. **Create app** - use the curl command with the manifest to create the app
2. **Install app** - install the app in the teams whose events you want to receive
### Step 1: Create app
Create a POST request to create your webhook app with the following curl command:
```bash theme={null}
curl --location 'https://apps-studio.thena.ai/apps/create-app' \
--header 'Content-Type: application/json' \
--header 'x-api-key: YOUR_API_KEY' \
--data-raw '{
"app_visibility": "private",
"manifest": {
"app": {
"name": "Webhooks",
"description": "Send webhoooks to third party services",
"category": "webhooks",
"icons": {
"small": "https://cdn1.iconfinder.com/data/icons/carbon-design-system-vol-8/32/webhook-1024.png",
"large": "https://cdn1.iconfinder.com/data/icons/carbon-design-system-vol-8/32/webhook-1024.png"
},
"supported_locales": [
"en-US"
],
"slug":"webhooks"
},
"developer": {
"name": "Your org name",
"website": "https://yourorg.app",
"support_email": "support@yourorg.app",
"privacy_policy_url": "https://yourorg.app/privacy",
"terms_url": "https://yourorg.app/terms",
"documentation_url": "https://developers.yourorg.app/docs"
},
"integration": {
"entry_points": {
"main": "https://yourorg.app/app",
"configuration": "https://yourorg.app/config"
},
"webhooks": {
"events": "https://your-webhook-url",
"installations": "https://your-webhook-url"
},
"interactivity": {
"request_url": "https://your-webhook-url",
"message_menu_option_url": "https://your-webhook-url"
}
},
"configuration": {
"required_settings": [],
"optional_settings": []
},
"scopes": {
"required": {
"platform": [
{
"scope": "webhooks:read",
"reason": "Read webhook data",
"description": "Access to read webhook information"
}
]
},
"optional": {
"platform": []
}
},
"events": {
"subscribe": [],
"publish": []
},
"activities": [],
"metadata": {
"is_privileged_app": false
}
}
}'
```
**Customize the manifest** with your organization's information:
* Add your Thena API key in the `x-api-key` header
* Update the `developer` section with your company details
* Replace `webhook URLs` with your actual endpoints inside webhooks and interactivity
* Modify the app name and description as needed
Replace `YOUR_API_KEY` with your actual Thena API key. You can find this in your Thena dashboard under Organization → Personal → Security Access or visit [https://dashboard.thena.ai/organization/settings/personal/security-access](https://dashboard.thena.ai/organization/settings/personal/security-access).
**App visibility**: Ensure this is set to `private` since it is for internal use.
Use the [Create a new app API](/api-reference/apps-platform/app-creation/create-a-new-app) to execute the curl command above.
The API endpoint will validate your manifest and create the webhook app with the specified configuration.
Once the app is created successfully, you will receive an API response containing:
* `appId`: This unique identifier for your webhook app (e.g., `EGHG8R3K9HGU98JJ81W5EKQRM2X9`)
* `clientId` and `clientSecret`: Authentication credentials for the app
Save the `appId` as you'll need it for the next step.
### Step 2: Install app
After creating the app, you need to install it to specify which teams' events you want to receive.
Create a POST request to install the webhook app with the following curl command:
```bash theme={null}
curl --location 'https://apps-studio.thena.ai/apps/install' \
--header 'Content-Type: application/json' \
--header 'x-api-key: YOUR_API_KEY' \
--data '{
"teamIds": [
"TAHGVCBHGT",
"THHGHBNIYF"
],
"appId": "YOUR_APP_ID",
"appConfiguration": {
"required_settings": [],
"optional_settings": []
}
}'
```
**Customize the installation request** with your specific values:
* Add your Thena API key in the `x-api-key` header
* Replace `YOUR_APP_ID` with the `appId` you received from Step 1 (e.g., `EGHG8R3K9HGU98JJ81W5EKQRM2X9`)
* Update the `teamIds` array with your actual team IDs
**Finding team IDs**: You can find your team ID from the URL when you're in the team dashboard in Thena. For example, if the URL is `https://dashboard.thena.ai/dashboard/T123NHFDRF`, then the team ID is `T123NHFDRF`.
**Multiple teams**: You can install the webhook app to multiple teams at once by including all relevant team IDs in the `teamIds` array.
Use the [Install an app API](/api-reference/apps-platform/app-installation/install-an-app) to execute the curl command above.
The API endpoint will handle connecting your webhook app to the specified Thena teams.
After successful installation, you should see the webhook app appear in your app settings. The app will now start sending events from the specified teams to the webhook URL.
## What can you do with multiple webhook apps?
You can create **as many webhook private apps as needed** using this approach to send events to multiple destinations:
Send events to Zapier, n8n, Make for workflow automation and integration with multiple apps.
Route events to your internal monitoring and alerting systems.
Stream events to data warehouses for analytics and reporting.
Send filtered events to Slack channels for team notifications.
**App isolation**: Each webhook app operates independently, so you can have different configurations, webhook URLs, and team assignments for different use cases.
## How do you process webhook events?
Based on the platform events you receive, you can add **filtering on your end** and create any workflows:
**Event filtering**: You can filter these events on your webhook endpoint to process only the events relevant to your use case. Each event includes rich metadata and payload data for comprehensive integration.
### Filtering examples
```javascript theme={null}
// Example webhook handler
app.post('/webhook', (req, res) => {
const event = req.body;
// Filter for specific event types
if (event.type === 'ticket:created') {
// Handle new contact creation
processNewContact(event.data);
}
// Filter for specific teams
if (event.team_id === 'team_123') {
// Process team-specific events
handleTeamEvent(event);
}
// Filter for specific users
if (event.user_id === 'user_456') {
// Process user-specific events
handleUserEvent(event);
}
res.status(200).send('OK');
});
```
### No-code filtering
If you're using no-code automation tools like Zapier, n8n, or Make, you can filter events using the **Message Event Type** field instead of writing code. For example:
* Filter by `ticket:created` to process only new ticket events
* Filter by `ticket:comment:reaction:added` to handle reaction events
* Filter by `account:updated` to respond to account changes
* Use pattern matching like `ticket:*` to catch all ticket-related events
This approach allows you to create sophisticated workflows without writing custom filtering logic.
### Workflow examples
Send Slack messages when high-priority tickets are created or escalated.
Update external CRM systems when contacts are modified or created.
Track user engagement patterns and generate real-time reports.
Log all data changes for audit purposes and regulatory compliance.
**Getting help**: If you encounter issues during setup, check the validation requirements above and ensure all required fields are properly configured in your manifest.
# Activities
Source: https://docs.thena.ai/platform/core-concepts/accounts/activities
Track and manage all interactions with customer accounts
Activities capture all interactions and engagements with customer accounts in the Thena platform, providing a comprehensive timeline of customer relationships.
## Understanding activities
Activities provide a structured way to track, manage, and analyze all customer interactions. They help maintain a complete history of engagements and ensure proper follow-up on customer communications.
## Activity types
• Meetings: In-person or virtual
• Calls: Phone conversations
• Emails: Email threads
• Chat: Instant messaging
• Site visits: On-premise meetings
• Reviews: Performance discussions
• Presentations: Product demos
• Training: Customer education
## Standard fields
### Required fields
| Name | Type | Options | Comments |
| :----------------- | :-------- | :------- | :---------------------------- |
| Account ID | string | Required | Associated account identifier |
| Activity Timestamp | timestamp | Required | When the activity occurred |
| Duration | integer | Required | Length of activity in minutes |
| Location | string | Required | Physical or virtual location |
### Optional fields
| Name | Type | Options | Comments |
| :-------------- | :----- | :--------------------------------------------------------------- | :------------------------ |
| Type | string | Optional, Values: \[CALL (default), EMAIL, MEETING, SITE\_VISIT] | Activity type reference |
| Status | string | Optional, Values: \[PENDING (default), COMPLETED, CANCELLED] | Activity status reference |
| Participants | jsonb | Optional, Default: \[] | List of participants |
| Attachment URLs | array | Optional | List of attachment URLs |
### System-managed fields
| Name | Type | Options | Comments |
| :---------- | :-------- | :------------- | :---------------------------------- |
| Activity ID | bigserial | Auto-generated | Primary key |
| UID | text | Auto-generated | Unique identifier (ULID) |
| Is Active | boolean | Default: true | Activity's active status |
| Created By | bigint | Auto-populated | References user table |
| Created At | timestamp | Auto-populated | Creation timestamp with timezone |
| Updated At | timestamp | Auto-populated | Last update timestamp with timezone |
| Deleted At | timestamp | Optional | Soft delete timestamp with timezone |
Database types:
* Account ID and Created By are stored as `bigint` in the database
* Location is stored as `text`
* Duration is stored as `integer`
* Participants is stored as `jsonb`
* System fields use their respective database types (`bigserial`, `text`, `boolean`, `timestamp with time zone`)
## Activity tracking
* Schedule activities
* Set clear objectives
* Identify participants
* Prepare required materials
* Record attendance
* Document key points
* Track action items
* Note decisions made
* Update activity status
* Create follow-up tasks
* Share meeting notes
* Schedule next steps
## Best practices
• Record activities promptly
• Include all relevant details
• Link to related records
• Maintain consistent format
• Use clear subject lines
• Categorize properly
• Tag all participants
• Set appropriate privacy
## API endpoints
### Sample activity
```json theme={null}
{
"accountId": "ACC123",
"title": "Quarterly Business Review",
"type": "MEETING",
"typeId": "T123",
"typeConfiguration": {
"icon": "video",
"color": "#4CAF50"
},
"status": "SCHEDULED",
"statusId": "S123",
"statusConfiguration": {
"icon": "calendar",
"color": "#2196F3"
},
"activityTimestamp": "2024-03-20T14:00:00Z",
"duration": 60,
"location": "https://meet.google.com/abc-defg-hij",
"participants": ["USER123", "USER456"],
"attachmentUrls": [
"https://storage.thena.ai/documents/agenda.pdf",
"https://storage.thena.ai/documents/presentation.pdf"
],
"metadata": {
"agenda": "1. Q3 Review\n2. Q4 Goals\n3. Action Items",
"meetingType": "QBR",
"requiredPreparation": "Please review Q3 metrics before the meeting"
}
}
```
When creating an activity, the system will add additional fields in the response such as:
* `id`: Unique identifier for the activity
* `account`: Name of the associated account
* `creator`: Name of the activity creator
* `creatorId`: ID of the creator
* `creatorEmail`: Email of the creator
* `createdAt`: Creation timestamp
* `updatedAt`: Last update timestamp
### Available operations
```bash theme={null}
# List account activities
GET /v1/accounts/{accountId}/activities
# Create account activity
POST /v1/accounts/{accountId}/activities
Content-Type: application/json
# Get activity by ID
GET /v1/accounts/{accountId}/activities/{activityId}
# Update activity
PATCH /v1/accounts/{accountId}/activities/{activityId}
Content-Type: application/json
# Delete activity
DELETE /v1/accounts/{accountId}/activities/{activityId}
```
All endpoints require authentication with Bearer token, API key, and Organization ID in the headers.
For detailed API specifications, see Activity Management
## Related resources
Learn about account management
Manage customer contacts
# Contacts
Source: https://docs.thena.ai/platform/core-concepts/accounts/contacts
Managing customer contacts and their roles within accounts
Contacts represent individuals associated with an account in the Thena platform. They serve as the key points of communication and relationship management between your organization and your customers.
## Understanding contacts
Contacts provide a structured way to manage relationships with individuals within customer organizations. Each contact can have specific roles, responsibilities, and preferences that help in personalizing interactions.
## Contact roles
• Primary contact: Main decision maker
• Billing contact: Financial matters
• Technical contact: Implementation and support
• Executive sponsor: Strategic relationship
• Department heads
• Team managers
• Project leads
• Subject matter experts
## Standard fields
### Required fields
| Name | Type | Options | Comments |
| :------------------- | :------ | :----------------------------------------------------------------------- | :---------------------------------- |
| Organization ID | string | Required | Organization the contact belongs to |
| First Name | string | Required | Contact's first name |
| Email | string | Required, Unique per organization | Primary email address |
| Contact Type | string | Required, Values: \[PRIMARY (default), BILLING, LEGAL, EXECUTIVE, OTHER] | Type of contact relationship |
| Is Marketing Contact | boolean | Required, Default: false | Marketing communication preference |
| Is Active | boolean | Required, Default: true | Contact's active status |
### Optional fields
| Name | Type | Options | Comments |
| :--------------- | :----- | :--------------- | :----------------------------- |
| Last Name | string | Optional | Contact's last name |
| Phone Number | string | Optional | Phone number with country code |
| Avatar URL | string | Optional | Profile picture URL |
| Metadata | jsonb | Optional | Additional metadata |
| Customer User ID | string | Optional, Unique | Associated user reference |
### System-managed fields
| Name | Type | Options | Comments |
| :--------- | :-------- | :------------- | :---------------------------------- |
| Contact ID | bigserial | Auto-generated | Primary key |
| UID | text | Auto-generated | Unique identifier (ULID) |
| Created At | timestamp | Auto-populated | Creation timestamp with timezone |
| Updated At | timestamp | Auto-populated | Last update timestamp with timezone |
| Deleted At | timestamp | Optional | Soft delete timestamp with timezone |
Database types:
* Organization ID and Customer User ID are stored as `bigint` in the database
* First Name, Last Name, Email, Phone Number are stored as `text`
* Metadata is stored as `jsonb`
* System fields use their respective database types (`bigserial`, `text`, `boolean`, `timestamp with time zone`)
## Best practices
* Maintain up-to-date contact details
* Verify email addresses periodically
* Document communication preferences
* Track role changes
* Clearly define primary contacts
* Maintain backup contacts
* Document role transitions
* Update access permissions
* Respect time zones
* Follow language preferences
* Maintain communication history
* Track engagement levels
## API endpoints
### Sample contact
```json theme={null}
{
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@acme.com",
"phone": "+1-555-123-4567",
"type": "PRIMARY",
"isMarketingContact": false,
"isActive": true,
"metadata": {
"department": "Engineering",
"title": "CTO",
"timezone": "America/Los_Angeles"
}
}
```
When creating a contact, the system will add additional fields in the response such as `uid`, `createdAt`, `updatedAt`, and `accountId`.
### Available operations
```bash theme={null}
# List account contacts
GET /v1/accounts/{accountId}/contacts
# Create account contact
POST /v1/accounts/{accountId}/contacts
Content-Type: application/json
# Get contact by ID
GET /v1/accounts/{accountId}/contacts/{contactId}
# Update contact
PATCH /v1/accounts/{accountId}/contacts/{contactId}
Content-Type: application/json
# Delete contact
DELETE /v1/accounts/{accountId}/contacts/{contactId}
```
All endpoints require authentication with Bearer token, API key, and Organization ID in the headers.
For detailed API specifications, see Contact Management
## Related resources
Learn about account management
Track interactions with contacts
# Notes
Source: https://docs.thena.ai/platform/core-concepts/accounts/notes
Document and manage account-related information and updates
Notes provide a flexible way to document important information, updates, and insights related to customer accounts in the Thena Platform.
## Understanding notes
Notes serve as a central repository for documenting customer interactions, internal discussions, decisions, and other important account-related information that needs to be preserved and shared across teams.
## Note types
• General updates
• Meeting minutes
• Decision records
• Strategy documents
• Implementation details
• Configuration changes
• Integration notes
• Troubleshooting logs
## Standard fields
### Required fields
| Name | Type | Options | Comments |
| :--------- | :----- | :------- | :---------------------------- |
| Account ID | string | Required | Associated account identifier |
| Content | string | Required | Main content of the note |
### Optional fields
| Name | Type | Options | Comments |
| :-------------- | :----- | :------- | :------------------------------------- |
| Type | string | Optional | Note type reference |
| Visibility | enum | Optional | Access control (PUBLIC, PRIVATE, TEAM) |
| Attachment URLs | array | Optional | List of attachment URLs |
### System-managed fields
| Name | Type | Options | Comments |
| :--------- | :-------- | :------------- | :----------------------------- |
| Note ID | string | Auto-generated | Unique identifier for the note |
| UID | string | Auto-generated | Unique identifier (ULID) |
| Is Active | boolean | Default: true | Note's active status |
| Author ID | string | Auto-populated | User who created the note |
| Created At | timestamp | Auto-populated | Creation timestamp |
| Updated At | timestamp | Auto-populated | Last update timestamp |
| Deleted At | timestamp | Optional | Soft delete timestamp |
## Note organization
* Choose appropriate type
* Set clear title
* Structure content well
* Add relevant tags
* Control visibility
* Link related records
* Attach documents
* Track versions
* Share with teams
* Gather feedback
* Update content
* Maintain history
## Best practices
• Write clearly and concisely
• Use consistent formatting
• Include relevant context
• Maintain objectivity
• Use descriptive titles
• Apply appropriate tags
• Link related notes
• Set proper visibility
## API endpoints
### Sample note
```json theme={null}
{
"accountId": "A790SFS229",
"content": "Met with John (CTO) and Sarah (Engineering Lead) to discuss API integration requirements. Key points:\n- Need OAuth2 implementation\n- Rate limiting concerns for high-traffic periods\n- Webhook setup for real-time updates\n\nNext steps: Schedule technical deep dive next week.",
"type": "MEETING_NOTES",
"visibility": "private",
"attachmentUrls": [
"https://storage.thena.ai/documents/api-requirements-draft.pdf",
"https://storage.thena.ai/documents/integration-timeline.xlsx"
]
}
```
When creating a note, the system will add additional fields in the response such as:
* `id`: Unique identifier for the note
* `account`: Name of the associated account
* `author`: Name of the note creator
* `authorId`: ID of the creator
* `authorEmail`: Email of the creator
* `createdAt`: Creation timestamp
* `updatedAt`: Last update timestamp
### Available operations
```bash theme={null}
# List account notes
GET /v1/accounts/{accountId}/notes
# Create account note
POST /v1/accounts/{accountId}/notes
Content-Type: application/json
# Get note by ID
GET /v1/accounts/{accountId}/notes/{noteId}
# Update note
PATCH /v1/accounts/{accountId}/notes/{noteId}
Content-Type: application/json
# Delete note
DELETE /v1/accounts/{accountId}/notes/{noteId}
```
All endpoints require authentication with Bearer token, API key, and Organization ID in the headers.
For detailed API specifications, see Note Management
## Related resources
Learn about account management
Track customer interactions
# Overview
Source: https://docs.thena.ai/platform/core-concepts/accounts/overview
Understanding accounts and their implementation in the Thena platform
Accounts are the foundational entities that represent customer organizations in the Thena platform. They serve as a central hub for managing customer relationships, hierarchies, and associated business data across all platform services.
## Understanding accounts
A central system for managing customer organizations, their relationships, and business operations across the platform. Accounts serve as the foundation for all customer-related activities and data management.
• Complex organizational hierarchies
• Parent-subsidiary relationships
• Multi-level account management
• Comprehensive data tracking
• Flexible classification system
• Seamless tickets integration
• Workflow automation
• Custom field support
• API-first architecture
Accounts form the backbone of customer relationship management in the Thena platform, providing context for tickets, teams, workflows, and other platform features.
### Core capabilities
• Company profiles
• Business identifiers
• Industry classification
• Account health tracking
• Territory management
• Parent-subsidiary links
• Partner relationships
• Contact management
• Team associations
• Access controls
## Standard fields
All fields support custom validation rules and can be extended with custom fields based on your business needs.
The following fields can be customized with your own values based on your business requirements:
* `account_status`: Account lifecycle states
* `account_classification`: Business segmentation
* `account_health`: Health indicators
* `account_industry`: Industry categories
* `contact_type`: Contact role types
* `activity_type`: Types of activities
* `activity_status`: Activity states
* `note_type`: Note categories
* `task_type`: Task categories
* `task_status`: Task states
* `task_priority`: Priority levels
### Required fields
| Name | Type | Options | Mandatory for API Creation | Comments |
| -------------- | ----------- | --------------- | -------------------------- | ------------------------------------------- |
| Account ID | Auto Number | N/A | No (Auto-generated) | Unique identifier for each account |
| Account Name | Text | Max length: 255 | Yes | Legal/Trading name of the company |
| Primary Domain | Text | Max length: 255 | Yes | Company's email domain (e.g., @company.com) |
### Optional fields
| Name | Type | Options | Mandatory for API Creation | Comments |
| ------------------ | --------- | --------------------------------------------- | -------------------------- | ----------------------------------------------- |
| Secondary Domain | Text | Max length: 255 | No | Company's secondary domain |
| Logo | URL | N/A | No | Logo of the company |
| Industry | Picklist | Technology, Healthcare, Finance, Retail, etc. | No | Primary industry of the account |
| Description | Long Text | Max length: 32,768 | No | Additional notes about the account |
| Annual Revenue | Currency | N/A | No | Company's reported annual revenue |
| Employees | Number | N/A | No | Total number of employees |
| Website | URL | N/A | No | Company's official website |
| Billing Address | Address | Street, City, State, Country, ZIP | No | Primary address for invoicing |
| Shipping Address | Address | Street, City, State, Country, ZIP | No | Address for product deliveries |
| Status | Picklist | PROSPECT, TRIAL, ACTIVE, CHURNED, ACQUIRED | No | Current state of the relationship |
| Classification | Picklist | ENTERPRISE, MID\_MARKET, SMB, STRATEGIC | No | Classification of the account |
| Health | Picklist | RED, YELLOW, GREEN | No | Health of the account |
| Account Owner | Lookup | Active Vendor Users | No | CRM user responsible for the account |
| Organization ID | Lookup | Organization ID | No | The platform's Organization ID |
| Source | Text | Max length: 255 | No | Source of the account (e.g., Slack, Custom App) |
| Created Date | DateTime | N/A | No (Auto-generated) | Timestamp of account creation |
| Last Modified Date | DateTime | N/A | No (Auto-generated) | Timestamp of last update |
## Associated entities
Customer contacts with roles:
* Primary contact: Main point of contact
* Billing contact: Handles financial matters
* Legal contact: For contractual communications
* Executive contact: Senior management contact
[Learn more about Contacts →](/platform/core-concepts/accounts/contacts)
Track interactions:
* Meetings: In-person or virtual discussions
* Calls: Phone or video conversations
* Emails: Email communications
* Site visits: On-premise interactions
[Learn more about Activities →](/platform/core-concepts/accounts/activities)
Document management:
* General notes: Day-to-day updates
* Meeting notes: Discussion summaries
* Call summaries: Call interaction records
* Email records: Important email documentation
[Learn more about Notes →](/platform/core-concepts/accounts/notes)
Action items:
* Follow-ups: Scheduled check-ins
* Reviews: Regular assessments
* Approvals: Authorization workflows
* Custom tasks: Business-specific actions
[Learn more about Tasks →](/platform/core-concepts/accounts/tasks)
### Account relationships
```mermaid theme={null}
flowchart TD
subgraph Valid Hierarchy
A[Parent Corp] --> B[Subsidiary 1]
A --> C[Subsidiary 2]
B --> D[Sub-subsidiary 1.1]
B --> E[Sub-subsidiary 1.2]
end
subgraph Invalid Cyclic
X[Company X] --> Y[Company Y]
Y --> Z[Company Z]
Z -.->|Not Allowed| X
end
style X fill:#f96,stroke:#333
style Y fill:#f96,stroke:#333
style Z fill:#f96,stroke:#333
```
The platform enforces relationship rules to prevent cyclic dependencies:
* Maximum hierarchy depth: No limit
* No circular relationships allowed
* Each account can have only one parent
* Child accounts inherit certain properties from parent
## Custom fields
The Thena platform allows you to extend account entities with custom fields to capture business-specific data. Common use cases include:
• Industry-specific metrics
• Custom scoring models
• Compliance requirements
• Integration mappings
• Business unit specific data
Custom fields support various data types including text, number, date, picklist, multi-select, and more. For detailed information about implementing custom fields, refer to our [Custom Fields documentation](/platform/core-concepts/custom-fields/overview).
## Best practices
* Maintain accurate company information
* Regular data validation
* Consistent naming conventions
* Complete required fields
* Document hierarchy changes
* Track key contacts
* Monitor account health
* Regular engagement tracking
* Set up health scoring rules
* Configure automated alerts
* Define workflow triggers
* Enable team notifications
## API endpoints
### Sample account
```json theme={null}
{
"name": "Acme Corporation",
"primaryDomain": "acme.com",
"description": "Global technology company specializing in cloud infrastructure and AI solutions",
"source": "hubspot",
"accountOwnerId": "USER123",
"logo": "https://acme.com/brand/logo.png",
"status": "ACTIVE",
"classification": "ENTERPRISE",
"health": "GREEN",
"industry": "TECHNOLOGY",
"secondaryDomain": "acme.io",
"annualRevenue": 50000000,
"employees": 500,
"website": "https://acme.com",
"billingAddress": "100 Technology Park, Suite 200, San Francisco, CA 94105, USA",
"shippingAddress": "100 Technology Park, Suite 200, San Francisco, CA 94105, USA",
"customFieldValues": [
{
"fieldId": "customer_success_tier",
"value": "premium"
}
],
"addExistingUsersToAccountContacts": true,
"metadata": {
"preferredContactMethod": "email",
"timezone": "America/Los_Angeles",
"customerSince": "2023-01-01"
}
}
```
When creating an account, the system will add additional fields in the response such as `uid`, `createdAt`, `updatedAt`, `isActive`, `memberCount`, and `createdBy`. Only `name` and `primaryDomain` are required fields.
### Available operations
```bash theme={null}
# List all accounts
GET /v1/accounts
# Create account
POST /v1/accounts
Content-Type: application/json
# Get account by ID
GET /v1/accounts/{id}
# Update account
PATCH /v1/accounts/{id}
Content-Type: application/json
# Delete account
DELETE /v1/accounts/{id}
```
All endpoints require authentication and appropriate permissions.
For detailed API specifications, see Account Management
## Related resources
Extending accounts with custom fields
Managing team access and permissions
# Tasks
Source: https://docs.thena.ai/platform/core-concepts/accounts/tasks
Manage and track account-related action items and follow-ups
Tasks help teams manage and track action items, follow-ups, and deliverables related to customer accounts in the Thena platform.
## Understanding tasks
Tasks provide a structured way to manage work items, ensuring that all account-related activities are properly tracked, assigned, and completed. They help maintain accountability and drive customer success initiatives forward.
## Task categories
• Follow-up calls
• Account reviews
• Training sessions
• Issue resolution
• Team updates
• Resource allocation
• Process reviews
• Documentation updates
## Standard fields
### Required fields
| Name | Type | Options | Comments |
| :---------- | :----- | :------- | :---------------------------- |
| Account ID | string | Required | Associated account identifier |
| Title | string | Required | Task title |
| Assignee ID | string | Required | ID of assigned user |
### Optional fields
| Name | Type | Options | Comments |
| :-------------- | :----- | :------------------------------------------------------------------------- | :------------------------- |
| Activity ID | string | Optional | Related activity reference |
| Description | string | Optional | Detailed task description |
| Type | string | Optional, Values: \[FOLLOW\_UP (default), REVIEW, APPROVAL, CUSTOM] | Task type reference |
| Status | string | Optional, Values: \[PENDING (default), IN\_PROGRESS, COMPLETED, CANCELLED] | Task status reference |
| Priority | string | Optional, Values: \[LOW (default), MEDIUM, HIGH] | Task priority reference |
| Attachment URLs | array | Optional | List of attachment URLs |
### System-managed fields
| Name | Type | Options | Comments |
| :--------- | :-------- | :------------- | :---------------------------------- |
| Task ID | bigserial | Auto-generated | Primary key |
| UID | text | Auto-generated | Unique identifier (ULID) |
| Is Active | boolean | Default: true | Task's active status |
| Created By | bigint | Auto-populated | References user table |
| Created At | timestamp | Auto-populated | Creation timestamp with timezone |
| Updated At | timestamp | Auto-populated | Last update timestamp with timezone |
| Deleted At | timestamp | Optional | Soft delete timestamp with timezone |
Database types:
* Account ID, Activity ID, Assignee ID, Type, Status, Priority are stored as `bigint` in the database
* Title and Description are stored as `text`
* System fields use their respective database types (`bigserial`, `text`, `boolean`, `timestamp with time zone`)
## Task workflow
* Define clear objective
* Set priority level
* Assign ownership
* Establish timeline
* Track progress
* Update status
* Document blockers
* Manage dependencies
* Verify deliverables
* Document outcomes
* Create follow-ups
* Update stakeholders
## Best practices
• Set clear deadlines
• Define ownership
• Track dependencies
• Monitor progress
• Communicate updates
• Share context
• Escalate blockers
• Document decisions
## API endpoints
### Sample task
```json theme={null}
{
"accountId": "ACC_01HFGZ2E9KZXP8W4YT0Q6XR1M9",
"title": "Schedule technical deep dive for API integration",
"assigneeId": "USR_01HFGZ4N8X7C9P2M3K5R1V6B8D",
"activityId": "ACT_01HFGZ6B7V4M2N8P5X3J9K1L7H",
"description": "Organize technical deep dive session with Acme Corp's engineering team to discuss:\n- OAuth2 implementation details\n- Rate limiting strategies\n- Webhook configuration\n- Error handling and retry mechanisms",
"type": "FOLLOW_UP",
"status": "PENDING",
"priority": "HIGH",
"attachmentUrls": [
"https://storage.thena.ai/documents/api-requirements-draft.pdf",
"https://storage.thena.ai/documents/integration-architecture.pdf"
]
}
```
When creating a task, the system will add additional fields in the response such as:
* `id`: Unique identifier for the task
* `account`: Name of the associated account
* `creator`: Name of the task creator
* `creatorId`: ID of the creator
* `creatorEmail`: Email of the creator
* `isActive`: Whether the task is active
* `createdAt`: Creation timestamp
* `updatedAt`: Last update timestamp
### Available operations
```bash theme={null}
# List account tasks
GET /v1/accounts/{accountId}/tasks
# Create account task
POST /v1/accounts/{accountId}/tasks
Content-Type: application/json
# Get task by ID
GET /v1/accounts/{accountId}/tasks/{taskId}
# Update task
PATCH /v1/accounts/{accountId}/tasks/{taskId}
Content-Type: application/json
# Delete task
DELETE /v1/accounts/{accountId}/tasks/{taskId}
```
All endpoints require authentication with Bearer token, API key, and Organization ID in the headers.
For detailed API specifications, see Task Management
## Related resources
Learn about account management
Track customer interactions
# Custom fields
Source: https://docs.thena.ai/platform/core-concepts/custom-fields/overview
Complete guide to custom fields in the Thena platform
Custom fields allow you to extend the standard ticket, account, and custom object information with additional data specific to your business needs. This guide explains how custom fields work and how to use them effectively.
These fields provide flexibility to capture and manage specialized information beyond standard fields. They can be added to tickets, accounts and custom objects, enabling you to:
* Collect specific business information
* Standardize data collection
* Enable advanced reporting
* Automate workflows based on field values
## Field sources
Custom fields can be associated with different sources:
Fields that appear on tickets for tracking specific ticket-related information
Fields that store account-specific information and appear on account records
Fields that extend custom objects with additional attributes and data points
## Field configuration
Each custom field can be configured with various properties:
Essential properties for every custom field:
* **Name**: Unique identifier for the field
* **Display name**: Label shown to users
* **Description**: Help text explaining the field's purpose
* **Field type**: Data type for the field
* **Source type**: Ticket, Account, or Custom Object
* **Default value**: Initial value when creating records
Team-specific configurations:
* **Team association**: Link field to specific teams
* **Auto-add to forms**: Automatically add to new forms
* **Field permissions**: Control who can view/edit
* **Source visibility**: Control visibility per source type
Control how the field appears:
* **Placeholder text**: Example text shown when empty
* **Hint text**: Helper text below the field
* **Field width**: Display width in forms
* **Field order**: Position in form layout
* **Source-specific display**: Different display per source type
Control field visibility:
* **Visible to customer**: Show in customer portal
* **Editable by customer**: Allow customer edits
* **Conditional display**: Show based on conditions
* **Role-based visibility**: Show for specific roles
* **Source-based rules**: Different rules per source
## Field types
The Thena platform supports a wide range of field types to capture different kinds of data. Each type has specific properties and validation rules.
### Text fields
Basic text input for short responses.
* **Use for**: Names, titles, references
* **Max length**: 255 characters
* **Validation**: Optional character limit
* **Common uses**:
* Ticket: Reference numbers, short descriptions
* Account: Company aliases, industry codes
* Custom Object: Identifiers, short attributes
Text area for longer responses.
* **Use for**: Descriptions, notes, comments
* **Max length**: 65,535 characters
* **Validation**: Optional character limit
* **Common uses**:
* Ticket: Detailed descriptions, internal notes
* Account: Company descriptions, special instructions
* Custom Object: Detailed attributes, documentation
Formatted text with styling options.
* **Use for**: Detailed descriptions, formatted content
* **Features**: Formatting, lists, links
* **Storage**: HTML content
* **Common uses**:
* Ticket: Solution descriptions, formatted responses
* Account: Formatted company profiles
* Custom Object: Rich content storage
### Numeric fields
Whole number values.
* **Use for**: Counts, quantities, whole numbers
* **Range**: -2,147,483,648 to 2,147,483,647
* **Validation**: Optional min/max values
Numbers with decimal points.
* **Use for**: Measurements, percentages
* **Precision**: Up to 10 decimal places
* **Validation**: Optional decimal places limit
Monetary values with currency support.
* **Use for**: Prices, costs, budgets
* **Features**: Currency symbol, formatting
* **Validation**: Currency-specific rules
### Date and time fields
Calendar date selection.
* **Use for**: Deadlines, schedules
* **Format**: YYYY-MM-DD
* **Features**: Date picker
Combined date and time selection.
* **Use for**: Scheduled events, timestamps
* **Format**: YYYY-MM-DD HH:mm:ss
* **Features**: Date and time picker
Time selection only.
* **Use for**: Duration, time slots
* **Format**: HH:mm:ss
* **Features**: Time picker
### Choice fields
Select one option from a list.
* **Use for**: Categories, status values
* **Features**: Dropdown or list
* **Options**: Customizable choices
Select multiple options from a list.
* **Use for**: Tags, multiple categories
* **Features**: Multi-select dropdown
* **Options**: Customizable choices
Visual single choice selection.
* **Use for**: Clear option choices
* **Features**: Visual radio buttons
* **Best for**: 2-5 options
Visual multiple choice selection.
* **Use for**: Multiple selections
* **Features**: Visual checkboxes
* **Best for**: 2-10 options
### Specialized fields
Email address input with validation.
* **Use for**: Contact information
* **Validation**: Email format
* **Features**: Email verification
Phone number input with formatting.
* **Use for**: Contact information
* **Validation**: Phone format
* **Features**: International format support
Web address input with validation.
* **Use for**: Website links
* **Validation**: URL format
* **Features**: Link verification
IP address input with validation.
* **Use for**: Network information
* **Validation**: IPv4/IPv6 format
* **Features**: IP format verification
Secure password input field.
* **Use for**: Sensitive information
* **Features**: Masked input
* **Security**: Encrypted storage
### Advanced fields
Computed values based on other fields.
* **Use for**: Formulas, computations
* **Features**: Dynamic calculation
* **Dependencies**: Based on other fields
* **Common uses**:
* Ticket: SLA calculations, time tracking
* Account: Revenue calculations, usage metrics
* Custom Object: Computed attributes
Reference values from other records.
* **Use for**: Related data
* **Features**: Cross-source relationships
* **Options**: Filtered lookups
* **Common uses**:
* Ticket: Related accounts, parent tickets
* Account: Related contacts, parent accounts
* Custom Object: Related records
True/false or on/off values.
* **Use for**: Simple flags
* **Features**: Visual toggle
* **Values**: True/false
* **Common uses**:
* Ticket: Feature flags, approval status
* Account: Active status, premium features
* Custom Object: State indicators
## Validation
Field validation ensures data quality and consistency across tickets, accounts, and custom objects.
### Validation types
Control when fields must have values:
* **Required on creation**: Must be filled when creating
* **Required on closure**: Must be filled before closing
* **Conditionally required**: Required based on conditions
* **Role-based requirements**: Required for specific roles
* **Source-specific requirements**: Different rules per source type
Ensure correct data format:
* **Text format**: Length, pattern matching
* **Number format**: Range, decimals
* **Date format**: Range, valid dates
* **Email format**: Valid email structure
* **Source-specific formats**: Format rules per source
Validate field values:
* **Range checks**: Min/max values
* **List validation**: Valid option selection
* **Unique values**: No duplicates allowed
* **Dependencies**: Based on other fields
* **Cross-source validation**: Validate across sources
### Advanced validation
Build custom validation rules:
* **Custom functions**: JavaScript validation
* **Complex rules**: Multi-field validation
* **API validation**: External validation
* **Async validation**: Background checks
* **Cross-source rules**: Validate across sources
Context-based validation:
* **Field dependencies**: Based on other fields
* **Status rules**: Based on status
* **Role rules**: Based on user role
* **Team rules**: Based on team
* **Source rules**: Based on source type
Validate multiple fields:
* **Field comparison**: Compare values
* **Field groups**: Group validation
* **Calculated fields**: Formula validation
* **Related fields**: Relationship rules
* **Cross-source fields**: Validate across sources
### Error handling
Configure validation messages:
* **Custom messages**: Field-specific errors
* **Localization**: Multi-language support
* **Dynamic text**: Context-based messages
* **Help text**: User guidance
* **Source-specific messages**: Different messages per source
Control error presentation:
* **Inline errors**: Show next to field
* **Summary errors**: Group all errors
* **Error styling**: Visual presentation
* **Error timing**: When to show errors
* **Source-specific display**: Different display per source
Handle validation failures:
* **Block submission**: Prevent saving
* **Warning only**: Allow with warning
* **Auto-correction**: Fix common errors
* **Suggestions**: Provide valid options
* **Source-specific actions**: Different actions per source
## Best practices
• Use clear, descriptive names
• Choose appropriate field types
• Set helpful default values
• Add descriptive hints
• Consider source-specific needs
• Review field usage regularly
• Archive unused fields
• Document field purposes
• Maintain consistent naming
• Monitor cross-source relationships
• Keep rules simple and clear
• Provide helpful error messages
• Use appropriate validation types
• Test edge cases
• Consider source-specific needs
• Show errors immediately
• Provide clear guidance
• Offer error resolution
• Log validation issues
• Handle cross-source validation
## API reference
### Create custom field
```json theme={null}
{
"name": "device_type",
"displayName": "Device Type",
"description": "Type of device the customer is using",
"type": "SELECT",
"isRequired": false,
"isActive": true,
"options": [
{
"label": "Mobile",
"value": "mobile"
},
{
"label": "Desktop",
"value": "desktop"
},
{
"label": "Tablet",
"value": "tablet"
}
],
"defaultValue": "desktop",
"validation": {
"pattern": null,
"min": null,
"max": null
}
}
```
### Available operations
```bash theme={null}
# Create a custom field
POST /v1/custom-field
Content-Type: application/json
# Get all custom fields
GET /v1/custom-field
# Update custom fields
PATCH /v1/custom-field
Content-Type: application/json
# Get custom fields by IDs
GET /v1/custom-field/fetchByIds
# Search custom field by name
GET /v1/custom-field/search
# Delete custom fields
POST /v1/custom-field/delete
Content-Type: application/json
# Get all custom field types
GET /v1/custom-field/types
```
All endpoints require authentication with Bearer token, API key, and Organization ID in the headers.
For detailed API specifications, see Custom Fields API Reference
The structure and available options for custom fields depend on the field type selected. The example above shows a SELECT type field with predefined options.
Each field type has its own specific configuration options and validation rules.
# Overview
Source: https://docs.thena.ai/platform/core-concepts/organizations/overview
Understanding organizations in the Thena platform
Organizations are the foundational building blocks of the Thena platform that help you manage your teams, members, and resources. Think of an organization as your company's dedicated workspace where all collaboration, automation, and management takes place.
Users can be members of multiple organizations simultaneously. This allows individuals to participate in different workspaces while maintaining separate access controls and settings for each organization.
## What is an organization?
An organization in Thena platform represents a distinct business entity with its own:
* Members and teams
* Resources and configurations
* Customized settings and branding
* Security and access controls
## Creating and joining organizations
### Organization creation
When you create an organization, you automatically become the organization admin. The organization is uniquely identified by a combination of:
* Organization name
* Domain (derived from your email)
Organization names must be unique within the same domain. For example, if an organization named "Thena" exists under domain "thena.ai", another organization with the same name cannot be created under that domain.
### Domain-based joining
As an organization admin, you can configure whether users from your domain can automatically join your organization:
Users with matching email domains can automatically join the organization
Users with matching email domains must be explicitly invited
### Example scenario
Here's how the domain-based organization system works:
User: [alice@acme.com](mailto:alice@acme.com)
Creates: "Acme Corp"
Domain: acme.com
Setting: Allow domain joining
User: [bob@acme.com](mailto:bob@acme.com)
Creates: "Acme Inc"
Domain: acme.com
Setting: Restrict domain joining
User: [carol@acme.com](mailto:carol@acme.com)
Options available:
• Join "Acme Corp" (available due to domain matching and allowed joining)
• Create new org (cannot use names "Acme Inc" or "Acme Corp" with acme.com domain)
### Key components
When creating an organization, you'll need to set up:
A unique identifier for your organization (unique within your domain)
Configure whether users from your domain can automatically join
Your organization's branding image (recommended size 512x512px)
Additional access controls and security settings
## Organization settings
### General settings
* Organization name
* Organization URL (for easy access)
* Organization icon (branding)
* Description
Choose between:
* **Restricted**: Only invited members can join (recommended for most organizations)
* **Open**: Anyone with the organization link can join
Customize your organization's appearance:
* Organization icon
* Color scheme
* Email templates
* Custom domain settings
### Member management
• Admin: Full organization control
• Member: Standard access
• Viewer: Read-only access
• Role-based access control
• Custom permission sets
• Resource-level permissions
### Team structure
Organizations can have multiple teams for different functions:
Create parent-child team relationships for better organization
Configure team-specific workflows, permissions, and automations
## Best practices
### Organization setup
1. **Plan your structure**
* Define clear team hierarchies
* Set up logical member groupings
* Plan permission schemes
2. **Security first**
* Start with restricted access
* Implement role-based permissions
* Regular security audits
3. **Standardize processes**
* Create consistent naming conventions
* Document organization policies
* Establish clear workflows
### Member onboarding
1. **Clear roles**
* Define role responsibilities
* Set up proper permissions
* Document access levels
2. **Structured process**
* Create onboarding checklists
* Provide necessary training
* Set up mentorship pairs
## Related resources
Learn how to effectively manage teams within your organization
Understand different member roles and their permissions
Configure organization security and access controls
Set up automated workflows for your organization
# Role-based access control (RBAC)
Source: https://docs.thena.ai/platform/core-concepts/organizations/rbac
Understanding user roles, permissions, and access control in the Thena platform
Role-based access control (RBAC) is a foundational security model in the Thena platform that ensures users have appropriate access based on their responsibilities and organizational hierarchy. This system protects sensitive operations while enabling efficient collaboration.
The Thena platform implements a progressive access model with five distinct user roles, each designed for specific use cases and access requirements
## User roles and permissions
The Thena platform provides five user roles, each with specific access levels and capabilities. Use the tabs below to explore each role in detail:
Organization administrators have comprehensive access to manage their organization's resources, settings, and members. This is the highest level of access within an organization.
* Create and delete teams
* Add and remove team members
* Update team configurations
* Manage routing rules
* Configure team settings
* Set up team hierarchies
* Manage ticket priorities, statuses, and types
* Configure custom fields and objects
* Set up tags and categories
* Manage forms and templates
* Configure organization settings
* Control workflow automation
* Send organization invitations
* Manage user access and permissions
* Configure notification channels
* Oversee bulk operations
* Control user role assignments
* Manage user onboarding/offboarding
* View subscription details
* Create and manage subscriptions
* Access billing portal
* Monitor usage and costs
* Manage payment methods
* Control subscription features
Organization users have full access to operational features within their organization for daily work. This is the standard role for most team members.
* View, create, and update tickets
* Add comments and reactions
* Escalate and assign tickets
* Create sub-tickets and link related tickets
* Archive/unarchive tickets
* Log time and view time logs
* Use ticket templates and automation
* View and create accounts
* Update account information
* Manage customer contacts
* Add account notes and tasks
* Track account activities
* Manage account relationships
* Access account history and insights
* Update personal profile and settings
* Configure business hours and availability
* Manage skills and integrations
* Set notification preferences
* Configure view preferences
* Customize dashboard and workspace
* View team information and members
* Access team configurations
* View routing rules
* Participate in communications
* Use search and view features
* Collaborate on shared resources
Lite users have limited access focused on essential ticket management and viewing capabilities. This role is ideal for users who need basic access without full operational permissions.
* View assigned tickets
* View ticket history
* Access basic ticket information
* Receive ticket notifications
* View account information (read-only)
* View account activities (read-only)
* See account relationships
* Access contact information (read-only)
* Update basic profile information
* Configure personal notifications
* View personal dashboard
* Manage personal preferences
* Access help resources
* View team information (read-only)
* See team members
* Access basic team resources
* View team structure
* See team contact information
Customer administrators manage customer-facing portal features and customer organization settings. This role is designed for customers who need administrative control over their portal experience.
* Configure customer portal settings
* Manage customer-facing features
* Control customer access and permissions
* Customize portal branding
* Set up customer workflows
* Manage portal integrations
* Manage customer organization settings
* Control customer user access
* Configure customer workflows
* Oversee customer integrations
* Set up customer team structure
* Manage customer billing preferences
* Invite and manage customer users
* Assign customer user permissions
* Configure customer user settings
* Monitor customer user activity
* Control customer user access levels
Customer users have access to customer-facing features and their own tickets through the customer portal. This is the standard role for end customers using the platform.
Scenario: A new employee joins your organization and needs access to the platform for daily work.
New employee creates an account or receives an invitation to join the organization
Organization admin assigns the **org user** role, providing complete operational access
Admin adds the user to relevant teams, granting team-specific access and permissions
User can now manage tickets, accounts, and collaborate with team members effectively
Most new team members should start with the **org user** role as it provides the right balance of access for daily operations without administrative privileges.
Scenario: A contractor, part-time employee, or external collaborator needs limited access to specific tickets.
User needs to view only assigned tickets without full platform access
Organization admin assigns the **light user** role for restricted access
Admin assigns specific tickets to the light user for their work
User can only view assigned tickets but cannot add comments, update status, or access broader platform features
Lite users have view-only access to assigned tickets. They cannot create tickets, add comments, update statuses, or manage customer contacts. Ensure they have the necessary tickets assigned by an admin.
Scenario: An existing team member is promoted to a management role and needs administrative access.
User currently has **org user** role with operational access
Organization admin promotes the user to **org admin** role
User gains access to team management, system configuration, and billing features
User can now manage teams, invite users, configure settings, and oversee organizational operations
Consider providing training on administrative features when promoting users to ensure they understand their new responsibilities and capabilities.
Scenario: External customers need access to submit tickets and track their support requests.
Customer creates an account through the customer portal or receives an invitation
Customer is automatically assigned the **customer user** role with portal access
Customer can access the customer portal, submit tickets, and track their requests
If needed, promote a customer contact to **customer admin** for managing their organization's portal settings
Customer users can only see and manage their own tickets. Customer admins can manage multiple customer users and configure portal settings for their organization.
## Related resources
Learn about managing users within organizations
Understand team-level access controls
Implement proper API authentication
Follow security guidelines for organizations
# Members
Source: https://docs.thena.ai/platform/core-concepts/teams/members
Managing team members and their roles in the Thena platform
Team members are the individuals who make up your teams and contribute to your organization's success. The Thena platform provides comprehensive tools for managing team membership, roles, and permissions.
Members can belong to multiple teams simultaneously, with different roles in each team. This flexibility allows for cross-functional collaboration while maintaining clear responsibilities.
## Member roles
### Role hierarchy
• Team Admin: Complete control
• Team Lead: Operational oversight
• Resource Manager: Asset control
• Configuration Manager: Settings access
• Team Member: Standard access
• Observer: Read-only access
• Guest: Limited access
• Trainee: Supervised access
### Role capabilities
* Full team configuration access
* Member management
* Role assignment
* Resource allocation
* Workflow configuration
* Performance monitoring
* Operational management
* Task assignment
* Performance tracking
* Resource scheduling
* Report generation
* Task execution
* Resource usage
* Basic configurations
* Team collaboration
## Member management
### Access control
• Full access: Complete control
• Modify access: Can edit
• View access: Read only
• No access: Restricted
• Ticket management
• Document access
• Tool usage
• Data visibility
### Member operations
* Direct addition
* Invitation system
* Bulk import
* Role assignment
* Role definition
* Permission setup
* Access configuration
* Role updates
* Access revocation
* Data transfer
* History preservation
* Team reassignment
## API endpoints
### Sample member
```json theme={null}
{
"userId": "user-123",
"teamId": "team-456",
"role": "MEMBER",
"isPrimary": true,
"permissions": ["VIEW_TICKETS", "MODIFY_TICKETS", "VIEW_REPORTS"]
}
```
When adding a member to a team, the system will add additional fields in the response such as `uid`, `createdAt`, `updatedAt`, and `lastActive`.
### Available operations
```bash theme={null}
# List team members
GET /v1/teams/{teamId}/members
# Add member to team
POST /v1/teams/{teamId}/members
Content-Type: application/json
# Update member role
PATCH /v1/teams/{teamId}/members/{memberId}
Content-Type: application/json
# Remove member from team
DELETE /v1/teams/{teamId}/members/{memberId}
```
All endpoints require authentication and appropriate team admin permissions.
For detailed API specifications, see Member Management
```bash theme={null}
# Get member roles
GET /v1/teams/{teamId}/members/{memberId}/roles
# Update member roles
PATCH /v1/teams/{teamId}/members/{memberId}/roles
Content-Type: application/json
```
#### Update roles request (coming soon)
```json theme={null}
{
"role": "TEAM_LEAD",
"permissions": [
"MANAGE_MEMBERS",
"VIEW_ANALYTICS",
"ASSIGN_TICKETS"
]
}
```
For detailed API specifications, see Update Member Roles
## Best practices
* Assign roles based on responsibilities
* Follow principle of least privilege
* Regular role reviews
* Document role changes
* Start with minimal permissions
* Group similar permissions
* Regular access audits
* Clear approval process
* Structured onboarding
* Regular access reviews
* Clean offboarding process
* Knowledge transfer plans
## Related resources
Learn about team management
Configure member routing rules
Understand permission system
Learn about access management
# Overview
Source: https://docs.thena.ai/platform/core-concepts/teams/overview
Understanding teams and their implementation in the Thena platform
Teams in the Thena platform provide a structured way to organize members, manage workflows, and handle ticket routing within your organization. They serve as the primary unit for work distribution and collaboration.
Teams can be organized hierarchically, allowing for parent-child relationships that reflect your organizational structure. A member can belong to multiple teams, each with specific roles and responsibilities.
## What is a team?
A team in Thena Platform represents a group of members who:
* Work together on specific projects or areas
* Share common workflows and processes
* Handle related tickets and tasks
* Have defined roles and permissions
## Team structure
### Team hierarchy
• Department level teams
• Broad responsibility areas
• Cross-functional groups
• Regional divisions
• Specialized units
• Project teams
• Product teams
• Support tiers
### Team types
• Visible to all organization members
• Open for viewing and joining requests
• Transparent workflows
• Limited visibility
• Invitation-only membership
• Protected resources
## Team settings
### Basic configuration
* Team name and description
* Team type (public/private)
* Parent team association
* Team icon and color
* Member roles and permissions
* Resource access levels
* Workflow permissions
* Integration access
* Ticket assignment logic
* Load balancing settings
* Priority handling
* Escalation paths
### Member management
• Team Admin: Full team control
• Team Lead: Operational management
• Member: Standard access
• Observer: Read-only access
• Ticket management
• Resource access
• Configuration rights
• Member management
## Best practices
* Define clear team purpose
* Establish team hierarchy
* Set up access controls
* Configure routing rules
* Define role responsibilities
* Document access levels
* Set up onboarding process
* Maintain member roster
* Regular team reviews
* Performance monitoring
* Process documentation
* Resource allocation
## API endpoints
### Sample team
```json theme={null}
{
"name": "Customer Support",
"description": "Primary support team handling customer inquiries",
"type": "PUBLIC",
"parentTeamId": "team-123",
"icon": "https://example.com/icon.png",
"color": "#FF5733"
}
```
When creating a team, the system will add additional fields in the response such as `uid`, `organizationId`, `createdAt`, `updatedAt`, `isActive`, and `memberCount`.
### Available operations
```bash theme={null}
# List all teams
GET /v1/teams
# Create team
POST /v1/teams
Content-Type: application/json
# Get team by ID
GET /v1/teams/{id}
# Update team
PATCH /v1/teams/{id}
Content-Type: application/json
# Delete team
DELETE /v1/teams/{id}
```
All endpoints require authentication. Include your API key in the Authorization header.
For detailed API specifications, see Team Management
```bash theme={null}
# List team members
GET /v1/teams/{id}/members
# Add team member
POST /v1/teams/{id}/members
Content-Type: application/json
# Remove team member
DELETE /v1/teams/{id}/members/{memberId}
```
#### Add member request
```json theme={null}
{
"userId": "user-123",
"role": "MEMBER"
}
```
For detailed API specifications, see:
* Add Team Member
* List Team Members
```bash theme={null}
# Get team configuration
GET /v1/teams/{id}/configuration
# Update team configuration
PATCH /v1/teams/{id}/configuration
Content-Type: application/json
```
#### Configuration request
```json theme={null}
{
"workingHours": {
"timezone": "America/New_York",
"schedule": {
"monday": [{"start": "09:00", "end": "17:00"}],
"tuesday": [{"start": "09:00", "end": "17:00"}]
}
},
"routingRules": {
"assignmentStrategy": "ROUND_ROBIN",
"priorityWeights": true
}
}
```
For detailed API specifications, see Team Configuration
## Related resources
Learn about organization management
Configure team routing rules
Understand ticket management
Set up team workflows
# Routing
Source: https://docs.thena.ai/platform/core-concepts/teams/routing
Configure and manage ticket routing rules for teams
Routing in the Thena platform determines how tickets are distributed among teams and their members. It ensures efficient workload distribution and optimal resource utilization through configurable rules and intelligent assignment strategies.
Routing rules can be configured at both team and member levels, with support for multiple assignment strategies and load balancing mechanisms.
## Routing concepts
### Assignment strategies
• Round robin distribution
• Load-based balancing
• Priority-based routing
• Skill-based matching
• Team queue assignment
• Direct agent assignment
• Escalation paths
• Fallback rules
### Routing criteria
* Priority levels
* Ticket type
* Customer tier
* Source channel
* Custom fields
* Team capacity
* Working hours
* Member availability
* Skill requirements
* Current workload
* SLA requirements
* Customer preferences
* Business hours
* Territory rules
* Language support
## Routing configuration
### Basic setup
* Set assignment strategy
* Configure conditions
* Specify priorities
* Set load limits
* Set team capacity
* Define working hours
* Configure availability
* Set up escalations
* Set individual capacity
* Configure skills
* Define availability
* Set workload limits
### Advanced settings
• Workload distribution
• Capacity management
• Priority weighting
• Queue monitoring
• Time-based escalation
• Priority escalation
• Team escalation
• Manager notifications
## API endpoints
### Sample routing rule
```json theme={null}
{
"teamId": "team-123",
"strategy": "ROUND_ROBIN",
"conditions": {
"priority": ["HIGH", "URGENT"],
"ticketType": ["INCIDENT", "PROBLEM"],
"customerTier": ["PREMIUM"]
},
"loadBalancing": {
"enabled": true,
"maxTicketsPerAgent": 10,
"considerPriority": true
}
}
```
When creating a routing rule, the system will add additional fields in the response such as `uid`, `createdAt`, `updatedAt`, and `isActive`.
### Available operations
```bash theme={null}
# Get team routing
GET /v1/teams/{teamId}/routing
# Create routing rule
POST /v1/teams/{teamId}/routing
Content-Type: application/json
# Update routing rule
PATCH /v1/teams/{teamId}/routing/{ruleId}
Content-Type: application/json
# Delete routing rule
DELETE /v1/teams/{teamId}/routing/{ruleId}
```
All endpoints require authentication and appropriate team admin permissions.
For detailed API specifications, see Routing Management
```bash theme={null}
# Get current assignments
GET /v1/teams/{teamId}/assignments
# Assign ticket
POST /v1/teams/{teamId}/assignments
Content-Type: application/json
# Reassign ticket
PATCH /v1/teams/{teamId}/assignments/{ticketId}
Content-Type: application/json
```
#### Assignment request
```json theme={null}
{
"ticketId": "ticket-123",
"assigneeId": "user-456",
"priority": "HIGH",
"notifyAssignee": true
}
```
For detailed API specifications, see Assignment Operations
## Best practices
* Start with simple rules
* Test thoroughly
* Monitor effectiveness
* Iterate based on data
* Set realistic limits
* Consider priorities
* Monitor queue health
* Adjust dynamically
* Define clear paths
* Set appropriate timers
* Configure notifications
* Document procedures
## Related resources
Learn about team management
Manage team members
Understand ticket lifecycle
Configure SLA policies
# Account mapping
Source: https://docs.thena.ai/platform/core-concepts/tickets/account-mapping
Understanding how Thena automatically links tickets to customer accounts during creation
When a new ticket is created in Thena, the platform automatically attempts to identify and link it to the appropriate customer account. This intelligent mapping process ensures every ticket is properly associated with the right customer for better organization and relationship management.
Account mapping happens automatically during ticket creation using a priority-based resolution system. No manual intervention is required in most cases, though the results can be reviewed and adjusted if needed.
## How account mapping works
Thena follows a priority-based approach to determine the best account match for each incoming ticket:
• Direct account ID
• Slack channel association
• Explicit customer reference
• Email domain matching
• Customer contact lookup
• Automatic account creation
## Mapping scenarios
### Scenario 1: Direct account reference
**When it happens:** The ticket creation request explicitly includes an account ID.
**Process:**
Thena immediately searches for the specified account ID
If the account exists, the ticket is linked immediately
If the account doesn't exist, the system continues with other mapping methods
**Result:** Highest success rate when the account ID is valid.
**Example:** API calls or form submissions that include the account identifier like `"accountId": "acc_123456"`.
***
### Scenario 2: Slack channel mapping
**When it happens:** A ticket is created from a Slack channel that's associated with a customer account.
**Process:**
System searches for accounts linked to the specific Slack channel
If exactly one account is found, ticket is automatically linked
If multiple accounts match, proceed to email-based resolution
If no accounts match, continue with email domain resolution
**Example:** Customer support requests in dedicated Slack channels like `#customer-acme-corp`.
***
### Scenario 3: Email domain resolution
**When it happens:** Thena uses the requester's email domain to find matching accounts.
**Process:**
Extract domain from email (e.g., `support@company.com` → `company.com`)
Skip resolution for public domains like gmail.com, yahoo.com
Search accounts with matching primary domains
If no primary matches, check secondary domains
If multiple matches found, ticket created without account
**Results:**
* **Single match:** Ticket linked to matching account
* **Multiple matches:** Conflict prevents automatic linking
* **No matches:** Proceeds to account creation logic
**Example:** A ticket from `john@acmecorp.com` gets linked to the "Acme Corporation" account.
Public email domains (gmail.com, yahoo.com, etc.) are automatically excluded from domain-based account mapping to prevent incorrect associations.
***
### Scenario 4: Customer contact resolution
**When it happens:** Multiple accounts match a Slack channel, so Thena checks if the requester is a known contact.
**Process:**
Search for the requester's email in existing customer contacts
Check which accounts the contact is associated with
Match contact's accounts with potential candidates
Link ticket if exactly one account matches
**Result:** Helps resolve conflicts when multiple accounts could potentially match.
***
### Scenario 5: Automatic account creation
**When it happens:** No existing account matches are found and automatic account creation is enabled.
**Conditions:**
* No account ID provided
* No Slack channel matches
* No domain matches found
* Email domain is not public (gmail.com, yahoo.com, etc.)
* Team settings allow automatic account creation
* New account created using the email domain as the primary domain
* Ticket automatically linked to the new account
* Customer contact created for the requester
* Account name derived from domain (e.g., "acmecorp.com" → "Acmecorp")
**Result:**
* ✅ New account created and linked to ticket
* ✅ Customer contact established
* ✅ Future tickets from same domain will link automatically
Automatic account creation is disabled for public email domains to prevent creating accounts for personal email addresses like gmail.com or yahoo.com.
### Organization-wide policies
**Primary domains:** Main email domain for the organization
**Secondary domains:** Additional domains (acquisitions, subsidiaries)
**Public domains:** Excluded from automatic mapping
**Activity logging:** Track all mapping decisions
**Success tracking:** Monitor mapping accuracy
**Conflict reporting:** Identify mapping issues
## Troubleshooting
### Common issues
**Symptoms:** Tickets consistently created without account attachments
**Potential causes:**
* Email domain doesn't match account's primary or secondary domains
* Slack channel is not properly mapped to the account
* Automatic account creation is disabled when needed
* Public domain restrictions are blocking legitimate domains
**Solutions:**
* Verify domain assignments across accounts
* Check Slack channel mappings in account settings
* Review team configuration for account creation settings
* Update public domain exclusion list if needed
**Symptoms:** Tickets created without accounts due to multiple matches
**Potential causes:**
* Overlapping domain assignments across accounts
* Multiple accounts for the same organization
* Inconsistent domain configuration
**Solutions:**
* Review domain assignments across accounts
* Consolidate duplicate accounts where appropriate
* Use more specific secondary domains
* Manually resolve conflicts when they occur
**Symptoms:** Tickets getting linked to incorrect accounts
**Potential causes:**
* Broad domain assignments causing incorrect matches
* Shared email domains across multiple organizations
* Incorrect Slack channel mappings
**Solutions:**
* Review and refine domain assignments for precision
* Use more specific secondary domains for disambiguation
* Verify Slack channel mappings are accurate
* Consider manual account assignment for ambiguous cases
### When to manually intervene
• Organizations with overlapping domains
• Temporary email addresses
• Unusual domain configurations
• Legacy data migration issues
• Enterprise customer accounts
• Strategic partnership tickets
• Escalated support cases
• Compliance-sensitive situations
### Manual override procedures
* Account mapping decisions can be reviewed immediately after ticket creation
* Use the ticket edit function to manually assign the correct account
* Analyze patterns in manual overrides to identify system improvements
* Update domain configurations based on override patterns
All account mapping decisions can be reviewed and manually adjusted after ticket creation if needed. The system maintains a full audit trail of both automatic and manual account associations.
## The account mapping flow
```mermaid theme={null}
flowchart TD
A["New Ticket Created"] --> B{"Account ID Provided?"}
%% Step 1: Account ID with Fallback Logic
B -- Yes --> C["Find Account by ID"]
C --> D{"Account Found?"}
D -- Yes --> E["✅ Account Successfully Linked"]
D -- No --> F["⚠️ Account ID Not Found Continue Fallback"]
E --> G{"Has Slack Channel Info?"}
G -- Yes --> H["Check Metadata Update Needed"]
G -- No --> AUDIT["Create Activity Logs"]
H -- Updated --> H1["✅ Account Updated"]
H -- No Update --> AUDIT
H1 --> AUDIT
%% Step 2: Slack Channel ID Lookup (including fallback cases)
B -- No --> I{"Slack Channel Provided?"}
F --> I
I -- No --> J["Skip Account Resolution"]
I -- Yes --> K["Search Accounts by Slack Channel"]
K --> L{"How Many Accounts Found?"}
L -- 0 --> M["❌ No Account Found"]
L -- 1 --> N{"Is This Fallback?"}
N -- Yes --> N1["✅ Account Found via Fallback"]
N -- No --> N2["✅ Account Found"]
L -- Multiple --> O["Try Email Resolution"]
%% Enhanced Email Resolution with Public Domain Check
O --> P["Extract Email Domain"]
P --> Q{"Is Email Domain Public?"}
Q -- Yes --> R["🛡️ Skip Email Resolution"]
Q -- No --> S{"Customer Contact Exists?"}
R --> T["❌ No Account Attached"]
S -- Yes --> U["Check Contact's Accounts"]
U --> V{"Contact Account Matches?"}
V -- 1 Match --> W{"Is This Fallback?"}
W -- Yes --> W1["✅ Account Resolved via Fallback"]
W -- No --> W2["✅ Account Resolved"]
V -- No Match --> X["Try Domain Resolution"]
S -- No --> X
%% Domain Resolution (Primary & Secondary)
X --> Y["Check Primary Domain Matches"]
Y --> Z{"Primary Domain Matches?"}
Z -- 1 Match --> AA["✅ Account Found"]
Z -- No Match --> BB["Check Secondary Domains"]
Z -- Multiple --> CC["❌ Multiple Conflicts"]
BB --> DD{"Secondary Domain Matches?"}
DD -- 1 Match --> EE["✅ Account Found"]
DD -- No Match --> FF["❌ No Domain Matches"]
DD -- Multiple --> GG["❌ Multiple Conflicts"]
%% Unresolved Conflicts Flow to No Account
CC --> T
FF --> T
GG --> T
%% Customer Contact Creation Flow
J --> HH["Create Customer Contact"]
M --> HH
N1 --> HH
N2 --> HH
W1 --> HH
W2 --> HH
AA --> HH
EE --> HH
T --> HH
HH --> II["Process Customer Contact"]
II --> JJ{"Existing Contact Found?"}
%% Existing Contact Path
JJ -- Yes --> KK{"Contact Has Accounts?"}
KK -- Yes --> LL["Use Existing Contact with Accounts"]
KK -- No --> MM{"Auto-Create Accounts Enabled?"}
MM -- No --> NN["Contact Remains Without Account"]
MM -- Yes --> OO{"Email Domain Public?"}
OO -- Yes --> PP["❌ Skip Account Creation"]
OO -- No --> QQ["Create Account for Contact"]
%% New Contact Path
JJ -- No --> RR{"Auto-Create Accounts Enabled?"}
RR -- No --> SS["Create Contact Only"]
RR -- Yes --> TT{"Email Domain Public?"}
TT -- Yes --> UU["❌ Skip Account Creation"]
TT -- No --> VV["Create Account from Domain"]
%% Account Creation with Flag Detection
QQ --> WW["Process Account Creation"]
VV --> WW
WW --> XX{"Account Creation Result?"}
XX -- Failed --> YY["❌ Multiple Accounts Conflict"]
XX -- Existing Found --> ZZ["✅ Existing Account Found"]
XX -- New Created --> AAA["✅ New Account Created"]
%% Final Account Status Check
LL --> BBB{"Final Account Status?"}
NN --> CCC{"Final Account Status?"}
PP --> CCC
SS --> CCC
UU --> CCC
YY --> CCC
ZZ --> BBB
AAA --> BBB
CCC -- No Account --> DDD["❌ Ticket Created Without Account"]
BBB -- Has Account --> EEE["✅ Ticket Created With Account"]
%% Enhanced Audit Log Creation
DDD --> FFF["📋 Create No-Attachment Logs"]
EEE --> GGG{"New Account Created?"}
GGG -- Yes --> HHH["Create Account Creation Log"]
GGG -- No --> III["Skip Account Creation Log"]
HHH --> JJJ["Create Ticket Attachment Log"]
III --> JJJ
JJJ --> KKK{"Account Info Updated?"}
KKK -- Yes --> LLL["Create Update Log"]
KKK -- No --> FFF
LLL --> FFF
FFF --> MMM["🎯 Ticket Successfully Created"]
%% Enhanced Styling with New Categories
classDef successNode fill:#e8f5e8,stroke:#2d5a2d,color:#1a4a1a,stroke-width:3px,font-weight:bold
classDef errorNode fill:#ffeaea,stroke:#8b2a2a,color:#6b1f1f,stroke-width:3px,font-weight:bold
classDef processNode fill:#f0f4f8,stroke:#4a5d6b,color:#2c3e50,stroke-width:2px,font-weight:bold
classDef decisionNode fill:#fff8e1,stroke:#b8860b,color:#8b6914,stroke-width:2px,font-weight:bold
classDef auditNode fill:#e3f2fd,stroke:#1565c0,color:#0d47a1,stroke-width:2px,font-weight:bold
classDef fallbackNode fill:#fff0e6,stroke:#cc7a00,color:#cc7a00,stroke-width:2px,font-weight:bold
classDef securityNode fill:#e6f3ff,stroke:#0066cc,color:#0066cc,stroke-width:2px,font-weight:bold
classDef startEndNode fill:#f3e5f5,stroke:#7b1fa2,color:#4a148c,stroke-width:3px,font-weight:bold
A:::startEndNode
MMM:::startEndNode
E:::successNode
N1:::successNode
N2:::successNode
W1:::successNode
W2:::successNode
AA:::successNode
EE:::successNode
LL:::successNode
ZZ:::successNode
AAA:::successNode
EEE:::successNode
M:::errorNode
T:::errorNode
PP:::errorNode
YY:::errorNode
DDD:::errorNode
CC:::errorNode
FF:::errorNode
GG:::errorNode
HH:::processNode
II:::processNode
WW:::processNode
FFF:::processNode
III:::processNode
JJJ:::processNode
B:::decisionNode
D:::decisionNode
G:::decisionNode
I:::decisionNode
L:::decisionNode
N:::decisionNode
Q:::decisionNode
S:::decisionNode
V:::decisionNode
W:::decisionNode
Z:::decisionNode
DD:::decisionNode
JJ:::decisionNode
KK:::decisionNode
MM:::decisionNode
OO:::decisionNode
RR:::decisionNode
TT:::decisionNode
XX:::decisionNode
BBB:::decisionNode
CCC:::decisionNode
GGG:::decisionNode
KKK:::decisionNode
AUDIT:::auditNode
H1:::auditNode
HHH:::auditNode
LLL:::auditNode
F:::fallbackNode
R:::securityNode
UU:::securityNode
```
This comprehensive flow shows how Thena systematically attempts to link every ticket to an appropriate account through multiple resolution strategies.
## Related resources
Learn about managing customer accounts
Understanding the ticket creation process
Configure team settings and behaviors
Learn about moving tickets between teams
# Draft tickets
Source: https://docs.thena.ai/platform/core-concepts/tickets/drafts
Understanding and managing ticket drafts in the Thena platform
Ticket drafts provide a way to prepare and collaborate on tickets before they are officially created. This feature is particularly useful for complex tickets that require multiple edits or team input before being submitted.
Drafts can be either private (visible only to the creator) or public (visible to all team members), allowing for flexible collaboration while maintaining control over work in progress.
## Understanding drafts
### Draft types
• Visible only to the creator
• Perfect for personal work
• No team visibility
• Convert to public when ready
• Visible to all team members
• Enables collaboration
• Team can provide input
• Ready for group review
### Draft lifecycle
* Start new draft
* Set visibility (private/public)
* Add initial content
* Save progress
* Share with team (if public)
* Gather feedback
* Make revisions
* Track changes
* Review final content
* Validate required fields
* Get approvals if needed
* Prepare for submission
* Convert to actual ticket
* Assign appropriate team
* Set initial status
* Begin ticket lifecycle
## Draft management
### Core capabilities
* Start from scratch
* Save progress
* Rich text editing
* Share with team
* Track changes (coming soon)
* Mention colleagues (coming soon)
* Request reviews (coming soon)
* Categorize drafts (coming soon)
* Set priorities (coming soon)
* Add labels (coming soon)
* Group related drafts (coming soon)
* Archive old drafts (coming soon)
## API endpoints
### Draft ticket
```json theme={null}
{
"title": "Customer reported login issue",
"description": "User unable to access mobile app",
"isPrivate": true,
"draftScope": "personal",
"teamId": "team_123",
"requestorEmail": "customer@example.com",
"submitterEmail": "agent@thena.ai",
"statusId": "status_new",
"priorityId": "priority_high",
"typeId": "type_bug",
"accountId": "account_456",
"assignedAgentId": "agent_789",
"customFieldValues": [
{
"fieldId": "field_123",
"value": "iOS 15.0"
}
],
"metadata": {
"browserVersion": "Chrome 120",
"deviceType": "Mobile"
}
}
```
When creating a draft, use `isPrivate: true` and `draftScope: "personal"` for private drafts visible only to the creator. For team-wide visibility, set `isPrivate: false`.
### Available operations
```bash theme={null}
# Create a new ticket draft
POST /v1/tickets/draft
Content-Type: application/json
# Get all draft tickets
GET /v1/tickets/draft
# Get draft ticket by UID
GET /v1/tickets/draft/{uid}
# Update draft ticket
PUT /v1/tickets/draft/{uid}
Content-Type: application/json
# Delete draft ticket
DELETE /v1/tickets/draft/{uid}
# Publish draft ticket
POST /v1/tickets/draft/{uid}/submit
Content-Type: application/json
```
All endpoints require authentication with Bearer token, API key, and Organization ID in the headers.
For detailed API specifications, see Draft Management
## Best practices
• Use clear titles
• Include key details
• Set appropriate visibility
• Use templates when available
• Share early for feedback
• Use clear comments
• Track major changes
• Set review expectations
### Tips for effective draft management
* Use consistent naming
* Categorize appropriately
* Clean up old drafts
* Document decisions
* Share context early
* Request specific feedback
* Set review timelines
* Track feedback status
* Review required fields
* Validate information
* Check attachments
* Test links and references
## Related resources
Learn about ticket management
Understand ticket fields
Team collaboration
Ticket management guidelines
# Fields and tags
Source: https://docs.thena.ai/platform/core-concepts/tickets/fields
Understanding standard ticket fields and tags in the Thena platform
## Standard fields
Standard fields are built-in fields that come with every ticket. They provide essential information and functionality for ticket management.
### Core fields
* **Ticket ID** - System-generated unique identifier
* **UID** - Human-readable unique identifier
* **Title** - Brief description of the ticket
* **Description** - Detailed explanation of the ticket
* **Organization ID** - Associated organization
* **Team ID** - Assigned team
* **Form ID** - Source form reference
* **Requestor Email** - Email of the person requesting
* **Customer Contact** - Associated customer contact
* **Submitter Email** - Email of the person who submitted
### Default values
The following standard fields have default values at the team level. Each team can customize these values according to their needs.
Default priorities for each team:
* **Low**: Routine issues that can be handled during normal business hours
* **Medium** (Default): Issues requiring attention within standard SLA
* **High**: Important issues needing prompt attention
* **Urgent**: Critical issues requiring immediate attention
Default types for each team:
* **Bug**: Error or issue in the code (Color: #db1f61)
* **Feature Request**: Request for a new feature (Color: #1f74db)
* **Question**: Request for information (Color: #1fdb8a)
* **Task**: Request for a new task (Color: #db7a1f)
### Additional attributes
* Created At
* Updated At
* Due Date
* Resolution Date
* Status
* Priority
* Progress Percentage
* Time Spent
* Is Active
* Is Deleted
* Is Draft
* Is Resolved
* Source
* Channel
* Category
* Version
## Tags
Tags provide a flexible way to categorize and organize tickets. They can be used for filtering, reporting, and automation.
### Tag structure
* Name (unique identifier)
* Display Name
* Color
* Description
* Organization ID
* Created At
* Updated At
* Created By
* Is Active
* Is System Tag
### Tag usage
* Categorize tickets
* Group related items
* Filter and search
* Generate reports
* Trigger workflows
* Route tickets
* Set priorities
* Apply rules
## Best practices
* Keep data accurate and up-to-date
* Use consistent formatting
* Follow naming conventions
* Regular data cleanup
* Use meaningful names
* Maintain tag hierarchy
* Review and cleanup regularly
* Document tag purposes
## Related resources
Learn about extending tickets with custom fields
Configure forms for ticket creation
Automate processes using fields and tags
Field and tag management guidelines
## API endpoints
### Field configuration
```json theme={null}
{
"displayName": "High",
"description": "This is a high priority ticket",
"isDefault": true,
"name": "High",
"teamId": "123e4567-e89b-12d3-a456-426614174000"
}
```
Field configurations determine how data is collected, validated, and displayed in tickets. Changes to field configurations may affect existing tickets.
### Available operations
```bash theme={null}
# Type management
GET /v1/tickets/type/{id} # Get a ticket type by ID
PATCH /v1/tickets/type/{id} # Update a custom ticket type
DELETE /v1/tickets/type/{id} # Delete a custom ticket type
# Priority management
GET /v1/tickets/priority # Get all ticket priorities
POST /v1/tickets/priority # Create a new custom ticket priority
GET /v1/tickets/priority/{id} # Get a ticket priority by ID
PATCH /v1/tickets/priority/{id} # Update a custom ticket priority
DELETE /v1/tickets/priority/{id} # Delete a custom ticket priority
```
All endpoints require authentication and appropriate permissions. System default fields cannot be deleted.
For detailed API specifications, see:
* Type Management
* Priority Management
```bash theme={null}
# Get all available tags
GET /v1/tickets/tags
# Create a new tag
POST /v1/tickets/tags
Content-Type: application/json
# Delete a tag
DELETE /v1/tickets/tags/{id}
```
For detailed API specifications, see Tag Management
# Overview
Source: https://docs.thena.ai/platform/core-concepts/tickets/overview
Understanding tickets and their implementation in the Thena platform
Tickets are the primary unit of work in the Thena Platform, representing customer inquiries, issues, requests, and other actionable items. They provide a structured way to track, manage, and resolve customer interactions across your organization.
Each ticket can be customized with various fields, workflows, and automations to match your business processes. Tickets can be created through multiple channels including email, chat, API, and web forms.
## What is a ticket?
A ticket in Thena platform represents:
* A customer inquiry or request
* An internal task or issue
* A trackable work item
* A collaboration point for teams
## Ticket structure
### Core components
• Unique identifier
• Title and description
• Status and priority
• Creation timestamp
• Customer association
• Team assignment
• Agent ownership
• Related tickets
### Field types
* Title (required)
* Description
* Status
* Priority
* Type
* Source
* Tags
* Due date
* Customer ID
* Contact information
* Company details
* Preferences
* Service level
* Assigned team
* Assigned agent
* Assignment rules
* Escalation level
* Handling time
* Business-specific fields
* Industry requirements
* Process tracking
* Integration data
## Ticket management
### Creation methods
• Web interface
• API endpoints
• Email
• Slack
• MS Teams
• Chat integration
• Form submissions
• Workflow triggers
### Lifecycle stages
* Initial submission
* Channel processing
* Field population
* Rule evaluation
* Team routing
* Agent assignment
* Priority setting
* SLA calculation
* Status updates
* Work tracking
* Communication
* Collaboration
* Solution implementation
* Customer confirmation
* Quality checks
* Knowledge capture
## API endpoints
### Sample ticket
```json theme={null}
{
"title": "Unable to access account",
"description": "Customer reported login issues on mobile app",
"type": "INCIDENT",
"priority": "HIGH",
"status": "NEW",
"source": "EMAIL",
"customerId": "cust-123",
"teamId": "team-456",
"tags": ["mobile-app", "login"],
"customFields": {
"impactedSystem": "Mobile Authentication",
"deviceType": "iOS",
"appVersion": "2.1.0"
}
}
```
When creating a ticket, the system will add additional fields in the response such as `uid`, `createdAt`, `updatedAt`, `number` (human-readable identifier), and tracking information.
### Available operations
```bash theme={null}
# List tickets
GET /v1/tickets
# Create ticket
POST /v1/tickets
Content-Type: application/json
# Get ticket by ID
GET /v1/tickets/{id}
# Update ticket
PATCH /v1/tickets/{id}
Content-Type: application/json
# Delete ticket
DELETE /v1/tickets/{id}
```
All endpoints require authentication and appropriate permissions.
For detailed API specifications, see Ticket Management
```bash theme={null}
# Add comment
POST /v1/tickets/{id}/comments
Content-Type: application/json
# Assign ticket
POST /v1/tickets/{id}/assign
Content-Type: application/json
# Change status
PATCH /v1/tickets/{id}/status
Content-Type: application/json
# Link tickets
POST /v1/tickets/{id}/links
Content-Type: application/json
```
#### Comment request
```json theme={null}
{
"content": "Investigating the login issue...",
"isPublic": true,
"mentions": ["user-789"]
}
```
For detailed API specifications, see:
* Add Comment
* Assign Ticket
## Best practices
* Use clear, descriptive titles
* Include relevant details
* Set appropriate priority
* Add proper categorization
* Follow standard workflows
* Maintain communication
* Document actions taken
* Update status promptly
* Verify solution
* Get customer confirmation
* Document resolution
* Update knowledge base
## Related resources
Understand ticket lifecycle
Configure SLA policies
Manage ticket fields
Team management
# Service level agreements (SLA)
Source: https://docs.thena.ai/platform/core-concepts/tickets/sla
Configure and manage SLA policies for tickets
Service Level Agreements (SLAs) in the Thena platform help organizations define, track, and maintain service standards for ticket resolution. This feature enables teams to set up granular policies based on various criteria and monitor performance against defined targets.
SLAs establish clear expectations for response and resolution times, helping teams prioritize work and maintain consistent service quality. The system supports multiple metrics, business hours, and complex policy conditions.
## Key concepts
• First response time
• Next response time
• Resolution time
• Update time
• Ticket properties
• Customer attributes
• Time-based rules
• Custom conditions
## Understanding response time metrics
Key response time metrics:
* First response time: Time to first agent response after ticket creation
* Next response time: Time between customer comments and subsequent agent responses
* Update time: Regular updates at fixed intervals (e.g., every 30 minutes for incidents)
* Resolution time: Total time to resolve the ticket, considering business hours and pauses
Update time specific characteristics:
* Run on fixed intervals (e.g., 30 minutes for incidents)
* Are not reset by agent responses
* Continue on the original schedule regardless of early updates
* Require regular updates even if there are other interactions
```mermaid theme={null}
sequenceDiagram
participant Customer
participant Ticket
participant Agent
Customer->>Ticket: Creates ticket
Note over Ticket: SLA timer starts
Agent->>Ticket: First response
Note over Ticket: First response SLA met
```
The first response time metric measures how long it takes for the first agent response after a ticket is created.
```mermaid theme={null}
sequenceDiagram
participant Customer
participant Ticket
participant Agent
Customer->>Ticket: New comment
Note over Ticket: Next response timer starts
Agent->>Ticket: Agent responds
Note over Ticket: Next response SLA met
Customer->>Ticket: Another comment
Note over Ticket: New next response timer starts
```
The next response time metric tracks the time between each customer comment and the subsequent agent response.
```mermaid theme={null}
sequenceDiagram
participant Ticket
participant Agent
Note over Ticket: Update timer starts (30m)
Agent->>Ticket: Public comment
Note over Ticket: Update SLA met
Note over Ticket: Timer continues from original schedule
Agent->>Ticket: Internal note
Note over Ticket: No impact on update timer
Note over Ticket: 30m elapsed - Update needed
Agent->>Ticket: Public update
Note over Ticket: Update SLA met
Note over Ticket: Next 30m interval starts
```
The update time metric ensures regular updates (public comments) on tickets at fixed intervals, regardless of other interactions.
```mermaid theme={null}
sequenceDiagram
participant Customer
participant Ticket
participant Agent
Customer->>Ticket: Creates ticket
Note over Ticket: Resolution SLA starts (24h)
Agent->>Ticket: Initial response
Note over Ticket: Investigation ongoing
Agent->>Ticket: Request info
Customer->>Ticket: Provides info
Note over Ticket: SLA paused during wait
Agent->>Ticket: Implements solution
Agent->>Ticket: Marks as resolved
Note over Ticket: Resolution SLA met
```
The resolution time metric tracks the total time taken to resolve a ticket, considering business hours and any pause periods.
***
### Common scenarios
```mermaid theme={null}
sequenceDiagram
participant Customer
participant Ticket
participant Agent
Customer->>Ticket: Creates ticket
Note over Ticket: First response timer starts
Agent->>Ticket: Agent response 1
Note over Ticket: First response SLA met
Agent->>Ticket: Agent response 2
Note over Ticket: No impact on SLA
Customer->>Ticket: Customer reply
Note over Ticket: Next response timer starts
```
Multiple agent responses before customer reply don't reset or affect the SLA timer.
```mermaid theme={null}
sequenceDiagram
participant Customer
participant Ticket
participant Agent
Customer->>Ticket: Creates ticket
Note over Ticket: First response timer starts
Customer->>Ticket: Additional info
Note over Ticket: Timer continues
Agent->>Ticket: Agent response
Note over Ticket: First response SLA met
```
Additional customer comments before first response don't reset the first response timer.
```mermaid theme={null}
sequenceDiagram
participant Customer
participant Ticket
participant Agent
Customer->>Ticket: Creates ticket
Note over Ticket: SLA timer starts
Agent->>Ticket: Request information
Note over Ticket: Auto-pause: Pending customer
Note over Ticket: Timer paused
Customer->>Ticket: Provides information
Note over Ticket: Auto-resume: Customer responded
Note over Ticket: Timer resumes
Agent->>Ticket: Manual pause (maintenance)
Note over Ticket: Timer paused
Note over Ticket: System maintenance period
Agent->>Ticket: Manual resume
Note over Ticket: Timer resumes
Note over Ticket: Only business hours counted
```
Common pause scenarios:
* **Automatic pauses**:
• Pending customer response
• Third-party dependencies
• Integration sync delays
• Scheduled maintenance windows
* **Manual pauses**:
• Emergency maintenance
• Major incidents
• Planned downtimes
• Customer-requested holds
* **Business rules**:
• Only business hours counted during active periods
• Pause periods completely excluded
• Auto-resume on specific triggers
• Pause reason tracking for reporting
***
### Business hours calculation examples
```mermaid theme={null}
sequenceDiagram
participant Monday
participant Tuesday
Note over Monday: 9 AM - Business hours start
Note over Monday: 4 PM - Ticket created
Note over Monday: 5 PM - Business hours end (7h counted)
Note over Tuesday: 9 AM - Business hours resume
Note over Tuesday: 12 PM - SLA breaches (3h counted)
```
Example details:
* Ticket created Monday 10:00 AM
* Business hours: 9 AM - 5 PM
* 5-hour SLA requirement
* Monday: 7 hours counted (10 AM - 5 PM)
* Tuesday: Needs 3 more hours, counted from 9 AM
* SLA breaches Tuesday at 12:00 PM if not resolved
```mermaid theme={null}
sequenceDiagram
participant Friday
participant Weekend
participant Monday
Note over Friday: 4 PM - Ticket created
Note over Friday: 5 PM - Day ends (1h counted)
Note over Weekend: No hours counted
Note over Monday: 9 AM - Business hours resume
Note over Monday: 1 PM - SLA breaches (4h counted)
```
Example details:
* Ticket created Friday 4:00 PM
* 5-hour SLA
* 1 hour counted Friday
* 0 hours counted on weekend
* 4 hours counted Monday
* SLA breaches Monday at 1:00 PM
```mermaid theme={null}
sequenceDiagram
participant Monday
participant Tuesday
Note over Monday: 10 AM - Ticket created
Note over Monday: 11 AM - SLA paused (1h counted)
Note over Monday: 2 PM - SLA resumed
Note over Monday: 4 PM - SLA paused (2h more counted)
Note over Tuesday: 10 AM - SLA resumed
Note over Tuesday: 12 PM - SLA breaches (2h final)
```
Example details:
* 5-hour SLA with multiple pauses
* Monday: 3 hours counted (10-11 AM, 2-4 PM)
* Tuesday: 2 hours counted (10 AM-12 PM)
* Paused time not counted
***
### Complex SLA scenarios
```mermaid theme={null}
sequenceDiagram
participant High
participant Urgent
Note over High: 8 AM - Ticket created
Note over High: 9 AM - 1 hour elapsed
Note over Urgent: 9 AM - Priority upgraded
Note over Urgent: 10 AM - SLA breaches
```
When priority changes from High (4hr SLA) to Urgent (2hr SLA):
* Time already elapsed (1hr) is considered
* New breach time = Current time + (New SLA duration - Elapsed time)
```mermaid theme={null}
sequenceDiagram
participant Customer
participant Ticket
participant Agent
Customer->>Ticket: Creates ticket (9 AM)
Note over Ticket: First response: 2hr SLA starts
Note over Ticket: Resolution: 8hr SLA starts
Agent->>Ticket: First response (10 AM)
Note over Ticket: First response met (1hr)
Agent->>Ticket: Resolution (4 PM)
Note over Ticket: Resolution met (7hrs)
```
Tracking multiple SLA metrics simultaneously:
* First response: 2 hours (Met in 1 hour)
* Resolution time: 8 hours (Met in 7 hours)
* Each metric tracked independently
```mermaid theme={null}
sequenceDiagram
participant Time
participant Ticket
Note over Time: Morning slot (09:00-17:00)
Note over Time: Break (17:00-18:00)
Note over Time: Evening slot (18:00-23:59)
Note over Ticket: Created at 17:30
Note over Time: Non-working hours
Note over Time: Evening slot begins
Note over Ticket: SLA starts at 18:00
Note over Ticket: SLA breaches at 19:00
```
A ticket created between working hour slots:
* Working hours configured in two slots:
• Morning slot: 09:00-17:00
• Evening slot: 18:00-23:59
* Ticket created at 17:30 (during break)
* 60-minute SLA duration
* Since ticket was created during non-working hours:
• SLA clock starts at next slot (18:00)
• SLA breaches at 19:00 if not resolved
```mermaid theme={null}
sequenceDiagram
participant Sunday
participant Monday
Note over Sunday: 17:00 - Ticket created
Note over Sunday: Weekend - no hours counted
Note over Monday: 09:00 - Business hours start
Note over Monday: 10:00 - SLA breaches
```
Example of ticket created on weekend:
* Working hours: Monday-Friday
* Ticket created: 17:00 Sunday
* SLA duration: 60 minutes
* SLA breach time: 10:00 Monday
```mermaid theme={null}
sequenceDiagram
participant Holiday
participant NextDay
Note over Holiday: 10:00 (Christmas) - Ticket created
Note over Holiday: Holiday - no hours counted
Note over NextDay: 09:00 - Business hours start
Note over NextDay: 10:00 - SLA breaches
```
Example of ticket created on holiday:
* Holidays: Dec 25, Dec 31, Jan 1
* Ticket created: 10:00 on Christmas
* SLA duration: 60 minutes
* SLA breach time: 10:00 next business day
```mermaid theme={null}
sequenceDiagram
participant Thursday
participant Friday
participant Weekend
participant Monday
Note over Thursday: 17:30 - Ticket created
Note over Friday: Business hours counted
Note over Weekend: No hours counted
Note over Monday: 13:00 - SLA breaches
```
Example of longer SLA spanning multiple days:
* Ticket created: 17:30 Thursday
* SLA duration: 24 hours
* Spans across weekend
* SLA breach time: 13:00 Monday
***
## SLA policies
### Policy components
* Policy name and description
* Entity type (e.g., ticket)
* Priority level
* Active status
* First response time targets
* Next response time targets
* Resolution time targets
* Update time requirements
* Ticket-based filters (priority, type, channel)
* Customer attributes (tier, region, SLA tier)
* Time-based conditions
* Business hours and holidays
* Automatic pause conditions
* Manual pause capability
* Resume conditions
* Multiple pause/resume support
### Policy ordering
When multiple SLA policies are applicable to a ticket, the system applies the policy with the highest priority in the policy order. This allows for precise control over which policies take precedence.
```mermaid theme={null}
graph TD
A[Platinum SLA Policy] --> B[Gold SLA Policy]
B --> C[Silver SLA Policy]
C --> D[Default SLA Policy]
style A fill:#C0C0C0,stroke:#333
style B fill:#FFD700,stroke:#333
style C fill:#CD7F32,stroke:#333
style D fill:#FFFFFF,stroke:#333
```
Example tier-based policies:
* **Platinum tier**:
• First response: 30 minutes
• Resolution: 4 hours
• Update frequency: Every 30 minutes
* **Gold tier**:
• First response: 1 hour
• Resolution: 8 hours
• Update frequency: Every 2 hours
* **Silver tier**:
• First response: 4 hours
• Resolution: 24 hours
• Update frequency: Daily
* **Default**:
• First response: 8 hours
• Resolution: 48 hours
• Update frequency: Every 48 hours
```mermaid theme={null}
sequenceDiagram
participant Ticket
participant PolicyEngine
participant Policies
Ticket->>PolicyEngine: New ticket created
PolicyEngine->>Policies: Fetch applicable policies
Note over PolicyEngine: Multiple policies match
PolicyEngine->>Policies: Get policy order
Note over PolicyEngine: Select highest priority policy
PolicyEngine->>Ticket: Apply selected policy
```
Policy selection process:
1. System identifies all matching policies
2. Evaluates policies in order of priority
3. Applies the first matching policy
4. Ignores lower priority policies
### Dynamic SLA updates
SLA policies can be updated based on ticket changes. The system recalculates breach times considering the time elapsed under previous policies.
```mermaid theme={null}
sequenceDiagram
participant Ticket
participant Time
Note over Ticket: Created at 8 AM (High priority)
Note over Time: 4hr SLA starts
Note over Ticket: Updated at 9 AM (Urgent)
Note over Time: 1hr elapsed
Note over Time: Recalculate: 2hr SLA - 1hr = 1hr
Note over Time: New breach at 10 AM
```
**Scenario 1**: Early upgrade
* Created: 8 AM (High - 4hr SLA)
* Updated: 9 AM (Urgent - 2hr SLA)
* Time elapsed: 1 hour
* New breach time: 10 AM
```mermaid theme={null}
sequenceDiagram
participant Ticket
participant Time
Note over Ticket: Created at 8 AM (High priority)
Note over Time: 4hr SLA starts
Note over Ticket: Updated at 11 AM (Urgent)
Note over Time: 3hr elapsed
Note over Time: 2hr SLA already breached
Note over Time: Immediate breach
```
**Scenario 2**: Late upgrade
* Created: 8 AM (High - 4hr SLA)
* Updated: 11 AM (Urgent - 2hr SLA)
* Time elapsed: 3 hours
* Result: Immediate breach
```mermaid theme={null}
sequenceDiagram
participant Ticket
participant Time
Note over Ticket: Created at 8 AM (High priority)
Note over Time: SLA breached at 12 PM
Note over Ticket: Updated at 1 PM (Urgent)
Note over Time: No new breach time
Note over Time: Maintains breached status
```
**Scenario 3**: Post-breach upgrade
* Created: 8 AM (High - 4hr SLA)
* Breached: 12 PM
* Updated: 1 PM (Urgent)
* Result: Maintains breach status
```mermaid theme={null}
sequenceDiagram
participant Ticket
participant Time
Note over Ticket: Created at 8 AM (Urgent)
Note over Time: SLA breached at 10 AM
Note over Ticket: Updated at 11 AM (High)
Note over Time: No new breach calculation
Note over Time: Maintains breached status
```
**Scenario 4**: Post-breach downgrade
* Created: 8 AM (Urgent - 2hr SLA)
* Breached: 10 AM
* Updated: 11 AM (High)
* Result: Maintains breach status
**Manual Override**: Users with appropriate permissions can manually override the SLA policy for specific tickets. This allows for exceptional cases while maintaining the standard policy hierarchy for regular operations.
### Business hours
• Define working hours per day
• Set up multiple time zones
• Configure holiday calendar
• Specify weekend rules
• Only count business hours
• Handle timezone differences
• Skip holidays automatically
## SLA tracking
### Real-time monitoring
• Time remaining display
• Breach warnings
• Pause status
• Breach alerts
• Team notifications
## API endpoints
### Sample SLA policy
```json request.json theme={null}
{
"name": "High priority ticket SLA",
"description": "SLA policy for handling high priority tickets",
"entityType": "ticket",
"teamId": "team-123456",
"filter": {
"all": [
{
"entity": "ticket",
"field": "status",
"operator": "equals",
"values": [
{
"label": "Open",
"id": "status-1"
}
]
}
],
"any": [
{
"entity": "ticket",
"field": "priority",
"operator": "in",
"values": [
{
"label": "High Priority",
"id": "priority-1"
},
{
"label": "Urgent",
"id": "priority-2"
}
]
}
]
},
"policyMetrics": [
{
"metric": "first_time_response",
"default": true,
"durationInMinutes": "120",
"specific": [
{
"entity": "ticket",
"field": "priority",
"operator": "equals",
"values": [
{
"label": "Urgent",
"id": "priority-2"
}
],
"durationInMinutes": "60"
}
]
},
{
"metric": "total_resolution_time",
"default": true,
"durationInMinutes": "480",
"specific": []
}
],
"pauseConditions": {
"all": [
{
"entity": "ticket",
"field": "status",
"operator": "equals",
"values": [
{
"label": "Pending Customer",
"id": "status-2"
}
]
}
],
"any": []
}
}
```
```json response.json theme={null}
{
"organizationId": "org-123456",
"version": 1,
"priority": 1,
"isActive": true,
"uid": "sla-policy-123456",
"createdAt": "2024-03-21T08:00:00Z",
"updatedAt": "2024-03-21T08:00:00Z",
"name": "High Priority Ticket SLA",
"description": "SLA policy for handling high priority tickets",
"entityType": "ticket",
"teamId": "team-123456",
"filter": {
"all": [
{
"entity": "ticket",
"field": "status",
"operator": "equals",
"values": [
{
"label": "Open",
"id": "status-1"
}
]
}
],
"any": [
{
"entity": "ticket",
"field": "priority",
"operator": "in",
"values": [
{
"label": "High Priority",
"id": "priority-1"
},
{
"label": "Urgent",
"id": "priority-2"
}
]
}
]
},
"policyMetrics": [
{
"metric": "first_time_response",
"default": true,
"durationInMinutes": "120",
"specific": [
{
"entity": "ticket",
"field": "priority",
"operator": "equals",
"values": [
{
"label": "Urgent",
"id": "priority-2"
}
],
"durationInMinutes": "60"
}
]
},
{
"metric": "total_resolution_time",
"default": true,
"durationInMinutes": "480",
"specific": []
}
],
"pauseConditions": {
"all": [
{
"entity": "ticket",
"field": "status",
"operator": "equals",
"values": [
{
"label": "Pending Customer",
"id": "status-2"
}
]
}
],
"any": []
}
}
```
For detailed API specifications and examples, see [Create SLA Policy](/api-reference/platform/sla-policies/create-a-policy).
The response includes all fields from the request plus these system-managed fields:
* `organizationId`: Organization that owns the policy
* `version`: Policy version number
* `priority`: Policy priority in the evaluation order
* `isActive`: Whether the policy is currently active
* `uid`: Unique identifier for the policy
* `createdAt`: Creation timestamp
* `updatedAt`: Last update timestamp
### Available operations
```http theme={null}
# Create new SLA policy
POST /v1/sla/policy
Content-Type: application/json
# List all policies
GET /v1/sla/policy?teamId={teamId}&entityType={entityType}
# Get specific policy
GET /v1/sla/policy/{id}
# Update policy
PATCH /v1/sla/policy/{id}
Content-Type: application/json
# Archive policy
DELETE /v1/sla/policy/{id}
```
For detailed API specifications, see [SLA Policy Management](/api-reference/platform/sla-policies)
```http theme={null}
# Update policy priorities
PATCH /v1/sla/priorities
Content-Type: application/json
Example request body:
{
"teamId": "team-123456",
"entityType": "ticket",
"priorityUpdates": [
{
"id": "policy-123",
"priority": 1
},
{
"id": "policy-456",
"priority": 2
}
]
}
```
For detailed API specifications, see [SLA Policy Priorities](/api-reference/platform/sla-policies/update-priorities-of-multiple-sla-policies)
## Best practices
* Start with broad policies
* Define clear hierarchies
* Use specific conditions
* Regular policy reviews
* Set up early warnings
* Track team performance
* Monitor breach patterns
* Regular reporting review
* Clear escalation paths
* Define team responsibilities
* Set notification rules
* Regular team training
## Related resources
Understanding ticket states and transitions
Managing ticket priorities
# Status management
Source: https://docs.thena.ai/platform/core-concepts/tickets/status
Understanding and managing ticket statuses in the Thena platform
Ticket statuses in the Thena Platform provide a structured way to track the progress and state of work items. The platform offers a flexible status system with parent-child hierarchy and customization options while maintaining essential system requirements.
## System overview
When an organization signs up, four default parent statuses are automatically created: Open, In progress, On hold, and Closed. These serve as the foundation for your status workflow.
### System requirements
• Minimum 1 system default status required
• "Open" status created by default
• Used for new ticket creation
• Can be changed if needed
• Minimum 1 closed status required
• "Closed" status created by default
• Represents final state
• Can be changed if needed
## Status hierarchy
### Parent statuses
System creates four initial parent statuses:
* Open (system default)
* In progress
* On hold
* Closed (system closed)
Each parent status:
* Can have multiple sub-statuses
* Has one default sub-status
* Supports custom configuration
* Maintains system requirements
### Sub-statuses
• Can be added to any parent
• Inherits parent properties
• Supports custom settings
• Maintains parent requirements
• Optional ticket migration
• Config flag available
• Moves parent tickets
• One-time operation
### Platform configuration
```mermaid theme={null}
flowchart TD
%% Styling
classDef default fill:#f9f9f9,stroke:#333,stroke-width:2px
classDef status fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef substatus fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
classDef requirement fill:#fff3e0,stroke:#e65100,stroke-width:2px
A[Organization Signup] --> B[Create 4 Default Parent Statuses]
B --> C[Open]:::status
B --> D[In Progress]:::status
B --> E[On Hold]:::status
B --> F[Closed]:::status
B --> G[System Requirements]:::requirement
G --> H[Min 1 Default Status]:::requirement
G --> I[Min 1 Closed Status]:::requirement
```
## Deletion rules
### Parent status deletion
Cannot delete:
* System default status (Open)
* System closed status
* Status with active tickets
System maintains:
* Minimum one default status
* Minimum one closed status
### Sub-status deletion
When deleting:
• Moves tickets to parent's default sub-status
• Validates ticket migration
• Allows deletion after migration
• Maintains data integrity
When deleting:
• Moves tickets back to parent status
• Ensures data preservation
• Allows deletion after migration
• Updates parent status
### Delete scenarios
```mermaid theme={null}
flowchart TD
%% Styling
classDef default fill:#f9f9f9,stroke:#333,stroke-width:2px
classDef warning fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef success fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
classDef info fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
A[Delete Parent Status] --> B{Check if System Default}
B -->|Yes| C[ Deletion not allowed]:::warning
B -->|No| D{Check Active Tickets}
D -->|Has Tickets| E[Deletion not allowed]:::warning
D -->|No Tickets| F[Allow Deletion]:::success
G[Delete Sub-status] --> H{Last Sub-status?}
H -->|Yes| I[Move Tickets to Parent Status]:::info
H -->|No| J[Move to Default Sub-status]:::info
I --> K[Allow Deletion]:::success
J --> K
```
## Status configuration
### Core properties
* Status name
* Description
* Color coding
* Icon selection
* Default assignment
* Automation rules
* Transition permissions (coming soon)
* Notification triggers (coming soon)
## API endpoints
### Create status
```json theme={null}
{
"displayName": "In Review",
"description": "Ticket is being reviewed by the team",
"isDefault": false,
"name": "in_review",
"teamId": "team_123",
"parentStatusId": "status_456",
"moveParentTickets": true
}
```
Creating a new status requires appropriate permissions. The status will be available for use immediately after creation.
### Available operations
```bash theme={null}
# Get all ticket statuses
GET /v1/tickets/status
# Create a new ticket status
POST /v1/tickets/status
Content-Type: application/json
# Get a ticket status by its ID
GET /v1/tickets/status/{id}
# Update a ticket status
PATCH /v1/tickets/status/{id}
Content-Type: application/json
# Delete a custom ticket status
DELETE /v1/tickets/status/{id}
```
All endpoints require authentication and appropriate permissions. System default statuses cannot be deleted.
For detailed API specifications, see Status Management
## Best practices
### Status management
1. **Plan your hierarchy**
* Define clear parent categories
* Plan sub-status needs
* Consider workflow requirements
* Document status purposes
2. **Configure thoughtfully**
* Use clear naming conventions
* Set appropriate defaults
* Configure transitions
* Test workflow paths
3. **Maintain efficiently**
* Regular status review
* Update as needed
* Monitor usage patterns
* Optimize workflow
## Related resources
Understanding the ticket journey
Status-based automation
Team workflow configuration
Status management guidelines
# Moving tickets between teams
Source: https://docs.thena.ai/platform/core-concepts/tickets/team-migration
Understanding how to move tickets between teams, ownership transfer, and communication continuity
Policies for moving tickets between teams are based on source of the ticket and team combination to ensure proper governance and maintain service quality standards.
Moving tickets between teams enables the transfer of tickets between different teams within your organization based on business rules, escalation needs, or specialized expertise requirements. The process maintains communication continuity, preserves all ticket history and context, and ensures proper ownership handoff. This feature is essential for organizations with specialized teams that need to collaborate on customer issues.
## How moving tickets works
When you need to move a ticket from one team to another, the platform creates a new ticket in the destination team while preserving all context and communication history from the original ticket.
### The process
**1. Ticket archival and creation**
* The original ticket is archived and transfer details are logged in the ticket's activity
* A new ticket is created in the destination team with all relevant context
* Both tickets are automatically linked as related tickets for complete audit trail
* The archived ticket can be unarchived if moved back to the original team, otherwise remains for reference only
**2. Data and context transfer**
* All conversation history is copied to the new ticket
* Custom field values are mapped between team forms where compatible
* File attachments and internal notes are transferred
* Customer communication channels are redirected to the new ticket
**3. Team transition**
* Destination team receives immediate ownership and notification
* Team-specific workflows, SLAs, and auto-responders are applied
* SLA of the source team is paused and CSAT is cancelled
### Benefits
* **Independent team metrics**: Each team's performance is measured separately
* **Specialized workflows**: Tickets follow the appropriate processes for each team
* **Clear ownership**: No ambiguity about which team is responsible
* **Preserved context**: Complete history is maintained for seamless handoffs
### Important considerations
* **Ticket number changes**: Customers will see a new ticket number (e.g., SUP-123 becomes SEC-456)
* **Form compatibility**: Field mapping may be required when teams use different forms
* **SLA reset**: New tickets start with the destination team's SLA timeline
## Impact on team operations
Understanding how moving tickets between teams affects different operational aspects is crucial for your organization.
### SLA management
**How it works:**
* Original ticket archived with transfer details logged in activity
* New ticket starts fresh SLA clock
* Each team measured independently
**Example:**
* Support team receives SUP-122 at 9:00 AM (4-hour SLA)
* Archives SUP-122 at 11:00 AM (SLA paused)
* Activity log shows: "Transferred to Security team as SEC-980 by Agent John"
* Security team creates SEC-980 at 11:00 AM (8-hour SLA)
* Security has full 8 hours to resolve SEC-980
* SUP-122 and SEC-980 are linked as related tickets
**Impact:**
* ✅ Clean metrics separation between teams
* ✅ Each team measured on their actual work
* ✅ No cross-team SLA conflicts
* ⚠️ Customer may see extended total resolution time
### Auto-responders
**How it works:**
* Original ticket keeps source team's auto-responder
* New ticket gets destination team auto-responders
* Customer receives both auto-responders as the external communication channel remains the same
**Example:**
* SUP-122: Original ticket retains Support team's auto-responder
* SEC-980: Security auto-responder welcomes customer with new expectations
* Customer receives Security team's auto-responder message
* SUP-122 activity log records: "Transferred to Security team as SEC-980 by Agent John"
**Impact:**
* ✅ Clear separation of team communication styles
* ✅ Appropriate messaging for each team's expertise
* ⚠️ Customer may receive multiple auto-responders
### Customer satisfaction (CSAT)
**How it works:**
* Source team's CSAT is cancelled upon ticket archival and will not be sent
* Only destination team receives CSAT measurement
* Each team's metrics remain separate
* CSAT is measured only for the final resolving team
**Example:**
* SUP-122: CSAT cancelled upon archival (no survey sent)
* SEC-980: 3/5 stars ("Resolution took longer than expected")
* Support team: No CSAT impact
* Security team: 3/5 added to team average
**Impact:**
* ✅ Clear accountability for final resolution
* ✅ Accurate team performance metrics
* ✅ No survey fatigue from multiple requests
* ⚠️ Source team's contribution not measured
* ⚠️ Only final team's performance captured
### Workflows and automation
**How it works:**
* Original ticket completes source team workflows
* New ticket starts fresh with destination team workflows
* Both workflows run independently
* Migration triggers can coordinate between workflows
**Example:**
* SUP-122: Completes Support workflow (status: "Archived")
* Activity log records: "Transferred to Security team as SEC-980 by Agent John"
* SEC-980: Starts Security workflow from beginning
* Support workflow: Triggers "ticket archival" automation
* Security workflow: Triggers "new incident" automation
* Move workflow: Coordinates data transfer and notifications
* Both tickets automatically linked as related tickets
**Impact:**
* ✅ Clean workflow execution for each team
* ✅ No conflicts between different team processes
* ✅ Appropriate automation for each team's needs
## Forms and fields management
Since forms and custom fields are configured at the team level, moving tickets between teams requires careful handling of field mapping and form selection.
### Form selection when moving tickets
**Process:**
* Original ticket retains source team's form and fields
* User selects destination team's form for the new ticket
* System maps compatible fields automatically
* User reviews and adjusts field mappings
* New ticket created with destination team's selected form
* Field values copied where compatible mappings exist
* Reference link maintained between tickets
**Example:**
* SUP-122: Keeps "General Support Request" form (archived)
* User selects "Security Incident" form for SEC-980
* System maps Priority → Severity, Description → Incident Details
* SEC-980: Created with "Security Incident" form and mapped data
* Original form data preserved in SUP-122 for reference
* Both tickets automatically linked as related tickets
### Field mapping process
System attempts to map fields based on:
* Field names (exact match)
* Field types (compatible types)
* Common field patterns (priority/severity, description/details)
* Previous mapping configurations
Migration interface shows:
* Automatically mapped fields
* Unmapped source fields
* Available destination fields
* Mapping suggestions based on field types
User can:
* Accept automatic mappings
* Override suggested mappings
* Map additional fields manually
* Choose to preserve unmapped data in history
System validates:
* Required fields in destination form are populated
* Field value compatibility (text to text, number to number)
* Field constraints and validation rules
* Data format requirements
### Field type compatibility
• Text → Text
• Number → Number
• Date → Date
• Single Select → Single Select (if options match)
• Multi Select → Multi Select (if options match)
• Boolean → Boolean
• Text → Number (unless parseable)
• Single Select → Multi Select
• Date → Text (format issues)
• Custom field types with different schemas
• Fields with different validation rules
### Data preservation strategies
**Handling:**
* Values transferred to corresponding destination fields
* Data validation applied according to destination field rules
* Conversion applied where necessary (e.g., text formatting)
* Original values preserved in migration audit log
**Example:**
* Source: Priority (High, Medium, Low)
* Destination: Severity (Critical, High, Medium, Low)
* Mapping: High → High, Medium → Medium, Low → Low
* Audit log: "Priority 'High' mapped to Severity 'High'"
**Handling:**
* Original field values preserved in ticket history
* Displayed in "Migration History" section
* Searchable through ticket search functionality
* Available for future reference and reporting
**Example:**
* Source field: "Customer Tier" (Enterprise, Business, Starter)
* No equivalent in Security team form
* Value "Enterprise" preserved in migration history
* Visible to Security team for context
**Handling:**
* Must be populated before migration can complete
* System prompts user to provide values
* Can use default values if configured
* Migration blocked until all required fields satisfied
**Example:**
* Security form requires "Threat Level" field
* No equivalent in Support form
* User must select: Critical, High, Medium, or Low
* Migration cannot proceed without this selection
## Source-based policies for moving tickets
Different sources have different capabilities and restrictions for moving tickets between teams based on their technical constraints and business requirements.
### Slack-based tickets
Both source and destination teams must have Slack configured and access to the same Slack workspace for moving tickets to be possible.
• Internal help desk
• Shared customer channels
• External channels
• Guest channels
• Cross-Slack-workspace scenarios
• Archived conversations
• Deleted channels
#### Communication handling when moving Slack tickets
**How it works:**
* Original ticket archived and disconnected from Slack thread
* New ticket created in destination team and connected to the Slack thread
* Customer messages in Slack are now captured in the new ticket
* Destination team receives all new customer messages in the new ticket
* Complete conversation history transferred to maintain context
* Both tickets automatically linked as related tickets
**Customer experience:**
* Continues messaging in the same Slack thread
* Messages are captured in the new ticket system
* Receives responses from destination team in same thread
* Seamless communication experience despite backend ticket change
**Team experience:**
* New ticket receives all ongoing Slack communications
* Complete historical messages from original ticket available for reference
* Destination team manages all new communications through new ticket
* Clean separation between old and new ticket workflows
* Access to full context from previous team interactions
**Important considerations:**
* **Thread ownership transfer**: Slack thread switches from original to new ticket
* **Complete history transfer**: All conversation history moves to the new ticket
* **Notification routing**: All new Slack notifications go to destination team
* **Context preservation**: Full thread context maintained for seamless handoff
### Email-based tickets
Both source and destination teams must have email configured and access to the same email domain for moving tickets to be possible.
• Standard support emails
• Forwarded conversations
• CC/BCC scenarios (multiple team members are copied)
• Personal email addresses
• Cross domain tickets
#### Communication handling when moving email tickets
**How it works:**
* Original ticket archived and email thread disconnected
* New ticket created in destination team and connected to the email thread
* All new email replies are captured in the new ticket
* Destination team receives all new email messages
* Complete email history transferred to maintain context
* Both tickets automatically linked as related tickets
**Team experience:**
* New ticket receives all ongoing email communications
* Complete historical messages from original ticket available for reference
* Destination team manages all new communications through new ticket
* Clean separation between old and new ticket workflows
* Access to full context from previous team interactions
**Important considerations:**
* **Thread ownership transfer**: Email thread switches from original to new ticket
* **Complete history transfer**: All email conversation history moves to the new ticket
* **Email routing**: All new email replies go to destination team
* **Context preservation**: Full thread context maintained for seamless handoff
### MS Teams-based tickets
Both source and destination teams must have MS Teams configured and access to the same MS Teams tenant for moving tickets to be possible.
• Standard channels
• Shared channels
• Private channels
• Private chats
• Guest user conversations
• Cross-tenant scenarios
#### Communication handling when moving MS Teams tickets
**How it works:**
* Original ticket archived and Teams thread disconnected
* New ticket created in destination team and connected to the Teams thread
* All new Teams messages are captured in the new ticket
* Destination team receives all new Teams messages
* Complete conversation history transferred to maintain context
* Both tickets automatically linked as related tickets
**Team experience:**
* New ticket receives all ongoing Teams communications
* Complete historical messages from original ticket available for reference
* Destination team manages all new communications through new ticket
* Clean separation between old and new ticket workflows
* Access to full context from previous team interactions
**Important considerations:**
* **Thread ownership transfer**: Teams thread switches from original to new ticket
* **Complete history transfer**: All Teams conversation history moves to the new ticket
* **Message routing**: All new Teams messages go to destination team
* **Context preservation**: Full thread context maintained for seamless handoff
## Process flow
### Moving tickets between teams flow
```mermaid theme={null}
graph TD
A[Move Ticket Request] --> B[Validate Source-Based Policy]
B --> C{Policy Allows Move?}
C -->|No| D[Reject with Policy Reason]
C -->|Yes| E[Select Destination Form]
E --> F[Map Fields Automatically]
F --> G[User Reviews Field Mappings]
G --> H{Required Fields Satisfied?}
H -->|No| I[Prompt for Missing Values]
I --> G
H -->|Yes| J[Create New Ticket in Destination Team]
J --> K[Transfer All Message History]
K --> L[Connect Source Communication to New Ticket]
L --> M[Archive Original Ticket and Log Activity]
M --> N[Apply Destination Team Configuration and trigger workflows]
N --> O[Link Tickets as Related]
O --> P[Complete Process]
```
## Communication ownership
### External communication (customer-facing)
**During the move:**
* **Ownership**: Destination team takes immediate ownership
* **Continuity**: Customer sees seamless transition
* **Branding**: Destination team's signature and branding applied
**Historical messages:**
* **Preservation**: All previous messages remain visible
* **Attribution**: Original team attribution maintained
* **Context**: Full conversation history available to destination team
* **Search**: All messages searchable by destination team
### Internal communication (team-facing)
**Private notes:**
* **Transfer**: All private notes transferred to destination team
* **Audit trail**: Reason for move and timestamp recorded
* **Collaboration**: Option to maintain shared access for specific notes
**Internal threads:**
* **Ownership**: Destination team owns all internal discussions
* **History**: Previous internal conversations preserved
* **Notifications**: Internal notifications route to destination team
## Example scenarios
### Scenario 1: Support to security escalation
**Context**: A customer reports a potential security vulnerability through the general support channel.
* Ticket created in Support team (default for email source)
* Support agent recognizes security implications
* Agent initiates move to Security team
* System validates: Email source allows moving to Security team
* Move approved automatically (using default form with no custom fields)
* New ticket created in Security team with all context
* Security team's SLA and response templates applied
* All future communication handled by Security team
### Scenario 2: Moving ticket back to original team (Security to Support)
**Context**: After investigation, Security team determines the reported issue is not a security vulnerability but a product question, requiring the ticket to be moved back to the original Support team.
* Security team documents findings
* Prepares handoff notes for Support team
* Updates ticket classification and priority
* Original ticket SUP-122 is unarchived and reactivated
* SEC-980 is archived
* Activity log records: "Transferred back to Support team, SUP-122 unarchived by Security Agent Sarah"
* Support team's processes and workflows are reapplied
* SLA resumes from where it was paused (2 hours remaining from original 4-hour SLA)
* Security team's notes and findings are preserved in ticket history
* Two tickets now exist: SUP-122 (original, reactivated), SEC-980 (archived)
* Both tickets are automatically linked as related tickets
* Complete audit trail maintained across the entire customer journey
* Each team's work and timeline clearly separated and measurable
* Original ticket maintains its ticket number and customer communication continuity
When tickets are moved back to the original team, the original archived ticket is unarchived and reactivated rather than creating a new ticket. This maintains ticket number continuity for the customer and allows the SLA to resume from where it was paused. The SLA timer continues from the remaining time when the ticket was originally transferred, ensuring accurate measurement of the original team's total resolution time. All tickets in the chain remain linked as related tickets for complete traceability.
## API reference
### Moving tickets between teams
```json theme={null}
POST /v1/tickets/{id}/move
{
"destinationTeamId": "team_security_001",
"moveType": "NEW_TICKET",
"reason": "Security vulnerability reported",
"formConfiguration": {
"destinationFormId": "form_security_incident",
"fieldMappings": [
{
"sourceFieldId": "field_priority",
"destinationFieldId": "field_severity",
"mappingType": "DIRECT"
},
{
"sourceFieldId": "field_description",
"destinationFieldId": "field_incident_details",
"mappingType": "DIRECT"
}
],
"unmappedFields": [
{
"fieldId": "field_customer_tier",
"preserveInHistory": true
}
],
"requiredFieldValues": [
{
"fieldId": "field_threat_level",
"value": "HIGH"
}
]
}
}
```
**Response:**
```json theme={null}
{
"success": true,
"moveId": "move_abc123",
"status": "COMPLETED",
"originalTicket": {
"id": "ticket_123",
"teamId": "team_support_001",
"status": "ARCHIVED",
"archivedAt": "2024-01-15T10:30:00Z"
},
"newTicket": {
"id": "ticket_456",
"teamId": "team_security_001",
"createdAt": "2024-01-15T10:30:00Z",
"createdBy": "agent_123"
},
"move": {
"fromTeam": "team_support_001",
"toTeam": "team_security_001",
"type": "NEW_TICKET",
"reason": "Security vulnerability reported",
"completedAt": "2024-01-15T10:30:15Z"
},
"formMapping": {
"fromForm": "form_general_support",
"toForm": "form_security_incident",
"fieldMappings": {
"successful": [
{
"sourceField": "Priority",
"destinationField": "Severity",
"originalValue": "High",
"mappedValue": "High"
},
{
"sourceField": "Description",
"destinationField": "Incident Details",
"originalValue": "Customer reports suspicious activity",
"mappedValue": "Customer reports suspicious activity"
}
],
"preserved": [
{
"field": "Customer Tier",
"value": "Enterprise",
"location": "original_ticket_history"
}
],
"required": [
{
"field": "Threat Level",
"value": "HIGH",
"source": "user_input"
}
]
}
},
"relatedTickets": {
"originalTicketReference": "SUP-123",
"newTicketReference": "SEC-980",
"relationshipType": "MOVED_TO",
"linkCreated": true,
"canUnarchive": true
},
"activityLog": {
"originalTicketActivity": {
"action": "TICKET_TRANSFERRED",
"details": "Transferred to Security team as SEC-980",
"performedBy": "agent_123",
"performedAt": "2024-01-15T10:30:00Z",
"destinationTeam": "team_security_001",
"newTicketId": "ticket_456"
}
}
}
```
**Error Response:**
```json theme={null}
{
"success": false,
"error": {
"code": "MOVE_NOT_ALLOWED",
"message": "Moving tickets from Support to Security team is not allowed for Slack-based tickets from private channels",
"details": {
"sourceType": "SLACK",
"restriction": "PRIVATE_CHANNEL_POLICY",
"allowedDestinations": ["team_support_001", "team_billing_001"],
"moveType": "NEW_TICKET"
}
}
}
```
## Best practices
* Familiarize teams with source-based restrictions for moving tickets
* Understand which ticket types can be moved between teams
* Know the limitations for each communication channel
* Train teams on processes and tools for moving tickets
* Establish clear handoff procedures and documentation
* Design compatible forms across teams where possible
* Establish field naming conventions for easier mapping
* Document field mapping strategies for common moves
* Train teams on field mapping and validation processes
* Provide consistent branding across team transitions
* Maintain transparency about why tickets are moved
## Related resources
Configure teams and their capabilities
Set up automatic ticket routing
Configure service level agreements
Automate processes for moving tickets
# Overview
Source: https://docs.thena.ai/platform/core-concepts/work-units
Understanding work units and their implementation in the Thena platform
Work units are the foundational building blocks for tracking and managing work in the Thena platform. While implemented using the ticket system under the hood, work units can be customized and aliased to match your specific business terminology and workflows.
## Understanding work units
Core system that adapts to your business language - call them tickets, cases, opportunities, or bugs
Consistent data model and APIs regardless of how work units are presented in your interface
Work units are defined at the team level, and each team can have only one type of work unit. This ensures consistent workflows and processes within team operations.
### Work units vs custom objects
• Built-in capabilities
• Standard fields (assignee, status, priority)
• Built-in workflows
• Automatic SLA tracking
• Smart assignment rules
• Sub-team-based routing
• Notification system
• Basic data storage
• No standard fields
• Manual workflow creation
• No built-in SLA tracking
• Custom assignment logic needed
• Manual routing setup
• Custom notification setup
While custom objects provide flexibility for data storage, work units come with out-of-the-box functionality designed for operational workflows, making them ideal for managing team processes.
## Implementation
### Core attributes
Every work unit, regardless of its alias, includes:
• Unique identifier
• Title and description
• Status and priority
• Assignment details
• Timestamps
• Custom fields
• Dynamic forms
• Metadata
• Tags
### Common aliases
Work units can be presented differently based on your team's needs:
* Tickets
* Cases
* Issues
* Requests
* Opportunities
* Leads
* Deals
* Tasks
* Stories
* Deliverables
* Features
* Requests
* Incidents
* Changes
* Assets
### Customization options
* Custom field labels
* Branded terminology
* Team-specific views
* Role-based layouts (coming soon)
Define your workflows:
* Custom statuses
* Team-specific processes
* Automation rules
* SLA definitions
Connect with your tools:
* API access
* Webhook support (coming soon)
* Custom actions (coming soon)
* External system sync (coming soon)
## Example: Sales opportunities
Here's how work units can be customized for a sales team:
Required information tracking:
• Deal value and currency
• Probability percentage
• Expected close date
• Account and contacts
• Product/service details
• Competitor analysis
Process automation:
• Stage-based routing
• Approval flows
• Quote generation
• Win/loss tracking
• Revenue forecasting
• Team notifications
### Custom pipeline stages
These stages are implemented as custom statuses in the work unit. Each stage can be configured with mandatory fields that must be completed before moving to the next stage.
Required fields:
• Company size
• Budget range
• Decision timeline
Required fields:
• Requirements document
• Technical assessment
• Stakeholder map
Required fields:
• Solution scope
• Pricing details
• ROI calculation
Required fields:
• Contract terms
• Discount approvals
• Legal review status
Required fields:
• Final contract
• Win/loss reason
• Next steps/implementation plan
### Pipeline visualization
```mermaid theme={null}
flowchart LR
A[Lead] --> B[Opportunity]
B --> C[Proposal]
C --> D[Contract]
D --> E[Closed]
```
Each transition between stages is controlled by field validation. The work unit can only progress when all mandatory fields for the current stage are completed, ensuring data quality and process compliance.
## Best practices
1. **Consistent terminology**
* Use clear, team-specific aliases
* Maintain consistent naming
* Document terminology
* Train team members
2. **Process alignment**
* Map to existing workflows
* Define clear transitions
* Set up automation
* Monitor effectiveness
3. **Data integrity**
* Validate required fields
* Maintain relationships
* Track history
* Ensure compliance
## Related resources
Core ticket implementation details
Extending work units with custom fields
# Activities
Source: https://docs.thena.ai/platform/core-concepts/workflows/activities
Complete guide to workflow activities in the Thena platform
Activities are the building blocks of workflows in the Thena platform. They represent the actual operations to be performed when a workflow executes, enabling automation of various business processes.
## Understanding activities
Activities provide a structured way to define and execute operations within workflows. Each activity represents a discrete, reusable operation that can be configured, secured, and monitored.
## Activity types
• Data manipulation: Transform, filter, format
• Flow control: Branch, delay
• Ticket activities: Create, update, assign
• User activities: Create, update, permissions
• Integration activities: API calls, webhooks
## Activity anatomy
### Core properties
• **uid**: Unique system identifier
• **name**: Human-readable name
• **uniqueIdentifier**: Machine-readable identifier (e.g., `tickets:create-ticket-platform`)
• **version**: Activity version number
• **source**: Origin application
• **description**: Purpose description
• **throttler**: Rate limiting configuration
• **metadata**: Additional configuration data
### Schema structure
Input parameters definition:
* Required fields
* Optional fields
* Data types and validation
* Nested object structures
Output data definition:
* Required response fields
* Optional response fields
* Success/failure indicators
* Return data structure
Rate limiting configuration:
* Time window (TTL)
* Request limits
* Key definition
* Enable/disable flag
## Core platform activities
### Ticket management
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates a new ticket
**Request payload**:
```json theme={null}
{
"title": {
"type": "string",
"required": true,
"description": "Title of the ticket"
},
"requestorEmail": {
"type": "string",
"required": true,
"description": "Email of the person requesting the ticket"
},
"teamId": {
"type": "string",
"required": true,
"description": "ID of the team to assign the ticket to"
},
"description": {
"type": "string",
"optional": true,
"description": "Detailed description of the ticket"
},
"accountId": {
"type": "string",
"optional": true,
"description": "ID of the associated account"
},
"typeId": {
"type": "string",
"optional": true,
"description": "Type of the ticket"
},
"statusId": {
"type": "string",
"optional": true,
"description": "Status of the ticket"
},
"priorityId": {
"type": "string",
"optional": true,
"description": "Priority of the ticket"
},
"assignedAgentId": {
"type": "string",
"optional": true,
"description": "ID of the agent to assign the ticket to"
},
"isPrivate": {
"type": "boolean",
"optional": true,
"description": "Whether the ticket is private"
},
"dueDate": {
"type": "string",
"optional": true,
"description": "Due date for the ticket"
},
"source": {
"type": "string",
"optional": true,
"description": "Source of the ticket"
},
"attachmentUrls": {
"type": "array",
"items": {
"type": "string"
},
"optional": true,
"description": "URLs of attached files"
},
"customFieldValues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"customFieldId": {
"type": "string",
"required": true
},
"data": {
"type": "object",
"required": true
}
}
},
"optional": true,
"description": "Custom field values"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Unique identifier of the created ticket"
},
"title": {
"type": "string",
"required": true,
"description": "Title of the ticket"
},
"ticketId": {
"type": "number",
"required": true,
"description": "Numeric ID of the ticket"
},
"teamId": {
"type": "string",
"required": true,
"description": "Team ID"
},
"teamName": {
"type": "string",
"required": true,
"description": "Team name"
},
"requestorEmail": {
"type": "string",
"required": true,
"description": "Email of the requestor"
},
"status": {
"type": "string",
"optional": true,
"description": "Current status"
},
"priority": {
"type": "string",
"optional": true,
"description": "Current priority"
},
"description": {
"type": "string",
"optional": true,
"description": "Ticket description"
},
"assignedAgent": {
"type": "string",
"optional": true,
"description": "Name of assigned agent"
},
"assignedAgentId": {
"type": "string",
"optional": true,
"description": "ID of assigned agent"
},
"assignedAgentEmail": {
"type": "string",
"optional": true,
"description": "Assigned agent email"
},
"accountId": {
"type": "string",
"optional": true,
"description": "Associated account ID"
},
"isPrivate": {
"type": "boolean",
"required": true,
"description": "Whether the ticket is private"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Ticket creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Updates an existing ticket
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the ticket to update"
},
"title": {
"type": "string",
"optional": true,
"description": "New title for the ticket"
},
"description": {
"type": "string",
"optional": true,
"description": "New description for the ticket"
},
"teamId": {
"type": "string",
"optional": true,
"description": "New team ID"
},
"typeId": {
"type": "string",
"optional": true,
"description": "New type ID"
},
"statusId": {
"type": "string",
"optional": true,
"description": "New status ID"
},
"priorityId": {
"type": "string",
"optional": true,
"description": "New priority ID"
},
"accountId": {
"type": "string",
"optional": true,
"description": "New account ID"
},
"assignedAgentId": {
"type": "string",
"optional": true,
"description": "New assigned agent ID"
},
"isPrivate": {
"type": "boolean",
"optional": true,
"description": "Whether the ticket is private"
},
"dueDate": {
"type": "string",
"optional": true,
"description": "New due date"
},
"attachmentUrls": {
"type": "array",
"optional": true,
"items": {
"type": "string"
},
"description": "List of attachment URLs"
},
"customFieldValues": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"customFieldId": {
"type": "string",
"required": true
},
"data": {
"type": "object",
"required": true
}
}
},
"description": "Custom field values"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true
},
"title": {
"type": "string",
"required": true
},
"ticketId": {
"type": "number",
"required": true
},
"teamId": {
"type": "string",
"required": true
},
"teamName": {
"type": "string",
"required": true
},
"requestorEmail": {
"type": "string",
"required": true
},
"status": {
"type": "string",
"optional": true
},
"type": {
"type": "string",
"optional": true
},
"priority": {
"type": "string",
"optional": true
},
"description": {
"type": "string",
"optional": true
},
"assignedAgent": {
"type": "string",
"optional": true
},
"assignedAgentId": {
"type": "string",
"optional": true
},
"assignedAgentEmail": {
"type": "string",
"optional": true,
"description": "Assigned agent email"
},
"accountId": {
"type": "string",
"optional": true
},
"isPrivate": {
"type": "boolean",
"required": true
},
"createdAt": {
"type": "string",
"required": true
},
"updatedAt": {
"type": "string",
"required": true
}
}
```
**Scope**: Team\
**Source**: Platform\
**Compensation**: Compensate assign ticket\
**Description**: Assigns a ticket to an agent
**Request payload**:
```json theme={null}
{
"ticketId": {
"type": "string",
"required": true,
"description": "ID of the ticket to assign"
},
"agentId": {
"type": "string",
"required": true,
"description": "ID of the agent to assign the ticket to"
},
"unassign": {
"type": "boolean",
"optional": true,
"description": "Whether to unassign the ticket instead"
}
}
```
**Response payload**:
```json theme={null}
{
"success": {
"type": "boolean",
"required": true,
"description": "Whether the assignment was successful"
},
"ticket": {
"type": "object",
"required": true,
"description": "The updated ticket object",
"properties": {
"id": {
"type": "string",
"required": true,
"description": "Ticket ID"
},
"title": {
"type": "string",
"required": true,
"description": "Ticket title"
},
"ticketId": {
"type": "number",
"required": true,
"description": "Numeric ticket identifier"
},
"teamId": {
"type": "string",
"required": true,
"description": "Team ID"
},
"teamName": {
"type": "string",
"required": true,
"description": "Team name"
},
"requestorEmail": {
"type": "string",
"required": true,
"description": "Email of the ticket requestor"
},
"assignedAgent": {
"type": "string",
"optional": true,
"description": "Name of the assigned agent"
},
"assignedAgentId": {
"type": "string",
"optional": true,
"description": "ID of the assigned agent"
},
"assignedAgentEmail": {
"type": "string",
"optional": true,
"description": "Email of the assigned agent"
},
"status": {
"type": "string",
"optional": true,
"description": "Ticket status"
},
"priority": {
"type": "string",
"optional": true,
"description": "Ticket priority"
},
"description": {
"type": "string",
"optional": true,
"description": "Ticket description"
},
"accountId": {
"type": "string",
"optional": true,
"description": "Associated account ID"
},
"isPrivate": {
"type": "boolean",
"required": true,
"description": "Whether the ticket is private"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Ticket creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Escalates a ticket
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the ticket to escalate"
},
"reason": {
"type": "string",
"required": true,
"description": "Reason for escalation"
},
"details": {
"type": "string",
"required": true,
"description": "Detailed explanation of the escalation"
},
"impact": {
"type": "string",
"required": true,
"description": "Impact level of the escalation"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Ticket ID"
},
"title": {
"type": "string",
"required": true,
"description": "Ticket title"
},
"ticketId": {
"type": "number",
"required": true,
"description": "Numeric ticket identifier"
},
"teamId": {
"type": "string",
"required": true,
"description": "Team ID"
},
"teamName": {
"type": "string",
"required": true,
"description": "Team name"
},
"requestorEmail": {
"type": "string",
"required": true,
"description": "Email of the ticket requestor"
},
"description": {
"type": "string",
"optional": true,
"description": "Ticket description"
},
"status": {
"type": "string",
"optional": true,
"description": "Ticket status"
},
"priority": {
"type": "string",
"optional": true,
"description": "Ticket priority"
},
"assignedAgent": {
"type": "string",
"optional": true,
"description": "Name of the assigned agent"
},
"assignedAgentId": {
"type": "string",
"optional": true,
"description": "ID of the assigned agent"
},
"assignedAgentEmail": {
"type": "string",
"optional": true,
"description": "Email of the assigned agent"
},
"accountId": {
"type": "string",
"optional": true,
"description": "Associated account ID"
},
"isPrivate": {
"type": "boolean",
"required": true,
"description": "Whether the ticket is private"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Ticket creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Archives a ticket
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the ticket to archive"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Ticket ID"
},
"title": {
"type": "string",
"required": true,
"description": "Ticket title"
},
"ticketId": {
"type": "number",
"required": true,
"description": "Numeric ticket identifier"
},
"teamId": {
"type": "string",
"required": true,
"description": "Team ID"
},
"teamName": {
"type": "string",
"required": true,
"description": "Team name"
},
"requestorEmail": {
"type": "string",
"required": true,
"description": "Email of the ticket requestor"
},
"description": {
"type": "string",
"optional": true,
"description": "Ticket description"
},
"status": {
"type": "string",
"optional": true,
"description": "Ticket status"
},
"priority": {
"type": "string",
"optional": true,
"description": "Ticket priority"
},
"assignedAgent": {
"type": "string",
"optional": true,
"description": "Name of the assigned agent"
},
"assignedAgentId": {
"type": "string",
"optional": true,
"description": "ID of the assigned agent"
},
"assignedAgentEmail": {
"type": "string",
"optional": true,
"description": "Email of the assigned agent"
},
"accountId": {
"type": "string",
"optional": true,
"description": "Associated account ID"
},
"isPrivate": {
"type": "boolean",
"required": true,
"description": "Whether the ticket is private"
},
"archivedAt": {
"type": "string",
"optional": true,
"description": "Timestamp when the ticket was archived"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Ticket creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Gets a ticket by ID
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the ticket to retrieve"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Ticket ID"
},
"title": {
"type": "string",
"required": true,
"description": "Ticket title"
},
"ticketId": {
"type": "number",
"required": true,
"description": "Numeric ticket identifier"
},
"teamId": {
"type": "string",
"required": true,
"description": "Team ID"
},
"teamName": {
"type": "string",
"required": true,
"description": "Team name"
},
"requestorEmail": {
"type": "string",
"required": true,
"description": "Email of the ticket requestor"
},
"description": {
"type": "string",
"optional": true,
"description": "Ticket description"
},
"status": {
"type": "string",
"optional": true,
"description": "Ticket status"
},
"priority": {
"type": "string",
"optional": true,
"description": "Ticket priority"
},
"assignedAgent": {
"type": "string",
"optional": true,
"description": "Assigned agent name"
},
"assignedAgentId": {
"type": "string",
"optional": true,
"description": "Assigned agent ID"
},
"assignedAgentEmail": {
"type": "string",
"optional": true,
"description": "Assigned agent email"
},
"accountId": {
"type": "string",
"optional": true,
"description": "Associated account ID"
},
"isPrivate": {
"type": "boolean",
"required": true,
"description": "Whether the ticket is private"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Ticket creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
### Comment management
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates a comment on an entity
**Request payload**:
```json theme={null}
{
"content": {
"type": "string",
"required": true,
"description": "Content of the comment"
},
"entityType": {
"type": "string",
"required": true,
"description": "Type of entity the comment is for (e.g., 'ticket')"
},
"entityId": {
"type": "string",
"required": true,
"description": "ID of the entity the comment is for"
},
"metadata": {
"type": "string",
"required": false,
"description": "Additional metadata for the comment"
},
"threadName": {
"type": "string",
"required": false,
"description": "Name of the thread this comment belongs to"
},
"commentType": {
"type": "string",
"required": false,
"description": "Type of comment"
},
"attachmentUrls": {
"type": "array",
"required": false,
"description": "Array of attachment URLs",
"items": {
"type": "string"
}
},
"parentCommentId": {
"type": "string",
"required": false,
"description": "ID of parent comment if this is a reply"
},
"commentVisibility": {
"type": "string",
"required": false,
"description": "Visibility setting for the comment"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Comment ID"
},
"content": {
"type": "string",
"required": true,
"description": "Comment content"
},
"contentHtml": {
"type": "string",
"required": true,
"description": "Comment content in HTML format"
},
"contentMarkdown": {
"type": "string",
"required": true,
"description": "Comment content in Markdown format"
},
"author": {
"type": "string",
"required": true,
"description": "Author name"
},
"authorId": {
"type": "string",
"required": true,
"description": "Author ID"
},
"authorUserType": {
"type": "string",
"required": true,
"description": "Type of user who authored the comment"
},
"isEdited": {
"type": "boolean",
"required": true,
"description": "Whether the comment has been edited"
},
"isPinned": {
"type": "boolean",
"required": true,
"description": "Whether the comment is pinned"
},
"threadName": {
"type": "string",
"required": true,
"description": "Thread name"
},
"commentVisibility": {
"type": "string",
"required": true,
"description": "Comment visibility setting"
},
"commentType": {
"type": "string",
"required": true,
"description": "Type of comment"
},
"parentCommentId": {
"type": "string",
"required": false,
"description": "Parent comment ID if this is a reply"
},
"sourceEmailId": {
"type": "string",
"required": false,
"description": "Source email ID if comment came from email"
},
"metadata": {
"type": "object",
"required": true,
"description": "Comment metadata including reactions, replies, mentions"
},
"attachments": {
"type": "array",
"required": false,
"description": "Array of attachment objects"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Updates an existing comment
**Request payload**:
```json theme={null}
{
"commentId": {
"type": "string",
"required": true,
"description": "ID of the comment to update"
},
"content": {
"type": "string",
"required": false,
"description": "New content for the comment"
},
"threadName": {
"type": "string",
"required": false,
"description": "New thread name"
},
"attachments": {
"type": "array",
"required": false,
"description": "Array of attachment URLs",
"items": {
"type": "string"
}
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Comment ID"
},
"content": {
"type": "string",
"required": true,
"description": "Updated comment content"
},
"contentHtml": {
"type": "string",
"required": true,
"description": "Comment content in HTML format"
},
"contentMarkdown": {
"type": "string",
"required": true,
"description": "Comment content in Markdown format"
},
"author": {
"type": "string",
"required": true,
"description": "Author name"
},
"authorId": {
"type": "string",
"required": true,
"description": "Author ID"
},
"authorUserType": {
"type": "string",
"required": true,
"description": "Type of user who authored the comment"
},
"isEdited": {
"type": "boolean",
"required": true,
"description": "Whether the comment has been edited (will be true after update)"
},
"isPinned": {
"type": "boolean",
"required": true,
"description": "Whether the comment is pinned"
},
"threadName": {
"type": "string",
"required": true,
"description": "Thread name"
},
"commentVisibility": {
"type": "string",
"required": true,
"description": "Comment visibility setting"
},
"commentType": {
"type": "string",
"required": true,
"description": "Type of comment"
},
"parentCommentId": {
"type": "string",
"required": false,
"description": "Parent comment ID if this is a reply"
},
"sourceEmailId": {
"type": "string",
"required": false,
"description": "Source email ID if comment came from email"
},
"metadata": {
"type": "object",
"required": true,
"description": "Comment metadata including reactions, replies, mentions"
},
"attachments": {
"type": "array",
"required": false,
"description": "Array of attachment objects"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Deletes a comment
**Request payload**:
```json theme={null}
{
"commentId": {
"type": "string",
"required": true,
"description": "ID of the comment to delete"
}
}
```
**Response payload**:
```json theme={null}
{
"success": {
"type": "boolean",
"description": "Indicates if the deletion was successful"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves a single comment by ID
**Request payload**:
```json theme={null}
{
"commentId": {
"type": "string",
"required": true,
"description": "ID of the comment to retrieve"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Comment ID"
},
"content": {
"type": "string",
"required": true,
"description": "Comment content"
},
"contentHtml": {
"type": "string",
"required": true,
"description": "Comment content in HTML format"
},
"contentMarkdown": {
"type": "string",
"required": true,
"description": "Comment content in Markdown format"
},
"author": {
"type": "string",
"required": true,
"description": "Author name"
},
"authorId": {
"type": "string",
"required": true,
"description": "Author ID"
},
"authorUserType": {
"type": "string",
"required": true,
"description": "Type of user who authored the comment"
},
"isEdited": {
"type": "boolean",
"required": true,
"description": "Whether the comment has been edited"
},
"isPinned": {
"type": "boolean",
"required": true,
"description": "Whether the comment is pinned"
},
"threadName": {
"type": "string",
"required": true,
"description": "Thread name"
},
"commentVisibility": {
"type": "string",
"required": true,
"description": "Comment visibility setting"
},
"commentType": {
"type": "string",
"required": true,
"description": "Type of comment"
},
"parentCommentId": {
"type": "string",
"required": false,
"description": "Parent comment ID if this is a reply"
},
"sourceEmailId": {
"type": "string",
"required": false,
"description": "Source email ID if comment came from email"
},
"metadata": {
"type": "object",
"required": true,
"description": "Comment metadata including reactions, replies, mentions"
},
"attachments": {
"type": "array",
"required": false,
"description": "Array of attachment objects"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves comments for an entity with pagination
**Request payload**:
```json theme={null}
{
"entityType": {
"type": "string",
"required": true,
"description": "Type of entity to get comments for (e.g., 'ticket')"
},
"entityId": {
"type": "string",
"required": true,
"description": "ID of the entity to get comments for"
},
"page": {
"type": "number",
"required": false,
"description": "Page number for pagination"
},
"limit": {
"type": "number",
"required": false,
"description": "Number of comments per page"
}
}
```
**Response payload**:
```json theme={null}
{
"comments": {
"type": "array",
"required": true,
"description": "Array of comment objects",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Comment ID"
},
"content": {
"type": "string",
"description": "Comment content"
},
"contentHtml": {
"type": "string",
"description": "Comment content in HTML format"
},
"contentMarkdown": {
"type": "string",
"description": "Comment content in Markdown format"
},
"author": {
"type": "string",
"description": "Author name"
},
"authorId": {
"type": "string",
"description": "Author ID"
},
"authorUserType": {
"type": "string",
"description": "Type of user who authored the comment"
},
"isEdited": {
"type": "boolean",
"description": "Whether the comment has been edited"
},
"isPinned": {
"type": "boolean",
"description": "Whether the comment is pinned"
},
"threadName": {
"type": "string",
"description": "Thread name"
},
"commentVisibility": {
"type": "string",
"description": "Comment visibility setting"
},
"commentType": {
"type": "string",
"description": "Type of comment"
},
"parentCommentId": {
"type": "string",
"description": "Parent comment ID if this is a reply"
},
"sourceEmailId": {
"type": "string",
"description": "Source email ID if comment came from email"
},
"metadata": {
"type": "object",
"description": "Comment metadata including reactions, replies, mentions"
},
"attachments": {
"type": "array",
"description": "Array of attachment objects"
},
"createdAt": {
"type": "string",
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"description": "Last update timestamp"
}
}
}
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Adds a reaction to a comment
**Request payload**:
```json theme={null}
{
"commentId": {
"type": "string",
"required": true,
"description": "ID of the comment to add reaction to"
},
"reactionName": {
"type": "string",
"required": true,
"description": "Name of the reaction/emoji to add"
}
}
```
**Response payload**:
```json theme={null}
{
"success": {
"type": "boolean",
"required": true,
"description": "Whether the reaction was successfully added"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Removes a reaction from a comment
**Request payload**:
```json theme={null}
{
"commentId": {
"type": "string",
"required": true,
"description": "ID of the comment to remove reaction from"
},
"reactionName": {
"type": "string",
"required": true,
"description": "Name of the reaction/emoji to remove"
}
}
```
**Response payload**:
```json theme={null}
{
"success": {
"type": "boolean",
"required": true,
"description": "Whether the reaction was successfully removed"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves available emojis for reactions
**Request payload**:
```json theme={null}
{}
```
**Response payload**:
```json theme={null}
{
"emojis": {
"type": "array",
"required": true,
"description": "List of available emojis",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"required": true,
"description": "Display name of the emoji"
},
"unicode": {
"type": "string",
"required": true,
"description": "Unicode representation of the emoji"
},
"shortcode": {
"type": "string",
"required": true,
"description": "Shortcode for the emoji (e.g., :smile:)"
},
"category": {
"type": "string",
"required": true,
"description": "Category the emoji belongs to"
},
"keywords": {
"type": "array",
"required": true,
"description": "Keywords associated with the emoji",
"items": {
"type": "string"
}
}
}
}
}
}
```
**Connection details**: Platform API
### Account management
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates a new account
**Request payload**:
```json theme={null}
{
"name": {
"type": "string",
"required": true,
"description": "Account name"
},
"primaryDomain": {
"type": "string",
"required": true,
"description": "Primary domain for the account"
},
"logo": {
"type": "string",
"optional": true
},
"website": {
"type": "string",
"optional": true
},
"description": {
"type": "string",
"optional": true
},
"industry": {
"type": "string",
"optional": true
},
"status": {
"type": "string",
"optional": true
},
"health": {
"type": "string",
"optional": true
},
"classification": {
"type": "string",
"optional": true
},
"accountOwnerId": {
"type": "string",
"optional": true
},
"employees": {
"type": "number",
"optional": true
},
"annualRevenue": {
"type": "number",
"optional": true
},
"billingAddress": {
"type": "string",
"optional": true
},
"shippingAddress": {
"type": "string",
"optional": true
},
"secondaryDomain": {
"type": "string",
"optional": true
},
"customFieldValues": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"customFieldId": {
"type": "string",
"required": true
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "string",
"required": true
},
"id": {
"type": "string"
}
}
}
}
}
}
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"description": "Unique identifier for the created account"
},
"name": {
"type": "string"
},
"primaryDomain": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"customFieldValues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"customFieldId": {
"type": "string"
},
"data": {
"type": "object"
},
"metadata": {
"type": "object"
}
}
}
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates an account activity
**Request payload**:
```json theme={null}
{
"accountId": {
"type": "string",
"required": true,
"description": "ID of the account to create activity for"
},
"activityTimestamp": {
"type": "string",
"required": true,
"description": "Timestamp of the activity"
},
"type": {
"type": "string",
"optional": true,
"description": "Type of activity"
},
"status": {
"type": "string",
"optional": true,
"description": "Status of activity"
},
"duration": {
"type": "number",
"optional": true,
"description": "Duration of activity"
},
"location": {
"type": "string",
"optional": true,
"description": "Location of activity"
},
"participants": {
"type": "array",
"optional": true,
"items": {
"type": "string"
},
"description": "List of participant IDs"
},
"attachmentUrls": {
"type": "array",
"optional": true,
"items": {
"type": "string"
},
"description": "List of attachment URLs"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string"
},
"accountId": {
"type": "string"
},
"account": {
"type": "string"
},
"type": {
"type": "string",
"optional": true
},
"status": {
"type": "string",
"optional": true
},
"duration": {
"type": "number",
"optional": true
},
"location": {
"type": "string",
"optional": true
},
"participants": {
"type": "array",
"items": {
"type": "string"
}
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": "string"
},
"size": {
"type": "number"
},
"contentType": {
"type": "string"
}
}
}
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves accounts with optional filtering
**Request payload**:
```json theme={null}
{
"page": {
"type": "number",
"optional": true,
"description": "Page number for pagination"
},
"limit": {
"type": "number",
"optional": true,
"description": "Number of records per page"
},
"health": {
"type": "string",
"optional": true,
"description": "Filter by account health"
},
"source": {
"type": "string",
"optional": true,
"description": "Filter by account source"
},
"status": {
"type": "string",
"optional": true,
"description": "Filter by account status"
},
"industry": {
"type": "string",
"optional": true,
"description": "Filter by industry"
},
"accountOwnerId": {
"type": "string",
"optional": true,
"description": "Filter by account owner"
},
"classification": {
"type": "string",
"optional": true,
"description": "Filter by classification"
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"primaryDomain",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"primaryDomain": {
"type": "string"
},
"logo": {
"type": "string",
"optional": true
},
"website": {
"type": "string",
"optional": true
},
"description": {
"type": "string",
"optional": true
},
"industry": {
"type": "string",
"optional": true
},
"status": {
"type": "string",
"optional": true
},
"health": {
"type": "string",
"optional": true
},
"classification": {
"type": "string",
"optional": true
},
"accountOwnerId": {
"type": "string",
"optional": true
},
"accountOwnerEmail": {
"type": "string",
"optional": true
},
"employees": {
"type": "number",
"optional": true
},
"annualRevenue": {
"type": "number",
"optional": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"customFieldValues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"customFieldId": {
"type": "string"
},
"data": {
"type": "object"
},
"metadata": {
"type": "object"
}
}
}
}
}
}
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Updates an existing account
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Account ID to update"
},
"name": {
"type": "string",
"optional": true,
"description": "Account name"
},
"primaryDomain": {
"type": "string",
"optional": true,
"description": "Primary domain"
},
"logo": {
"type": "string",
"optional": true,
"description": "Logo URL"
},
"website": {
"type": "string",
"optional": true,
"description": "Website URL"
},
"description": {
"type": "string",
"optional": true,
"description": "Account description"
},
"industry": {
"type": "string",
"optional": true,
"description": "Industry name"
},
"status": {
"type": "string",
"optional": true,
"description": "Account status"
},
"health": {
"type": "string",
"optional": true,
"description": "Account health"
},
"classification": {
"type": "string",
"optional": true,
"description": "Account classification"
},
"accountOwnerId": {
"type": "string",
"optional": true,
"description": "Account owner user ID"
},
"employees": {
"type": "number",
"optional": true,
"description": "Number of employees"
},
"annualRevenue": {
"type": "number",
"optional": true,
"description": "Annual revenue"
},
"billingAddress": {
"type": "string",
"optional": true,
"description": "Billing address"
},
"shippingAddress": {
"type": "string",
"optional": true,
"description": "Shipping address"
},
"secondaryDomain": {
"type": "string",
"optional": true,
"description": "Secondary domain"
},
"customFieldValues": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"customFieldId": {
"type": "string",
"required": true
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "string",
"required": true
}
}
}
}
}
}
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"primaryDomain": {
"type": "string"
},
"logo": {
"type": "string",
"optional": true
},
"website": {
"type": "string",
"optional": true
},
"description": {
"type": "string",
"optional": true
},
"industry": {
"type": "string",
"optional": true
},
"status": {
"type": "string",
"optional": true
},
"health": {
"type": "string",
"optional": true
},
"classification": {
"type": "string",
"optional": true
},
"accountOwnerId": {
"type": "string",
"optional": true
},
"accountOwnerEmail": {
"type": "string",
"optional": true
},
"employees": {
"type": "number",
"optional": true
},
"annualRevenue": {
"type": "number",
"optional": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
},
"customFieldValues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"customFieldId": {
"type": "string"
},
"data": {
"type": "object"
},
"metadata": {
"type": "object"
}
}
}
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Deletes an account
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the account to delete"
}
}
```
**Response payload**: Empty response on success
**Scope**: Organization\
**Source**: Platform\
**Description**: Manage account relationships and types
Available operations:
* Create/Update/Delete relationship
* Create/Update/Delete relationship type
* Get relationships and types
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Manage account activities
Available operations:
* Create activity
* Update activity
* Delete activity
* Get activities
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates a new note for an account
**Request payload**:
```json theme={null}
{
"accountId": {
"type": "string",
"required": true,
"description": "ID of the account to create note for"
},
"content": {
"type": "string",
"required": true,
"description": "Content of the note"
},
"type": {
"type": "string",
"optional": true,
"description": "Type of note"
},
"visibility": {
"type": "string",
"optional": true,
"description": "Visibility level of the note"
},
"attachmentUrls": {
"type": "array",
"optional": true,
"items": {
"type": "string"
},
"description": "List of attachment URLs"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"description": "Unique identifier for the created note"
},
"accountId": {
"type": "string",
"description": "ID of the account"
},
"account": {
"type": "string",
"description": "Account name"
},
"content": {
"type": "string",
"description": "Note content"
},
"type": {
"type": "string",
"optional": true,
"description": "Note type"
},
"visibility": {
"type": "string",
"description": "Note visibility"
},
"author": {
"type": "string",
"description": "Author name"
},
"authorId": {
"type": "string",
"description": "Author ID"
},
"authorEmail": {
"type": "string",
"description": "Author email"
},
"attachments": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Attachment ID"
},
"url": {
"type": "string",
"description": "Attachment URL"
},
"name": {
"type": "string",
"description": "Attachment name"
},
"size": {
"type": "number",
"description": "Attachment size"
},
"contentType": {
"type": "string",
"description": "Attachment content type"
},
"createdAt": {
"type": "string",
"description": "Attachment creation timestamp"
}
}
}
},
"createdAt": {
"type": "string",
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"description": "Last update timestamp"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Updates an existing account note
**Request payload**:
```json theme={null}
{
"noteId": {
"type": "string",
"required": true,
"description": "ID of the note to update"
},
"content": {
"type": "string",
"optional": true,
"description": "New content for the note"
},
"type": {
"type": "string",
"optional": true,
"description": "New type for the note"
},
"visibility": {
"type": "string",
"optional": true,
"description": "New visibility level"
},
"attachmentUrls": {
"type": "array",
"optional": true,
"items": {
"type": "string"
},
"description": "New list of attachment URLs"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"description": "Note ID"
},
"accountId": {
"type": "string",
"description": "Account ID"
},
"account": {
"type": "string",
"description": "Account name"
},
"content": {
"type": "string",
"description": "Note content"
},
"type": {
"type": "string",
"optional": true,
"description": "Note type"
},
"visibility": {
"type": "string",
"description": "Note visibility"
},
"author": {
"type": "string",
"description": "Author name"
},
"authorId": {
"type": "string",
"description": "Author ID"
},
"authorEmail": {
"type": "string",
"description": "Author email"
},
"attachments": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Attachment ID"
},
"url": {
"type": "string",
"description": "Attachment URL"
},
"name": {
"type": "string",
"description": "Attachment name"
},
"size": {
"type": "number",
"description": "Attachment size"
},
"contentType": {
"type": "string",
"description": "Attachment content type"
},
"createdAt": {
"type": "string",
"description": "Attachment creation timestamp"
}
}
}
},
"createdAt": {
"type": "string",
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"description": "Last update timestamp"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Deletes an account note
**Request payload**:
```json theme={null}
{
"noteId": {
"type": "string",
"required": true,
"description": "ID of the note to delete"
}
}
```
**Response payload**: Empty response on success
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves notes for an account
**Request payload**:
```json theme={null}
{
"accountId": {
"type": "string",
"required": true,
"description": "ID of the account to get notes for"
},
"page": {
"type": "number",
"optional": true,
"description": "Page number for pagination"
},
"limit": {
"type": "number",
"optional": true,
"description": "Number of records per page"
},
"type": {
"type": "string",
"optional": true,
"description": "Filter notes by type"
},
"visibility": {
"type": "string",
"optional": true,
"description": "Filter notes by visibility"
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Note ID"
},
"accountId": {
"type": "string",
"description": "Account ID"
},
"account": {
"type": "string",
"description": "Account name"
},
"content": {
"type": "string",
"description": "Note content"
},
"type": {
"type": "string",
"optional": true,
"description": "Note type"
},
"typeId": {
"type": "string",
"optional": true,
"description": "Type ID"
},
"visibility": {
"type": "string",
"description": "Note visibility"
},
"author": {
"type": "string",
"description": "Author name"
},
"authorId": {
"type": "string",
"description": "Author ID"
},
"authorEmail": {
"type": "string",
"description": "Author email"
},
"attachments": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Attachment ID"
},
"url": {
"type": "string",
"description": "Attachment URL"
},
"name": {
"type": "string",
"description": "Attachment name"
},
"size": {
"type": "number",
"description": "Attachment size"
},
"contentType": {
"type": "string",
"description": "Attachment content type"
},
"createdAt": {
"type": "string",
"description": "Attachment creation timestamp"
}
}
}
},
"metadata": {
"type": "object",
"optional": true,
"description": "Additional metadata"
},
"typeConfiguration": {
"type": "object",
"optional": true,
"description": "Type-specific configuration"
},
"createdAt": {
"type": "string",
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"description": "Last update timestamp"
}
}
}
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates a new task for an account
**Request payload**:
```json theme={null}
{
"accountId": {
"type": "string",
"required": true,
"description": "ID of the account to create task for"
},
"title": {
"type": "string",
"required": true,
"description": "Task title"
},
"assigneeId": {
"type": "string",
"required": true,
"description": "ID of the user to assign the task to"
},
"type": {
"type": "string",
"optional": true,
"description": "Task type"
},
"status": {
"type": "string",
"optional": true,
"description": "Task status"
},
"priority": {
"type": "string",
"optional": true,
"description": "Task priority"
},
"description": {
"type": "string",
"optional": true,
"description": "Task description"
},
"activityId": {
"type": "string",
"optional": true,
"description": "Associated activity ID"
},
"attachmentUrls": {
"type": "array",
"optional": true,
"items": {
"type": "string"
},
"description": "List of attachment URLs"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"description": "Task ID"
},
"accountId": {
"type": "string",
"description": "Account ID"
},
"account": {
"type": "string",
"description": "Account name"
},
"title": {
"type": "string",
"description": "Task title"
},
"type": {
"type": "string",
"optional": true,
"description": "Task type"
},
"typeId": {
"type": "string",
"optional": true,
"description": "Type ID"
},
"status": {
"type": "string",
"optional": true,
"description": "Task status"
},
"statusId": {
"type": "string",
"optional": true,
"description": "Status ID"
},
"priority": {
"type": "string",
"optional": true,
"description": "Task priority"
},
"priorityId": {
"type": "string",
"optional": true,
"description": "Priority ID"
},
"description": {
"type": "string",
"optional": true,
"description": "Task description"
},
"creator": {
"type": "string",
"description": "Creator name"
},
"creatorId": {
"type": "string",
"description": "Creator ID"
},
"creatorEmail": {
"type": "string",
"description": "Creator email"
},
"assignee": {
"type": "string",
"optional": true,
"description": "Assignee name"
},
"assigneeId": {
"type": "string",
"optional": true,
"description": "Assignee ID"
},
"activityId": {
"type": "string",
"description": "Associated activity ID"
},
"attachments": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Attachment ID"
},
"url": {
"type": "string",
"description": "Attachment URL"
},
"name": {
"type": "string",
"description": "Attachment name"
},
"size": {
"type": "number",
"description": "Attachment size"
},
"contentType": {
"type": "string",
"description": "Attachment content type"
},
"createdAt": {
"type": "string",
"description": "Attachment creation timestamp"
}
}
}
},
"metadata": {
"type": "object",
"optional": true,
"description": "Additional metadata"
},
"typeConfiguration": {
"type": "object",
"optional": true,
"description": "Type-specific configuration"
},
"statusConfiguration": {
"type": "object",
"optional": true,
"description": "Status-specific configuration"
},
"priorityConfiguration": {
"type": "object",
"optional": true,
"description": "Priority-specific configuration"
},
"createdAt": {
"type": "string",
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"description": "Last update timestamp"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Updates an existing account task
**Request payload**:
```json theme={null}
{
"taskId": {
"type": "string",
"required": true,
"description": "ID of the task to update"
},
"title": {
"type": "string",
"optional": true,
"description": "New task title"
},
"type": {
"type": "string",
"optional": true,
"description": "New task type"
},
"status": {
"type": "string",
"optional": true,
"description": "New task status"
},
"priority": {
"type": "string",
"optional": true,
"description": "New task priority"
},
"assigneeId": {
"type": "string",
"optional": true,
"description": "New assignee ID"
},
"description": {
"type": "string",
"optional": true,
"description": "New task description"
},
"activityId": {
"type": "string",
"optional": true,
"description": "New associated activity ID"
},
"attachmentUrls": {
"type": "array",
"optional": true,
"items": {
"type": "string"
},
"description": "New list of attachment URLs"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"description": "Task ID"
},
"accountId": {
"type": "string",
"description": "Account ID"
},
"account": {
"type": "string",
"description": "Account name"
},
"title": {
"type": "string",
"description": "Task title"
},
"type": {
"type": "string",
"optional": true,
"description": "Task type"
},
"typeId": {
"type": "string",
"optional": true,
"description": "Type ID"
},
"status": {
"type": "string",
"optional": true,
"description": "Task status"
},
"statusId": {
"type": "string",
"optional": true,
"description": "Status ID"
},
"priority": {
"type": "string",
"optional": true,
"description": "Task priority"
},
"priorityId": {
"type": "string",
"optional": true,
"description": "Priority ID"
},
"description": {
"type": "string",
"optional": true,
"description": "Task description"
},
"creator": {
"type": "string",
"description": "Creator name"
},
"creatorId": {
"type": "string",
"description": "Creator ID"
},
"creatorEmail": {
"type": "string",
"description": "Creator email"
},
"assignee": {
"type": "string",
"optional": true,
"description": "Assignee name"
},
"assigneeId": {
"type": "string",
"optional": true,
"description": "Assignee ID"
},
"activityId": {
"type": "string",
"description": "Associated activity ID"
},
"attachments": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Attachment ID"
},
"url": {
"type": "string",
"description": "Attachment URL"
},
"name": {
"type": "string",
"description": "Attachment name"
},
"size": {
"type": "number",
"description": "Attachment size"
},
"contentType": {
"type": "string",
"description": "Attachment content type"
},
"createdAt": {
"type": "string",
"description": "Attachment creation timestamp"
}
}
}
},
"metadata": {
"type": "object",
"optional": true,
"description": "Additional metadata"
},
"typeConfiguration": {
"type": "object",
"optional": true,
"description": "Type-specific configuration"
},
"statusConfiguration": {
"type": "object",
"optional": true,
"description": "Status-specific configuration"
},
"priorityConfiguration": {
"type": "object",
"optional": true,
"description": "Priority-specific configuration"
},
"createdAt": {
"type": "string",
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"description": "Last update timestamp"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Deletes an account task
**Request payload**:
```json theme={null}
{
"taskId": {
"type": "string",
"required": true,
"description": "ID of the task to delete"
}
}
```
**Response payload**: Empty response on success
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves tasks for an account
**Request payload**:
```json theme={null}
{
"accountId": {
"type": "string",
"required": true,
"description": "ID of the account to get tasks for"
},
"page": {
"type": "number",
"optional": true,
"description": "Page number for pagination"
},
"limit": {
"type": "number",
"optional": true,
"description": "Number of records per page"
},
"type": {
"type": "string",
"optional": true,
"description": "Filter by task type"
},
"status": {
"type": "string",
"optional": true,
"description": "Filter by task status"
},
"priority": {
"type": "string",
"optional": true,
"description": "Filter by task priority"
},
"assigneeId": {
"type": "string",
"optional": true,
"description": "Filter by assignee ID"
},
"activityId": {
"type": "string",
"optional": true,
"description": "Filter by associated activity ID"
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"accountId",
"account",
"title",
"createdAt",
"updatedAt"
],
"properties": {
"id": {
"type": "string",
"description": "Task ID"
},
"accountId": {
"type": "string",
"description": "Account ID"
},
"account": {
"type": "string",
"description": "Account name"
},
"title": {
"type": "string",
"description": "Task title"
},
"type": {
"type": "string",
"optional": true,
"description": "Task type"
},
"typeId": {
"type": "string",
"optional": true,
"description": "Type ID"
},
"status": {
"type": "string",
"optional": true,
"description": "Task status"
},
"statusId": {
"type": "string",
"optional": true,
"description": "Status ID"
},
"priority": {
"type": "string",
"optional": true,
"description": "Task priority"
},
"priorityId": {
"type": "string",
"optional": true,
"description": "Priority ID"
},
"description": {
"type": "string",
"optional": true,
"description": "Task description"
},
"creator": {
"type": "string",
"description": "Creator name"
},
"creatorId": {
"type": "string",
"description": "Creator ID"
},
"creatorEmail": {
"type": "string",
"description": "Creator email"
},
"assignee": {
"type": "string",
"optional": true,
"description": "Assignee name"
},
"assigneeId": {
"type": "string",
"optional": true,
"description": "Assignee ID"
},
"activityId": {
"type": "string",
"description": "Associated activity ID"
},
"attachments": {
"type": "array",
"optional": true,
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Attachment ID"
},
"url": {
"type": "string",
"description": "Attachment URL"
},
"name": {
"type": "string",
"description": "Attachment name"
},
"size": {
"type": "number",
"description": "Attachment size"
},
"contentType": {
"type": "string",
"description": "Attachment content type"
},
"createdAt": {
"type": "string",
"description": "Attachment creation timestamp"
}
}
}
},
"metadata": {
"type": "object",
"optional": true,
"description": "Additional metadata"
},
"typeConfiguration": {
"type": "object",
"optional": true,
"description": "Type-specific configuration"
},
"statusConfiguration": {
"type": "object",
"optional": true,
"description": "Status-specific configuration"
},
"priorityConfiguration": {
"type": "object",
"optional": true,
"description": "Priority-specific configuration"
},
"createdAt": {
"type": "string",
"description": "Creation timestamp"
},
"updatedAt": {
"type": "string",
"description": "Last update timestamp"
}
}
}
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves relationships for an account
**Request payload**:
```json theme={null}
{
"accountId": {
"type": "string",
"required": true,
"description": "ID of the account to get relationships for"
},
"page": {
"type": "number",
"optional": true,
"description": "Page number for pagination"
},
"limit": {
"type": "number",
"optional": true,
"description": "Number of records per page"
},
"relationshipType": {
"type": "string",
"optional": true,
"description": "Filter by relationship type"
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"accountId": {
"type": "string"
},
"account": {
"type": "string"
},
"relatedAccountId": {
"type": "string"
},
"relatedAccount": {
"type": "string"
},
"relationshipType": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"inverseRelationship": {
"type": "string",
"optional": true
},
"inverseRelationshipId": {
"type": "string",
"optional": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
}
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates a relationship between two accounts
**Request payload**:
```json theme={null}
{
"accountId": {
"type": "string",
"required": true,
"description": "ID of the first account"
},
"relatedAccountId": {
"type": "string",
"required": true,
"description": "ID of the second account"
},
"relationshipType": {
"type": "string",
"required": true,
"description": "Type of relationship to create"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string"
},
"accountId": {
"type": "string"
},
"account": {
"type": "string"
},
"relatedAccountId": {
"type": "string"
},
"relatedAccount": {
"type": "string"
},
"relationshipType": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"inverseRelationship": {
"type": "string",
"optional": true
},
"inverseRelationshipId": {
"type": "string",
"optional": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Updates an existing account relationship
**Request payload**:
```json theme={null}
{
"relationshipId": {
"type": "string",
"required": true,
"description": "ID of the relationship to update"
},
"relationshipType": {
"type": "string",
"optional": true,
"description": "New relationship type"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string"
},
"accountId": {
"type": "string"
},
"account": {
"type": "string"
},
"relatedAccountId": {
"type": "string"
},
"relatedAccount": {
"type": "string"
},
"relationshipType": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"inverseRelationship": {
"type": "string",
"optional": true
},
"inverseRelationshipId": {
"type": "string",
"optional": true
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
}
```
**Scope**: Organization\
**Source**: Platform\
**Description**: Deletes an account relationship
**Request payload**:
```json theme={null}
{
"relationshipId": {
"type": "string",
"required": true,
"description": "ID of the relationship to delete"
}
}
```
**Response payload**: Empty response on success
### Customer contact management
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates a new customer contact
**Request payload**:
```json theme={null}
{
"firstName": {
"type": "string",
"required": true,
"description": "First name of the contact"
},
"email": {
"type": "string",
"required": true,
"description": "Email address of the contact"
},
"lastName": {
"type": "string",
"required": false,
"description": "Last name of the contact"
},
"phoneNumber": {
"type": "string",
"required": false,
"description": "Phone number of the contact"
},
"contactType": {
"type": "string",
"required": false,
"description": "Type of contact"
},
"accountIds": {
"type": "array",
"required": false,
"description": "Array of account IDs to associate with the contact",
"items": {
"type": "string"
}
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Unique identifier of the created contact"
},
"firstName": {
"type": "string",
"required": true,
"description": "First name of the contact"
},
"email": {
"type": "string",
"required": true,
"description": "Email address of the contact"
},
"lastName": {
"type": "string",
"required": false,
"description": "Last name of the contact"
},
"phoneNumber": {
"type": "string",
"required": false,
"description": "Phone number of the contact"
},
"contactType": {
"type": "string",
"required": false,
"description": "Type of contact"
},
"contactTypeId": {
"type": "string",
"required": false,
"description": "ID of the contact type"
},
"accounts": {
"type": "array",
"required": false,
"description": "Associated accounts",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Account ID"
},
"name": {
"type": "string",
"description": "Account name"
}
}
}
},
"createdAt": {
"type": "string",
"required": true,
"description": "Contact creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Updates an existing customer contact
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the contact to update"
},
"firstName": {
"type": "string",
"required": false,
"description": "New first name of the contact"
},
"email": {
"type": "string",
"required": false,
"description": "New email address of the contact"
},
"lastName": {
"type": "string",
"required": false,
"description": "New last name of the contact"
},
"phoneNumber": {
"type": "string",
"required": false,
"description": "New phone number of the contact"
},
"contactType": {
"type": "string",
"required": false,
"description": "New type of contact"
},
"accountIds": {
"type": "array",
"required": false,
"description": "New array of account IDs to associate with the contact",
"items": {
"type": "string"
}
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Unique identifier of the contact"
},
"firstName": {
"type": "string",
"required": true,
"description": "First name of the contact"
},
"email": {
"type": "string",
"required": true,
"description": "Email address of the contact"
},
"lastName": {
"type": "string",
"required": false,
"description": "Last name of the contact"
},
"phoneNumber": {
"type": "string",
"required": false,
"description": "Phone number of the contact"
},
"contactType": {
"type": "string",
"required": false,
"description": "Type of contact"
},
"contactTypeId": {
"type": "string",
"required": false,
"description": "ID of the contact type"
},
"accounts": {
"type": "array",
"required": false,
"description": "Associated accounts",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Account ID"
},
"name": {
"type": "string",
"description": "Account name"
}
}
}
},
"createdAt": {
"type": "string",
"required": true,
"description": "Contact creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Deletes a customer contact
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the contact to delete"
}
}
```
**Response payload**: Empty response on success
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Retrieves customer contacts with optional filtering
**Request payload**:
```json theme={null}
{
"page": {
"type": "number",
"required": false,
"description": "Page number for pagination"
},
"limit": {
"type": "number",
"required": false,
"description": "Number of contacts per page"
},
"email": {
"type": "string",
"required": false,
"description": "Filter by email address"
},
"accountId": {
"type": "string",
"required": false,
"description": "Filter by associated account ID"
},
"contactType": {
"type": "string",
"required": false,
"description": "Filter by contact type"
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "array",
"required": true,
"description": "Array of contact objects",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"required": true,
"description": "Contact ID"
},
"firstName": {
"type": "string",
"required": true,
"description": "First name of the contact"
},
"email": {
"type": "string",
"required": true,
"description": "Email address of the contact"
},
"lastName": {
"type": "string",
"required": false,
"description": "Last name of the contact"
},
"phoneNumber": {
"type": "string",
"required": false,
"description": "Phone number of the contact"
},
"contactType": {
"type": "string",
"required": false,
"description": "Type of contact"
},
"contactTypeId": {
"type": "string",
"required": false,
"description": "ID of the contact type"
},
"accounts": {
"type": "array",
"required": false,
"description": "Associated accounts",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Account ID"
},
"name": {
"type": "string",
"description": "Account name"
}
}
}
},
"createdAt": {
"type": "string",
"required": true,
"description": "Contact creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
}
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Creates multiple customer contacts in a single operation
**Request payload**:
```json theme={null}
{
"contacts": {
"type": "array",
"required": true,
"description": "Array of contact objects to create",
"items": {
"type": "object",
"properties": {
"firstName": {
"type": "string",
"required": true,
"description": "First name of the contact"
},
"email": {
"type": "string",
"required": true,
"description": "Email address of the contact"
},
"lastName": {
"type": "string",
"required": false,
"description": "Last name of the contact"
},
"phoneNumber": {
"type": "string",
"required": false,
"description": "Phone number of the contact"
},
"contactType": {
"type": "string",
"required": false,
"description": "Type of contact"
},
"accountIds": {
"type": "array",
"required": false,
"description": "Array of account IDs to associate with the contact",
"items": {
"type": "string"
}
}
}
}
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "array",
"required": true,
"description": "Array of created contact objects",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"required": true,
"description": "Contact ID"
},
"firstName": {
"type": "string",
"required": true,
"description": "First name of the contact"
},
"email": {
"type": "string",
"required": true,
"description": "Email address of the contact"
},
"lastName": {
"type": "string",
"required": false,
"description": "Last name of the contact"
},
"phoneNumber": {
"type": "string",
"required": false,
"description": "Phone number of the contact"
},
"contactType": {
"type": "string",
"required": false,
"description": "Type of contact"
},
"contactTypeId": {
"type": "string",
"required": false,
"description": "ID of the contact type"
},
"accounts": {
"type": "array",
"required": false,
"description": "Associated accounts",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Account ID"
},
"name": {
"type": "string",
"description": "Account name"
}
}
}
},
"createdAt": {
"type": "string",
"required": true,
"description": "Contact creation timestamp"
},
"updatedAt": {
"type": "string",
"required": true,
"description": "Last update timestamp"
}
}
}
}
}
```
**Connection details**: Platform API
### Utilities
**Scope**: Organization\
**Source**: Platform\
**Description**: Waits for a specified duration
**Request payload**:
```json theme={null}
{
"duration": {
"type": "number",
"required": true,
"description": "Duration to sleep in milliseconds"
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "string",
"required": true,
"description": "Response data"
},
"status": {
"type": "number",
"required": true,
"description": "HTTP status code"
},
"sleep_duration": {
"type": "number",
"required": true,
"description": "Actual duration slept in milliseconds"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Triggers another workflow
**Request payload**:
```json theme={null}
{
"workflowUniqueIdentifier": {
"type": "string",
"required": true,
"description": "Unique identifier of the workflow to trigger"
},
"data": {
"type": "object",
"required": true,
"description": "Input data for the triggered workflow"
}
}
```
**Response payload**:
```json theme={null}
{
"data": {
"type": "string",
"required": true,
"description": "Result of the workflow trigger operation"
},
"status": {
"type": "number",
"required": true,
"description": "HTTP status code of the operation"
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Checks team availability based on holidays and business hours
**Request payload**:
```json theme={null}
{
"teamId": {
"type": "string",
"required": true,
"description": "ID of the team to check availability for (can be null for organization-wide check)"
}
}
```
**Response payload**:
```json theme={null}
{
"isAvailable": {
"type": "boolean",
"required": true,
"description": "Whether the team is currently available"
},
"reason": {
"type": "string",
"required": true,
"description": "Reason for availability status",
"enum": ["IN_BUSINESS_HOURS", "OUTSIDE_BUSINESS_HOURS", "HOLIDAY"]
}
}
```
**Connection details**: Platform API
**Scope**: Organization\
**Source**: Platform\
**Description**: Checks user availability based on time off and business hours
**Request payload**:
```json theme={null}
{
"userId": {
"type": "string",
"required": true,
"description": "ID of the user to check availability for (can be null for current user)"
}
}
```
**Response payload**:
```json theme={null}
{
"isAvailable": {
"type": "boolean",
"required": true,
"description": "Whether the user is currently available"
},
"reason": {
"type": "string",
"required": true,
"description": "Reason for availability status",
"enum": ["IN_BUSINESS_HOURS", "OUTSIDE_BUSINESS_HOURS", "TIME_OFF"]
}
}
```
**Connection details**: Platform API
## Integration activities
### Slack integration
**Scope**: Organization\
**Source**: Registered App\
**Description**: Posts a message to a Slack channel or user
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID or user ID to send message to"
},
"text": {
"type": "string",
"required": true,
"description": "Message text content"
},
"blocks": {
"type": "array",
"required": false,
"description": "Optional Slack block kit elements"
},
"thread_ts": {
"type": "string",
"required": false,
"description": "Optional timestamp of parent message for threading"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
},
"ts": {
"type": "string",
"description": "Timestamp of the posted message"
},
"channel": {
"type": "string",
"description": "Channel ID where message was posted"
},
"message": {
"type": "object",
"description": "Full message object"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Edits an existing Slack message
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID containing the message"
},
"ts": {
"type": "string",
"required": true,
"description": "Timestamp of message to edit"
},
"text": {
"type": "string",
"required": true,
"description": "New message text"
},
"blocks": {
"type": "array",
"required": false,
"description": "Optional updated block kit elements"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
},
"ts": {
"type": "string",
"description": "Timestamp of the edited message"
},
"text": {
"type": "string",
"description": "Updated message text"
},
"channel": {
"type": "string",
"description": "Channel ID containing the message"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Deletes a Slack message
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID containing the message"
},
"ts": {
"type": "string",
"required": true,
"description": "Timestamp of message to delete"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
},
"ts": {
"type": "string",
"description": "Timestamp of the deleted message"
},
"channel": {
"type": "string",
"description": "Channel ID containing the message"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Joins a Slack channel
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID to join"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
},
"channel": {
"type": "object",
"description": "Channel object that was joined"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Leaves a Slack channel
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID to leave"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Adds a member to a Slack channel
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID"
},
"user": {
"type": "string",
"required": true,
"description": "User ID to add"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Removes a member from a Slack channel
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID"
},
"user": {
"type": "string",
"required": true,
"description": "User ID to remove"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Adds a reaction to a Slack message
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID containing the message"
},
"ts": {
"type": "string",
"required": true,
"description": "Timestamp of target message"
},
"name": {
"type": "string",
"required": true,
"description": "Emoji name without colons (e.g., 'thumbsup')"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
}
}
```
**Connection**: HTTP (Slack API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Removes a reaction from a Slack message
**Request payload**:
```json theme={null}
{
"channel": {
"type": "string",
"required": true,
"description": "Channel ID containing the message"
},
"ts": {
"type": "string",
"required": true,
"description": "Timestamp of target message"
},
"name": {
"type": "string",
"required": true,
"description": "Emoji name to remove"
}
}
```
**Response payload**:
```json theme={null}
{
"ok": {
"type": "boolean",
"description": "Whether the operation was successful"
}
}
```
**Connection**: HTTP (Slack API)
### Jira integration
**Scope**: Organization\
**Source**: Registered App\
**Description**: Creates a new issue in Jira
**Request payload**:
```json theme={null}
{
"summary": {
"type": "string",
"required": true,
"description": "Issue summary/title"
},
"issue_type": {
"type": "string",
"required": true,
"description": "Jira issue type ID (e.g., 'Bug', 'Task', 'Story')"
},
"description": {
"type": "string",
"required": true,
"description": "Detailed description of the issue"
},
"project_key": {
"type": "string",
"required": true,
"description": "Jira project key (e.g., 'PROJ', 'DEV')"
}
}
```
**Response payload**:
```json theme={null}
{
"id": {
"type": "string",
"description": "Unique identifier of the created issue"
},
"key": {
"type": "string",
"description": "Issue key (e.g., 'PROJ-123')"
},
"self": {
"type": "string",
"description": "URL to the created issue"
},
"metadata": {
"type": "object",
"description": "Additional information about the created issue"
}
}
```
**Connection**: HTTP (Jira API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Transitions a Jira issue to a different status
**Request payload**:
```json theme={null}
{
"issue_key": {
"type": "string",
"required": true,
"description": "Jira issue key (e.g., 'PROJ-123')"
},
"transition_id": {
"type": "string",
"required": true,
"description": "Transition ID to execute (e.g., '21' for 'In Progress', '31' for 'Done')"
}
}
```
**Response payload**:
```json theme={null}
{
"success": {
"type": "boolean",
"description": "Whether the transition was successful"
},
"metadata": {
"type": "object",
"description": "Additional information about the transition"
}
}
```
**Connection**: HTTP (Jira API)
## AI agent activities
**Scope**: Team\
**Source**: Registered App\
**Description**: Changes ticket status based on AI analysis of comments and context
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the ticket to analyze for status change"
}
}
```
**Response payload**:
```json theme={null}
{
"success": {
"type": "boolean",
"description": "Whether the status change was successful"
},
"new_status": {
"type": "string",
"description": "The new status assigned to the ticket"
},
"confidence": {
"type": "number",
"description": "AI confidence score for the status change decision"
},
"reasoning": {
"type": "string",
"description": "AI reasoning for the status change"
}
}
```
**Connection**: HTTP (Agent Studio API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Analyzes tickets for potential deflection opportunities using AI
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "ID of the ticket to analyze for deflection"
}
}
```
**Response payload**:
```json theme={null}
{
"output": {
"type": "object",
"description": "AI analysis results for ticket deflection",
"properties": {
"can_deflect": {
"type": "boolean",
"description": "Whether the ticket can be deflected"
},
"deflection_confidence": {
"type": "number",
"description": "Confidence score for deflection recommendation"
},
"suggested_resources": {
"type": "array",
"items": {
"type": "string"
},
"description": "Suggested knowledge base articles or resources"
},
"deflection_reason": {
"type": "string",
"description": "Reason why the ticket can or cannot be deflected"
}
}
}
}
```
**Connection**: HTTP (Agent Studio API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Generates AI-powered summaries for ticket content and context
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Ticket ID"
},
"title": {
"type": "string",
"required": true,
"description": "Ticket title"
},
"description": {
"type": "string",
"required": false,
"description": "Ticket description"
},
"teamId": {
"type": "string",
"required": true,
"description": "Team ID"
},
"customer": {
"type": "object",
"required": true,
"properties": {
"id": {
"type": "string",
"description": "Customer ID"
},
"name": {
"type": "string",
"description": "Customer name"
},
"email": {
"type": "string",
"required": true,
"description": "Customer email"
}
}
},
"statusId": {
"type": "string",
"required": false,
"description": "Current status ID"
},
"statusName": {
"type": "string",
"required": false,
"description": "Current status name"
},
"priorityId": {
"type": "string",
"required": false,
"description": "Priority ID"
},
"priorityName": {
"type": "string",
"required": false,
"description": "Priority name"
},
"assignedTo": {
"type": "string",
"required": false,
"description": "Assigned agent ID"
},
"assignedName": {
"type": "string",
"required": false,
"description": "Assigned agent name"
},
"source": {
"type": "string",
"required": false,
"description": "Ticket source"
},
"tags": {
"type": "array",
"required": true,
"items": {
"type": "string"
},
"description": "Ticket tags"
},
"isArchived": {
"type": "boolean",
"required": true,
"description": "Whether ticket is archived"
},
"isEscalated": {
"type": "boolean",
"required": true,
"description": "Whether ticket is escalated"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Ticket creation timestamp"
},
"metadata": {
"type": "object",
"required": false,
"description": "Additional ticket metadata"
},
"customFields": {
"type": "array",
"required": false,
"items": {
"type": "object"
},
"description": "Custom field values"
}
}
```
**Response payload**:
```json theme={null}
{
"output": {
"type": "object",
"required": true,
"properties": {
"key_points": {
"type": "array",
"items": {
"type": "string"
},
"description": "3-5 key points extracted from the ticket"
},
"customer_summary": {
"type": "string",
"description": "Customer-friendly, non-technical summary"
},
"technical_summary": {
"type": "string",
"description": "Technical summary with internal context"
}
}
}
}
```
**Connection**: HTTP (Agent Studio API)
**Scope**: Organization\
**Source**: Registered App\
**Description**: Generates optimized titles and descriptions for tickets using AI
**Request payload**:
```json theme={null}
{
"id": {
"type": "string",
"required": true,
"description": "Ticket ID"
},
"title": {
"type": "string",
"required": true,
"description": "Current ticket title"
},
"description": {
"type": "string",
"required": false,
"description": "Current ticket description"
},
"teamId": {
"type": "string",
"required": true,
"description": "Team ID"
},
"customer": {
"type": "object",
"required": true,
"properties": {
"id": {
"type": "string",
"description": "Customer ID"
},
"name": {
"type": "string",
"description": "Customer name"
},
"email": {
"type": "string",
"required": true,
"description": "Customer email"
}
}
},
"statusId": {
"type": "string",
"required": false,
"description": "Current status ID"
},
"statusName": {
"type": "string",
"required": false,
"description": "Current status name"
},
"priorityId": {
"type": "string",
"required": false,
"description": "Priority ID"
},
"priorityName": {
"type": "string",
"required": false,
"description": "Priority name"
},
"assignedTo": {
"type": "string",
"required": false,
"description": "Assigned agent ID"
},
"assignedName": {
"type": "string",
"required": false,
"description": "Assigned agent name"
},
"source": {
"type": "string",
"required": false,
"description": "Ticket source"
},
"tags": {
"type": "array",
"required": true,
"items": {
"type": "string"
},
"description": "Ticket tags"
},
"isArchived": {
"type": "boolean",
"required": true,
"description": "Whether ticket is archived"
},
"isEscalated": {
"type": "boolean",
"required": true,
"description": "Whether ticket is escalated"
},
"createdAt": {
"type": "string",
"required": true,
"description": "Ticket creation timestamp"
},
"metadata": {
"type": "object",
"required": false,
"description": "Additional ticket metadata"
},
"customFields": {
"type": "array",
"required": false,
"items": {
"type": "object"
},
"description": "Custom field values"
}
}
```
**Response payload**:
```json theme={null}
{
"output": {
"type": "object",
"required": true,
"properties": {
"title": {
"type": "string",
"description": "Optimized and clear title for the ticket"
},
"description": {
"type": "string",
"description": "Well-structured and detailed description"
},
"keywords": {
"type": "array",
"items": {
"type": "string"
},
"description": "Relevant keywords for ticket categorization"
},
"confidence_scores": {
"type": "object",
"properties": {
"title": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Confidence score for the generated title"
},
"description": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Confidence score for the generated description"
}
}
}
}
}
}
```
**Connection**: HTTP (Agent Studio API)
## Best practices
* Keep activities focused and single-purpose
* Define clear input/output contracts
* Implement proper validation
* Handle errors gracefully
* Validate all inputs
* Check required permissions
* Secure sensitive data
* Audit activity execution
* Configure appropriate rate limits
* Implement proper timeouts
* Monitor resource usage
* Handle concurrent executions
## Related resources
Learn about workflow events and triggers
View complete activity reference
# Events & triggers
Source: https://docs.thena.ai/platform/core-concepts/workflows/events-triggers
Understanding events and triggers in the workflow system
A trigger is the foundation of workflow automation in the Thena platform. It consists of two key components: an event and filters. While events represent what happened, triggers allow you to specify exactly when a workflow should execute based on those events.
## Understanding triggers
A trigger is a combination of an event and optional filters. Events tell us what happened (e.g., "ticket created"), while filters let us specify precise conditions about when we care about that event (e.g., "only when the ticket priority is high").
## Event types
• Ticket events: Created, updated, status changed
• User events: Created, updated, permissions changed
• Team events: Created, members changed
• Account events: Created, updated, status changed
• Slack events: Message sent, channel created
• Email events: Received, sent, bounced
• Custom app events: Any app-specific events
• Scheduled events: Time-based triggers
## Event anatomy
An event in the Thena Platform consists of several key components that define its structure and behavior.
### Key components
• **uid**: Unique identifier for the event
• **eventName**: Human-readable name
• **eventType**: Machine-readable type (e.g., `ticket:updated`)
• **source**: Origin of the event
• **description**: Human-readable description
• **message**: Core event data including actor and payload
• **messageAttributes**: Context and metadata about the event
• **required fields**: Mandatory data points
• **properties**: Data type definitions and validations
### Event data structure
The core event data container:
* **actor**: Who triggered the event
* **orgId**: Organization context
* **eventId**: Unique event instance ID
* **payload**: The actual event data
* **timestamp**: When the event occurred
The main event data:
* **Current state**: Latest data (e.g., updated ticket)
* **Previous state**: Data before the change (when applicable)
* **Required fields**: Mandatory data points
* **Optional fields**: Additional context
Additional context about the event:
* **event\_name**: Name of the event
* **event\_timestamp**: When it occurred
* **context\_user\_id**: Who triggered it
* **context\_organization\_id**: Org context
Configuration for event processing:
* **entityType**: Type of entity involved
* **pathToTeamId**: Location of team identifier
* **pathToAnnotate**: Path for data enrichment
* **requiredFields**: Fields needed for processing
Events follow a consistent structure that enables:
* Rich context through nested properties
* Type safety with JSON schema validation
* Clear audit trail with actor and timestamp information
* Flexible data access through dot notation in filters
Here's a comprehensive example of a ticket update event:
```json theme={null}
{
"uid": "D0DN56NJ10C3RJJG1TGR3D86HM0S8",
"description": "This event is triggered when a ticket is updated",
"eventName": "Ticket updated",
"source": "platform_app",
"eventType": "ticket:updated",
"schema": {
"type": "object",
"required": ["message", "messageAttributes"],
"properties": {
"message": {
"type": "object",
"required": ["actor", "orgId", "eventId", "payload", "eventType", "timestamp"],
"properties": {
"actor": {
"type": "object",
"required": ["email", "id", "type"],
"properties": {
"id": { "type": "string" },
"type": { "type": "string" },
"email": { "type": "string" }
}
},
"payload": {
"type": "object",
"required": ["previousTicket", "ticket"],
"properties": {
"ticket": {
"type": "object",
"required": ["id", "title", "teamId"],
"properties": {
"id": { "type": "string" },
"title": { "type": "string" },
"teamId": { "type": "string" }
// ... additional ticket properties
}
},
"previousTicket": {
"type": "object",
"required": ["id", "title", "teamId"]
// ... same structure as ticket
}
}
}
}
},
"messageAttributes": {
"type": "object",
"required": [
"event_name",
"event_id",
"event_timestamp",
"context_user_id",
"context_user_type",
"context_organization_id"
]
// ... attribute properties
}
}
},
"metadata": {
"entityType": "Ticket",
"pathToTeamId": "context.event.message.payload.ticket.teamId",
"pathToAnnotate": "context.event.message.payload.ticket",
"requiredFields": {
"ticketId": "{{context.event.message.payload.ticket.id}}"
}
}
}
```
## Trigger components
### Event definition
| Name | Type | Options | Comments |
| :----------- | :------- | :-------------------------- | :------------------------ |
| Event Name | string | Required, Format: app:event | Unique event identifier |
| Event Schema | object | Required | JSON Schema of event data |
| Event Data | object | Required | Actual event payload |
| Source | string | Required | Event origin identifier |
| Timestamp | datetime | Required | Event occurrence time |
### Filter operators
Filters in triggers allow you to specify precise conditions for when a workflow should execute. The platform supports a comprehensive set of operators:
#### Comparison operators
| Operator | Description | Example |
| :------- | :-------------------- | :------------------------------- |
| \~eq | Equals | `{"priority": {"~eq": "high"}}` |
| \~neq | Not equals | `{"status": {"~neq": "closed"}}` |
| \~gt | Greater than | `{"value": {"~gt": 100}}` |
| \~gte | Greater than or equal | `{"age": {"~gte": 18}}` |
| \~lt | Less than | `{"count": {"~lt": 5}}` |
| \~lte | Less than or equal | `{"score": {"~lte": 10}}` |
#### Collection operators
| Operator | Description | Example |
| :------- | :----------- | :----------------------------------------- |
| \~in | In array | `{"status": {"~in": ["open", "pending"]}}` |
| \~nin | Not in array | `{"type": {"~nin": ["internal", "test"]}}` |
#### String operators
| Operator | Description | Example |
| :---------- | :------------------- | :------------------------------------------ |
| \~regex | Matches regex | `{"email": {"~regex": ".*@company\\.com"}}` |
| \~nregex | Does not match regex | `{"url": {"~nregex": ".*\\.test\\.com"}}` |
| \~starts | Starts with | `{"name": {"~starts": "Test"}}` |
| \~nstarts | Does not start with | `{"ref": {"~nstarts": "DRAFT"}}` |
| \~ends | Ends with | `{"email": {"~ends": "@thena.ai"}}` |
| \~nends | Does not end with | `{"path": {"~nends": ".tmp"}}` |
| \~contains | Contains | `{"description": {"~contains": "urgent"}}` |
| \~ncontains | Does not contain | `{"title": {"~ncontains": "test"}}` |
#### Special operators
| Operator | Description | Example |
| :-------- | :---------- | :-------------------------------- |
| \~isnull | Is null | `{"assignee": {"~isnull": true}}` |
| \~isempty | Is empty | `{"tags": {"~isempty": true}}` |
#### Logical operators
| Operator | Description | Example |
| :------- | :------------------------ | :----------------------------------------------------------------------- |
| \~and | All conditions must match | `{"~and": [{"status": {"~eq": "open"}}, {"priority": {"~eq": "high"}}]}` |
| \~or | Any condition must match | `{"~or": [{"type": {"~eq": "bug"}}, {"priority": {"~eq": "high"}}]}` |
Filter operators can be combined to create complex conditions. The platform evaluates them in a deterministic order, with logical operators (\~and, \~or) being evaluated last.
## Example trigger
```json theme={null}
{
"name": "Change status to Waiting on Customer when an agent replies",
"triggerEvent": "ticket:comment:created",
"filters": {
"~and": [
{
"{{context.event.message.payload.comment.teamId}}": {
"~eq": "T66CEQQJXZ"
}
},
{
"~and": [
{
"~and": [
{
"{{ context.event.message.payload.ticket.status.name }}": {
"~neq": "Waiting on customer"
}
},
{
"{{ context.event.message.payload.comment.customerContact }}": {
"~isEmpty": true
}
},
{
"{{ context.event.message.payload.comment.commentVisibility }}": {
"~eq": "public"
}
},
{
"{{ context.event.message.payload.comment.commentType }}": {
"~eq": "comment"
}
}
]
}
]
}
]
}
}
```
This example demonstrates:
* Using context variables with dot notation to access nested properties
* Combining multiple logical operators
* Checking for specific team, status, and comment properties
* Using various comparison and special operators
## Platform events reference
Events are real-time notifications that your application can listen to when specific actions occur in the Thena platform.
Each event contains metadata about when and where it was triggered, along with relevant payload data.
### Event structure
All events in the Thena platform follow a consistent base structure:
```json theme={null}
{
"event_id": "evt_123abc456def",
"event_type": "ticket:created",
"timestamp": "2025-01-26T12:34:56Z",
"org_id": "org_789xyz",
"team_id": "team_123abc",
"actor": {
"id": "usr_456def",
"type": "user"
},
"payload": {
// Event-specific data
}
}
```
### Available events
#### Organization events
* `org:created` - When a new organization is created
* `org:updated` - When organization details are updated
* `org:deleted` - When an organization is deleted
* `org:settings:updated` - When organization settings are modified
#### Team events
* `team:created` - When a new team is created
* `team:updated` - When team details are updated
* `team:deleted` - When a team is deleted
* `team:member:added` - When a member is added to a team
* `team:member:removed` - When a member is removed from a team
#### User events
* `user:created` - When a new user is created
* `user:updated` - When user details are updated
* `user:deleted` - When a user is deleted
* `user:status:changed` - When a user's status changes
* `user:role:changed` - When a user's role is modified
* `user:login` - When a user logs in
* `user:logout` - When a user logs out
#### Ticket events
* `ticket:created` - When a new ticket is created
* `ticket:updated` - When ticket details are updated
* `ticket:deleted` - When a ticket is deleted
* `ticket:status:changed` - When a ticket's status changes
* `ticket:assigned` - When a ticket is assigned
* `ticket:unassigned` - When a ticket is unassigned
* `ticket:priority:changed` - When a ticket's priority changes
* `ticket:comment:added` - When a comment is added to a ticket
* `ticket:comment:updated` - When a comment is updated
* `ticket:comment:deleted` - When a comment is deleted
* `ticket:reaction:added` - When a reaction is added to a ticket
* `ticket:reaction:removed` - When a reaction is removed from a ticket
* `ticket:comment:reaction:added` - When a reaction is added to a comment
* `ticket:comment:reaction:removed` - When a reaction is removed from a comment
#### Account events
* `account:created` - When a new account is created
* `account:updated` - When account details are updated
* `account:deleted` - When an account is deleted
* `account:status:changed` - When an account's status changes
#### Customer events
* `customer:created` - When a new customer is created
* `customer:updated` - When customer details are updated
* `customer:deleted` - When a customer is deleted
* `customer:merged` - When customer records are merged
#### Custom field events
* `custom_field:created` - When a new custom field is created
* `custom_field:updated` - When a custom field is updated
* `custom_field:deleted` - When a custom field is deleted
* `custom_field:value:changed` - When a custom field value changes
#### Form events
* `form:created` - When a new form is created
* `form:updated` - When a form is updated
* `form:deleted` - When a form is deleted
* `form:submission:created` - When a form submission is received
* `form:submission:updated` - When a form submission is updated
#### SLA events
* `sla:created` - When a new SLA policy is created
* `sla:updated` - When an SLA policy is updated
* `sla:deleted` - When an SLA policy is deleted
* `sla:breach:warning` - When an SLA is about to breach
* `sla:breach:occurred` - When an SLA breach occurs
#### Workflow events
* `workflow:created` - When a new workflow is created
* `workflow:updated` - When a workflow is updated
* `workflow:deleted` - When a workflow is deleted
* `workflow:executed` - When a workflow starts execution
* `workflow:step:completed` - When a workflow step is completed
* `workflow:completed` - When a workflow execution completes
#### CSAT events
* `csat:survey:sent` - When a CSAT survey is sent
* `csat:response:received` - When a CSAT response is received
* `csat:feedback:updated` - When CSAT feedback is updated
#### App events
* `app:installed` - When an app is installed in a workspace
* `app:uninstalled` - When an app is uninstalled from a workspace
* `app:reinstalled` - When an app is reinstalled in a workspace
* `app:mentioned` - When an app is mentioned in a conversation
* `app:settings:updated` - When app settings are modified
#### Source integration events
##### Slack events
* `source:slack:message:received` - When a message is received from Slack
* `source:slack:thread:created` - When a new thread is created in Slack
* `source:slack:reaction:added` - When a reaction is added in Slack
##### MS Teams events
* `source:msteams:message:received` - When a message is received from MS Teams
* `source:msteams:thread:created` - When a new thread is created in MS Teams
* `source:msteams:reaction:added` - When a reaction is added in MS Teams
##### Email events
* `source:email:received` - When an email is received
* `source:email:bounced` - When an email bounces
* `source:email:replied` - When an email is replied to
##### Widget events
* `source:widget:opened` - When the widget is opened
* `source:widget:message:sent` - When a message is sent via widget
* `source:widget:closed` - When the widget is closed
### Event delivery and retries
Events are delivered in real-time with automatic retries on failure:
1. **First attempt**: Immediate delivery
2. **Second attempt**: After 3 minutes
3. **Final attempt**: After 5 minutes
Your webhook endpoint must respond within 3 seconds, or the request will time out and trigger the retry mechanism.
Design your event handlers to be idempotent as you may receive the same event multiple times during retries.
### Best practices for event consumers
#### Handling events reliably
* **Implement idempotency checks**: Store processed event IDs to avoid duplicate processing during retries
* **Use event timestamps**: Process events in chronological order using the `timestamp` field
* **Validate event data**: Always validate the event payload before processing to handle schema changes gracefully
#### Performance optimization
* **Process asynchronously**: Handle events in background workers to avoid blocking your main application
* **Batch related operations**: Group related database updates or API calls for better performance
* **Set reasonable timeouts**: Acknowledge webhooks within 3 seconds and process heavy tasks asynchronously
* **Queue long-running tasks**: If processing takes longer than 3 seconds, acknowledge the webhook and process in background
#### Error handling
* **Log processing errors**: Include event ID and type in error logs for easier debugging
* **Implement dead letter queues**: Store failed events separately for manual review
* **Monitor processing delays**: Set up alerts for event processing backlogs
#### Security
* **Validate webhook signatures**: Use the provided signature to verify event authenticity
* **Secure API keys**: Store webhook secret keys in secure environment variables
* **Filter by event types**: Subscribe only to events your application needs
#### Testing
* **Use the event simulator**: Test your handlers with simulated events before going live
* **Verify retry handling**: Test your idempotency logic with duplicate events
* **Monitor event processing**: Track success rates and processing times in production
Remember to version your event handlers to handle potential schema changes in future platform updates.
### Example event payloads
```json theme={null}
{
"event_id": "evt_abc123def456",
"event_type": "app:installed",
"timestamp": "2025-01-23T14:19:50.300Z",
"org_id": "EMMBB11RCN",
"team_id": "TNN77BB6JF",
"payload": {
"app_id": "ZWS0M7JJ10JR39FSFR7HER0189DW3",
"installed_by": "UKK7Z00C9Q",
"installation_id": "ZWS0M7JJ10JR39FSFR7HER0189DW3",
"bot_token": "UWW7M66C2Y",
"settings": {
"optional_settings": {},
"required_settings": {
"agent_studio_api_key": "Harsh"
}
}
},
"x_webhook_event": "app.installation"
}
```
```json theme={null}
{
"event_id": "evt_abc123def456",
"event_type": "ticket:created",
"timestamp": "2025-01-26T12:34:56Z",
"org_id": "org_789xyz",
"team_id": "team_123abc",
"actor": {
"id": "usr_456def",
"type": "user",
"email": "john@example.com"
},
"payload": {
"ticket": {
"id": "tkt_789xyz",
"title": "Need help with integration",
"description": "Having issues connecting with Slack",
"priority": "high",
"status": "open",
"source": "email",
"created_at": "2025-01-26T12:34:56Z",
"team_id": "team_123abc",
"customer": {
"id": "cust_123abc",
"email": "customer@example.com",
"name": "Jane Smith"
},
"assigned_to": null,
"tags": ["integration", "slack"],
"custom_fields": {
"department": "IT",
"category": "Integration"
}
}
}
}
```
```json theme={null}
{
"event_id": "evt_uvw012xyz345",
"event_type": "csat:response:received",
"timestamp": "2025-01-26T15:00:00Z",
"org_id": "org_789xyz",
"team_id": "team_123abc",
"actor": {
"id": "cust_123abc",
"type": "customer",
"email": "customer@example.com"
},
"payload": {
"survey": {
"id": "srv_456def",
"type": "ticket_resolution",
"sent_at": "2025-01-26T14:30:00Z"
},
"ticket": {
"id": "tkt_789xyz",
"title": "Need help with integration",
"resolved_by": {
"id": "usr_456def",
"name": "John Doe"
}
},
"response": {
"rating": 5,
"comment": "Great service, very helpful!",
"categories": ["knowledgeable", "quick_response"],
"submitted_at": "2025-01-26T15:00:00Z"
},
"metrics": {
"time_to_response": 1800,
"resolution_time": 3600
}
}
}
```
```json theme={null}
{
"event_id": "evt_def345ghi678",
"event_type": "source:msteams:message:received",
"timestamp": "2025-01-26T15:30:00Z",
"org_id": "org_789xyz",
"team_id": "team_123abc",
"actor": {
"id": "msteams_usr_789",
"type": "integration",
"platform": "msteams"
},
"payload": {
"message": {
"id": "msteams_msg_123",
"channel_id": "19:123456789@thread.tacv2",
"team_name": "Customer Success",
"user_id": "29:1abc2def3ghi",
"user_name": "Bob Wilson",
"text": "Need urgent assistance with API integration",
"timestamp": "2025-01-26T15:30:00Z",
"conversation_id": "19:123456789@thread.tacv2"
},
"converted_ticket": {
"id": "tkt_901xyz",
"source": "msteams",
"source_thread_id": "19:123456789@thread.tacv2",
"priority": "high"
},
"routing": {
"assigned_team": "team_123abc",
"routing_rule": "api_integration_issues"
}
}
}
```
# Overview
Source: https://docs.thena.ai/platform/core-concepts/workflows/overview
Understanding workflows and their implementation in the Thena Platform
Workflows are powerful automation tools in the Thena Platform that enable you to create, manage, and execute complex business processes across various applications. They serve as the foundation for automating repetitive tasks, ensuring consistency, and improving operational efficiency.
## Understanding workflows
A centralized system for automating business processes, managing event-driven operations, and orchestrating activities across the platform. Workflows serve as the backbone for all automation needs.
• Event-driven automation
• Complex conditional logic
• Multi-step processes
• Error handling and compensation
• Cross-app automation
• Custom activity support
• API-first architecture
Workflows form the automation engine of the Thena Platform, connecting various components like tickets, teams, accounts, and other platform features into cohesive automated processes.
### Core capabilities
• Event registration
• Trigger conditions
• Event filtering
• Real-time processing
• System activities
• Custom activities
• Activity chaining
• Error handling
• Compensation logic
## Standard components
All workflow components can be customized and extended based on your business requirements through the API.
### Events
| Type | Description | Examples |
| ------------------ | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| System Events | Platform-generated events | • Ticket comment updated (`ticket:comment:updated`): Triggered when a comment is updated, contains previous and new content • Ticket archived (`ticket:archived`): Triggered when a ticket is moved to archived status • Ticket escalated (`ticket:escalated`): Triggered when a ticket is escalated |
| Integration Events | Events from integrated apps | • Slack message (`slack:message`): Triggered when a message is sent in a channel • Slack channel created (`slack:channel:created`): Triggered when a new channel is created |
| Timer Events | Schedule-based events | • Daily report generation (`schedule:daily`) • Weekly cleanup (`schedule:weekly`) • Custom intervals (`cron:custom`) |
### Activities
| Type | Description | Examples |
| ---------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| System Activities | Built-in platform activities | • Create account (`accounts:create-account-platform`): Creates new account with name and domain • Sleep (`workflows:sleep-platform`): Pauses execution for specified duration • Update ticket (`tickets:update-ticket-platform`): Updates ticket information |
| Integration Activities | Activities for external services | • Slack postMessage (`slack.postMessage-YKGGEBQJ10VM380KWBSKVYP875AJQ-EUUV8TTGY1`): Sends messages to Slack channels |
| Data Activities | Data manipulation activities | • Get comment threads (`communications:get-comment-threads-platform`): Retrieves threaded comments for specific IDs |
## Associated components
Event processing system:
* Event registration
* Trigger conditions
* Event filtering
[Learn more about Events & Triggers →](/platform/core-concepts/workflows/events-triggers)
Activity management:
* System activities
* Custom activities
* Activity configuration
* Error handling
[Learn more about Activities →](/platform/core-concepts/workflows/activities)
Execution management:
* Workflow execution
* State management
* Monitoring
* Error handling
[Learn more about Execution →](/platform/core-concepts/workflows/execution)
### Workflow structure
```mermaid theme={null}
flowchart TD
subgraph Main[Workflow Process]
T((Event)) --> C{Conditions}
C -->|True| A1[Activity 1]
A1 --> A2[Activity 2]
A2 --> A3[Activity 3]
C -->|False| E((End))
end
A3 --> |On Error| F
subgraph Error[Error Handling]
F[Failure] --> CA3[Compensate A3]
CA3 --> CA2[Compensate A2]
CA2 --> CA1[Compensate A1]
end
style T fill:#4CAF50,stroke:#45a049,color:white
style E fill:#607D8B,stroke:#546E7A,color:white
style F fill:#FF5252,stroke:#D32F2F,color:white
style C fill:#2196F3,stroke:#1E88E5,color:white
```
The platform enforces workflow execution rules:
* Sequential activity execution
* Automatic compensation on failure
* Error handling at each step
* State management throughout execution
## API examples
### Create a workflow
```bash theme={null}
curl -X POST https://api.thena.ai/v1/workflows \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "High Priority Ticket Handler",
"trigger": {
"event": "ticket:created",
"conditions": {
"priority": "high"
}
},
"activities": [
{
"name": "notify_team",
"params": {
"channel": "slack",
"message": "New high priority ticket created"
}
},
{
"name": "assign_agent",
"params": {
"team": "support"
}
}
]
}'
```
### List workflows
```bash theme={null}
curl -X GET https://api.thena.ai/v1/workflows \
-H "Authorization: Bearer YOUR_API_KEY"
```
## Best practices
* Keep workflows focused and single-purpose
* Implement proper error handling
* Use appropriate compensation strategies
* Monitor workflow performance
* Follow least privilege principle
* Secure sensitive data
* Audit workflow executions
* Document workflow purposes
* Monitor execution metrics
* Regular performance reviews
* Update workflows as needed
## Next steps
Learn how to work with events and create triggers for your workflows.
Understand how to create and manage workflow activities.
# Getting started
Source: https://docs.thena.ai/platform/getting-started
Technical overview of Thena platform core concepts and integrations
Welcome to the Thena Platform technical documentation. This guide will help you understand the platform's architecture, core components, and integration capabilities. Whether you're building customer service applications, automating workflows, or integrating with external systems, you'll find comprehensive technical information about our APIs, data models, and best practices for implementation.
## Core concepts
Learn about organizational hierarchy, team management, and routing configurations for efficient workflow distribution.
Explore ticket lifecycle, status management, SLAs, and how tickets flow through your organization.
Configure custom fields to extend and customize entities according to your business needs.
Understand the fundamental unit of work in Thena - how tickets, tasks, and other work items are structured and managed.
Manage customer accounts, contacts, and related activities with comprehensive data models.
Build automated workflows with triggers, conditions, and actions to streamline operations.
## Integration sources
Thena provides robust integration capabilities with various communication channels and platforms:
Deep Slack integration for ticket management, notifications, and team collaboration with detailed event handling.
Email channel setup for ticket creation, updates, and customer communication with advanced configuration options.
# Account events
Source: https://docs.thena.ai/platform/platform-events/account-events
Platform events related to account management operations
Account events are published whenever accounts, customer contacts, or account-related entities (activities, notes, tasks, relationships) are created, updated, or deleted. These events are delivered through the platform events system.
## Developer quickstart
### Minimal handler (accounts only)
```javascript theme={null}
app.post("/webhook/platform-events", async (req, res) => {
const event = req.body;
if (!event?.eventId || !event?.eventType?.startsWith("account")) {
return res.status(200).send("OK");
}
res.status(200).send("OK");
switch (event.eventType) {
case "account:created":
await onAccountCreated(event.payload);
break;
case "account-custom_field_value:changed":
await onAccountCustomFieldChanged(event.payload);
break;
default:
break;
}
});
```
### Checklist
* Use `eventId` for idempotency to avoid duplicate updates in CRM tools.
* For relationship changes, rebuild affected hierarchies lazily.
* For bulk imports, implement queueing/backoff to protect downstream services.
## Core account events
### Account lifecycle
#### `account:created`
Triggered when a new account is created.
**Payload structure:**
```typescript theme={null}
{
account: {
id: string;
name: string;
domain?: string;
industry?: string;
size?: string;
status: string;
health: string;
classification: string;
metadata?: Record;
customFields?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
#### `account:updated`
Triggered when an account is updated.
**Payload structure:**
```typescript theme={null}
{
account: AccountData;
previousAccount: AccountData; // Previous state
}
```
#### `account:deleted`
Triggered when an account is deleted.
**Payload structure:**
```typescript theme={null}
{
previousAccount: AccountData; // The deleted account data
}
```
### Account attribute change events
These events are triggered when specific account attributes change:
#### `account-health:changed`
Triggered when an account's health status changes.
#### `account-status:changed`
Triggered when an account's status changes.
#### `account-classification:changed`
Triggered when an account's classification changes.
#### `account-industry:changed`
Triggered when an account's industry changes.
### Account custom field events
#### `account-custom_field_value:added`
Triggered when a custom field value is added to an account.
**Additional payload:**
```typescript theme={null}
{
changedCustomFields: Array<{
fieldUid: string;
newValues: string[];
changeType: "added";
}>;
}
```
#### `account-custom_field_value:removed`
Triggered when a custom field value is removed from an account.
**Additional payload:**
```typescript theme={null}
{
changedCustomFields: Array<{
fieldUid: string;
previousValues: string[];
changeType: "removed";
}>;
}
```
#### `account-custom_field_value:changed`
Triggered when a custom field value is changed on an account.
**Additional payload:**
```typescript theme={null}
{
changedCustomFields: Array<{
fieldUid: string;
previousValues: string[];
newValues: string[];
changeType: "updated";
}>;
}
```
## Customer contact events
### Customer contact lifecycle
#### `customer-contact:created`
Triggered when a new customer contact is created.
**Payload structure:**
```typescript theme={null}
{
customerContact: {
id: string;
firstName: string;
lastName: string;
email: string;
phone?: string;
jobTitle?: string;
type: string;
status: string;
accountId: string;
metadata?: Record;
customFields?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
#### `customer-contact:updated`
Triggered when a customer contact is updated.
**Payload structure:**
```typescript theme={null}
{
customerContact: CustomerContactData;
previousCustomerContact: CustomerContactData;
}
```
#### `customer-contact:deleted`
Triggered when a customer contact is deleted.
**Payload structure:**
```typescript theme={null}
{
previousCustomerContact: CustomerContactData;
}
```
#### `customer-contact:type:changed`
Triggered when a customer contact's type changes.
### Customer contact custom field events
#### `customer-contact:custom_field_value:added`
Triggered when a custom field value is added to a customer contact.
#### `customer-contact:custom_field_value:removed`
Triggered when a custom field value is removed from a customer contact.
#### `customer-contact:custom_field_value:changed`
Triggered when a custom field value is changed on a customer contact.
## Account relationship events
### Account relationship lifecycle
#### `account-relationship:created`
Triggered when a new account relationship is created.
**Payload structure:**
```typescript theme={null}
{
relationship: {
id: string;
parentAccountId: string;
childAccountId: string;
relationshipType: string;
metadata?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
#### `account-relationship:updated`
Triggered when an account relationship is updated.
**Payload structure:**
```typescript theme={null}
{
relationship: AccountRelationshipData;
previousRelationship: AccountRelationshipData;
}
```
#### `account-relationship:deleted`
Triggered when an account relationship is deleted.
**Payload structure:**
```typescript theme={null}
{
previousRelationship: AccountRelationshipData;
}
```
## Account activity events
### Account activity lifecycle
#### `account-activity:created`
Triggered when a new account activity is created.
**Payload structure:**
```typescript theme={null}
{
activity: {
id: string;
accountId: string;
title: string;
description?: string;
activityType: string;
status: string;
scheduledAt?: Date;
completedAt?: Date;
assignedUserId?: string;
metadata?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
#### `account-activity:updated`
Triggered when an account activity is updated.
**Payload structure:**
```typescript theme={null}
{
activity: AccountActivityData;
previousActivity: AccountActivityData;
}
```
#### `account-activity:deleted`
Triggered when an account activity is deleted.
**Payload structure:**
```typescript theme={null}
{
previousActivity: AccountActivityData;
}
```
### Account activity comment events
#### `account-activity:comment:created`
Triggered when a comment is added to an account activity.
#### `account-activity:comment:updated`
Triggered when a comment on an account activity is updated.
#### `account-activity:comment:deleted`
Triggered when a comment is deleted from an account activity.
## Account note events
### Account note lifecycle
#### `account-note:created`
Triggered when a new account note is created.
**Payload structure:**
```typescript theme={null}
{
note: {
id: string;
accountId: string;
title: string;
content: string;
visibility: string;
authorId: string;
metadata?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
#### `account-note:updated`
Triggered when an account note is updated.
**Payload structure:**
```typescript theme={null}
{
note: AccountNoteData;
previousNote: AccountNoteData;
}
```
#### `account-note:deleted`
Triggered when an account note is deleted.
**Payload structure:**
```typescript theme={null}
{
previousNote: AccountNoteData;
}
```
### Account note comment events
#### `account-note:comment:created`
Triggered when a comment is added to an account note.
#### `account-note:comment:updated`
Triggered when a comment on an account note is updated.
#### `account-note:comment:deleted`
Triggered when a comment is deleted from an account note.
## Account task events
### Account task lifecycle
#### `account-task:created`
Triggered when a new account task is created.
**Payload structure:**
```typescript theme={null}
{
task: {
id: string;
accountId: string;
title: string;
description?: string;
status: string;
priority: string;
dueDate?: Date;
assignedUserId?: string;
metadata?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
#### `account-task:updated`
Triggered when an account task is updated.
**Payload structure:**
```typescript theme={null}
{
task: AccountTaskData;
previousTask: AccountTaskData;
}
```
#### `account-task:deleted`
Triggered when an account task is deleted.
**Payload structure:**
```typescript theme={null}
{
previousTask: AccountTaskData;
}
```
### Account task comment events
#### `account-task:comment:created`
Triggered when a comment is added to an account task.
#### `account-task:comment:updated`
Triggered when a comment on an account task is updated.
#### `account-task:comment:deleted`
Triggered when a comment is deleted from an account task.
## Event structure
All account events follow the standard platform event structure:
```typescript theme={null}
interface AccountEventEnvelope {
eventId: string;
eventType: string; // One of the AccountEvents enum values
timestamp: string;
orgId: string;
actor: {
id: string;
type: string;
email: string;
};
payload: T;
}
```
## Integration examples
### Account health monitoring
```javascript theme={null}
function handleAccountHealthChange(payload) {
const { account, previousAccount } = payload;
if (account.health === "At Risk" && previousAccount.health !== "At Risk") {
// Account became at risk
triggerAccountReview(account.id);
notifyAccountManager(account.id);
} else if (
account.health === "Healthy" &&
previousAccount.health === "At Risk"
) {
// Account recovered
logAccountRecovery(account.id);
}
}
```
### Customer contact synchronization
```javascript theme={null}
function handleContactCreated(payload) {
const { customerContact } = payload;
// Sync to CRM
syncToCRM({
type: "contact",
id: customerContact.id,
email: customerContact.email,
name: `${customerContact.firstName} ${customerContact.lastName}`,
accountId: customerContact.accountId,
});
// Update marketing lists
updateMarketingSegmentation(customerContact);
}
```
### Task management integration
```javascript theme={null}
function handleTaskCreated(payload) {
const { task } = payload;
if (task.priority === "High" && task.dueDate) {
// Create calendar reminder
createCalendarEvent({
title: task.title,
date: task.dueDate,
assignee: task.assignedUserId,
});
}
// Update project management tool
syncToProjectManagement(task);
}
```
## Best practices
1. **Account hierarchy**: Use relationship events to maintain account hierarchies in external systems
2. **Data consistency**: Process events in order using the timestamp to maintain data consistency
3. **Bulk operations**: Be prepared for high-volume events during bulk imports or updates
4. **Custom fields**: Monitor custom field events for account scoring and segmentation
5. **Activity tracking**: Use activity events to build comprehensive account timelines
## Event frequency
Account events have moderate frequency but can spike during:
* Bulk imports
* Account health reassessments
* Custom field updates
* Integration synchronizations
Consider implementing appropriate rate limiting and queuing strategies for downstream processing.
# Comment events
Source: https://docs.thena.ai/platform/platform-events/comment-events
Platform events related to comments and reactions across different entities
Comment events are published when comments are created, updated, or deleted on various entities throughout the platform. Comments can be attached to tickets, account tasks, account activities, and account notes. These events are delivered through the platform events system.
## Developer quickstart
### Minimal handler (comments only)
```javascript theme={null}
app.post("/webhook/platform-events", async (req, res) => {
const event = req.body;
if (!event?.eventId || !event?.eventType?.includes(":comment:")) {
return res.status(200).send("OK");
}
res.status(200).send("OK");
switch (event.eventType) {
case "ticket:comment:created":
await onTicketCommentCreated(event.payload);
break;
case "account-task:comment:updated":
await onAccountTaskCommentUpdated(event.payload);
break;
default:
break;
}
});
```
### Checklist
* For public email-sourced comments, expect selective content fields (privacy).
* For large payloads, detect truncation markers and fetch full content via API.
* Handle mentions downstream; see `user:mentioned` events for notifications.
## Event types by entity
Comments can be associated with different entity types, and the event names reflect this:
### Ticket comments
#### `ticket:comment:created`
Triggered when a comment is added to a ticket.
#### `ticket:comment:updated`
Triggered when a comment on a ticket is updated.
#### `ticket:comment:deleted`
Triggered when a comment is deleted from a ticket.
### Account task comments
#### `account-task:comment:created`
Triggered when a comment is added to an account task.
#### `account-task:comment:updated`
Triggered when a comment on an account task is updated.
#### `account-task:comment:deleted`
Triggered when a comment is deleted from an account task.
### Account activity comments
#### `account-activity:comment:created`
Triggered when a comment is added to an account activity.
#### `account-activity:comment:updated`
Triggered when a comment on an account activity is updated.
#### `account-activity:comment:deleted`
Triggered when a comment is deleted from an account activity.
### Account note comments
#### `account-note:comment:created`
Triggered when a comment is added to an account note.
#### `account-note:comment:updated`
Triggered when a comment on an account note is updated.
#### `account-note:comment:deleted`
Triggered when a comment is deleted from an account note.
## Comment event structure
### Standard comment events (created/deleted)
```typescript theme={null}
interface CommentEventPayload {
comment: {
id: string;
content?: string; // May be omitted for certain visibility rules
contentHtml?: string;
contentMarkdown?: string;
contentJson?: string;
commentType: string;
parentCommentId?: string;
teamId?: string; // For ticket comments
accountId?: string; // For account-related comments
metadata: Record;
customerContact?: {
id: string;
email: string;
avatarUrl: string;
};
author: {
id: string;
name: string;
email: string;
avatarUrl: string;
};
attachments: Array<{
id: string;
name: string;
url: string;
size: number;
contentType: string;
createdAt: Date;
updatedAt: Date;
deletedAt?: Date;
}>;
commentVisibility: string;
createdAt: Date;
updatedAt: Date;
deletedAt?: Date;
shouldSendEmail?: boolean; // Only for created events
createdWithTicket?: boolean; // Only for created events
};
// Entity-specific payload additions
ticket?: {
id: string;
title: string;
description?: string;
requestorEmail?: string;
submitterEmail?: string;
source: string;
isProactive?: boolean;
proactiveChannels?: string[];
};
accountTask?: {
id: string;
title: string;
};
accountActivity?: {
id: string;
};
accountNote?: {
id: string;
};
}
```
### Comment update events
For update events, the payload structure includes both previous and updated states:
```typescript theme={null}
interface CommentUpdateEventPayload {
comment: {
previous: CommentData; // Previous state of the comment
updated: CommentData; // Updated state of the comment
};
// Same entity-specific additions as above
}
```
## Reaction events
Comments can have reactions (emoji responses) which generate their own events:
### `ticket:comment:reaction:added`
Triggered when a reaction is added to a ticket comment.
### `ticket:comment:reaction:removed`
Triggered when a reaction is removed from a ticket comment.
**Reaction event payload:**
```typescript theme={null}
interface ReactionEventPayload {
reaction: {
name: string; // Emoji name (e.g., "thumbs_up", "heart")
author: {
id: string;
name: string;
avatarUrl: string;
email: string;
};
metadata: Record;
};
comment: {
id: string;
};
}
```
## Content filtering and privacy
### Email source content protection
For comments on tickets with email source and public visibility, certain content fields may be omitted from the platform payload for privacy reasons:
* `content`
* `contentMarkdown`
* `contentJson`
Only `contentHtml` is included in these cases.
### Large content truncation
Comments with large content (approaching the 256KB platform limit) will have their content fields truncated and replaced with "Payload too large. Use API instead".
## Event structure
All comment events follow the standard platform event structure:
```typescript theme={null}
interface CommentEventEnvelope {
eventId: string;
eventType: string; // e.g., "ticket:comment:created"
timestamp: string;
orgId: string;
actor: {
id: string;
type: string;
email: string;
};
payload:
| CommentEventPayload
| CommentUpdateEventPayload
| ReactionEventPayload;
}
```
## Special metadata
### Mention metadata
When a comment contains user mentions, the metadata may include:
```typescript theme={null}
{
mentions: {
users: Array<{
id: string;
email: string;
name: string;
}>;
}
ignoreSelf: boolean; // Indicates if the author should be excluded from notifications
}
```
### Integration metadata
Comments created through integrations may include additional metadata:
```typescript theme={null}
{
source: "slack" | "email" | "api" | "web";
integrationId?: string;
externalId?: string;
syncStatus?: string;
}
```
## Integration examples
### Comment notification system
```javascript theme={null}
function handleCommentCreated(payload) {
const { comment, ticket, accountTask } = payload;
// Determine notification recipients
const recipients = [];
if (ticket) {
// Notify ticket participants
recipients.push(ticket.assignedAgent);
recipients.push(ticket.customer);
} else if (accountTask) {
// Notify task assignee and watchers
recipients.push(accountTask.assignedUser);
recipients.push(...accountTask.watchers);
}
// Send notifications
recipients.forEach((recipient) => {
if (comment.shouldSendEmail) {
sendEmailNotification(recipient, comment, { ticket, accountTask });
}
sendInAppNotification(recipient, comment);
});
}
```
### Comment synchronization
```javascript theme={null}
function handleCommentUpdate(payload) {
const { comment } = payload;
const { previous, updated } = comment;
// Sync to external systems
if (previous.content !== updated.content) {
// Content changed
syncContentToExternalSystems(updated);
// Log edit history
logCommentEdit({
commentId: updated.id,
previousContent: previous.content,
newContent: updated.content,
editedBy: payload.actor.id,
editedAt: updated.updatedAt,
});
}
// Update search index
updateSearchIndex(updated);
}
```
### Reaction aggregation
```javascript theme={null}
function handleReactionEvent(payload) {
const { reaction, comment } = payload;
// Update reaction counts
updateReactionCounts(comment.id, reaction.name, payload.eventType);
// Notify comment author (if not self-reaction)
if (reaction.author.id !== comment.author.id) {
notifyCommentAuthor(comment.author.id, {
type: "reaction",
reaction: reaction.name,
reactorName: reaction.author.name,
commentId: comment.id,
});
}
// Track engagement metrics
trackEngagement({
type: "reaction",
reactionType: reaction.name,
commentId: comment.id,
userId: reaction.author.id,
});
}
```
### Mention processing
```javascript theme={null}
function handleCommentWithMentions(payload) {
const { comment, metadata } = payload;
if (metadata?.mentions?.users) {
metadata.mentions.users.forEach((mentionedUser) => {
// Skip self-mentions if ignoreSelf is true
if (metadata.ignoreSelf && mentionedUser.id === comment.author.id) {
return;
}
// Send mention notification
sendMentionNotification(mentionedUser, {
comment,
mentionedBy: comment.author,
context:
payload.ticket || payload.accountTask || payload.accountActivity,
});
// Track mention metrics
trackMention({
mentionedUserId: mentionedUser.id,
mentionedByUserId: comment.author.id,
commentId: comment.id,
});
});
}
}
```
## Comment threading
Comments support threading through the `parentCommentId` field:
```javascript theme={null}
function handleThreadedComment(payload) {
const { comment } = payload;
if (comment.parentCommentId) {
// This is a reply to another comment
const parentComment = getCommentById(comment.parentCommentId);
// Notify parent comment author
notifyCommentAuthor(parentComment.author.id, {
type: "reply",
replyId: comment.id,
replyContent: comment.content,
repliedBy: comment.author,
});
// Update thread metrics
updateThreadMetrics(comment.parentCommentId);
}
}
```
## Attachment handling
Comments can include file attachments:
```javascript theme={null}
function handleCommentAttachments(payload) {
const { comment } = payload;
comment.attachments?.forEach((attachment) => {
// Process attachment
processAttachment({
id: attachment.id,
name: attachment.name,
size: attachment.size,
contentType: attachment.contentType,
url: attachment.url,
commentId: comment.id,
});
// Virus scan for new attachments
if (payload.eventType.includes("created")) {
scheduleVirusScan(attachment.id);
}
// Update storage metrics
updateStorageMetrics(attachment.size);
});
}
```
## Best practices
1. **Content safety**: Always sanitize comment content before displaying
2. **Mention handling**: Respect user notification preferences for mentions
3. **Threading**: Maintain proper parent-child relationships for threaded comments
4. **Privacy**: Be aware of content filtering for email sources
5. **Performance**: Consider comment volume for high-traffic tickets/entities
6. **Attachments**: Implement proper security scanning for file attachments
## Event frequency
Comment events can be high-frequency, especially for:
* Active support tickets
* Collaborative account management tasks
* Popular discussion threads
Consider implementing:
* Rate limiting for notification systems
* Batching for non-critical integrations
* Proper indexing for search systems
* Efficient storage for comment history
# Custom object events
Source: https://docs.thena.ai/platform/platform-events/custom-object-events
Platform events related to custom object operations and lifecycle
Custom object events are published when custom objects are created, updated, or deleted within the platform. These events enable integrations to stay synchronized with custom business data and workflows. These events are delivered through the platform events system.
## Developer quickstart
### Minimal handler (custom objects only)
```javascript theme={null}
app.post("/webhook/platform-events", async (req, res) => {
const event = req.body;
if (!event?.eventId || !event?.eventType?.startsWith("custom-object:")) {
return res.status(200).send("OK");
}
res.status(200).send("OK");
const [, , objectType, action] = event.eventType.split(":");
switch (action) {
case "created":
await onCustomObjectCreated(objectType, event.eventData);
break;
case "updated":
await onCustomObjectUpdated(objectType, event.eventData);
break;
case "deleted":
await onCustomObjectDeleted(objectType, event.eventData);
break;
default:
break;
}
});
```
### Checklist
* Validate `eventData` against your configured schema per organization.
* Track field-level changes for analytics and workflow triggers.
* Use idempotency when syncing to CRMs/ERPs to avoid duplicates.
## Event structure
Custom object events follow a flexible structure to accommodate various custom object types:
```typescript theme={null}
interface CustomObjectEventEnvelope {
eventId: string;
eventType: string; // Custom object specific event type
timestamp: number; // Unix timestamp
orgId: string;
actor: {
id: string;
type: string;
email: string;
};
eventData: unknown; // Flexible payload based on custom object type
metadata?: Record;
}
```
## Event publishing
Custom object events are published through a dedicated platform publisher service with the following characteristics:
### Event attributes
All custom object events include these platform event attributes:
* `event_name` - The specific event type
* `event_id` - Unique event identifier (or generated UUID if not provided)
* `event_timestamp` - Unix timestamp of the event
* `context_user_id` - ID of the user who triggered the event
* `context_user_type` - Type of the user (AGENT, CUSTOMER, etc.)
* `context_organization_id` - Organization ID
### Ordering
Where applicable, events are ordered per organization or configured scope.
## Event types
Since custom objects are flexible by nature, the specific event types depend on the custom object definitions. However, common patterns include:
### Lifecycle events
#### `custom-object:{type}:created`
Triggered when a new custom object is created.
**Example for a "Deal" custom object:**
```typescript theme={null}
{
eventType: "custom-object:deal:created",
eventData: {
deal: {
id: "deal-123",
name: "Enterprise Software License",
value: 50000,
stage: "proposal",
accountId: "account-456",
ownerId: "user-789",
customFields: {
"expected_close_date": "2024-03-15",
"deal_source": "inbound"
},
createdAt: "2024-01-15T10:30:00Z",
updatedAt: "2024-01-15T10:30:00Z"
}
}
}
```
#### `custom-object:{type}:updated`
Triggered when a custom object is updated.
**Example payload:**
```typescript theme={null}
{
eventType: "custom-object:deal:updated",
eventData: {
deal: {
// Updated deal data
},
previousDeal: {
// Previous state of the deal
},
changedFields: ["stage", "value"]
}
}
```
#### `custom-object:{type}:deleted`
Triggered when a custom object is deleted.
**Example payload:**
```typescript theme={null}
{
eventType: "custom-object:deal:deleted",
eventData: {
previousDeal: {
// Deleted deal data
}
}
}
```
### Field-specific events
#### `custom-object:{type}:field:{field_name}:changed`
Triggered when specific important fields change.
**Example for stage changes:**
```typescript theme={null}
{
eventType: "custom-object:deal:field:stage:changed",
eventData: {
deal: {
// Current deal data
},
fieldChange: {
fieldName: "stage",
previousValue: "proposal",
newValue: "negotiation",
changedAt: "2024-01-16T14:20:00Z"
}
}
}
```
## Integration examples
### CRM synchronization
```javascript theme={null}
function handleCustomObjectEvent(payload) {
const { eventType, eventData } = payload;
// Parse event type to determine object type and action
const [, , objectType, action] = eventType.split(":");
switch (action) {
case "created":
syncToExternalCRM("create", objectType, eventData);
break;
case "updated":
syncToExternalCRM("update", objectType, eventData);
trackFieldChanges(objectType, eventData.changedFields);
break;
case "deleted":
syncToExternalCRM("delete", objectType, eventData);
break;
default:
// Handle custom field-specific events
if (action === "field") {
handleFieldSpecificEvent(objectType, eventData);
}
}
}
function syncToExternalCRM(action, objectType, data) {
switch (objectType) {
case "deal":
syncDealToCRM(action, data.deal || data.previousDeal);
break;
case "contact":
syncContactToCRM(action, data.contact || data.previousContact);
break;
case "opportunity":
syncOpportunityToCRM(
action,
data.opportunity || data.previousOpportunity,
);
break;
default:
// Generic custom object sync
syncGenericObjectToCRM(action, objectType, data);
}
}
```
### Workflow automation
```javascript theme={null}
function handleDealStageChange(payload) {
const { eventData } = payload;
const { deal, fieldChange } = eventData;
if (fieldChange?.fieldName === "stage") {
switch (fieldChange.newValue) {
case "closed_won":
// Deal won workflow
triggerDealWonWorkflow(deal);
createSuccessStoryTask(deal);
notifySuccessTeam(deal);
break;
case "closed_lost":
// Deal lost workflow
triggerDealLostWorkflow(deal);
scheduleFollowUpActivity(deal);
updateLossReasonAnalytics(deal);
break;
case "negotiation":
// Entering negotiation
assignLegalReview(deal);
prepareContractTemplates(deal);
break;
default:
// Standard stage progression
updateDealPipeline(deal);
notifyDealOwner(deal, fieldChange);
}
}
}
function triggerDealWonWorkflow(deal) {
// Create onboarding tasks
createTask({
title: `Onboard new customer: ${deal.name}`,
accountId: deal.accountId,
assignedTo: deal.ownerId,
dueDate: addDays(new Date(), 7),
priority: "high",
});
// Update account status
updateAccount(deal.accountId, {
status: "customer",
lastDealWonDate: new Date(),
totalDealValue: incrementDealValue(deal.value),
});
// Send congratulations
sendCongratulationsEmail(deal.ownerId, deal);
}
```
### Analytics and reporting
```javascript theme={null}
function trackCustomObjectMetrics(payload) {
const { eventType, eventData, actor } = payload;
const [, , objectType, action] = eventType.split(":");
// Track object lifecycle metrics
trackEvent(`custom_object_${action}`, {
objectType,
organizationId: payload.orgId,
userId: actor.id,
timestamp: payload.timestamp,
});
// Object-specific metrics
if (objectType === "deal") {
trackDealMetrics(action, eventData);
} else if (objectType === "project") {
trackProjectMetrics(action, eventData);
}
// User activity metrics
updateUserActivityScore(actor.id, {
action: `${objectType}_${action}`,
weight: getActionWeight(action),
timestamp: payload.timestamp,
});
}
function trackDealMetrics(action, eventData) {
const deal = eventData.deal || eventData.previousDeal;
switch (action) {
case "created":
trackMetric("deal_created", {
value: deal.value,
stage: deal.stage,
source: deal.customFields?.deal_source,
});
break;
case "updated":
if (eventData.changedFields?.includes("stage")) {
trackMetric("deal_stage_changed", {
fromStage: eventData.previousDeal?.stage,
toStage: deal.stage,
value: deal.value,
});
}
break;
case "deleted":
trackMetric("deal_deleted", {
stage: deal.stage,
value: deal.value,
reason: eventData.deletionReason,
});
break;
}
}
```
### Real-time notifications
```javascript theme={null}
function handleCustomObjectNotifications(payload) {
const { eventType, eventData, actor } = payload;
const [, , objectType] = eventType.split(":");
// Get object watchers/subscribers
const watchers = getObjectWatchers(objectType, getObjectId(eventData));
// Create notifications for each watcher
watchers.forEach((watcher) => {
if (watcher.id !== actor.id) {
// Don't notify the actor
const notification = createObjectNotification(
watcher,
eventType,
eventData,
actor,
);
sendRealtimeNotification(watcher.id, notification);
}
});
// Send team notifications for important events
if (isImportantEvent(eventType, eventData)) {
const team = getObjectTeam(objectType, getObjectId(eventData));
sendTeamNotification(team, eventType, eventData, actor);
}
}
function isImportantEvent(eventType, eventData) {
// Define what constitutes an important event
if (eventType.includes("deleted")) return true;
if (eventType.includes("field:stage:changed")) return true;
if (eventType.includes("created") && eventData.deal?.value > 10000)
return true;
return false;
}
```
## Event processing considerations
### Payload flexibility
Since custom objects can have varying structures, event processing should be robust:
```javascript theme={null}
function processCustomObjectEvent(payload) {
try {
// Validate basic event structure
validateEventStructure(payload);
// Extract object type from event type
const objectType = extractObjectType(payload.eventType);
// Get object schema for validation
const schema = getObjectSchema(objectType, payload.orgId);
if (schema) {
// Validate against schema
validateEventData(payload.eventData, schema);
}
// Process event
processEvent(payload);
} catch (error) {
handleEventProcessingError(payload, error);
}
}
function validateEventData(eventData, schema) {
// Validate required fields
schema.requiredFields?.forEach((field) => {
if (!hasField(eventData, field)) {
throw new Error(`Missing required field: ${field}`);
}
});
// Validate field types
schema.fields?.forEach((fieldDef) => {
if (hasField(eventData, fieldDef.name)) {
validateFieldType(getField(eventData, fieldDef.name), fieldDef);
}
});
}
```
### Error handling
```javascript theme={null}
function handleCustomObjectEventError(payload, error) {
switch (error.type) {
case "INVALID_OBJECT_TYPE":
logError("Unknown custom object type", { payload, error });
// Don't retry for invalid object types
break;
case "SCHEMA_VALIDATION_ERROR":
logError("Event data validation failed", { payload, error });
// May indicate schema changes, alert admin
alertSchemaValidationFailure(payload, error);
break;
case "EXTERNAL_SERVICE_ERROR":
// Retry for external service errors
scheduleRetry(payload, { delay: calculateBackoff() });
break;
default:
logError("Unexpected custom object event error", { payload, error });
scheduleRetry(payload);
}
}
```
## Best practices
1. **Schema validation**: Always validate custom object data against defined schemas
2. **Event versioning**: Consider versioning for custom object event schemas
3. **Error handling**: Implement robust error handling for flexible data structures
4. **Performance**: Monitor processing times for complex custom objects
5. **Security**: Validate permissions for custom object access
6. **Documentation**: Document custom object event schemas for each organization
## Configuration
Custom object events can be configured per organization:
```javascript theme={null}
// Example configuration
{
"customObjectEvents": {
"enabled": true,
"objectTypes": {
"deal": {
"events": ["created", "updated", "deleted", "stage_changed"],
"fieldEvents": ["stage", "value", "owner"],
"notificationSettings": {
"highValueThreshold": 10000,
"criticalFields": ["stage", "close_date"]
}
},
"project": {
"events": ["created", "updated", "status_changed"],
"fieldEvents": ["status", "budget", "deadline"],
"notificationSettings": {
"criticalFields": ["status", "deadline"]
}
}
}
}
}
```
This configuration allows organizations to customize which events are published and how they're processed, providing flexibility while maintaining consistency in the event structure.
# Organization events
Source: https://docs.thena.ai/platform/platform-events/organization-events
Platform events related to organization-level operations
Organization events are published when organization-level changes occur, such as organization creation, updates, or member management. These events are delivered through the platform events system.
## Developer quickstart
### Minimal handler (organization only)
```javascript theme={null}
app.post("/webhook/platform-events", async (req, res) => {
const event = req.body;
if (!event?.eventId || !event?.eventType?.startsWith("organization:")) {
return res.status(200).send("OK");
}
res.status(200).send("OK");
switch (event.eventType) {
case "organization:created":
await onOrganizationCreated(event.payload.organization);
break;
case "organization:member-joined":
await onMemberJoined(event.payload.organization, event.payload.user);
break;
default:
break;
}
});
```
### Checklist
* Enforce idempotency with `eventId` to avoid creating duplicate resources.
* For plan/domain changes, re-sync dependent services (billing, DNS, SSO).
* For member events, respect role/permission propagation delays.
## Event types
### Organization lifecycle events
#### `organization:created`
Triggered when a new organization is created.
**Payload structure:**
```typescript theme={null}
{
organization: {
id: string;
name: string;
domain?: string;
subdomain: string;
plan: string;
status: string;
settings?: Record;
metadata?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
**Event context:**
* Triggered during organization setup process
* May be part of a larger user onboarding flow
* Often followed by initial configuration events
#### `organization:updated`
Triggered when an organization's details are updated.
**Payload structure:**
```typescript theme={null}
{
organization: OrganizationData;
previousOrganization: OrganizationData; // Previous state before update
}
```
**Common update scenarios:**
* Plan changes (free to paid, plan upgrades/downgrades)
* Organization name or domain changes
* Settings updates (timezone, locale, etc.)
* Metadata modifications
#### `organization:deleted`
Triggered when an organization is deleted.
**Payload structure:**
```typescript theme={null}
{
previousOrganization: OrganizationData; // The deleted organization data
}
```
**Important notes:**
* This is a destructive operation
* All associated data (tickets, accounts, users) are also affected
* Consider implementing appropriate cleanup logic
### Organization membership events
#### `organization:member-joined`
Triggered when a user joins an organization.
**Payload structure:**
```typescript theme={null}
{
organization: {
id: string;
name: string;
domain?: string;
subdomain: string;
plan: string;
status: string;
settings?: Record;
createdAt: Date;
updatedAt: Date;
};
user: {
id: string;
email: string;
name: string;
userType: string;
status: string;
roles?: string[];
teams?: Array<{
id: string;
name: string;
}>;
metadata?: Record;
createdAt: Date;
updatedAt: Date;
};
}
```
**Common scenarios:**
* New employee onboarding
* Contractor or external user access
* User role changes that affect organization membership
* Bulk user imports
## Event structure
All organization events follow the standard platform event structure:
```typescript theme={null}
interface OrganizationEventEnvelope {
eventId: string;
eventType: string; // One of the OrganizationEvents enum values
timestamp: string;
orgId: string;
actor: {
id: string;
type: string; // Usually "ADMIN" or "OWNER"
email: string;
};
payload: T;
}
```
## Special considerations
### Organization creation flow
When an organization is created, it typically triggers a cascade of events:
1. `organization:created` - The organization itself is created
2. `organization:member-joined` - The organization creator becomes the first member
3. Additional setup events (teams, initial configuration)
### Actor context
For organization events, the `actor` field represents:
* **Creation**: The user creating the organization (may be a system user for automated processes)
* **Updates**: The admin or owner making changes
* **Member join**: The user being added or the admin adding them
* **Deletion**: The admin or owner performing the deletion
## Integration examples
### Organization provisioning
```javascript theme={null}
function handleOrganizationCreated(payload) {
const { organization } = payload;
// Provision external resources
provisionSlackWorkspace(organization);
createBillingAccount(organization);
setupInitialTeams(organization);
// Send welcome emails
sendOrganizationWelcomeEmail(organization);
// Initialize analytics tracking
trackOrganizationCreated({
orgId: organization.id,
plan: organization.plan,
domain: organization.domain,
});
}
```
### Member onboarding
```javascript theme={null}
function handleMemberJoined(payload) {
const { organization, user } = payload;
// Send welcome email with organization context
sendUserWelcomeEmail(user, organization);
// Provision user in external systems
createSlackUser(user, organization);
updateCRMContact(user, organization);
// Set up user permissions
assignDefaultPermissions(user, organization);
// Track user growth metrics
trackUserJoined({
orgId: organization.id,
userId: user.id,
userType: user.userType,
});
}
```
### Plan change handling
```javascript theme={null}
function handleOrganizationUpdated(payload) {
const { organization, previousOrganization } = payload;
// Check if plan changed
if (organization.plan !== previousOrganization.plan) {
handlePlanChange({
orgId: organization.id,
previousPlan: previousOrganization.plan,
newPlan: organization.plan,
});
// Update billing
updateBillingPlan(organization);
// Adjust feature access
updateFeatureAccess(organization);
}
// Check for domain changes
if (organization.domain !== previousOrganization.domain) {
updateDNSRecords(organization);
updateSSLCertificates(organization);
}
}
```
### Organization cleanup
```javascript theme={null}
function handleOrganizationDeleted(payload) {
const { previousOrganization } = payload;
// Clean up external resources
deprovisionSlackWorkspace(previousOrganization);
cancelBillingSubscription(previousOrganization);
// Archive data in external systems
archiveAnalyticsData(previousOrganization.id);
archiveCRMData(previousOrganization.id);
// Send confirmation emails to admins
sendDeletionConfirmation(previousOrganization);
// Update metrics
trackOrganizationDeleted({
orgId: previousOrganization.id,
plan: previousOrganization.plan,
memberCount: previousOrganization.memberCount,
});
}
```
## Security considerations
### Sensitive data
Organization events may contain sensitive information:
* Billing details in plan changes
* Domain information that could reveal company structure
* User email addresses and roles
### Access control
* Ensure subscribers have appropriate permissions
* Consider scoping subscriptions based on sensitivity levels
* Implement proper authentication for webhook endpoints
## Monitoring and alerting
### Key metrics to track
1. **Organization growth**: Track creation and deletion rates
2. **Plan changes**: Monitor upgrade/downgrade patterns
3. **Member growth**: Track user addition rates per organization
4. **Churn indicators**: Monitor organizations with recent plan downgrades
### Alert scenarios
```javascript theme={null}
// High-value organization deletion
if (
organization.plan === "Enterprise" &&
eventType === "organization:deleted"
) {
alertSalesTeam(organization);
}
// Rapid member growth (potential abuse)
if (memberJoinedCount > 100 && timeWindow < "1 hour") {
alertSecurityTeam(organization);
}
// Plan downgrade after recent upgrade
if (planChangePattern === "upgrade_then_downgrade" && timeWindow < "7 days") {
alertCustomerSuccess(organization);
}
```
## Best practices
1. **Event ordering**: Process organization events before related entity events
2. **Idempotency**: Use `eventId` to prevent duplicate processing
3. **Cascading effects**: Be prepared for organization events to trigger additional events
4. **Data consistency**: Ensure external systems reflect organization state changes
5. **Performance**: Organization events can trigger expensive operations, consider async processing
## Error handling
Common error scenarios and handling strategies:
```javascript theme={null}
function handleOrganizationEventError(event, error) {
switch (error.type) {
case "EXTERNAL_SERVICE_UNAVAILABLE":
// Retry with exponential backoff
scheduleRetry(event, { delay: calculateBackoff(event.retryCount) });
break;
case "INVALID_ORGANIZATION_STATE":
// Log and alert, may require manual intervention
logCriticalError(event, error);
alertOperationsTeam(event, error);
break;
case "RATE_LIMIT_EXCEEDED":
// Queue for later processing
queueForLaterProcessing(event, { delay: "5 minutes" });
break;
default:
// Generic error handling
logError(event, error);
if (event.retryCount < MAX_RETRIES) {
scheduleRetry(event);
} else {
alertDevelopmentTeam(event, error);
}
}
}
```
## Event frequency
Organization events are typically low-frequency events:
* **Creation**: Usually during initial setup or business growth
* **Updates**: Periodic configuration changes, plan modifications
* **Member joins**: Varies by organization size and growth phase
* **Deletion**: Rare, but critical for cleanup processes
However, during bulk operations or migrations, these events can spike significantly.
# Platform events overview
Source: https://docs.thena.ai/platform/platform-events/overview
Complete documentation of all Platform events published by the Thena Platform
The Thena platform publishes various events through the platform events system to enable real-time integrations and webhooks. This documentation provides a comprehensive overview of all available events, their payloads, and metadata.
## Event categories
The platform publishes events across several categories:
1. **[Ticket events](/platform/platform-events/ticket-events)** - Events related to ticket lifecycle and operations
2. **[Account events](/platform/platform-events/account-events)** - Events for account management operations
3. **[Organization events](/platform/platform-events/organization-events)** - Organization-level events
4. **[Comment events](/platform/platform-events/comment-events)** - Comment and communication events
5. **[User events](/platform/platform-events/user-events)** - User mention and interaction events
6. **[Custom object events](/platform/platform-events/custom-object-events)** - Custom object lifecycle events
## Developer quickstart
1. Expose a secure HTTPS endpoint that accepts JSON POST requests.
2. Parse the incoming body as a platform event and validate required fields.
3. Enforce idempotency using `eventId` to avoid duplicate processing.
4. Route by `eventType` and process asynchronously; respond 2xx quickly.
5. Log minimally and filter only the events you need in your subscription.
### Minimal webhook handler (Node.js/Express)
```javascript theme={null}
import express from "express";
const app = express();
app.use(express.json());
// Simple in-memory idempotency guard (replace with Redis/DB in production)
const seenEventIds = new Set();
app.post("/webhook/platform-events", async (req, res) => {
const event = req.body;
// Basic validation
if (!event?.eventId || !event?.eventType || !event?.payload) {
return res.status(400).send("Invalid event");
}
// Idempotency
if (seenEventIds.has(event.eventId)) {
return res.status(200).send("OK");
}
seenEventIds.add(event.eventId);
// Acknowledge early
res.status(200).send("OK");
// Async processing by type
switch (event.eventType) {
case "ticket:created":
await handleTicketCreated(event.payload);
break;
case "ticket:comment:added":
await handleCommentAdded(event.payload);
break;
default:
// ignore unhandled events
break;
}
});
app.listen(3000, () => console.log("listening on :3000"));
```
### Local testing
* Use a tunneling tool (for example, `ngrok`) to expose your local server:
```bash theme={null}
ngrok http 3000
```
* Replay a sample event to your endpoint:
```bash theme={null}
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"eventId": "evt_123",
"eventType": "ticket:created",
"timestamp": "2024-01-01T10:00:00Z",
"orgId": "org_123",
"actor": {"id": "user_1", "type": "AGENT", "email": "agent@acme.com"},
"payload": {"ticket": {"id": "t_1", "ticketId": "AC-1", "title": "Example"}}
}' \
https://YOUR-NGROK-URL/webhook/platform-events
```
### Production checklist
* Return 2xx quickly; process heavy work asynchronously.
* Enforce idempotency with a persistent store (for example, Redis) using `eventId`.
* Validate payload shape per event page before using fields.
* Implement retries/backoff in your processors; handle duplicate deliveries.
* Log `eventId`, `eventType`, and `orgId` for traceability.
## Common event structure
All platform events follow a common structure with the following properties:
### Base event schema
```typescript theme={null}
interface PlatformEvent {
eventId: string; // Unique identifier for the event
eventType: string; // Event type identifier (e.g., "ticket:created")
timestamp: string; // Event timestamp (ISO string or Unix timestamp)
orgId: string; // Organization ID
actor: {
// User who triggered the event
id: string;
type: string; // User type (e.g., "AGENT", "CUSTOMER")
email: string;
};
payload: T; // Event-specific payload
metadata?: Record; // Optional metadata
}
```
### Event attributes
All platform events include the following attributes for filtering and routing:
* `event_name` - The event type (e.g., "ticket:created")
* `event_id` - Unique event identifier
* `event_timestamp` - Event timestamp
* `context_user_id` - ID of the user who triggered the event
* `context_user_type` - Type of the user (AGENT, CUSTOMER, etc.)
* `context_organization_id` - Organization ID
## Event delivery
### Message size limits
All events respect the platform payload size limit of 256KB. If an event payload exceeds this limit, the system automatically truncates large content fields (such as comment content) and replaces them with "Payload too large. Use API instead".
### Retry logic
Failed events are automatically retried with exponential backoff. The system distinguishes between:
* **Transient errors**: Network issues, timeouts - automatically retried
* **Permanent errors**: Not found errors, validation errors - not retried
### Ordering
Where applicable, the platform ensures per-organization ordering of events.
## Integration examples
### Webhook integration
```javascript theme={null}
// Example webhook handler for ticket events
app.post("/webhook/platform-events", (req, res) => {
const event = req.body;
switch (event.eventType) {
case "ticket:created":
handleTicketCreated(event.payload);
break;
case "ticket:comment:added":
handleCommentAdded(event.payload);
break;
// Handle other events...
}
res.status(200).send("OK");
});
```
### Event filtering
Use subscription filters to select only the events you need:
```json theme={null}
{
"event_name": ["ticket:created", "ticket:updated"],
"context_organization_id": ["org-123"]
}
```
## Next steps
* Explore specific event types in the navigation menu
* Set up platform subscriptions for your integration needs
## Support
For questions about our platform events or integration support, please contact our developer support team.
# Ticket events
Source: https://docs.thena.ai/platform/platform-events/ticket-events
Platform events related to ticket lifecycle and operations
Ticket events are published whenever tickets are created, updated, or undergo state changes. These events are delivered through the platform events system.
## Developer quickstart
### Minimal handler (tickets only)
```javascript theme={null}
app.post("/webhook/platform-events", async (req, res) => {
const event = req.body;
if (!event?.eventId || !event?.eventType?.startsWith("ticket:")) {
return res.status(200).send("OK"); // ignore non-ticket events
}
res.status(200).send("OK"); // ack early
switch (event.eventType) {
case "ticket:created":
await onTicketCreated(event.payload);
break;
case "ticket:status:changed":
await onTicketStatusChanged(event.payload);
break;
default:
break;
}
});
```
### Checklist
* Use `eventId` for idempotency; store processed IDs for 24–48h.
* Fetch full ticket via API if you detect truncated fields.
* Treat `ticket:updated` as a meta-event and listen for the derived specific events.
* Process asynchronously; do not block the HTTP response.
## Event types
### Core lifecycle events
#### `ticket:created`
Triggered when a new ticket is created.
**Payload structure:**
```typescript theme={null}
interface TicketCreatedPayload {
ticket: {
id: string;
ticketId: string;
title: string;
description: string;
customerContactFirstName: string;
customerContactLastName: string;
customerContactEmail: string;
priorityId: string;
statusId: string;
statusName: string;
priorityName: string;
sentimentId: string;
sentimentName: string;
source: string;
createdAt: Date;
teamId: string;
teamName: string;
teamIdentifier: string;
subTeamId?: string;
subTeamName?: string;
subTeamIdentifier?: string;
isEscalated: boolean;
customer: {
id: string;
email: string;
name: string;
};
assignedTo: string | null;
assignedAgent: {
id: string;
email: string;
name: string;
} | null;
tags?: string[];
isArchived: boolean;
customFields?: Record;
metadata?: Record;
aiGeneratedTitle?: string;
aiGeneratedSummary?: string;
lastCustomerComment?: Date;
lastVendorComment?: Date;
proactiveChannels?: string[];
isProactive?: boolean;
};
comment?: {
id: string;
content: string;
contentHtml: string;
contentJson: string;
customerContactId: string;
createdAt: Date;
};
}
```
#### `ticket:updated`
Triggered when a ticket is updated. This is a general update event that may trigger additional specific events.
**Payload structure:**
Same as `ticket:created`, but includes:
```typescript theme={null}
{
ticket: TicketPayload;
previousTicket: TicketPayload; // Previous state of the ticket
}
```
#### `ticket:deleted`
Triggered when a ticket is deleted.
**Payload structure:**
```typescript theme={null}
{
previousTicket: TicketPayload; // The deleted ticket data
}
```
#### `ticket:archived`
Triggered when a ticket is archived.
#### `ticket:unarchived`
Triggered when a ticket is unarchived.
### State change events
These events are automatically triggered when specific fields change during a `ticket:updated` event:
#### `ticket:status:changed`
Triggered when the ticket status changes.
#### `ticket:priority:changed`
Triggered when the ticket priority changes.
#### `ticket:assigned`
Triggered when the ticket is assigned to a different agent.
#### `ticket:type:changed`
Triggered when the ticket type changes.
#### `ticket:sentiment:changed`
Triggered when the ticket sentiment changes.
#### `ticket:escalated`
Triggered when a ticket is escalated.
### Custom field events
#### `ticket:custom_field_value:added`
Triggered when a custom field value is added to a ticket.
**Additional payload:**
```typescript theme={null}
{
changedCustomFields: Array<{
fieldUid: string;
newValues: string[];
changeType: "added";
}>;
}
```
#### `ticket:custom_field_value:removed`
Triggered when a custom field value is removed from a ticket.
**Additional payload:**
```typescript theme={null}
{
changedCustomFields: Array<{
fieldUid: string;
previousValues: string[];
changeType: "removed";
}>;
}
```
#### `ticket:custom_field_value:changed`
Triggered when a custom field value is changed on a ticket.
**Additional payload:**
```typescript theme={null}
{
changedCustomFields: Array<{
fieldUid: string;
previousValues: string[];
newValues: string[];
addedValues?: string[];
removedValues?: string[];
changeType: "updated";
}>;
}
```
### Tag events
#### `ticket:tag:updated`
Triggered when tags are added to or removed from a ticket.
### Migration events
#### `ticket:migrated`
Triggered when a ticket is migrated to a different team.
**Additional payload:**
```typescript theme={null}
{
migration: {
source: string;
sourceId: string;
[key: string]: unknown;
};
}
```
### Comment events
#### `ticket:comment:added`
Triggered when a comment is added to a ticket.
#### `ticket:comment:updated`
Triggered when a comment on a ticket is updated.
#### `ticket:comment:deleted`
Triggered when a comment is deleted from a ticket.
#### `ticket:comment:reaction:added`
Triggered when a reaction is added to a ticket comment.
#### `ticket:comment:reaction:removed`
Triggered when a reaction is removed from a ticket comment.
### CSAT events
#### `ticket:csat:sent`
Triggered when a CSAT survey is sent for a ticket.
**Additional payload:**
```typescript theme={null}
{
csat: {
id: string;
feedbackType: string;
surveyConfig?: any;
deliveryChannel?: string;
ruleName: string;
sentAt?: Date;
requestorEmail: string;
};
}
```
#### `ticket:csat:received`
Triggered when a CSAT survey response is received.
**Additional payload:**
```typescript theme={null}
{
csat: {
id: string;
feedbackType: string;
deliveryChannel?: string;
ruleName: string;
completedAt?: Date;
requestorEmail: string;
ratingValue?: number;
hasComment?: boolean;
commentText?: string;
};
}
```
### SLA events
#### `ticket:sla:breached`
Triggered when an SLA breach is detected on a ticket.
#### `ticket:sla:breach_warning`
Triggered when an SLA breach warning is detected on a ticket.
## Event processing
### Automatic event generation
When a `ticket:updated` event is processed, the system automatically analyzes the changes and generates appropriate specific events:
1. **Status change detection**: Compares `ticket.status.uid` with `previousTicket.status.uid`
2. **Priority change detection**: Compares `ticket.priority.uid` with `previousTicket.priority.uid`
3. **Assignment change detection**: Compares `ticket.assignedAgent.uid` with `previousTicket.assignedAgent.uid`
4. **Custom field change detection**: Analyzes custom field values for additions, removals, and changes
5. **Tag change detection**: Compares tag sets between current and previous ticket states
### Message size management
Ticket events can contain large amounts of data. The system automatically:
* Monitors payload size (256KB limit)
* Truncates large content fields when necessary
* Replaces truncated content with "Payload too large. Use API instead"
* Logs truncation events for monitoring
## Integration examples
### Handling ticket creation
```javascript theme={null}
function handleTicketCreated(payload) {
const { ticket } = payload;
// Send welcome email to customer
if (ticket.source === "EMAIL") {
sendWelcomeEmail(ticket.customer.email, ticket.ticketId);
}
// Notify assigned agent
if (ticket.assignedAgent) {
notifyAgent(ticket.assignedAgent.id, ticket);
}
// Log in CRM
updateCRM({
customerId: ticket.customer.id,
ticketId: ticket.id,
priority: ticket.priorityName,
});
}
```
### Handling status changes
```javascript theme={null}
function handleStatusChange(payload) {
const { ticket, previousTicket } = payload;
if (
ticket.statusName === "Closed" &&
previousTicket.statusName !== "Closed"
) {
// Ticket was closed
triggerCSATSurvey(ticket);
updateMetrics("ticket_closed", ticket.teamId);
}
}
```
### Custom field monitoring
```javascript theme={null}
function handleCustomFieldChange(payload) {
const { changedCustomFields } = payload;
changedCustomFields.forEach((change) => {
if (change.fieldUid === "severity-field-uid") {
if (change.newValues.includes("Critical")) {
escalateToManagement(payload.ticket);
}
}
});
}
```
## Best practices
1. **Event filtering**: Use platform message attributes to filter for specific event types
2. **Idempotency**: Use `eventId` to ensure idempotent processing
3. **Error handling**: Implement proper retry logic for failed event processing
4. **Large payloads**: For truncated payloads, use the API to fetch complete data
5. **Performance**: Process events asynchronously to avoid blocking ticket operations
## Event frequency
Ticket events are high-frequency events, especially in active organizations. Consider:
* Implementing rate limiting for downstream systems
* Using batch processing for non-critical integrations
* Filtering events at the platform subscription level to reduce unnecessary processing
# User events
Source: https://docs.thena.ai/platform/platform-events/user-events
Platform events related to user interactions and mentions
User events are published when users are mentioned in comments or when user-related activities occur. These events enable real-time notification systems and user engagement tracking. These events are delivered through the platform events system.
## Developer quickstart
### Minimal handler (mentions only)
```javascript theme={null}
app.post("/webhook/platform-events", async (req, res) => {
const event = req.body;
if (!event?.eventId || event?.eventType !== "user:mentioned") {
return res.status(200).send("OK");
}
res.status(200).send("OK");
await onUserMentioned(event.payload.user, event.metadata);
});
```
### Checklist
* Respect user notification preferences and quiet hours when sending alerts.
* Enrich notifications with context (linked entity, comment excerpt) for UX.
* De-duplicate multiple mentions in the same comment before notifying.
## Event types
### `user:mentioned`
Triggered when a user is mentioned in a comment across any entity type (tickets, account tasks, activities, or notes).
**Payload structure:**
```typescript theme={null}
interface UserMentionEventPayload {
user: {
id: string;
email: string;
name: string;
userType: string;
status: string;
organization: {
id: string;
name: string | null;
};
teams: Array<{
id: string;
name: string;
}>;
metadata?: Record;
};
}
```
**Event metadata:**
```typescript theme={null}
interface MentionMetadata {
mentionedUserId: string;
mentionedByUserId: string;
entityId: string;
entityType: string; // "TICKET", "ACCOUNT_TASK", "ACCOUNT_ACTIVITY", "ACCOUNT_NOTE"
commentId: string;
timestamp: string;
organizationId: string;
teamId?: string; // Present for ticket mentions
}
```
## Event structure
User events follow the standard platform event structure:
```typescript theme={null}
interface UserEventEnvelope {
eventId: string;
eventType: string; // "user:mentioned"
timestamp: string;
orgId: string;
actor: {
id: string;
type: string;
email: string;
};
payload: UserMentionEventPayload;
metadata: MentionMetadata;
}
```
## Mention context
### Entity types
Users can be mentioned in comments on different entity types:
#### Ticket mentions
* **Entity type**: `TICKET`
* **Additional context**: `teamId` is included in metadata
* **Common use cases**: Agent collaboration, customer escalation, knowledge sharing
#### Account task mentions
* **Entity type**: `ACCOUNT_TASK`
* **Context**: Task collaboration and assignment discussions
* **Common use cases**: Task handoffs, status updates, collaboration requests
#### Account activity mentions
* **Entity type**: `ACCOUNT_ACTIVITY`
* **Context**: Activity discussions and follow-ups
* **Common use cases**: Activity reviews, next steps planning
#### Account note mentions
* **Entity type**: `ACCOUNT_NOTE`
* **Context**: Note discussions and clarifications
* **Common use cases**: Knowledge sharing, note reviews, clarifications
## Event processing
### Mention detection
The system automatically detects mentions in comment content using patterns like:
* `@username`
* `@user.email`
* `@"Full Name"`
### Deduplication
Multiple users can be mentioned in a single comment, generating separate events for each mentioned user.
### Self-mention filtering
Users mentioning themselves may be filtered out based on the `ignoreSelf` flag in the comment metadata.
## Integration examples
### Real-time notification system
```javascript theme={null}
function handleUserMention(payload) {
const { user, metadata } = payload;
// Get mention context
const context = getMentionContext(metadata.entityType, metadata.entityId);
// Create notification
const notification = {
userId: user.id,
type: 'mention',
title: `You were mentioned by ${payload.actor.name}`,
message: createMentionMessage(context, payload.actor),
actionUrl: generateActionUrl(metadata),
createdAt: new Date(payload.timestamp)
};
// Send real-time notification
sendRealtimeNotification(user.id, notification);
// Send email if user preferences allow
if (await shouldSendEmailNotification(user.id, 'mention')) {
sendMentionEmail(user, notification, context);
}
// Send mobile push notification
if (await shouldSendPushNotification(user.id, 'mention')) {
sendPushNotification(user.id, notification);
}
}
```
### Mention analytics
```javascript theme={null}
function trackMentionMetrics(payload) {
const { metadata } = payload;
// Track mention frequency
trackEvent("user_mentioned", {
mentionedUserId: metadata.mentionedUserId,
mentionedByUserId: metadata.mentionedByUserId,
entityType: metadata.entityType,
organizationId: metadata.organizationId,
teamId: metadata.teamId,
timestamp: metadata.timestamp,
});
// Update user engagement scores
updateUserEngagement(metadata.mentionedUserId, {
type: "mention_received",
weight: 1,
});
updateUserEngagement(metadata.mentionedByUserId, {
type: "mention_sent",
weight: 0.5,
});
// Track cross-team collaboration
if (metadata.teamId) {
trackCrossTeamCollaboration(
metadata.mentionedByUserId,
metadata.mentionedUserId,
metadata.teamId,
);
}
}
```
### Smart notification routing
```javascript theme={null}
function routeMentionNotification(payload) {
const { user, metadata } = payload;
// Check user availability
const availability = await getUserAvailability(user.id);
if (!availability.isAvailable) {
// User is out of office or busy
if (metadata.entityType === 'TICKET' && isPriorityTicket(metadata.entityId)) {
// Route to team lead for high-priority tickets
const teamLead = await getTeamLead(metadata.teamId);
notifyTeamLead(teamLead, payload, 'user_unavailable');
} else {
// Queue notification for later
queueNotificationForLater(user.id, payload, availability.returnTime);
}
} else {
// User is available, send normal notification
sendImmediateNotification(user.id, payload);
}
}
```
### Mention context enhancement
```javascript theme={null}
function enhanceMentionContext(payload) {
const { metadata } = payload;
// Get rich context based on entity type
let context = {};
switch (metadata.entityType) {
case 'TICKET':
context = await getTicketContext(metadata.entityId);
break;
case 'ACCOUNT_TASK':
context = await getAccountTaskContext(metadata.entityId);
break;
case 'ACCOUNT_ACTIVITY':
context = await getAccountActivityContext(metadata.entityId);
break;
case 'ACCOUNT_NOTE':
context = await getAccountNoteContext(metadata.entityId);
break;
}
// Get comment context
const comment = await getComment(metadata.commentId);
// Create enhanced notification
const enhancedPayload = {
...payload,
context: {
entity: context,
comment: {
id: comment.id,
excerpt: truncateText(comment.content, 100),
author: comment.author
},
urgency: calculateUrgency(context, comment),
suggestedActions: generateSuggestedActions(context, comment)
}
};
return enhancedPayload;
}
```
### User preference management
```javascript theme={null}
function handleMentionWithPreferences(payload) {
const { user } = payload;
// Get user notification preferences
const preferences = await getUserNotificationPreferences(user.id);
// Check if mentions are enabled
if (!preferences.mentions.enabled) {
logSkippedNotification(user.id, 'mentions_disabled');
return;
}
// Check time-based preferences
if (preferences.mentions.quietHours) {
const now = new Date();
const userTimezone = user.timezone || 'UTC';
if (isInQuietHours(now, preferences.mentions.quietHours, userTimezone)) {
queueNotificationForLater(user.id, payload,
getNextActiveTime(preferences.mentions.quietHours, userTimezone));
return;
}
}
// Check entity-specific preferences
const entityPrefs = preferences.mentions.entityTypes[payload.metadata.entityType];
if (!entityPrefs?.enabled) {
logSkippedNotification(user.id, `mentions_disabled_for_${payload.metadata.entityType}`);
return;
}
// Process mention with user preferences applied
processMentionWithPreferences(payload, preferences);
}
```
## Mention patterns and best practices
### Mention syntax support
The platform supports various mention formats:
```javascript theme={null}
// Standard username mention
@john.smith
// Email-based mention
@john.smith@company.com
// Display name mention (with quotes for spaces)
@"John Smith"
// Department/role mention (if supported)
@support-team
```
### Integration best practices
1. **Deduplication**: Handle duplicate mentions gracefully
2. **Rate limiting**: Implement rate limiting for mention notifications
3. **Context preservation**: Maintain mention context for better user experience
4. **Privacy**: Respect user privacy settings and availability status
5. **Fallback handling**: Handle cases where mentioned users don't exist
### Performance considerations
```javascript theme={null}
function optimizeMentionProcessing(payload) {
// Batch process multiple mentions from same comment
const mentionBatch = groupMentionsByComment(payload.metadata.commentId);
// Pre-load user data for all mentions
const userIds = mentionBatch.map(m => m.mentionedUserId);
const users = await batchLoadUsers(userIds);
// Pre-load preferences
const preferences = await batchLoadPreferences(userIds);
// Process all mentions with cached data
mentionBatch.forEach(mention => {
processMentionWithCache(mention, users, preferences);
});
}
```
## Error handling
### Common error scenarios
```javascript theme={null}
function handleMentionErrors(payload, error) {
switch (error.type) {
case "USER_NOT_FOUND":
// Mentioned user doesn't exist
logInvalidMention(payload.metadata);
notifyCommentAuthor("invalid_mention", payload.metadata);
break;
case "USER_DEACTIVATED":
// Mentioned user is deactivated
logDeactivatedUserMention(payload.metadata);
// Don't send notification
break;
case "NOTIFICATION_SERVICE_DOWN":
// Notification service unavailable
queueMentionForRetry(payload);
break;
case "RATE_LIMIT_EXCEEDED":
// Too many notifications for user
queueMentionForLater(payload);
break;
default:
logMentionError(payload, error);
alertDevelopmentTeam("mention_processing_error", { payload, error });
}
}
```
## Event frequency and scaling
### Frequency characteristics
User mention events can vary greatly in frequency:
* **Low-volume organizations**: Few mentions per day
* **High-collaboration teams**: Hundreds of mentions per hour
* **Customer support teams**: Spike during business hours
### Scaling considerations
1. **Batch processing**: Group mentions for efficient processing
2. **Async processing**: Handle mention notifications asynchronously
3. **Caching**: Cache user data and preferences for better performance
4. **Rate limiting**: Prevent notification spam
5. **Monitoring**: Track mention processing latency and success rates
## Future enhancements
Potential future enhancements to user events:
* **Smart mentions**: AI-suggested mentions based on context
* **Group mentions**: Mention entire teams or roles
* **Mention threads**: Track mention conversation threads
* **Mention analytics**: Advanced analytics for collaboration patterns
* **Custom mention actions**: Configurable actions when mentioned