Return to overview
CV & Data Automation
Remo Vloet7 min.

Designing a recruitment data model

Decide what belongs to a candidate, a job or an application before adding more fields. Your records need to make sense when those relationships change.

On this page

A candidate withdraws from one job but has an interview booked for another. If you change their profile status to ‘withdrawn’, what will the next recruiter see? That small problem reveals a bigger design choice: information about a person isn’t the same as information about their application.

A recruitment data model defines the types of records your agency keeps and the relationships between them. It gives a fact a home. Before anyone adds a field, the team should know what it means, where it belongs and who can change it.

Key takeaways

  • Keep information about a person separate from their progress on a particular job.
  • Give a relationship its own record when it needs dates, an owner or a status.
  • Write down the meaning, source and responsibility for each field.
  • Test changes, duplicate entry and restricted access before importing real data.

Which records does your agency need?

Start with things that can exist independently: a candidate without an application, a client without an open job or a contact who moves to another company. Give each a record and connect them through relationships. That saves you from copying the same details into a fresh record for every assignment.

The following is a design exercise for a fictional permanent recruitment agency, not a required configuration for every ATS.

RecordWhat it representsInformation that belongs here
CandidateA person with whom the agency has a candidate relationshipContact details and agreed contact preferences
CompanyAn organisation the agency recruits for or keeps in touch withCompany name and responsible account team
ContactA person on the client sideBusiness contact details
JobA specific recruitment assignmentRequirements and responsible recruiter
ApplicationOne candidate’s involvement in one jobStage, feedback and next appointment

A client contact might also become a candidate. Decide whether your system uses one person record with different roles or separate records with a controlled link. Two roles don’t necessarily call for two independently maintained copies of a phone number.

When should a relationship become a record?

A relationship needs more than a simple link when you need to record facts about the connection itself. Candidates can apply for several jobs, and a job can attract several candidates. An application holds information about one candidate-job pair, such as an invitation, feedback or withdrawal date.

Microsoft’s explanation of table relationships distinguishes one-to-many from many-to-many relationships. The next question for an agency is what the relationship must tell you. Linking a person to a job doesn’t, by itself, say which interview they have reached.

Consider client contacts too. A contact may represent more than one company. If you overwrite a single ‘employer’ field when someone moves, an old conversation may become difficult to interpret. A relationship with start and end dates could preserve that context. Use it where the history matters; don’t build a separate object for every imaginable exception.

How do you give fields a shared meaning?

Write a short definition before creating a field. ‘Available’ might mean open to a conversation to one recruiter and ready to start next week to another. Separate those meanings when the team actually needs to use them independently.

A small data dictionary could look like this:

FieldDefinitionSource and responsibility
Available fromPossible start date stated by the candidateRecruiter confirms the date and records when
Application stageCurrent step for this candidate on this jobRecruiter responsible for the process
Client feedbackDated response about this applicationRecipient records who supplied it
Next actionA specific action with an owner and due datePerson accepting the commitment

A blank isn’t always a mistake. Nobody may have asked about a start date yet. Distinguish ‘unknown’, ‘not applicable’ and a confirmed value where that difference affects the work. An AI parser shouldn’t turn a missing date into a plausible guess.

A required field without a responsible owner creates another problem. Colleagues may fill it just to get past a form, despite having no reliable source. The record looks complete while telling the team very little.

How do you keep copies from contradicting each other?

Use stable record IDs for references and decide which record owns each fact. A name isn’t a dependable identifier: people can share names or change them. An email address can also change or belong to a shared mailbox.

Agree who reviews a suspected duplicate before anyone merges records. Compare relevant contact details and applications as well as the name. Keep one source for current information and make sure existing relationships still point to the right record.

Decide how to handle historical relationships too. A completed application may still explain an earlier rejection, so removing a link differs from deleting a whole record. Align that choice with your retention policy.

Who should be allowed to change each record?

Include access in the design. A recruiter may own an application without needing every piece of information held by a colleague. Consider permissions by record type and, where needed, by field. Test the result using an ordinary user account rather than only an administrator account.

In Simply, you can mark a field as sensitive and limit access to the appropriate roles. A salary expectation, for example, need not be visible to every colleague. Keep field definitions with an administrator so that a new name or meaning is agreed with the team first.

