Cross-system linking: Permalinks are the primary mechanism for linking external systems (Jira, email, databases, dashboards) to specific Slack messages. The URL format is https://<workspace>.slack.com/archives/<channel>/p<ts-without-dot> and is bookmarkable and shareable with any workspace member who has access to the channel.
When to Use
- Ticket cross-referencing: After posting an incident alert to Slack, retrieve its permalink and store it on the associated Jira issue, PagerDuty incident, or ServiceNow ticket so responders can quickly navigate to the full Slack conversation.
- Audit trail records: When a workflow captures an approval decision via
message/sendAndWait, store the permalink to the approval message in an audit log database as proof of the decision context and chain of evidence.
- Email escalation context: Include the Slack message permalink in escalation emails so recipients who prefer email can click directly to the originating Slack discussion without having to search for it.
- Status dashboard links: A operations dashboard displays links to recent Slack messages related to ongoing incidents, deployments, or system events, enabling one-click navigation to the full context.
- Notification threading: Include the permalink to an original announcement in follow-up notifications sent via email or other channels, creating a traceable reference back to the source discussion.
Configuration
Connection
| Field | Required | Description |
botToken | Required | Bot Token in xoxb-... format. Must have chat:write scope (the same scope used to send messages). The bot must have access to the channel containing the message. Store in BizFirst Credentials Manager. |
Operation
| Field | Required | Description |
channel | Required | Channel ID containing the target message. Must be a channel the bot has access to. |
messageTs | Required | Timestamp of the message to link (e.g. 1716700412.087200). This is the messageTs returned by the original message/send node. |
Sample Configuration
{
"resource": "message",
"operation": "getPermalink",
"botToken": "{{ $credentials.slackBotToken }}",
"channel": "{{ $output.postAlert.channel }}",
"messageTs": "{{ $output.postAlert.messageTs }}"
}
Validation Errors
| Error Code | Cause |
message_not_found | No message exists with the given messageTs in the specified channel. The message may have been deleted, or the timestamp is incorrect. |
channel_not_found | The specified channel does not exist or is not accessible to the bot token. |
not_authed | The bot token is invalid or has been revoked. |
VAL_MISSING_CHANNEL | The channel field is empty or not provided. |
VAL_MISSING_TS | The messageTs field is empty or not provided. |
Output
Success Port
Fires with the permanent URL to the message. The permalink is stable as long as the message is not deleted.
| Field | Type | Description |
permalink | string | Full HTTPS URL to the message, e.g. https://myworkspace.slack.com/archives/C04X9ABCDEF/p1716700412087200. Share this URL in tickets, emails, and databases. |
channel | string | Channel ID of the message. |
messageTs | string | Timestamp of the message the permalink points to. |
status | string | "ok" on success. |
errorCode | string | Empty on success. |
payload | object | Full raw Slack API response. |
Error Port
Fires when the message or channel cannot be found, or the bot lacks channel access.
| Field | Type | Description |
status | string | "error" |
errorCode | string | Slack error code, e.g. message_not_found, channel_not_found. |
payload | object | Full raw Slack error response. |
Sample Output
{
"permalink": "https://acmecorp.slack.com/archives/C04X9ABCDEF/p1716700412087200",
"channel": "C04X9ABCDEF",
"messageTs": "1716700412.087200",
"status": "ok",
"errorCode": "",
"payload": {
"ok": true,
"channel": "C04X9ABCDEF",
"permalink": "https://acmecorp.slack.com/archives/C04X9ABCDEF/p1716700412087200"
}
}
Expression Reference
| Field | Expression | Notes |
| Permalink URL | {{ $output.getLink.permalink }} | The full HTTPS URL. Embed in Jira fields, email bodies, or database records for cross-system navigation. |
| Channel reference | {{ $output.getLink.channel }} | Resolved channel ID. Record alongside the permalink in audit logs. |
| Message timestamp | {{ $output.getLink.messageTs }} | The message's unique timestamp. Use in audit records alongside the permalink. |
| Operation status | {{ $output.getLink.status }} | "ok" on success. Verify before writing the permalink to external systems. |
| Error code | {{ $output.getLink.errorCode }} | Non-empty if the permalink could not be retrieved — log for monitoring. |
| Formatted link text | <{{ $output.getLink.permalink }}|View in Slack> | Use this mrkdwn syntax in a follow-up message/send to include a clickable link to the original message. |
Node Policies & GuardRails
| Policy Area | Recommendation |
| Permalink availability | Permalinks become invalid if the message is deleted. For long-term audit records where message deletion is possible, store both the permalink and the message text content at record creation time. |
| Private channel access | Permalink URLs for private channel messages require the recipient to be a member of that private channel to view the linked message. When embedding permalinks in external tickets (Jira, ServiceNow), ensure the stakeholders who will use the links are channel members. |
| Chain after send | Always retrieve the permalink immediately after message/send in the same workflow run, using the messageTs from the send's success port. Attempting to retrieve permalinks from messages posted hours earlier requires storing the messageTs persistently. |
| Rate limits | chat.getPermalink is Tier 3 (50+ req/min). In batch workflows linking many messages, this rate is generous but monitor for burst scenarios. |
| Credential storage | Store the Bot Token in BizFirst Credentials Manager. The same token used to post the message can retrieve its permalink. |
| Error port handling | Connect the error port. If a message was deleted between send and permalink retrieval, the error port fires with message_not_found. Handle this gracefully in audit workflows. |
Examples
Jira Issue Cross-Reference
// Step 1 — Post incident alert to Slack (message/send node named "postAlert")
{
"resource": "message",
"operation": "send",
"botToken": "{{ $credentials.slackBotToken }}",
"channel": "C04INCIDENTS",
"text": "*P1 Incident:* {{ $input.serviceName }} is down"
}
// Step 2 — Get the permalink (message/getPermalink node named "getLink")
{
"resource": "message",
"operation": "getPermalink",
"botToken": "{{ $credentials.slackBotToken }}",
"channel": "{{ $output.postAlert.channel }}",
"messageTs": "{{ $output.postAlert.messageTs }}"
}
// Step 3 — Update the Jira issue with the Slack permalink (Jira node)
{
"resource": "issue",
"operation": "update",
"issueKey": "{{ $input.jiraIssueKey }}",
"fields": {
"comment": {
"body": "Slack incident discussion: {{ $output.getLink.permalink }}"
}
}
}
A three-step incident intake workflow: post to Slack, retrieve the permalink, then update the corresponding Jira issue with a direct link to the Slack discussion. Responders can navigate between Jira and Slack with a single click.
Approval Audit Record
{
"resource": "message",
"operation": "getPermalink",
"botToken": "{{ $credentials.slackBotToken }}",
"channel": "{{ $output.waitApproval.channel }}",
"messageTs": "{{ $output.waitApproval.messageTs }}"
}
After an approval decision is captured via message/sendAndWait, this node retrieves the permalink to the approval message. The permalink is then written to an audit database record alongside the approver ID, decision, and timestamp — providing an immutable link back to the original Slack approval context for compliance audits.
Email Escalation with Slack Context
{
"resource": "message",
"operation": "getPermalink",
"botToken": "{{ $credentials.slackBotToken }}",
"channel": "C04INCIDENTS",
"messageTs": "{{ $vars.incidentMessageTs }}"
}
When an incident timeout escalation fires (e.g. no acknowledgement within 15 minutes), this node fetches the permalink to the original Slack incident message. The permalink is then included in the escalation email body so the executive on-call can click directly to the full incident discussion in Slack without needing to search for it.