Skip to main content

How to build a secure contractor onboarding workflow with role-gated IT access handoff in Formaloo

Learn how to build a secure contractor onboarding workflow in Formaloo, with e-signed NDAs, tax intake, an auditable PDF record, and a role-gated portal handoff to IT.

What you'll build

By the end of this guide, you'll have a two-page contractor onboarding form that collects identity details, the right tax form for the contractor's country, and an e-signed NDA. Every submission generates an internal PDF record, routes automatically from HR to IT through Status changes, and lands in a portal where contractors, HR, and IT each see only their own slice of the process.

When to use this

  • You bring on contractors regularly and NDAs, tax forms, and IT access requests all get tracked in different places.

  • HR and IT don't share one queue, so access provisioning stalls waiting on an email or a Slack ping.

  • You need a record proving a contractor agreed to your NDA before any system access was granted.

  • Contractors keep emailing to ask if they're set to start yet, because they have no way to check their own status.

  • You want IT to see exactly what a new contractor needs access to, without giving them visibility into the rest of your workspace's data.

Part 1 — Build the intake form with Magic Create

Start with a Form project from your Formaloo homepage, since it comes with one form pre-attached and a table already connected to it. This is where contractors will submit their identity details, tax paperwork, and signed NDA.

1. Open Magic Create: From your Formaloo homepage, click Magic Create, then describe your form in plain text instead of building it field by field.

2. Paste this prompt: "Build a two-page contractor onboarding form. Page 1: full legal name (short text), email address (email field), contractor start date (date), engagement type (dropdown: Independent contractor, Corp-to-corp, International contractor), country filed for tax purposes (dropdown: United States, Outside the United States), a file upload for the W-9 form, and a file upload for the W-8BEN form. Page 2: a yes/no question asking if they've read and agree to the NDA, and a signature field for signing the NDA. Also add these admin-only fields: a Status dropdown (Submitted, Documents verified, Pending IT provisioning, Access granted, Onboarding complete), an Assignee field, an internal notes long text field, a multi-select dropdown for systems and access required (Email & chat, Source code repository, Cloud infrastructure, VPN, Customer data systems, Physical badge/office access), and a yes/no field for IT provisioning complete."

3. Click Create: Formaloo builds the full two-page form from that description in seconds.

💡 Want to know exactly what the Assignee field can do, assign to a person, a team, or either? See what the Assignee field is and how to use it, since this is what routes each record from HR to IT later in this guide.

4. Verify your fields match this table: Magic Create will have generated most of this for you. Check each field and field ID matches exactly before moving on.

Field (question form)

Field ID

Type

What's your full legal name?

full_legal_name

Short text

What's your email address?

email_address

Email

What's your contractor start date?

start_date

Date

What type of engagement is this?

engagement_type

Dropdown

What country do you file taxes in?

tax_country

Dropdown

Upload your W-9 form

w9_upload

File upload

Upload your W-8BEN form

w8ben_upload

File upload

Have you read and do you agree to the terms of the NDA?

nda_agreement

Yes/No

Sign the NDA below

nda_signature

Signature

Status

status

Dropdown (admin-only)

Assignee

assignee

Assignee field (admin-only)

Internal notes

internal_notes

Long text (admin-only)

Systems & access required

systems_access_required

Multi-select Dropdown (admin-only)

IT provisioning complete

it_provisioning_complete

Yes/No (admin-only)

💡 Want internal fields like Status, Assignee, and internal notes to stay invisible to the contractor filling out the form? Admin-only fields are the mechanism. See what admin-only fields are and how they help.

5. Add the signature field manually if Magic Create didn't include it: Click the + button on page 2, scroll to Signature, and select it. Formaloo's signature field lets contractors sign by drawing or typing their name, and it's built for exactly this kind of legally binding e-signature.

📖 See how to add a signature field to your forms for more on draw versus type signing and where signatures show up afterward.

6. Publish the form: Click Publish in the island bar at the top of the editor. This is different from Save, which only applies to logic rules, email templates, and PDF templates.

Note: Formaloo encrypts submission data in transit and at rest by default, and this form collects sensitive tax documents. See Formaloo's security and privacy practices and GDPR at Formaloo if you need to point compliance to Formaloo's data protection stance.

Part 2 — Set up the logic that gates the right tax form and NDA signature

This is where the form gets smart about which tax document to ask for and stops a contractor from signing before they've actually agreed. All of this lives in the same form's advanced logic, no separate automation tool needed.

💡 Want your form to show, hide, or require fields based on what someone just answered? See what logic is in Formaloo before building the rules below.

