<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Onur Hakbilen</title>
    <description>The latest articles on DEV Community by Onur Hakbilen (@hkbonur).</description>
    <link>https://dev.to/hkbonur</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4235880%2F2dc96942-0b75-4f33-a54c-057eeac5f455.png</url>
      <title>DEV Community: Onur Hakbilen</title>
      <link>https://dev.to/hkbonur</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hkbonur"/>
    <language>en</language>
    <item>
      <title>How to pause an n8n workflow until a customer answers</title>
      <dc:creator>Onur Hakbilen</dc:creator>
      <pubDate>Mon, 09 Nov 2026 21:23:06 +0000</pubDate>
      <link>https://dev.to/hkbonur/how-to-pause-an-n8n-workflow-until-a-customer-answers-3oj4</link>
      <guid>https://dev.to/hkbonur/how-to-pause-an-n8n-workflow-until-a-customer-answers-3oj4</guid>
      <description>&lt;p&gt;Every automation I have built for a client hits the same wall. The workflow has done its part. Now it needs one thing from a person who is not on the team: a bank detail, a signature, a document. The workflow stops, and someone writes an email.&lt;/p&gt;

&lt;p&gt;This post shows a pattern that removes that email. The workflow sends the person a form made for them, waits, and carries on with their answers. I built &lt;a href="https://formstep.io" rel="noopener noreferrer"&gt;Formstep&lt;/a&gt; for this step, so I will also say when you do not need it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt; create a Formstep request, pause on a Wait node, and branch on how the request ended: answered, expired or canceled.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why not n8n's own form, or a form builder?
&lt;/h2&gt;

&lt;p&gt;Both work well when the person is a colleague, or when the form is for anyone. They get awkward when one outside person has to answer about one record. This is what each tool's docs said on 5 November 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;n8n Wait node form&lt;/th&gt;
&lt;th&gt;Form builder link + webhook&lt;/th&gt;
&lt;th&gt;Formstep request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who can answer&lt;/td&gt;
&lt;td&gt;Anyone with the resume link&lt;/td&gt;
&lt;td&gt;Anyone with the link, any number of times&lt;/td&gt;
&lt;td&gt;One named person, once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What you already know&lt;/td&gt;
&lt;td&gt;Prefill is not in its docs&lt;/td&gt;
&lt;td&gt;Prefilled through the URL, where it can be read and changed&lt;/td&gt;
&lt;td&gt;Prefilled on the server. The link carries a token, not the data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Values they must not change&lt;/td&gt;
&lt;td&gt;Locking is not in its docs&lt;/td&gt;
&lt;td&gt;Often missing&lt;/td&gt;
&lt;td&gt;Locked per request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What you can ask for&lt;/td&gt;
&lt;td&gt;Six field types, no file upload&lt;/td&gt;
&lt;td&gt;Depends on the builder&lt;/td&gt;
&lt;td&gt;Files, signatures, payments and 20+ question types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;If they go quiet&lt;/td&gt;
&lt;td&gt;You build the follow-up&lt;/td&gt;
&lt;td&gt;You build the follow-up&lt;/td&gt;
&lt;td&gt;Reminders on a schedule (paid plans), then the request expires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How the run continues&lt;/td&gt;
&lt;td&gt;Same execution&lt;/td&gt;
&lt;td&gt;A second workflow has to find the record&lt;/td&gt;
&lt;td&gt;Same execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What they see&lt;/td&gt;
&lt;td&gt;Your n8n address&lt;/td&gt;
&lt;td&gt;The builder's page&lt;/td&gt;
&lt;td&gt;Your logo and colors, in their language&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Answers also come back under field keys you set once, like &lt;code&gt;iban&lt;/code&gt;. Rename or translate the question and your workflow still works.&lt;/p&gt;

