webhook-response-not-sent
This error occurs when a webhook is configured with respondWith: "manual" but the workflow does not send a response using request.respondWith() before the webhook execution completes.
Error Message
Workflow run did not send a responseWhy This Happens
When you create a webhook with respondWith: "manual", you are responsible for calling request.respondWith() to send the HTTP response back to the caller. If the workflow execution completes without sending a response, this error will be thrown.
The webhook infrastructure waits for a response to be sent, and if none is provided, it cannot complete the HTTP request properly.
Common Causes
Forgetting to Call request.respondWith()
// Error - no response sent
export async function webhookWorkflow() {
"use workflow";
const webhook = await createWebhook({
respondWith: "manual",
});
const request = await webhook;
const data = await request.json();
// Process data...
console.log(data);
// Error: workflow ends without calling request.respondWith()
}Solution: Always call request.respondWith() when using manual response mode.
// Fixed - response sent
export async function webhookWorkflow() {
"use workflow";
const webhook = await createWebhook({
respondWith: "manual",
});
const request = await webhook;
const data = await request.json();
// Process data...
console.log(data);
// Send response before workflow ends
await request.respondWith(new Response("Processed", { status: 200 }));
}Conditional Response Logic
// Error - response only sent in some branches
export async function webhookWorkflow() {
"use workflow";
const webhook = await createWebhook({
respondWith: "manual",
});
const request = await webhook;
const data = await request.json();
if (data.isValid) {
await request.respondWith(new Response("OK", { status: 200 }));
}
// Error: no response when data.isValid is false
}Solution: Ensure all code paths send a response.
// Fixed - response sent in all branches
export async function webhookWorkflow() {
"use workflow";
const webhook = await createWebhook({
respondWith: "manual",
});
const request = await webhook;
const data = await request.json();
if (data.isValid) {
await request.respondWith(new Response("OK", { status: 200 }));
} else {
await request.respondWith(new Response("Invalid data", { status: 400 }));
}
}Exception Before Response
// Error - exception thrown before response
export async function webhookWorkflow() {
"use workflow";
const webhook = await createWebhook({
respondWith: "manual",
});
const request = await webhook;
// Error occurs here
throw new Error("Something went wrong");
// Never reached
await request.respondWith(new Response("OK", { status: 200 }));
}Solution: Use try-catch to handle errors and send appropriate responses.
// Fixed - error handling with response
export async function webhookWorkflow() {
"use workflow";
const webhook = await createWebhook({
respondWith: "manual",
});
const request = await webhook;
try {
// Process request...
const result = await processData(request);
await request.respondWith(new Response("OK", { status: 200 }));
} catch (error) {
// Send error response
await request.respondWith(
new Response("Internal error", { status: 500 })
);
}
}Alternative: Use Default Response Mode
If you don't need custom response control, consider using the default response mode which automatically returns a 202 Accepted response:
// Automatic 202 response - no manual response needed
export async function webhookWorkflow() {
"use workflow";
const webhook = await createWebhook();
const request = await webhook;
// Process request asynchronously
await processData(request);
// No need to call request.respondWith()
}