1. Open Advanced logic: In the form editor, open Form settings on the right side and click Advanced logic, then go to the Logic tab.

2. Click Magic Logic: In the top-right corner of the Logic panel, click Magic Logic to open the prompt window.

3. Paste this Magic Logic prompt: "If 'What country do you file taxes in?' equals 'United States,' show and require 'Upload your W-9 form.' If it equals 'Outside the United States,' show and require 'Upload your W-8BEN form.' Both uploads are hidden and not required by default. If 'Have you read and do you agree to the terms of the NDA?' equals 'Yes,' show and require 'Sign the NDA below.' It's hidden and not required by default."

4. Click Generate rules: Review the AI's preview of each rule, approve, redo, or cancel as needed, then make any manual adjustments.

5. Click Save in the top-right corner once you're happy with the rules.

Note: Because the signature field only shows up after the contractor answers "Yes" to the NDA question, there's no way to reach the submit button without agreeing first.

Part 3 — Create the email templates

Four short, targeted emails run this workflow: one confirms the submission to the contractor, one alerts HR, one hands the request to IT, and one tells the contractor they're cleared to start. Building all four now means the logic in Part 5 has something to actually send.

💡 Want to send branded, personalized emails instead of Formaloo's plain default notification? See how to create and send custom email templates, the foundational guide for everything below.

1. Open the email template builder: Click your profile icon, go to Apps and integrations, and open Custom email templates. Click Add new template.

2. Build the "Submission received" template: Set the subject to "Thanks for completing your onboarding paperwork, @full_legal_name." Clear the body, add an AI block, and use this prompt: "Write a warm, reassuring confirmation email to a new contractor who just submitted their onboarding paperwork. Confirm it was received, that HR will review it and follow up before their start date, and that they don't need to do anything else right now. 3 to 4 sentences, under 80 words." Name and save the template.

3. Build the "New submission for review" template: Set the subject to "New contractor onboarding submitted: @full_legal_name (ref CO-@rowid)." Use this prompt: "Write a short, factual internal email to the HR onboarding team announcing a new contractor submission. State the contractor's name, engagement type, and start date, and note their documents are ready for review. Under 60 words, no small talk." Save the template.

4. Build the "New IT access request" template: Set the subject to "IT access request: @full_legal_name starts @start_date (ref CO-@rowid)." Use this prompt: "Write a short, factual internal email to the IT team asking them to provision access for a new contractor. Reference the systems requested and ask them to mark the request complete once access is granted. Direct tone, under 70 words." Save the template.

5. Build the "You're all set" template: Set the subject to "You're all set to start, @full_legal_name." Use this prompt: "Write a warm, brief welcome email confirming a contractor's system access has been provisioned and they're ready to begin on their start date. Mention who to contact if anything doesn't work on day one. Under 70 words." Save the template.

📖 Every @field_id above pulls the live value from that field on submission. See how to dynamically pull form data into custom emails, PDFs, and AI prompts for the full variable list, including @rowid for a stable reference number.

Part 4 — Build the PDF template

Every submission needs one internal record combining identity, tax filing status, and the signed NDA, something HR and IT can point to later if anyone asks whether onboarding actually happened correctly.

💡 Want every form submission to generate a polished, branded document automatically? See how to create PDF templates to turn responses into documents.

1. Open the PDF template builder: Click your profile icon, go to Apps and integrations, and open Custom PDF templates. Click Add new template.