&lt;p&gt;The longer comparisons, with sources, are &lt;a href="https://formstep.io/blog/formstep-vs-n8n-form/" rel="noopener noreferrer"&gt;Formstep vs n8n's form&lt;/a&gt; and &lt;a href="https://formstep.io/blog/why-not-a-form-builder/" rel="noopener noreferrer"&gt;why not use a form builder&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern: four nodes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faowfw3yrd20hcwot6t5s.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faowfw3yrd20hcwot6t5s.webp" alt="A finished n8n execution: a manual trigger, Create request, a Wait node named Wait for the answer, and a Switch named Outcome, all green, with one item leaving the approve output" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Trigger.&lt;/strong&gt; Anything: a new row, a CRM stage, an email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create request&lt;/strong&gt;, from the Formstep node. Pick the form, set the recipient's email, map what you already know, and turn on &lt;strong&gt;Wait for the Outcome&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait&lt;/strong&gt;, set to &lt;strong&gt;On Webhook Call&lt;/strong&gt;. The Create request node has already handed Formstep this execution's resume URL, so you never build that URL yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch&lt;/strong&gt; on &lt;code&gt;{{ $json.body.type }}&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;request.completed&lt;/code&gt;: the answers are under &lt;code&gt;{{ $json.body.data.answers }}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;request.expired&lt;/code&gt;: they never finished.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;request.canceled&lt;/code&gt;: someone withdrew it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Formstep calls back on every ending, not only on success. So the run never hangs on someone who went quiet. A request expires after 30 days unless you set another date.&lt;/p&gt;

&lt;p&gt;The node is &lt;code&gt;n8n-nodes-formstep&lt;/code&gt;, MIT-licensed, for self-hosted n8n. The &lt;a href="https://docs.formstep.io/guides/n8n/install-the-node/" rel="noopener noreferrer"&gt;install guide&lt;/a&gt; has the steps. On n8n Cloud, call the Formstep REST API from an HTTP Request node and pass the resume URL as the callback URL.&lt;/p&gt;

&lt;p&gt;Here are three jobs the same four nodes do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use case 1: confirm what you already have
&lt;/h2&gt;

&lt;p&gt;A supplier's bank details sit in a sheet, and you want them confirmed before you pay.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Create request&lt;/strong&gt;, map &lt;code&gt;company_name&lt;/code&gt; and &lt;code&gt;iban&lt;/code&gt; from the sheet under &lt;strong&gt;Values to Send&lt;/strong&gt;. Then pick &lt;code&gt;company_name&lt;/code&gt; under &lt;strong&gt;Read-Only Field Names or IDs&lt;/strong&gt;. The supplier opens the link and sees this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqq6vfotr6g99gxq4js1.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqq6vfotr6g99gxq4js1.webp" alt="The request form with Company name showing Analytical Engines Ltd in a greyed-out field and the note: Filled in by the sender" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They confirm the IBAN or fix it. They cannot change the company name. After the Wait node, &lt;code&gt;{{ $json.body.data.answers.iban }}&lt;/code&gt; is the confirmed value.&lt;/p&gt;

&lt;p&gt;To start from a ready-made form, use the &lt;a href="https://formstep.io/templates/vendor-onboarding/" rel="noopener noreferrer"&gt;vendor onboarding template&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use case 2: AI reads an invoice, the sender checks it
&lt;/h2&gt;

&lt;p&gt;AI reads PDFs well. But when it misreads a digit, it looks just as sure as when it is right. In my own test the model read a total of 27 325 as 27 235, and the execution looked the same as a correct one.&lt;/p&gt;

&lt;p&gt;So let the person who sent the invoice check it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extract from File&lt;/strong&gt; pulls the text out of the PDF. A scan has no text, so for scans use a model node that reads images instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information Extractor&lt;/strong&gt; reads the supplier, invoice number, dates and total.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create request&lt;/strong&gt; sends the supplier a form with every value filled in and the invoice shown above it.&lt;/li&gt;
&lt;li&gt;After the &lt;strong&gt;Wait&lt;/strong&gt; node, a &lt;strong&gt;Code&lt;/strong&gt; node compares what the AI read with what the supplier confirmed:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Read the invoice with AI&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;answers&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;corrected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;invoice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;corrected&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you review only the invoices where &lt;code&gt;corrected&lt;/code&gt; is not empty, not every invoice.&lt;/p&gt;

