# Send a request from an n8n workflow

Create a formbase request from any n8n workflow, prefill and lock the answers you already know, and send the link by email or through your own channel.

## Send a request from an n8n workflow

A request asks one named recipient to complete a form. This guide adds a Create request node to a workflow, prefills the supplier's company name so they cannot change it, and hands the link to the next node.

<p>
  You need a <a href="/guides/n8n/connect">formbase credential in n8n</a> and a published form. What a request is, and every option it
  takes, is in <a href="/requests/creating-requests">Creating requests</a>; this guide shows where those options sit in n8n.
</p>

<h2 id="add-the-node">1. Add the Create request node</h2>

<p>
  Start with the trigger that should send the request: a new row in a sheet, a deal marked won in your CRM, a schedule. This guide uses a
  manual trigger and an <strong>Edit Fields</strong> node named <em>Supplier</em> that holds <code>supplier_id</code>,{' '}
  <code>company_name</code> and <code>contact_email</code>. Click <strong>+</strong> after it, search for <strong>formbase</strong>, and
  pick <strong>Create request</strong>.
</p>

<h2 id="form-and-recipient">2. Pick the form and the recipient</h2>

<ul>
  <li>
    <strong>Form</strong> is the form the recipient completes. Pick it from the list, or switch to <strong>ID</strong> and paste its ID. It
    must be published.
  </li>
  <li>
    <strong>Recipient Email</strong> usually comes from the input, like <code>{'{{ $json.contact_email }}'}</code>. It is needed for email
    delivery and for reminders.
  </li>
</ul>

<h2 id="prefill-and-lock">3. Prefill and lock what you already know</h2>

<p>
  Once you pick the form, <strong>Values to Send</strong> lists every question you can prefill by its title and{' '}
  <a href="/requests/field-keys">field key</a>, like <em>Company name (company_name)</em>. File upload, signature, payment and schedule
  appointment questions, calculated fields and Documents blocks are not listed: the recipient or the form supplies those. Map the answers
  you already have; fields left empty are not sent. The recipient sees the mapped ones filled in.
</p>

<p>
  <strong>Mapping Column Mode</strong> can also be <strong>Map Automatically</strong>: then every input field named after a field key of the
  form is sent. That suits an input you shaped for this form with an Edit Fields node.
</p>

<p>
  Hidden fields of the form are listed too, marked <em>· context</em>. The recipient cannot change them and sees them only where the form
  mentions them. See <a href="/requests/creating-requests#three-buckets">Prefill, locked fields, and context</a> for the difference.
</p>

<p>
  Pick a question under <strong>Read-Only Field Names or IDs</strong> to lock it, so the recipient can see it but not change it. A locked
  question must also be prefilled. If the form has a Documents block, <strong>Documents</strong> takes files from a binary field of the
  input item.
</p>

<h2 id="additional-fields">4. Add the options you need</h2>

<p>
  Click <strong>Add Field</strong> under <strong>Additional Fields</strong>:
</p>

<ul>
  <li>
    <strong>Delivery</strong> decides who sends the link. <strong>Email the Invitation</strong> lets formbase send the{' '}
    <a href="/requests/invitations-and-reminders">invitation and reminders</a>, and needs a Pro or Business plan. <strong>None</strong>, the
    default, sends no invitation: a later node sends the request's <code>url</code>, by Slack, SMS or your own email tool.
  </li>
  <li>
    <strong>Reminders</strong> left out follows the form's reminder schedule. With a Recipient Email, those reminders are emailed even when
    Delivery is None. Add <strong>Reminders</strong> and leave it empty to send none, or enter a schedule like <code>2d, 5d</code>, which
    needs Pro or Business.
  </li>
  <li>
    <strong>External ID</strong> is your own ID for this piece of work, like <code>supplier-{'{{ $json.supplier_id }}'}</code>. A later
    workflow can <a href="/guides/n8n/manage-requests#find-a-request">find the request by it</a>. It is also the{' '}
    <a href="/requests/creating-requests#idempotency">idempotency key</a>: run the node again with the same External ID and the same
    parameters, and you get the same request back with <code>deduplicated: true</code>, not a second one. Within 30 days, the same External
    ID with any parameter changed, Test Mode included, fails with{' '}
    <em>CONFLICT: Idempotency key … was already used for a different request</em>.
  </li>
  <li>
    <strong>Test Mode</strong> creates a <a href="/requests/creating-requests#test-mode">test request</a>: nothing is emailed and it counts
    nowhere.
  </li>
  <li>
    <strong>Recipient Name</strong>, <strong>Language</strong>, <strong>Expires At</strong> and <strong>Metadata</strong> are optional. A
    request expires after 30 days unless you set another date, at most 365 days away.
  </li>
  <li>
    <strong>Callback URL</strong> sends the outcome to a URL of your own. To get the outcome back into this workflow, turn on{' '}
    <a href="/guides/n8n/request-outcome#wait-for-the-outcome">Wait for the Outcome</a> instead.
  </li>
</ul>

<h2 id="run-the-node">5. Run the node</h2>

<p>
  Click <strong>Execute step</strong>. formbase creates the request and returns it: <code>id</code>, <code>status</code>{' '}
  <code>pending</code>, and <code>url</code>, the link for the recipient. Map <code>{'{{ $json.url }}'}</code> into the node that sends it.{' '}
  <code>deliveryStatus</code> is <code>not_requested</code> when Delivery is None, because formbase sent nothing.
</p>

> ⚠️ **Running the node creates a real request**
> <p>
>     Unless <strong>Test Mode</strong> is on, every run, including <strong>Execute step</strong> in the editor, is a real request: with email
>     delivery the recipient gets the invitation. Turn Test Mode on while you build the workflow. A test request does not start any workflow
>     with a <a href="/guides/n8n/request-outcome">request trigger</a>. Before you publish, turn Test Mode off and change the External ID,
>     because the old one belongs to the test request.
>   </p>

<h2 id="next">Next</h2>

<div class="not-prose grid gap-3 sm:grid-cols-2 mb-8">
  - [Act on a request's outcome in n8n](/guides/n8n/request-outcome) — Branch when the recipient approves, declines or asks for changes.
  - [Look up, remind and cancel requests in n8n](/guides/n8n/manage-requests) — Find a request by External ID, nudge the recipient, or withdraw it.
</div>
