Custom questions allow you to collect specific information from applicants beyond the standard resume and contact details. You can add various types of questions to tailor the application process to your hiring needs.
Question types
WeGotWork supports several question types to gather different kinds of information:
SHORT_ANSWER
Best for brief, single-line responses like job titles or years of experience.
{
type : "SHORT_ANSWER" ,
label : "What is your current job title?" ,
placeholder : "e.g., Senior Software Engineer" ,
required : true
}
LONG_ANSWER
Ideal for detailed responses like motivation letters or project descriptions.
{
type : "LONG_ANSWER" ,
label : "Why are you interested in this position?" ,
placeholder : "Tell us about your motivation..." ,
required : true
}
SELECT
Provides a dropdown menu for single-choice selections.
{
type : "SELECT" ,
label : "How did you hear about us?" ,
options : [ "LinkedIn" , "Job Board" , "Referral" , "Company Website" ],
required : false
}
MULTI_SELECT
Allows applicants to select multiple options from a list.
{
type : "MULTI_SELECT" ,
label : "Which programming languages are you proficient in?" ,
options : [ "JavaScript" , "Python" , "Java" , "Go" , "Rust" ],
required : true
}
CHECKBOX
Useful for yes/no questions or consent requirements.
{
type : "CHECKBOX" ,
label : "I confirm that I am eligible to work in this country" ,
required : true
}
FILE
Enables applicants to upload additional documents like portfolios or certificates.
{
type : "FILE" ,
label : "Upload your portfolio (optional)" ,
placeholder : "PDF, max 10MB" ,
required : false
}
Adding questions to jobs
You can add custom questions when creating or editing a job posting. Questions are stored in the JobQuestion model and linked to specific jobs.
Create job with questions
Update job questions
const job = await prisma . job . create ({
data: {
title: "Frontend Developer" ,
organizationId: organization . id ,
questions: {
create: [
{
type: "SHORT_ANSWER" ,
label: "Years of React experience" ,
placeholder: "e.g., 3 years" ,
required: true ,
order: 0
},
{
type: "MULTI_SELECT" ,
label: "Select your frontend skills" ,
options: [ "React" , "Vue" , "Angular" , "Svelte" ],
required: true ,
order: 1
}
]
}
}
});
Database schema
The JobQuestion model in your Prisma schema:
model JobQuestion {
id String @id @default ( cuid ())
jobId String
job Job @relation ( fields : [ jobId ], references : [ id ], onDelete : Cascade )
type String // SHORT_ANSWER, LONG_ANSWER, SELECT, etc.
label String
placeholder String ?
required Boolean @default ( false )
options String [] // For SELECT or MULTI_SELECT
order Int @default ( 0 )
createdAt DateTime @default ( now ())
updatedAt DateTime @updatedAt
@@index ( [ jobId ] )
@@map ( "job_question" )
}
Ordering questions
Use the order field to control the sequence in which questions appear to applicants. Questions are typically sorted in ascending order:
const questions = await prisma . jobQuestion . findMany ({
where: { jobId },
orderBy: { order: "asc" }
});
Keep your application forms concise. Aim for 3-5 custom questions to avoid applicant drop-off.
Applicant responses
Applicant responses to custom questions are stored in the Applicant.responses JSON field, allowing you to review answers alongside their resume and other application materials.
const applicant = await prisma . applicant . findUnique ({
where: { id: applicantId },
include: { job: { include: { questions: true } } }
});
console . log ( applicant . responses );
// { "question-id-1": "5 years", "question-id-2": ["React", "Vue"] }