&lt;p&gt;The full walkthrough is in &lt;a href="https://formstep.io/blog/n8n-read-pdf-confirm-details/" rel="noopener noreferrer"&gt;reading a PDF with AI in n8n&lt;/a&gt;, and you can import the &lt;a href="https://github.com/formstep/n8n-nodes-formstep/blob/main/examples/formstep-invoice-ai-confirm.json" rel="noopener noreferrer"&gt;finished workflow&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use case 3: a form built on the fly
&lt;/h2&gt;

&lt;p&gt;Sometimes the questions depend on the case. A water damage claim needs photos and a repair estimate. A theft claim needs a police report and receipts. You do not want to build one form per case.&lt;/p&gt;

&lt;p&gt;Keep the checklist in a &lt;strong&gt;Code&lt;/strong&gt; node and send it with the request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;checklists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;water_damage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;damage_photos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Photos of the damage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxFiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;repair_estimate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Repair estimate from a contractor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxFiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;theft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;police_report&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Police report&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxFiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;receipts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Receipts for the stolen items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxFiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blocks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;checklists&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claimType&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;file&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;blocks&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;strong&gt;Create request&lt;/strong&gt;, set &lt;strong&gt;Form Source&lt;/strong&gt; to &lt;strong&gt;New Form&lt;/strong&gt; and &lt;strong&gt;Form Blocks&lt;/strong&gt; to &lt;code&gt;{{ JSON.stringify($json.blocks) }}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Formstep builds the form the first time it sees a definition and reuses it after that. The claimant sees only the uploads their claim needs, and your workflow gets a download URL for each file. A new claim type is a new entry in the object, not a new form.&lt;/p&gt;

&lt;p&gt;The full walkthrough is in &lt;a href="https://formstep.io/blog/n8n-collect-documents/" rel="noopener noreferrer"&gt;collecting documents in n8n&lt;/a&gt;, and every block type is in the &lt;a href="https://docs.formstep.io/requests/inline-forms/" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things that bite
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The resume URL shows localhost.&lt;/strong&gt; n8n builds it from &lt;code&gt;WEBHOOK_URL&lt;/code&gt;, not from your browser. Set it to your public HTTPS address. The Create request node refuses an &lt;code&gt;http://&lt;/code&gt; or private address before it creates anything, so a wrong setting fails while you build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The execution is gone when the answer arrives.&lt;/strong&gt; The answers live in the request, not in the waiting execution. Read them with &lt;strong&gt;Get request&lt;/strong&gt;, or start a fresh workflow with the &lt;strong&gt;Formstep Trigger&lt;/strong&gt; so nothing has to wait.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing emails real people.&lt;/strong&gt; Turn on &lt;strong&gt;Test Mode&lt;/strong&gt;. No email goes out, nothing is counted, and the callback still resumes the Wait node.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;The node is free. Requests, prefill, locked fields, callbacks and expiry are on every Formstep plan, with 1,000 submissions and requests a month on Free. On Free you send the link yourself. Having Formstep email the invitation and the reminders needs Pro, at $39 a month. The &lt;a href="https://formstep.io/pricing/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; has the rest.&lt;/p&gt;

&lt;h2&gt;
  
  
  When n8n's own form is the better choice
&lt;/h2&gt;

&lt;p&gt;If the person is on your team, use n8n's form. It is one fewer service holding your data, colleagues can answer as themselves with &lt;strong&gt;n8n User Auth&lt;/strong&gt;, and it works on n8n Cloud, where the Formstep node does not yet. If you only need a yes or no from someone in Slack, &lt;a href="https://formstep.io/blog/slack-approval-vs-request/" rel="noopener noreferrer"&gt;Slack buttons are simpler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Formstep earns its place when the person is outside your company, the data should arrive filled in or locked, someone has to chase them, and the run has to carry on by itself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Onur, the founder of Formstep. A longer version of the first pattern is on the &lt;a href="https://formstep.io/blog/n8n-wait-for-customer/" rel="noopener noreferrer"&gt;Formstep blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
