Skip to content

Feature: acknowledging requests without an HTTP response #2789

Open

Description

@ataylorme

Summary

Slack Bolt SDK handlers block the HTTP response until the handler returns. When Bolt runs inside an AWS Lambda with durable execution, the Lambda must finish before Slack receives a response.

That conflicts with Slack’s 3-second timeout and with durable workflows that need to run long-running tasks after an early acknowledgment.

Problem

Slack’s 3-second timeout

Slack expects an HTTP response within 3 seconds for:

  • Modal submissions (view_submission)
  • Slash commands
  • Other interactive payloads, such as buttons

If the response is late, Slack shows errors like “We had some trouble connecting. Try again?” and may retry.

Bolt’s request/response model

Bolt handlers are written as async functions. The HTTP response is sent only when the handler returns:

app.view('my_modal', async ({ ack, view, body }) => {
  await ack({ response_action: 'update', view: processingView });
  // Handler must return before Slack receives the response
  await longRunningWork();  // Blocks the response
});

So any work done after ack() still delays the response.

Durable execution requirements

With AWS Durable Execution (or similar runtimes), all work must be part of the durable workflow. Background or fire-and-forget work is not allowed; everything must be awaited so the runtime can checkpoint and replay correctly.

Resulting conflict

Slack needs a response within 3 seconds.

Bolt sends the response only when the handler returns.

Durable execution requires all work to be awaited before the Lambda completes.

Long-running work (e.g. LLM calls, external APIs) can exceed 3 seconds.

So we cannot both acknowledge Slack quickly, and run long-running work inside the same durable Lambda execution.

Desired behavior

We’d like a way to:

Acknowledge early – Send a response to Slack (e.g. “processing”) within 3 seconds.

Continue durable execution – Run long-running work in the same Lambda invocation, with proper checkpointing and replay.

Current workaround

We currently use SQS to decouple:
Bolt handler acks immediately and enqueues the payload to SQS.

A separate SQS-triggered Lambda (or the same Lambda with a different trigger) runs the long-running work with durable execution.

This works but adds:

  • Extra infrastructure (SQS, event source mapping)
  • Two Lambda invocations per interaction
  • More moving parts and failure modes

Feature request: ack_url in the interaction payload

When a POST request is made to the ack_url Slack receives acknowledgment of the interaction from the Slack app and does not display any error messages to the user

The Slack app can then continue with long running processes

Activity

  1. WilliamBergamin commented on Feb 16, 2026

    @WilliamBergamin
    Contributor

    Hi @ataylorme thanks for writing in 💯

    This does seems like a valid use case, it does seem like the awsLambdaReceiver we provide does not support acking in the middle of your event handler 🤔

    We might be able to update awsLambdaReceiver so that it supports your use case but it may be a breaking change. This might also be resolved by addressing a wider acknowledgement issue in this project (#2788)

    But for the time being the only workaround I can think of is for you to build your own custom receiver that behaves the way you need and mimics AwsLambdaReceiver

  2. ataylorme commented on Feb 16, 2026

    @ataylorme
    Author

    Thank you for the links, I will look into making a custom receiver.

    My current workaround is two Lambdas. The first adds a message to SQS and then returns early to meet the 3 second HTTP response requirement.

    The second Lambda reads from the queue and then handles long running tasks, updates modals with progress, sends messages, etc.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    auto-triage-skipPrevent this issue from being closed due to lack of activityenhancementM-T: A feature request for new functionalitysemver:majorsemver:minor

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions