Старый resume URL n8n больше не будит Wait node

Workflow отправляет пользователю ссылку для подтверждения заявки и останавливается на Wait node в режиме On Webhook Call. Через сутки пользователь нажимает ссылку. Запрос приходит на старый resume URL, но workflow уже вышел по лимиту ожидания либо был перезапущен вручную. Пользователь думает, что согласие принято, а заявка остаётся без решения. Проблема в том, что resume URL относится к конкретному исполнению, а не к заявке как постоянный публичный адрес.

Привяжите URL к исполнению и сроку

n8n создаёт $execution.resumeUrl во время запуска; URL уникален для исполнения. Узел Wait может автоматически продолжить работу по Limit Wait Time. После этого старый URL уже не должен считаться действующим подтверждением. Частичное исполнение в редакторе тоже меняет resume URL, поэтому ссылка, полученная в одном тестовом запуске, не проверяет другой. При отправке ссылки сохраняйте рядом request_id, execution_id, время создания и крайний срок. Покажите крайний срок пользователю до отправки сообщения.

Непосредственная цепочка в n8n: создать заявку со статусом awaiting_approval в устойчивом хранилище; сформировать ссылку на текущий $execution.resumeUrl; отправить её; войти в Wait On Webhook Call с настроенным Limit Wait Time; после продолжения проверить статус заявки. Путь таймаута помечает её как expired и отправляет уведомление. Если в вашей версии Wait нельзя удобно разделить причину продолжения, храните дедлайн в заявке и после Wait сравнивайте фактическое время с ним, прежде чем выполнять действие.

Поздний ответ — не невидимый успех

Для долгоживущего процесса лучше отправлять пользователю стабильную ссылку вашего приложения с непрозрачным ID заявки и одноразовым токеном. Она проверяет срок и состояние в базе, а затем направляет своевременное подтверждение на актуальный resume URL, сохранённый для этой заявки. Если заявка уже истекла, страница возвращает понятное «срок прошёл» и предлагает новую заявку; не пересылайте поздний callback в новый execution автоматически. Токен должен быть ограничен по времени и связан с конкретным действием, иначе чужая ссылка может подтвердить другую заявку.

В тесте создайте два исполнения одной схемы и убедитесь, что их resume URL различны. Затем пропустите дедлайн первого и отправьте его старую ссылку: статус expired не должен стать approved. Для второго нажмите ссылку в срок: статус меняется один раз. Повтор того же HTTP-запроса не должен повторно запускать внешнее действие. Так вы проверите одновременно привязку ссылки, срок и идемпотентность.

В платном курсе Продвинутый n8n: production-автоматизации и AI-агенты вы разделяете синхронные и асинхронные workflow, строите human-in-the-loop и проверяете сбои на fixtures. Запоздавший ответ на Wait — хороший тест жизненного цикла согласования. Откройте программу курса, чтобы связать эти элементы в рабочем процессе.

Продолжить на практике