In Simply’s ATS and CRM, an administrator creates objects, fields and relationships and configures access. For example, add ‘available from’ as a date field on the candidate and define it in your data dictionary. Simply Ask can also prepare a model proposal for an administrator to review before it is applied.

What does a one-candidate, two-job test reveal?

Consider this fictional example. Noor has one candidate profile. She has an interview for job A but withdraws from job B. The team records two applications and changes only the stage for B. Her appointment for A remains in place.

Noor then supplies a new phone number. A colleague updates the person record and checks that both applications still point to the current profile. The historical withdrawal from B stays unchanged. Using a restricted account, the colleague also checks which notes they can read.

Discuss the example with the colleague entering the data. Is it clear where the new agreement belongs and which information the other application shares? Adjust the model if that distinction is still unclear.

Keep the expected and observed results together. If a difference exposes an unresolved design choice, revise the model first. Imports and automated extraction come afterwards.

How can you start without a large data project?

Choose a current workflow and draw the records it uses. Walk through a real type of change with a recruiter, such as a client contact moving company or a candidate joining another process. Remove fields that nobody can connect to a clear use.

Bring that drawing to a Simply demo. Ask to see the candidate, both applications and the access check in the same environment. A useful model lets colleagues recover the right information after the situation has changed.

Share this post

About the author

Remo Vloet

Remo Vloet is a co-founder of Simply, the AI Operating System for recruitment agencies: inbox, meetings, sourcing, CV parsing, search and matching, documents and automation in one system. With a background in building complex software, he contributes to the technical vision behind Simply.

LinkedInArticles by Remo Vloet

Frequently asked questions

Is a recruitment data model just a list of fields?

No. It also defines record types, relationships and the meaning of the information. A field only has context once you know which record owns it.

Should an application status sit on the candidate profile?

A status for a particular job belongs to the application. General preferences or availability can belong to the candidate, with a clear definition and source.

Does every recruitment process need a separate object?

No. Create an object when you need to manage something independently or when a relationship needs information of its own. Start with the process your team uses today.

Can AI decide the data model for you?

AI can help draft a proposal, but the agency must check definitions and exceptions. It doesn't automatically know who may change a field or what your team means by ‘available’.

When is the model ready for an import?

When representative records and changes produce the agreed results, including restricted access and duplicate entry. Document unresolved limits before moving real data.

More in CV & Data Automation

Chase less,place more.

Find out how Simply can completely evolve your workflow. No slides, just product.

Cookie settings

Choose which optional cookies we may use; our cookie policy explains each one. Optional categories are off until you turn them on, and you can change this at any time from the footer.

Necessary

Keeps the site secure and remembers your language and these choices. These cannot be switched off.

Always on
What this includes
  • simply_lang · Simply

    Remembers the language you picked in the footer.

    Stores: Cookie, 1 year

  • simply_consent · Simply

    Remembers the choices you make here.

    Stores: Local storage, 12 months

  • Cloudflare Web Analytics · Cloudflare

    Counts page views and measures loading speed, without identifying you.

    Stores: No cookies

  • Cloudflare Turnstile · Cloudflare

    Checks the demo request form is sent by a person, not a bot.

    Stores: No cookies

Analytics

Shows us how visitors use the site, so we can improve it.

What this includes
  • Google Analytics · Google

    Counts visits and shows which pages are used.

    Stores: _ga, _ga_*: 2 years

  • Contentsquare · Contentsquare

    Analyses clicks and scrolling, with form input masked.

    Stores: _cs_id, _cs_c: 13 months; _cs_s: 30 minutes

Marketing

Measures our ads and campaigns, and lets us show relevant ads on other sites.

What this includes
  • Google Ads · Google

    Measures which ads lead to a demo request.

    Stores: _gcl_au: 90 days

  • Meta Pixel · Meta

    Measures conversions and supports retargeting on Facebook and Instagram.

    Stores: _fbp: 90 days

  • LinkedIn Insight Tag · LinkedIn

    Measures conversions and supports retargeting on LinkedIn.

    Stores: bcookie, li_sugr, lidc and others on linkedin.com: 1 day to 1 year

  • Factors.ai · Factors.ai

    Identifies visiting companies and attributes visits to campaigns.

    Stores: _fuid: 400 days

Google Tag Manager loads the Google, analytics and marketing tags above only after you allow them.