2. Switch to HTML view: Toggle the editor to HTML and paste your PDF's markup, or design it directly in the visual editor if you'd rather not hand-code it.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Contractor Onboarding Confirmation</title>
<style>
@page { margin: 0; }
* { box-sizing: border-box; }
body {
margin: 0;
padding: 0;
background: #ffffff;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
color: #222222;
}
.doc {
max-width: 760px;
margin: 0 auto;
padding: 60px 72px;
}
.header {
display: flex;
justify-content: space-between;
align-items: flex-start;
border-bottom: 1px solid #ececec;
padding-bottom: 24px;
margin-bottom: 32px;
}
.header-title {
font-size: 22px;
font-weight: 700;
letter-spacing: -0.01em;
margin: 0;
}
.header-sub {
font-size: 12px;
color: #999999;
margin-top: 6px;
}
.header-meta {
text-align: right;
font-size: 12px;
color: #aaaaaa;
line-height: 1.6;
}
.header-meta b {
color: #666666;
font-weight: 600;
}
.section {
margin-bottom: 32px;
}
.section-title {
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.08em;
color: #aaaaaa;
font-weight: 600;
margin-bottom: 14px;
}
.field-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0;
}
.field-grid.single {
grid-template-columns: 1fr;
}
.field {
padding: 10px 0;
border-bottom: 1px solid #f1f1f1;
padding-right: 20px;
}
.field-label {
font-size: 11px;
color: #999999;
margin-bottom: 3px;
}
.field-value {
font-size: 14px;
color: #222222;
font-weight: 500;
}
.full-width {
grid-column: 1 / -1;
}
.consent-block {
background: #f9f9f9;
border-left: 3px solid #d8d8d8;
padding: 16px 20px;
font-size: 12px;
line-height: 1.6;
color: #555555;
border-radius: 0 4px 4px 0;
}
.signature-row {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-top: 20px;
gap: 40px;
}
.signature-block {
flex: 1;
}
.signature-image {
font-family: 'Segoe Script', 'Brush Script MT', cursive;
font-style: italic;
font-size: 26px;
color: #333333;
border-bottom: 1px solid #dddddd;
padding-bottom: 8px;
margin-bottom: 6px;
min-height: 34px;
}
.signature-caption {
font-size: 10px;
color: #aaaaaa;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.status-badge {
display: inline-block;
font-size: 11px;
font-weight: 600;
padding: 4px 12px;
border-radius: 100px;
background: #eef7f0;
color: #1bb157;
letter-spacing: 0.02em;
}
.footer {
display: flex;
justify-content: space-between;
align-items: center;
border-top: 1px solid #ececec;
padding-top: 20px;
margin-top: 40px;
font-size: 10px;
color: #999999;
}
</style>
</head>
<body>
<div class="doc">

<div class="header">
<div>
<p class="header-title">Contractor onboarding confirmation</p>
<p class="header-sub">Identity, tax, and NDA record</p>
</div>
<div class="header-meta">
<div><b>Reference:</b> CO-@rowid</div>
<div><b>Submitted:</b> @created_at</div>
</div>
</div>

<div class="section">
<div class="section-title">Contractor details</div>
<div class="field-grid">
<div class="field">
<div class="field-label">Full legal name</div>
<div class="field-value">@full_legal_name</div>
</div>
<div class="field">
<div class="field-label">Email address</div>
<div class="field-value">@email_address</div>
</div>
<div class="field">
<div class="field-label">Engagement type</div>
<div class="field-value">@engagement_type</div>
</div>
<div class="field">
<div class="field-label">Start date</div>
<div class="field-value">@start_date</div>
</div>
<div class="field full-width">
<div class="field-label">Country filed for tax purposes</div>
<div class="field-value">@tax_country</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Tax documentation on file</div>
<div class="field-grid single">
<div class="field">
<div class="field-label">W-9 (US contractors)</div>
<div class="field-value">@w9_upload</div>
</div>
<div class="field">
<div class="field-label">W-8BEN (international contractors)</div>
<div class="field-value">@w8ben_upload</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">NDA agreement</div>
<div class="consent-block">
By signing below, the contractor named above confirms they have read and agree to the terms of the non-disclosure agreement provided as part of this onboarding process, and acknowledges that this signature is intended as a legally binding acceptance of those terms.
</div>
<div class="signature-row">
<div class="signature-block">
<div class="signature-image">@nda_signature</div>
<div class="signature-caption">Contractor signature</div>
</div>
<div class="signature-block">
<div class="signature-image">@full_legal_name</div>
<div class="signature-caption">Printed name</div>
</div>
</div>
</div>

<div class="section">
<div class="section-title">Onboarding status</div>
<span class="status-badge">@status</span>
</div>

<div class="footer">
<div>Confidential — internal onboarding record. Not for external distribution.</div>
<div>Formaloo</div>
</div>

</div>
</body>
</html>

3. Reference your fields with @ variables: Use @full_legal_name, @email_address, @tax_country, @w9_upload, @w8ben_upload, @nda_signature, @status, @rowid, and @created_at wherever those values should appear.

4. Name the template and click Save.

Note: This PDF is an internal audit record, not something to email the contractor. Keep it off any outgoing email and let HR and IT pull it from the response row when they need it.

Part 5 — Wire the routing logic that assigns, generates the PDF, and sends each email

This is the part that actually moves a submission from "just arrived" to "IT is on it" to "done," without anyone manually forwarding anything.

💡 Want a rule to fire the moment a form is first submitted? See what On Submit logic is and how it works. Want a rule to fire whenever an existing submission changes, like Status flipping to a new stage? See what On Update logic is and how it works. This workflow uses both.

