Skip to content

Registration forms · 9 fields

Customer onboarding form template

Sent after a client signs and before kickoff. It gathers company details, who to talk to, where invoices go and what the client wants from the first months, so the first meeting starts with answers.

Get the code

Customer onboarding

Live demo: try the fields. Submitting sends nothing.

Where invoices should go, if different from the contact email.

Why these fields

  • Company name

    text · required

    Required. Use the legal name you will invoice.

  • Main contact

    text · required

    Required. One named person avoids messages going to whoever happens to answer.

  • Contact email

    email · required

    Required, for the kickoff invitation and day-to-day contact.

  • Contact phone

    tel · optional

    Optional. Useful for urgent questions during the project.

  • Billing email

    email · optional

    Optional. Often a shared finance address; if it names a person, it is personal data like the rest.

  • VAT number

    text · optional

    Optional. Needed on invoices to business clients in other EU countries under the reverse charge, and you can check it in the EU's VIES service.

  • Website

    text · optional

    Optional. Saves a search before kickoff.

  • What should the first three months achieve?

    textarea · required

    Required, because it is what makes the kickoff useful. An open question gets better answers than a list of options.

  • Preferred start date

    date · optional

    Optional. Tells you whether the client's plans match your schedule.

When to use it

Send the link in your welcome email. Ask for logins another way: a submission is stored and emailed, which is the wrong place for credentials.

Onboarding suppliers rather than clients? The vendor application template asks what a buyer needs to know.

Privacy and GDPR

  • Most of this is business data, but contact names, direct numbers and personal addresses are personal data. The basis is the contract you just signed (Article 6(1)(b)).
  • Never collect passwords, API keys or card details here. Share access through a password manager or the client's own invitation flow.
  • Copy the answers into your CRM or project tool, then let a short form retention clear them, so client data lives in one place.

Choose your stack. Copy your form.

Replace the example endpoint with your Formward endpoint, then adapt the fields to your needs.

<form action="https://forms.formward.eu/f/your-form-id" method="POST">
  <label for="company">Company name</label>
  <input type="text" name="company" id="company" required />
  <label for="contact_name">Main contact</label>
  <input type="text" name="contact_name" id="contact_name" required />
  <label for="email">Contact email</label>
  <input type="email" name="email" id="email" required />
  <label for="phone">Contact phone</label>
  <input type="tel" name="phone" id="phone" />
  <label for="billing_email">Billing email</label>
  <small id="billing_email-help">Where invoices should go, if different from the contact email.</small>
  <input type="email" name="billing_email" id="billing_email" aria-describedby="billing_email-help" />
  <label for="vat_number">VAT number</label>
  <input type="text" name="vat_number" id="vat_number" />
  <label for="website">Website</label>
  <input type="text" name="website" id="website" placeholder="https://" />
  <label for="goals">What should the first three months achieve?</label>
  <textarea name="goals" id="goals" required></textarea>
  <label for="start_date">Preferred start date</label>
  <input type="date" name="start_date" id="start_date" />
  <input type="text" name="_gotcha" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true" />
  <button type="submit">Send</button>
</form>

Accessible by default, and how to keep it that way

  • Every field in the code has a visible label tied to it with for and id, so screen readers announce what to enter and a click on the label focuses the field.
  • Required fields carry the required attribute, so the browser explains a missing answer before anything is sent. Say “required” in words as well; an asterisk or a colour alone is easy to miss.
  • The spam trap field (_gotcha) is hidden from screen readers with aria-hidden and skipped by the Tab key, so people never meet it.
  • In the JavaScript versions, show the confirmation or error in an element with role="status" so the result is announced, and keep the entered answers when sending fails.

Changed the fields? Paste your version into the HTML form tester to see exactly what it sends, or run it through the GDPR form checker.

How the code talks to Formward

Each form you create gets its own endpoint in the form https://forms.formward.eu/f/your-form-id. The HTML version posts to it directly and the browser is redirected to a thank-you page, so it works without JavaScript.

The Next.js version below sends the same fields with fetch and an Accept: application/json header. Formward then answers with { ok: true, id }, or an error body with 402 when the plan limit is reached and 429 when the rate limit kicks in. See responses and status codes.

Next.js client component

"use client";

import { useState } from "react";

export function CustomerOnboardingForm() {
  const [sent, setSent] = useState(false);

  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();
    const form = e.currentTarget;
    const res = await fetch("https://forms.formward.eu/f/your-form-id", {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new FormData(form),
    });
    if (res.ok) {
      setSent(true);
      form.reset();
    }
  }

  if (sent) return <p>Thanks! Your message has been sent.</p>;

  return (
    <form onSubmit={onSubmit}>
      <label htmlFor="company">Company name</label>
      <input type="text" name="company" id="company" required />
      <label htmlFor="contact_name">Main contact</label>
      <input type="text" name="contact_name" id="contact_name" required />
      <label htmlFor="email">Contact email</label>
      <input type="email" name="email" id="email" required />
      <label htmlFor="phone">Contact phone</label>
      <input type="tel" name="phone" id="phone" />
      <label htmlFor="billing_email">Billing email</label>
      <small id="billing_email-help">Where invoices should go, if different from the contact email.</small>
      <input type="email" name="billing_email" id="billing_email" aria-describedby="billing_email-help" />
      <label htmlFor="vat_number">VAT number</label>
      <input type="text" name="vat_number" id="vat_number" />
      <label htmlFor="website">Website</label>
      <input type="text" name="website" id="website" placeholder="https://" />
      <label htmlFor="goals">What should the first three months achieve?</label>
      <textarea name="goals" id="goals" required />
      <label htmlFor="start_date">Preferred start date</label>
      <input type="date" name="start_date" id="start_date" />
      <input
        type="text"
        name="_gotcha"
        tabIndex={-1}
        autoComplete="off"
        style={{ position: "absolute", left: "-9999px" }}
        aria-hidden="true"
      />
      <button type="submit">Send</button>
    </form>
  );
}

Spam protection

  • The generated code already includes the hidden _gotcha honeypot. Leave it in: a bot that fills it gets a normal success response, the submission is filed as spam and no email is sent.
  • Every form has a per-IP rate limit, and you can restrict it to your own domains with the allowed-origins list in the form settings.
  • Cloudflare Turnstile is optional and works on every plan, including Free. Turn it on in the form settings, add the widget to your markup and Formward checks the token server-side.
  • The form settings can also reject disposable email addresses, which is worth turning on when a fake address would waste your time.

What happens after submit

  • Each onboarding form is emailed to you and stored in the EU on every plan.
  • From Professional, a webhook can create the client in your CRM or project tool. From Professional, the autoresponder can confirm the next steps.
  • CSV export starts at Personal.

Questions

Can clients send logos and brand files with the form?
Yes, with a file field and Professional or above. For large brand packs, a link to a shared folder is usually easier for both sides.
Should I ask for system access in the onboarding form?
No. Ask who will grant access, and handle the credentials through a password manager or the client's own invitation flow. Form submissions are stored and emailed, which is not where secrets belong.

Customize before publishing

  • Remove fields you do not need and mark only essential answers as required.
  • Replace placeholder wording with terms your audience already understands.
  • Add your privacy notice, retention details and expected response time.
  • Test keyboard focus, validation errors and the confirmation state on mobile.

Use this template

Create a free account and the form is set up from this template. Copy your endpoint and replace https://forms.formward.eu/f/your-form-id in the code above.

Use this template →