Portal Community
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

Configuration

Connection

FieldRequiredDescription
botTokenRequiredBot 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

FieldRequiredDescription
channelRequiredChannel ID containing the target message. Must be a channel the bot has access to.
messageTsRequiredTimestamp 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 CodeCause
message_not_foundNo message exists with the given messageTs in the specified channel. The message may have been deleted, or the timestamp is incorrect.
channel_not_foundThe specified channel does not exist or is not accessible to the bot token.
not_authedThe bot token is invalid or has been revoked.
VAL_MISSING_CHANNELThe channel field is empty or not provided.
VAL_MISSING_TSThe 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.

FieldTypeDescription
permalinkstringFull HTTPS URL to the message, e.g. https://myworkspace.slack.com/archives/C04X9ABCDEF/p1716700412087200. Share this URL in tickets, emails, and databases.
channelstringChannel ID of the message.
messageTsstringTimestamp of the message the permalink points to.
statusstring"ok" on success.
errorCodestringEmpty on success.
payloadobjectFull raw Slack API response.

Error Port

Fires when the message or channel cannot be found, or the bot lacks channel access.

FieldTypeDescription
statusstring"error"
errorCodestringSlack error code, e.g. message_not_found, channel_not_found.
payloadobjectFull 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

FieldExpressionNotes
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 AreaRecommendation
Permalink availabilityPermalinks 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 accessPermalink 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 sendAlways 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 limitschat.getPermalink is Tier 3 (50+ req/min). In batch workflows linking many messages, this rate is generous but monitor for burst scenarios.
Credential storageStore the Bot Token in BizFirst Credentials Manager. The same token used to post the message can retrieve its permalink.
Error port handlingConnect 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.