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
Applicants this week
Alex Chen
Senior Product Designer
Priya Raman
Senior Product Designer
Sam Okafor
Backend Engineer
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.
<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