1. Add the On Submit rule: In Advanced logic, open the On Submit tab and click Add rule. Set the actions: assign 'Status' to 'Submitted,' assign 'Assignee' to your HR onboarding team, send the 'Submission received' template to @email_address, send the 'New submission for review' template to your HR team's shared inbox, and generate a PDF using your onboarding PDF template.

💡 Want incoming submissions to land on the right person's desk automatically? See how to automatically assign submissions to the right team member or team, the mechanic behind every Assign action in this guide. Teams themselves are set up under what a team is in Formaloo and how to manage it, so create your HR onboarding team and IT team there first if you haven't already.

2. Add the On Update rule for the IT handoff: Open the On Update tab and click Add rule. Condition: 'Status' is changed to 'Pending IT provisioning.' Actions: assign 'Assignee' to your IT team, and send the 'New IT access request' template to the IT team's shared inbox.

3. Add the On Update rule for completion: Add a second On Update rule. Condition: 'IT provisioning complete' is changed to 'Yes.' Actions: assign 'Status' to 'Access granted,' and send the 'You're all set' template to @email_address.

4. Click Save in the top-right corner.

Note: HR moves a record to "Pending IT provisioning" manually once documents check out, which is what actually triggers the handoff to IT.

Part 6 — Activate the portal and build each team's pages

The last piece is giving contractors, HR, and IT each their own view: contractors track their own status, HR sees everything, and IT sees only the requests waiting on them, nothing else in your workspace.

💡 Want to give clients, applicants, or teammates their own space to submit and track requests? See how to create a portal and manage users' access, the foundational guide for everything in this part.

1. Activate the portal: Open your project, click the gear icon, and select Activate portal. Click Manage users, then run the Setup wizard: connect a new user directory for contractors, configure login and sign-up settings, then enable the user profile on your onboarding form so contractors only see their own submissions.

2. Build the contractor's submit page: Add your onboarding form as a Form block on its own page, titled "Submit your onboarding paperwork."

3. Build the contractor's status page: Add a Table data block titled "My onboarding status," connected to the same form. Switch to Edit mode, open Options, scroll to Manage access, select the profile field, and toggle on Allow users to view only their data. Leave editing off, since this page is read-only.

💡 Want each logged-in user to see only their own submissions, never anyone else's? See how to let users view and edit their own data in your portal.

4. Build the HR group's pages: Add a Kanban block titled "All contractors," grouped by Status. Add three Table blocks: "New submissions" (sorted newest first, unfiltered), "Pending IT provisioning" (filtered to Status is Pending IT provisioning, oldest first), and "Onboarding complete" (filtered to Status is Access granted).

📖 See how to sort and filter your submissions data for setting up each filter, and how to create a Kanban board for the pipeline view.

5. Restrict the HR pages to your HR team: On each HR page, open the three-dot menu and click Access. Under internal users, select your HR onboarding team so no one outside HR sees these pages by default.

💡 Want a whole page visible only to a specific role, not just filtered data within a shared page? See how to restrict users' access to pages in your portal. This is exactly how the IT-only queue below stays invisible to the rest of the workspace.

6. Build and restrict the IT team's pages: Add a Table block titled "IT access queue," filtered to Status is Pending IT provisioning, sorted oldest first. Add a Kanban block titled "My assigned handoffs," grouped by Status. On both pages, open Access and restrict them to your IT team, the same way you did for HR.

7. Scope "My assigned handoffs" to each IT member's own queue: Switch that block to Edit mode, open Options, scroll to Manage access, select the Assignee field, and toggle on Allow assignees to view only their data. Now each IT team member sees only the requests assigned to them.

What you now have

A single form now handles a contractor's entire onboarding paperwork, the right tax document for their country, and a legally binding NDA signature, all encrypted by default and backed by an internal PDF record. Status changes alone move the record from HR's queue to IT's, and Assignee-based access means IT only ever sees the requests waiting on them, never the rest of your workspace's data. Contractors get a real answer to "am I set to start yet" without emailing anyone, and every handoff between teams is timestamped and traceable.

What's next

Ready-to-use templates

Don't build this from scratch, we've already put it together for you.

  • Patient intake & consent workflow for healthcare — A two-page intake and consent form with conditional logic, a PDF consent document, and an admin Kanban pipeline. The same shape as this guide's signature-plus-PDF-plus-pipeline structure, just for a different industry.

  • Job applicant tracking workflow — Tracks applicants across hiring stages with status updates and reviewer assignments. Useful for seeing how Status-driven, multi-team routing looks on a different workforce workflow.

  • Employee request workflow — Internal request management that routes by type and notifies the right team. A close analog to the HR-to-IT handoff built in Part 5.

Learn more how-tos

Did this answer your question?