For hiring teams

Every applicant, one format —
not sixty different emails.

Resume, experience level, and portfolio link arrive as the same structured fields every time, so comparing candidates means scrolling a dashboard — not fifteen open Gmail tabs.

  • Resume & portfolio uploads
  • Spam filtered server-side
  • Free to start — no credit card

Now hiring

Senior Product Designer

Drop your resume here

or click to browse — PDF or DOCX

Portfolio URL
Experience level

Applicants this week

A

Alex Chen

Senior Product Designer

18m
P

Priya Raman

Senior Product Designer

2h
S

Sam Okafor

Backend Engineer

5h

What a "careers@" inbox actually looks like

Every resume comes as its own email, in its own format, answering its own subset of the questions that actually matter for the role.

A different format every time

One resume as a PDF attachment, another pasted into the email body — nothing to compare side by side.

Inconsistent screening

Some candidates answer the question that actually matters for the role; others never saw it, since email invites a free-form reply.

One role's form, every role's questions

A generic "careers@" address can't ask a designer for a portfolio and an engineer for a GitHub link at the same time.

No record of who reviewed what

Feedback scattered across forwarded threads means nobody can reconstruct why a candidate did or didn't move forward.

What to actually put on the form

Three groups of fields cover most roles — start here and drop what doesn't apply.

The basics

  • Name, email, phone

    Standard text and email fields — required.

  • Resume

    A required file upload, PDF or DOCX.

  • Cover letter (optional)

    A second file field, or a textarea if you'd rather read it inline.

Fit for the role

  • Portfolio or work samples

    A URL field — a site, GitHub, or Behance link.

  • Years of experience

    A select field beats a free-text guess at parsing.

  • Why this role

    One open-ended textarea question beats five shallow ones.

Logistics

  • Availability start date

    A clean date field — not a synced calendar.

  • Salary expectations (optional)

    A select range if you'd rather not read exact numbers upfront.

  • How did you hear about us

    A select field — genuinely useful for sourcing data over time.

Built for reviewing candidates, not just receiving them

The pieces a hiring process actually needs, without the weight of a full applicant tracking system.

Resume & portfolio uploads

Single or multiple file uploads for a resume, cover letter, and work samples — no separate tool needed.

One form per role

Each posting gets its own tailored form and link — no conditional logic to build or maintain.

Route by team

Send each role's applications to the right hiring manager, with CC for whoever else needs visibility.

Role-based review access

Admins manage the forms; other reviewers just read and work the applications from the same dashboard.

Spam protection built in

Server-side spam detection runs automatically, with optional reCAPTCHA or Turnstile once a posting goes public.

A hosted page if you need one

No careers page yet? Publish an application page at its own subdomain using the "Job application" template.

Job application forms that fit how hiring actually works

A resume is a file, not a paragraph, so it needs a real file upload — single or multiple, for a resume plus a cover letter or work samples. Everything around it works best as its own field: experience level as a select, a portfolio or LinkedIn URL as a link field, a preferred start date. Since each NBForms form is one straightforward page with no conditional logic between fields, the cleanest way to handle several open roles isn't one giant dynamic form — it's one tailored form per posting, each with its own link and exactly the questions that role needs.

Routing follows your team structure: point an engineering posting's applications at the engineering manager, a design posting's at design leadership, with CC for whoever else needs visibility — on separate forms, or on one form with multiple notification recipients. Role-based team access means an admin sets up and edits the forms while other reviewers just read and work the applications, without needing shared inbox access. NBForms doesn't include applicant tracking or automated resume screening — no scoring, no pipeline stages — but a webhook, Zapier, or Make connection can push every new application into whatever ATS or spreadsheet your team already uses. Server-side spam filtering runs on every submission automatically, useful the moment a posting goes public on a job board.

A careers page just needs a form whose action points at your NBForms endpoint — true whether it's built in Webflow, WordPress, a static site, or a framework-based app, with matching snippets for 16 stacks if the careers page is code-first. No careers page yet? Publish a hosted application page from the "Job application" template in the template library and link it from a job board post directly. Building forms is free, and pricing beyond the free tier is pay-as-you-go credits — it doesn't scale with headcount or how many roles are open at once.

At a glance

  • No backend or server required — just an HTML form action
  • Single & multi-file uploads for resumes and work samples
  • One tailored form per role — no conditional-logic wizard
  • Multiple notification recipients, routed by hiring team
  • No built-in ATS — connect a webhook, Zapier, or Make instead
  • Free to start, pay-as-you-go credits beyond that

A job application form you can paste today

Resume upload plus the structured fields that actually help a review. Styled with Tailwind CSS out of the box.

