# Business workflows: approvals, alerts and custom step logic

*Slack Developer Study Guide · Design the Interactive Flow of Your App · Last updated October 21, 2026 · https://www.certifyforce.com/study-guide/slack-developer/design-the-interactive-flow-of-your-app/business-workflows-approvals-alerts-and-custom-step-logic*

How to turn a business process into a Slack app: spotting use cases, actionable approval and alert messages, onboarding on team_join, the shortcut-to-modal helpdesk pattern, and the custom workflow step lifecycle with complete(), fail() and declared outputs.

- Certification: Salesforce Slack Developer
- Exam section: Design the Interactive Flow of Your App
- Study guide: https://www.certifyforce.com/study-guide/slack-developer

**Official exam objective:**

> Build common workflows (business processes) and use cases for Slack apps.

## What the exam expects

- Find good app use cases in how a team already works, and reject ideas that only add noise or duplicate Slack.
- Design approval and alert flows as actionable messages: post with buttons, handle the `block_actions` payload, update the message to show who acted.
- Pick the event that starts a process, such as `team_join` for onboarding a new member.
- Apply the shortcut-to-modal-to-confirmation pattern for actions that create or change data.
- Build a custom workflow step that waits for a person, returns declared outputs, and knows where it can and cannot run.

Key terms: **actionable message** (a notification with buttons or menus that lets the reader act in place); **`block_actions`** (the payload sent when a Block Kit interactive component is used); **custom workflow step** (a function in your app that Workflow Builder offers as a step); **`complete()` / `fail()`** (Bolt helpers that end a step successfully or unsuccessfully); **`home_team_only`** (the warning external Slack Connect members see on your org's steps).

## Key facts

| Fact | Detail | Source |
|---|---|---|
| Interactive component click | Sends a `block_actions` payload with the interacting `user` | [block_actions payload](https://docs.slack.dev/reference/interaction-payloads/block_actions-payload) |
| Updating the posted alert | `chat.update` with `channel` and `ts`; bots can update their own messages | [chat.update method](https://docs.slack.dev/reference/methods/chat.update) |
| New member joins the workspace | `team_join` event, `users:read` scope | [team_join event](https://docs.slack.dev/reference/events/team_join) |
| Shortcut that changes data | Must follow up with a confirmation modal | [Implementing shortcuts](https://docs.slack.dev/interactivity/implementing-shortcuts/) |
| Ephemeral to in-channel | Not possible: visibility is fixed for life; delete and publish new | [Handling user interaction](https://docs.slack.dev/interactivity/handling-user-interaction/) |
| Ending a custom step | `complete()` with outputs or `fail()` with an error string | [Custom Steps (Bolt for JavaScript)](https://docs.slack.dev/tools/bolt-js/concepts/custom-steps) |
| Bolt step setup | `function_executed` bot event plus a function definition on the Workflow Steps page | [Workflow steps](https://docs.slack.dev/workflows/workflow-steps/) |
| Deno Slack SDK step apps | Managed with the Slack CLI only, not the app settings | [Workflow steps](https://docs.slack.dev/workflows/workflow-steps/) |
| Distribution | Step apps cannot be distributed publicly or listed in the Marketplace | [Workflow steps](https://docs.slack.dev/workflows/workflow-steps/) |

## Check yourself

- Why should an approval notification carry buttons rather than a link?
- When may a Bolt custom step skip `complete()` in its `function()` handler?
- Which event lets an onboarding app greet a new employee as soon as the account joins?
- Why must a data-changing shortcut open a modal first?

## Sources

- [Workflow steps](https://docs.slack.dev/workflows/workflow-steps/)
- [Custom Steps (Bolt for JavaScript)](https://docs.slack.dev/tools/bolt-js/concepts/custom-steps)
- [Workflows](https://docs.slack.dev/workflows/)
- [App design](https://docs.slack.dev/surfaces/app-design/)
- [Interactivity overview](https://docs.slack.dev/interactivity/)
- [Handling user interaction in your Slack apps](https://docs.slack.dev/interactivity/handling-user-interaction/)
- [block_actions payload](https://docs.slack.dev/reference/interaction-payloads/block_actions-payload)
- [chat.update method](https://docs.slack.dev/reference/methods/chat.update)
- [team_join event](https://docs.slack.dev/reference/events/team_join)
- [Implementing shortcuts](https://docs.slack.dev/interactivity/implementing-shortcuts/)
- [Enhance Your Slack App with Interactivity](https://trailhead.salesforce.com/content/learn/projects/develop-a-slack-app-with-bolt/set-up-interactivity)

## About the full unit

The "Core concepts", "Exam traps" and "Worked scenario" sections of this unit, its 11 linked practice questions, and unlimited timed mock exams are included with the Slack Developer pack (USD $19): https://www.certifyforce.com/practice-exams
