Repository navigation
Feature: acknowledging requests without an HTTP response #2789
Description
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
WilliamBergamin commentedon Feb 16, 2026
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
ackingin 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
ataylorme commentedon Feb 16, 2026
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.