job-application.html
<form action="https://api.nbforms.com" method="POST" class="space-y-5 max-w-md min-w-[400px]">
  <input type="hidden" name="_token" value="YOUR_TOKEN" />
  <input type="hidden" name="role" value="Senior Product Designer" />

  <div class="mb-1">
    <h2 class="text-xl font-bold text-gray-900 tracking-tight">Apply for this role</h2>
    <p class="text-sm text-gray-500 mt-1">We review applications weekly and follow up within two weeks.</p>
  </div>

  <div class="grid grid-cols-2 gap-4">
    <div>
      <label class="block text-xs font-semibold text-gray-700 mb-1.5">Full name</label>
      <input type="text" name="name" required class="w-full rounded-xl border border-gray-200 bg-gray-50 px-3.5 py-2.5 text-sm text-gray-900 shadow-sm outline-none transition-all focus:bg-white focus:border-[#1d4ed8] focus:ring-4 focus:ring-[#1d4ed8]/10" />
    </div>
    <div>
      <label class="block text-xs font-semibold text-gray-700 mb-1.5">Email</label>
      <input type="email" name="email" required class="w-full rounded-xl border border-gray-200 bg-gray-50 px-3.5 py-2.5 text-sm text-gray-900 shadow-sm outline-none transition-all focus:bg-white focus:border-[#1d4ed8] focus:ring-4 focus:ring-[#1d4ed8]/10" />
    </div>
  </div>

  <div>
    <label class="block text-xs font-semibold text-gray-700 mb-1.5">Portfolio or LinkedIn URL</label>
    <input type="url" name="portfolio_url" class="w-full rounded-xl border border-gray-200 bg-gray-50 px-3.5 py-2.5 text-sm text-gray-900 shadow-sm outline-none transition-all focus:bg-white focus:border-[#1d4ed8] focus:ring-4 focus:ring-[#1d4ed8]/10" />
  </div>

  <div class="grid grid-cols-2 gap-4">
    <div>
      <label class="block text-xs font-semibold text-gray-700 mb-1.5">Years of experience</label>
      <select name="experience_level" class="w-full rounded-xl border border-gray-200 bg-gray-50 px-3.5 py-2.5 text-sm text-gray-900 shadow-sm outline-none transition-all focus:bg-white focus:border-[#1d4ed8] focus:ring-4 focus:ring-[#1d4ed8]/10">
        <option>0–2 years</option>
        <option>3–5 years</option>
        <option>6–10 years</option>
        <option>10+ years</option>
      </select>
    </div>
    <div>
      <label class="block text-xs font-semibold text-gray-700 mb-1.5">Earliest start date</label>
      <input type="date" name="start_date" class="w-full rounded-xl border border-gray-200 bg-gray-50 px-3.5 py-2.5 text-sm text-gray-900 shadow-sm outline-none transition-all focus:bg-white focus:border-[#1d4ed8] focus:ring-4 focus:ring-[#1d4ed8]/10" />
    </div>
  </div>

  <div>
    <label class="block text-xs font-semibold text-gray-700 mb-1.5">Resume</label>
    <input type="file" name="resume" required class="w-full text-sm text-gray-600 file:mr-3 file:rounded-lg file:border-0 file:bg-[#1d4ed8]/10 file:px-3 file:py-2 file:text-xs file:font-semibold file:text-[#1d4ed8] hover:file:bg-[#1d4ed8]/15 transition-colors" />
  </div>

  <div>
    <label class="block text-xs font-semibold text-gray-700 mb-1.5">Why this role?</label>
    <textarea name="why_this_role" rows="3" class="w-full rounded-xl border border-gray-200 bg-gray-50 px-3.5 py-2.5 text-sm text-gray-900 shadow-sm outline-none transition-all focus:bg-white focus:border-[#1d4ed8] focus:ring-4 focus:ring-[#1d4ed8]/10"></textarea>
  </div>

  <button type="submit" class="w-full rounded-full bg-[#1d4ed8] px-4 py-3 text-sm font-semibold text-white shadow-lg shadow-[#1d4ed8]/25 transition-all hover:brightness-110">Submit Application</button>
</form>

Replace YOUR_TOKEN with the token from your form's setup page, and give each posting's copy of this form its own role value. Keep or drop the Tailwind classes — NBForms only cares about the action and field names.

Job application forms — FAQ

Can candidates upload a resume and other files?

Yes. Add a file field for a required resume upload, and a second file or multi-file field for a cover letter, portfolio PDF, or work samples.

Can I ask different questions for different roles?

Not within a single dynamic form — there's no conditional logic between fields. The straightforward way is one form per open role, each with its own link and exactly the questions that posting needs.

Is this a multi-step application wizard?

No. Each form is a single page — there's no page-by-page wizard or progress bar built in. Group related fields with clear labels instead, the way the field groups above are organized.

Does this include applicant tracking or resume screening?

No — there's no ATS functionality, automated scoring, or pipeline stages. Applications land in your dashboard as structured submissions; connect a webhook, Zapier, or Make to push them into an ATS or spreadsheet you already use.

Can applications for different roles go to different hiring managers?

Yes. Each form supports multiple notification recipients plus CC, so an engineering posting can alert the engineering manager while a design posting notifies design leadership.

Does this send candidates an automatic confirmation email?

Not built in, no — NBForms has no auto-responder feature for confirming receipt. What you can set is a custom thank-you message or a redirect to a "thanks for applying" page, alongside the instant alert you get as the hiring team.

What does this cost for a hiring team?

Creating and building forms is free. Beyond the free monthly submission quota, pricing is pay-as-you-go credits — it doesn't scale with headcount or how many roles you have open.

Stop reviewing hiring from your inbox

Free to start. No credit card. One form per role, live in minutes.

Build Your Application Form