Skip to main content

Customizing Assistant branding in Slack

R
Written by Riya Sebastian

Currently, the Atomicwork Assistant branding requires a manifest file from the Atomicwork team that you then need to upload to your Slack workspace.

A manifest file is a configuration file written in YAML or JSON that defines the structure of a Slack app.

What You’ll Need

  • A Slack workspace with app creation privileges

  • A Slack account

  • Your app’s manifest file (YAML or JSON)

Step-by-Step Instructions

  1. Go to https://<domain>.atomicwork.com/settings/apps/SLACK. If there is an app that is already connected, please disconnect the app.

  2. Generate the manifest using API.

    curl --location 'https://<domain>.atomicwork.com/api/channel/slack/customise' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer <bearer token>' \
    --data '{
        "app_name": "<Custom App Name>",
        "long_description": "<Description, should be atleast 170 characters.>",
        "type": "SLACK",
        "short_description": "<Should be atleast 20 characters>"
    }'
    


    curl --location 'https://<domain>.atomicwork.com/api/v1/channel/slack/customise' \
    --header 'Content-Type: application/json' \
    --header 'X-Api-Key:Access Key' \
    --data '{
        "app_name": "<Custom App Name>",
        "long_description": "<Description, should be atleast 170 characters.>",
        "type": "SLACK",
        "short_description": "<Should be atleast 20 characters>"
    }'
  3. Copy the response from key “manifest” and unescape string.

    Note: Easiest way to do it is using a command line utility called JQ. Copy the
    response, and run the command -
    pbpaste | jq -r '.manifest' | sed 's/\\n/\n/g' | jq '.’

    {"manifest":"{     "display_information": {         "name": "Test Abhinay",         "description": "Test short description",         "background_color": "#676f78",         "long_description": "Test Test custom slack app for testing the atom slack custom branding apps and credentials. This may need an update in the branding also as well. Test custom slack app for testing the atom slack custom branding apps and credentials. This may need an update in the branding also as well."     },     "features": {         "app_home": {             "home_tab_enabled": true,             "messages_tab_enabled": true,             "messages_tab_read_only_enabled": false         },         "bot_user": {             "display_name": "Test Abhinay",             "always_online": true         },         "shortcuts": [             {                 "name": "Save as Verified Answer",                 "type": "message",                 "callback_id": "atom_add_verified_answer",                 "description": "Saves message response as Verified Answer"             }         ]     },     "oauth_config": {         "redirect_urls": [             "https://esd.atomicwork.com"         ],         "scopes": {             "bot": [                 "app_mentions:read",                 "channels:history",                 "channels:join",                 "channels:manage",                 "channels:read",                 "chat:write",                 "chat:write.customize",                 "chat:write.public",                 "commands",                 "conversations.connect:read",                 "dnd:read",                 "emoji:read",                 "files:write",                 "groups:history",                 "groups:read",                 "groups:write",                 "im:history",                 "im:read",                 "im:write",                 "links:write",                 "metadata.message:read",                 "mpim:write",                 "reactions:read",                 "reactions:write",                 "team.preferences:read",                 "team:read",                 "users.profile:read",                 "users:read",                 "users:read.email",                 "files:read"             ]         }     },     "settings": {         "event_subscriptions": {             "request_url": "https://bot.atomicwork.com/api/v1/slack/events/custom-app",             "bot_events": [                 "app_home_opened",                 "app_mention",                 "message.channels",                 "message.groups",                 "message.im",                 "reaction_added",                 "reaction_removed"             ]         },         "interactivity": {             "is_enabled": true,             "request_url": "https://bot.atomicwork.com/api/v1/slack/form/interactive/custom-app",             "message_menu_options_url": "https://bot.atomicwork.com/api/v1/slack/form/select-data-sources/custom-app"         },         "org_deploy_enabled": false,         "socket_mode_enabled": false,         "token_rotation_enabled": false     } }"}
  4. From that copy the entire response from manifest key. It should look like:

    {"display_information":  {"name": "Test Abhinay",
         "description": "Test short description",
         "background_color": "#676f78",
         "long_description": "Test Test custom slack app for testing the atom slack custom branding apps and credentials. This may need an update in the branding also as well. Test custom slack app for testing the atom slack custom branding apps and credentials. This may need an update in the branding also as well."
    },
     "features": {"app_home": {"home_tab_enabled": true,
          "messages_tab_enabled": true,
           "messages_tab_read_only_enabled": false}, "bot_user": {"display_name": "Test Abhinay",
            "always_online": true},
         "shortcuts": [{ "name": "Save as Verified Answer", "type": "message", "callback_id": "atom_add_verified_answer",
                "description": "Saves message response as Verified Answer"
            }]},
     "oauth_config": {"redirect_urls": [
            "https://esd.atomicwork.com"],
         "scopes": { "bot": ["app_mentions:read", "channels:history",
                 "channels:join",
                "channels:manage", "channels:read", "chat:write", "chat:write.customize", "chat:write.public",
 "commands", "conversations.connect:read", "dnd:read", "emoji:read", "files:write", "groups:history", "groups:read", "groups:write", "im:history", "im:read", "im:write", "links:write", "metadata.message:read", "mpim:write", "reactions:read", "reactions:write", "team.preferences:read", "team:read", "users.profile:read", "users:read", "users:read.email", "files:read"]}},
     "settings": {"event_subscriptions":  {"request_url":"https://bot.atomicwork.com/api/v1/slack/events/custom-app",
             "bot_events": [ "app_home_opened", "app_mention", "message.channels", "message.groups", "message.im", "reaction_added", "reaction_removed"]},
         "interactivity": { "is_enabled": true, "request_url": "https://bot.atomicwork.com/api/v1/slack/form/interactive/custom-app",
             "message_menu_options_url":"https://bot.atomicwork.com/api/v1/slack/form/select-data-sources/custom-app"},
         "org_deploy_enabled": false,
         "socket_mode_enabled": false,
         "token_rotation_enabled": false
    }
}

  5. Copy the JSON code and navigate to https://api.slack.com/apps. Click on Create New App. Select From a manifest.

  6. Pick a workspace and click on Next

  7. Select the type as JSON and copy in the JSON code.

    Screenshot_2024-08-26_at_12.53.06_PM.png
  8. Ensure these scopes haven't been changed and click on Create.

    Screenshot_2024-08-26_at_12.57.00_PM.png

Permission

Purpose

app_mentions:read

Receive and process messages where @Atom is mentioned, so the app can respond contextually and trigger relevant workflows.

channels:history

Read messages in public channels where the app has been added. This lets the app fetch full thread context when a user creates a request from a conversation.

channels:join

Join public channels when prompted by a workflow action or user request, so the app can post messages and execute actions in those channels.

channels:read

Read basic information about public channels (names, IDs) to display available channels for routing and workflow configuration. Does not access message content.

chat:write

Post messages, reply in threads, and update or delete messages sent by the app. Limited to messages the app itself has sent.

chat:write.customize

Customize the display name and avatar of messages sent by the app, so replies can appear as the relevant agent or responder.

chat:write.public

Post messages in public channels where the app hasn't been added as a member. Used for workflow notifications and updates that need to reach specific channels.

conversations.connect:read

Read metadata about Slack Connect shared channels, so users can include shared channels when configuring routing or learning from conversations. Does not access message content.

files:read

View and download files shared in the workspace. Used when workflows need to process or reference files shared in conversations.

files:write

Upload and share files within Slack, such as reports, summaries, or workflow-related documents. Limited to files generated by the app.

groups:read

Read basic metadata of private channels (name, topic, member list) to display them for routing and workflow configuration. Does not access message content.

groups:write

Post messages in private channels where the app has been added. Used for updates, notifications, and workflow-related messages.

im:history

Read message history in direct messages between a user and the app. This lets the app reference prior interactions and maintain conversational context.

im:read

Read basic metadata for DM conversations (channel IDs, user IDs) to identify and manage DMs where the app is active. Does not access message content.

im:write

Send direct messages to users — for example, to share workflow updates, confirmations, or contextual assistance.

metadata.message:read

Read structured metadata attached to messages via the Slack Message Metadata API. This lets the app process contextual information (such as workflow identifiers) without accessing message text.

reactions:read

Read emoji reactions added to messages. Used to detect user signals like acknowledgment or approval within conversations.

reactions:write

Add emoji reactions to messages to acknowledge user actions, confirm workflow completion, or provide lightweight feedback.

team.preferences:read

Read workspace-level preferences so the app can align its behavior with workspace configurations. Limited to non-sensitive workspace information.

team:read

Read basic workspace information (name, domain, icon) to identify the workspace context the app is operating in.

users.profile:read

Read basic user profile information (name, title, contact details) to personalize interactions and attribute actions correctly. Limited to publicly available profile fields.

users:read

Identify and reference users within the workspace for routing, assignments, and workflow attribution. Limited to basic user identity information.

users:read.email

Read user email addresses to map Slack users to their corresponding Atomicwork profiles. This enables cross-system linking and ensures workflows are attributed to the correct user.

9. Navigate to App settings > Event Subscriptions. Click on the Retry button in the Request URL field. This is to verify the app with Atomicwork.

10. Click Save changes

11. Go to Install app > Install to your <workspace>

12. After you install the app, a Bot User OAuth Token is generated. Copy the token into your notes application.

13. Go to App settings > Basic information. Copy the signing secret key into your notes app as well.

14. Make a call to this API and save.

curl --location 'https://<domain>.atomicwork.com/api/v1/channel-access-config' \
--header 'Content-Type: application/json' \
--header 'x-api-key: <Api Access Key>' \
--data '{
           "config_data": {
             "channel_type": "SLACK",
             "token": "<Bot user token>",
             "signing_secret": "<Signing secret>"
           },
           "description": "Slack channel config",
           "channel_type": "SLACK"
         }'

15. Go to Atomicwork > Settings > Apps > Slack. If the status is "Connected to your <Slack domain>", the app has been successfully uploaded.

Did this answer your question?