Student Placement CRM Data Model

Build a 9-object Salesforce CRM data model for a student placement office.

Introduction

30 Second Summary

Every college placement season, placement officers juggle hundreds of students, dozens of recruiting companies, and thousands of applications across scattered spreadsheets. Students miss deadlines, companies lose track of candidates, and opportunities slip through the cracks.

In this project, you will build the complete data model for a Student Career & Placement CRM in Salesforce. You will create 9 interconnected custom objects, model many-to-many relationships with junction objects, and add validation rules that enforce data integrity across the entire placement pipeline.

What You'll Build

When you are done, you will have a fully connected Salesforce app where you can create a student, assign their skills, browse job postings from companies, submit applications, track interviews, and watch a placement offer appear on the student's profile.

By the end of this project, you'll have:

  • A Student Career CRM Lightning App where you can navigate between students, companies, job postings, applications, interviews, and placements all in one dedicated workspace.
  • Many-to-many skill tracking through two junction objects, so you can assign multiple skills to a student and tag required skills on each job posting, seeing both connections from the same record page.
  • Data integrity guardrails with three validation rules that instantly block a CGPA of 12, a deadline set in the past, or a gibberish email address the moment someone tries to save.
  • Secret Mission: Build a Placement Pipeline Report and Dashboard for real-time visibility into placement status.

Do I need anything before starting?

This project uses a free Salesforce Trailhead Playground or Developer Edition org. You should be comfortable navigating Salesforce Setup and creating basic records.

Before We Start

You are about to build the complete data foundation for a Student Career and Placement CRM in Salesforce. Before you start clicking through Setup, take a moment to commit to what you are building and why this 9-object data model matters for a college placement office.

Create the Lightning App and Student Object

Every CRM needs a home base and a central entity. Without these, your placement data has nowhere to live and no way to organize itself.

In this step, you will create a Lightning App called Student Career CRM as your dedicated workspace. You will also build the Student custom object with nine fields that capture everything a placement office needs to know about each student.

In this step, get ready to:
  • Create a Lightning App called Student Career CRM.
  • Build the Student custom object with nine fields covering personal info, academics, and profile details.
  • Verify your setup by creating a test Student record.
Create a new Lightning App

A Lightning App is a container that groups your tabs, objects, and tools into one workspace. Think of it as a custom control panel built specifically for placement operations.

  • In your Salesforce org, click the gear icon in the top right corner.
  • Select **Setup**.
  • Type App Manager in the Quick Find box on the left.
  • Select App Manager from the results.
  • Click New Lightning App in the top right.
  • Enter Student Career CRM in the App Name field.
  • Click Next.
  • On the App Options screen, leave the defaults and click Next.

What is the App Options screen?

This screen lets you configure optional features like a utility bar. You do not need any of these for this project, so clicking through is fine.

  • On the Utility Items screen, leave the defaults and click Next.
  • On the Navigation Items screen, find Home in the Available Items list.
  • Click the right arrow to move Home into the Selected Items list.
  • Click Next.
  • On the Assign to User Profiles screen, check the box next to System Administrator.
  • Click Save & Finish.

You should see a confirmation message, and Student Career CRM now appears in the App Manager list.

What is a Lightning App?

A Lightning App groups tabs, objects, and navigation into a single workspace. Instead of searching for each object separately, you open one app and everything you need is right there.

You only added Home for now. You will add more tabs as you create objects throughout this project.

Don't see the New Lightning App button?

Make sure you are in Setup (gear icon, then Setup), not in the regular app view. Also confirm you are logged in as a System Administrator.

Help me find the App Manager in Salesforce Setup

Create the Student custom object and add its fields

Custom objects are database tables that store your data. The Student object is the anchor of the entire placement pipeline. Every application, interview, and placement will trace back to a Student record.

  • In Setup, click the Object Manager tab at the top (next to Home).
  • Click Create in the top right and select Custom Object.
  • Enter Student in the Label field.
  • Enter Students in the Plural Label field.
  • Under Record Name, keep the Data Type as Text. The label should say Student Name.
  • Scroll down and check Allow Reports.
  • Check Launch New Custom Tab Wizard after saving this custom object.
  • Click Save.

The Tab Wizard opens automatically. This creates a navigation tab for the Student object.

  • Pick any tab style (icon) you like.
  • Click Next.
  • Click Next again to accept the default profile visibility.
  • Click Save.

You are now on the Student object's detail page in Object Manager. The object exists, but it only has the default standard fields. Time to add your custom fields.

What is the __c suffix?

Salesforce automatically adds __c to the API name of every custom object and field. When you type Student as the label, Salesforce creates Student__c as the API name. This suffix tells Salesforce it is custom, not a built-in standard object.

You will now create nine custom fields on the Student object. Each field follows the same pattern, so let's walk through the first one step by step.

  • On the Student object page, click Fields & Relationships in the left sidebar.
  • Click New.
  • Select Email as the data type.
  • Click Next.
  • Enter Email in the Field Label field. The Field Name auto-fills as Email.
  • Click Next to accept the field-level security defaults.
  • Click Next again to add it to the page layout.
  • Click Save & New to create the field and start the next one immediately.

The field creation pattern

Every field follows this same flow: select the data type, enter the label, then click through the security and page layout screens. Use **Save & New** to chain field creation without navigating back each time.

Now create the remaining personal info fields. Follow the same pattern for each.

  • Create a Phone field: select Phone as the data type, enter Phone as the label.
  • Create a Department field: select Picklist as the data type, enter Department as the label.

How do I add Picklist values?

When you select Picklist as the data type, the next screen asks you to enter values. Type each value on its own line in the text area. For Department, enter these six values, one per line:

CS, IT, ECE, EEE, ME, CE.

  • Create a Year of Study field: select Picklist, enter Year of Study as the label. Enter these values one per line: 1st Year, 2nd Year, 3rd Year, 4th Year.

Go back to Fields & Relationships on the Student object. You should see Email, Phone, Department, and Year of Study in the list alongside the standard fields.

Five more fields to go. Click **New** to continue.

  • Create a CGPA field: select Number as the data type, enter CGPA as the label, and set Decimal Places to 2.
  • Create a Placement Status field: select Picklist, enter Placement Status as the label. Enter these values one per line: Not Placed, Applied, In Process, Placed.

Set the default value

On the Placement Status picklist screen, look for an option to set a default value and choose Not Placed. Every new student record should start as Not Placed until they enter the pipeline.

  • Create a Resume URL field: select URL as the data type, enter Resume URL as the label.
  • Create a LinkedIn Profile field: select URL as the data type, enter LinkedIn Profile as the label.
  • Create an About Me field: select Long Text Area as the data type, enter About Me as the label, and set the Length to 5000 characters.
  • Click Save on the final field (not Save & New, since this is the last one).

Go back to Fields & Relationships on the Student object. You should see all nine custom fields listed alongside the standard Salesforce fields.

Missing a field?

If your count is off, scroll through the full list and compare against these nine custom fields: Email, Phone, Department, Year of Study, CGPA, Placement Status, Resume URL, LinkedIn Profile, About Me. Standard fields like CreatedBy and LastModified are always there and do not count.

I'm missing a field on my Student object. Help me figure out which one.

Add the Students tab to the Lightning App

The Student tab exists, but it is not in your Lightning App's navigation yet. You need to add it to the app so it appears when you open Student Career CRM.

  • In Setup, type App Manager in the Quick Find box.
  • Select App Manager.
  • Find Student Career CRM in the list.
  • Click the dropdown arrow on its row and select Edit.
  • Click Navigation Items in the left sidebar.
  • Find Students in the Available Items list and move it to the Selected Items list.
  • Click Save.

Your Lightning App now has two navigation tabs: Home and Students. Time to test the full setup by creating your first Student record.

Before you create the record, think about this: what fields do you expect to see on the new Student form?

  • Click the App Launcher (the grid icon in the top left corner of your Salesforce org).
  • Search for Student Career CRM and select it.
  • Click the Students tab in the navigation bar.
  • Click New to create a new Student record.
  • Enter Ravi Kumar in the Student Name field.
  • Set Department to CS.
  • Enter 8.5 in the CGPA field.
  • Confirm that Placement Status already shows Not Placed as the default.

Why is Placement Status already filled in?

You set Not Placed as the default value for this picklist. Every new Student record automatically starts with this value, saving the placement office from manually setting it each time.

  • Click Save.

The Ravi Kumar record page opens, showing all the fields you created. You can see the Student Name, Department, CGPA, and Placement Status values you just entered.

Don't see all your fields on the record page?

Some fields may not appear on the record page if they were not added to the page layout during field creation. Go back to Object Manager, open the Student object, click Page Layouts, and verify that all nine fields are on the layout. If any are missing, drag them from the palette onto the layout and save.

Help me add missing fields to my Student page layout

Your app has a home and its first object. Next up, you will build the Skills and Company objects and create your first junction object to connect students to their skills.

Build the Skills and Company Objects

Your Student Career CRM app is live, and Ravi Kumar is sitting in your Students tab as the first record. Now it's time to build the objects that describe what students can do and who might hire them.

Students have skills. Companies offer jobs. These two independent entities need to exist before you can connect them. In this step, you'll create both objects and then link them with a junction object, a special object that models a many-to-many relationship between students and skills.

In this step, get ready to:
  • Create the Skill object to catalog competencies like programming, databases, and soft skills.
  • Create the Company object to track employers and their details.
  • Build the Student_Skill junction object to connect students to their skills with proficiency levels.
Create the Skill object and its fields

The Skill object stores individual competencies that students can have. Each skill gets a name, a category, and an optional description.

  • In your Salesforce org, click the gear icon in the top right corner and select Setup.
  • Click the Object Manager tab at the top of the Setup page.
  • Click Create in the top right, then select Custom Object.
  • Enter Skill in the Label field.
  • Enter Skills in the Plural Label field.
  • Confirm that Record Name is set to Skill Name with Data Type Text.
  • Scroll down and check Allow Reports.
  • Check Launch New Custom Tab Wizard after saving this custom object.

Tab Wizard shortcut

Checking this box saves you a trip to Setup later. It opens the Tab Wizard right after the object is created so you can create a tab in one flow.

  • Click Save.
  • In the Tab Wizard, pick any tab style icon you like and click Next.
  • Click Next again on the profile visibility screen.
  • Click Save to finish creating the tab.

You should land on the Skill object detail page in Object Manager. The Skill tab now exists.

Now add two fields to describe each skill. You already know this flow from creating Student fields in the previous step.

  • In the Skill object page, click Fields & Relationships in the left sidebar, then click New.
  • Select Picklist as the data type and click Next.
  • Enter Category as the Field Label.
  • Select Enter values, with each value separated by a new line and type these values, one per line: Programming, Database, Cloud, Soft Skills, Other.
  • Click Next through the remaining screens and click Save.

The Category__c field now appears in the Fields & Relationships list. Create the second field.

  • Click New again.
  • Select Text Area as the data type and click Next.
  • Enter Description as the Field Label.
  • Click Next through the remaining screens and click Save.

Your Fields & Relationships list for Skill should now show Category and Description alongside the standard fields.

Don't see your new fields?

Make sure you clicked Save on the final wizard screen, not just Next. If you clicked Next past the last screen, the field was not saved.

Also confirm you are looking at the Skill object's Fields & Relationships page, not a different object.

help me find my missing Skill fields in Salesforce Object Manager

Create the Company object and its fields

The Company object tracks the employers who post jobs and recruit from your placement pipeline. It follows the same creation pattern you just used for Skill.

  • Go back to Object Manager and click Create | Custom Object.
  • Enter Company as the Label and Companies as the Plural Label.
  • Confirm Record Name is Company Name with Data Type Text.
  • Check Allow Reports and Launch New Custom Tab Wizard after saving this custom object.
  • Click Save.
  • Complete the Tab Wizard by picking an icon, clicking Next twice, and clicking Save.

You should land on the Company object detail page. Now add six fields to capture employer details.

  • Click Fields & Relationships in the left sidebar, then click New.
  • Create an Industry field with data type Picklist. Enter these values one per line: IT, Finance, Healthcare, Manufacturing, Consulting, Other. Click Next through remaining screens and Save.
  • Create a Website field with data type URL. Click through and Save.
  • Create a Location field with data type Text. Click through and Save.

You should see Industry, Website, and Location in the Fields & Relationships list. Three more fields to go.

  • Create a Company Size field with data type Picklist. Enter these values one per line: Startup, Small, Medium, Large, Enterprise. Click through and Save.
  • Create a Description field with data type Text Area. Click through and Save.
  • Create an Is Active field with data type Checkbox. On the next screen, check Default Value: Checked so that new companies are active by default. Click through and Save.

Your Company object now has all six fields. The Fields & Relationships list should show Company Size, Description, Industry, Is Active, Location, and Website alongside the standard fields.

Missing the Is Active default?

If you forgot to check the default value for Is_Active__c, click into the field from Fields & Relationships, then click Edit. Set the Default Value to Checked and save.

help me fix the default value on my Is Active checkbox field

Build the Student_Skill junction object

A student can have many skills, and a skill can belong to many students. That is a many-to-many relationship, and Salesforce does not support it directly between two objects. You need a third object in the middle to connect them.

What is a junction object?

A junction object sits between two parent objects and has a Master-Detail relationship to each one. Every record in the junction object represents one link between the two parents.

In this case, each Student_Skill record says "this student has this skill at this proficiency level." Ravi Kumar with Python (Advanced) is one record. Ravi Kumar with SQL (Intermediate) is another.

The first Master-Detail you create becomes the primary relationship. It controls ownership and which object's icon the junction inherits.

  • Go back to Object Manager and click Create | Custom Object.
  • Enter Student Skill as the Label and Student Skills as the Plural Label.
  • Change the Record Name Data Type to Auto Number.
  • Set the Display Format to SS-{0000} and the Starting Number to 1.
  • Click Save. Do not check the Tab Wizard checkbox for this object. Junction objects do not need their own tab because you access them through their parent records' related lists.

Why Auto Number for the record name?

Junction records are links, not entities. A junction record connecting "Ravi Kumar" to "Python" does not have a meaningful name of its own. Auto Number gives each record a unique ID like SS-0001 automatically, so the learner does not have to invent a name every time they create a link.

Now add the two Master-Detail relationships and the proficiency field. The first Master-Detail you create becomes the primary relationship.

  • In the Student Skill object page, click Fields & Relationships, then click New.
  • Select Master-Detail Relationship as the data type and click Next.
  • Select Student as the Related To object and click Next.
  • Click Next through the remaining screens and click Save & New to immediately start the next field.
  • Select Master-Detail Relationship again and click Next.
  • Select Skill as the Related To object and click Next.
  • Click Next through the remaining screens and click Save & New.

Both Master-Detail relationships are saved. Now add the proficiency level field.

  • Select Picklist as the data type and click Next.
  • Enter Proficiency Level as the Field Label.
  • Enter these values one per line: Beginner, Intermediate, Advanced, Expert.
  • Click Next through the remaining screens and click Save.

The Student Skill object now has three fields: Student__c (Master-Detail), Skill__c (Master-Detail), and Proficiency_Level__c (Picklist).

The last configuration task is adding your new tabs to the Student Career CRM app so everything lives in one workspace.

  • In Setup, type App Manager in Quick Find and select App Manager.
  • Find Student Career CRM in the list, click the dropdown arrow on the right, and select Edit.
  • Click Navigation Items in the left sidebar.
  • Move Skills and Companies from Available Items to Selected Items.
  • Click Save.

Open the App Launcher (the grid icon in the top left) and select Student Career CRM. You should see Skills and Companies tabs alongside Home and Students.

Tabs not showing up in the app?

Make sure you moved both tabs to the Selected Items column, not just highlighted them. Also try refreshing the browser page. Salesforce sometimes caches navigation items.

If you do not see Skills or Companies in the Available Items list, go back to Object Manager and confirm each object has a custom tab created.

help me add my Skills and Companies tabs to the Student Career CRM app

All three objects are built and your app has their tabs. Time to prove it all works by creating real records.

Start by creating three Skill records to populate your skills catalog.

  • Click the Skills tab in the Student Career CRM app.
  • Click New.
  • Enter Python as the Skill Name and select Programming as the Category.
  • Click Save & New.
  • Create a second skill: Skill Name SQL, Category Database. Click Save & New.
  • Create a third skill: Skill Name Communication, Category Soft Skills. Click Save.

Your Skills list view should now show all three records. Next, create one Company record.

  • Click the Companies tab.
  • Click New.
  • Enter Infosys as the Company Name.
  • Select IT for Industry.
  • Enter Hyderabad for Location.
  • Click Save.

The Infosys company record opens. Notice that Is Active is already checked because you set the default to true.

Now for the real test. You'll create two Student_Skill junction records to link Ravi Kumar to his skills. This proves the many-to-many relationship works.

  • Click the Students tab and click Ravi Kumar to open his record.
  • Scroll down to find the Student Skills related list.
  • Click New on the Student Skills related list.
  • In the Skill lookup field, search for and select Python.
  • Select Advanced for Proficiency Level.
  • Click Save & New.
  • Create a second junction record: select SQL as the Skill and Intermediate as the Proficiency Level.
  • Click Save.

Before you navigate back to Ravi Kumar's record, how many entries do you expect to see in the Student Skills related list?

  • Navigate back to Ravi Kumar's Student record by clicking Ravi Kumar in the breadcrumb at the top of the page, or by clicking Students tab and selecting his record.
  • Scroll down to the Student Skills related list.

You should see two entries: Python (Advanced) and SQL (Intermediate). Each entry has an auto-generated name like SS-0001. That is your many-to-many relationship working. One student, two skills, linked through the junction object.

What just happened?

You created records in three different objects (Student, Skill, Student_Skill) and Salesforce connected them automatically through the Master-Detail relationships. The Student Skills related list on Ravi Kumar's record pulls all Student_Skill records where the Student field points to Ravi.

If you open one of the Skill records (like Python), you'll see a Student Skills related list there too, showing all students who have that skill. That is the "many" side working in both directions.

Don't see the Student Skills related list?

The related list might not be visible on the default page layout. Click the gear icon on the Student record page, select Edit Page to open Lightning App Builder, and add a Related List - Single component for Student Skills. Save and activate the page.

If you see the related list but it is empty, confirm both Student_Skill records have the Student field set to Ravi Kumar. Click into each junction record to verify.

help me find the Student Skills related list on my Student record

Your student-to-skill pipeline is connected. Students can have multiple skills, and each skill can belong to multiple students. Next up, you'll build the employer side of the CRM by creating Job Postings and linking them to the skills they require.

Create Job Postings with Required Skills

Your student-side objects are wired up. Ravi Kumar has skills assigned, and Infosys is in the system as a company. Now you need to build the employer side of the CRM.

Companies post specific jobs with specific requirements. In this step, you'll create a Job_Posting__c object connected to Company, and a junction object that captures which skills each posting demands. This sets the stage for matching students to jobs in future phases.

In this step, get ready to:
  • Create the Job_Posting__c custom object with all its fields.
  • Create the Job_Required_Skill__c junction object linking postings to required skills.
  • Add test data to verify the employer side of the pipeline.
Create the Job Posting custom object

Each company in the placement office posts multiple jobs for students to apply to. The Job_Posting__c object captures these roles with details like title, required CGPA, job type, and application deadline.

  • In Setup, click the Object Manager tab.
  • Click Create | Custom Object.
  • Enter Job Posting in the Label field.
  • Enter Job Postings in the Plural Label field.
  • Under Record Name, change the Data Type dropdown to Auto Number.
  • Enter JP-{0000} in the Display Format field.
  • Enter 1 in the Starting Number field.

What is Auto Number naming?

Unlike Student or Company records where you type a name manually, Job Posting records are auto-numbered. Each new posting gets a sequential ID like JP-0001, JP-0002, and so on.

Auto Number is a better fit for transactional records like job postings, applications, and interviews where a manually typed name would be arbitrary.

  • Check the Allow Reports checkbox.
  • Check Launch New Custom Tab Wizard after saving this custom object.
  • Click Save.

The Tab Wizard opens automatically.

  • Choose any icon you like for the tab style.
  • Click Next.
  • Click Next again on the profiles screen.
  • Click Save.

Your Job Posting custom object and tab are created. Now you need to add the relationship to Company and all the detail fields.

  • Click the Object Manager tab and click Job Posting from the object list.
  • Click Fields & Relationships in the left sidebar.
  • Click New.
  • Select Master-Detail Relationship and click Next.
  • Select Company from the Related To dropdown and click Next.
  • Accept the default field label and click Next through the remaining screens.
  • Click Save.

The Company__c Master-Detail field now appears in the Fields & Relationships list. This relationship means every job posting belongs to exactly one company, and deleting a company automatically removes all its postings.

Why add the Master-Detail relationship first?

The Master-Detail relationship establishes ownership of the record. The Company becomes the parent, and Job Posting becomes the child. Adding it first means that when you create test records later, the parent link is already in place.

Now add the nine remaining fields. The process is the same as in previous steps: click New in Fields & Relationships, select the data type, enter the field label, and click through to Save.

  • Create a Text field labeled Title.
  • Create a Long Text Area field labeled Description.
  • Create a Number field labeled Required CGPA. Set Decimal Places to 2.
  • Create a Picklist field labeled Job Type. Enter the values Full Time, Internship, and Part Time on separate lines.

You should now see Company, Title, Description, Required CGPA, and Job Type in the Fields & Relationships list alongside the standard fields.

  • Create a Text field labeled Location.
  • Create a Date field labeled Application Deadline.
  • Create a Number field labeled Number of Openings. Set Decimal Places to 0.
  • Create a Picklist field labeled Status. Enter the values Open, Closed, and On Hold on separate lines. Check Use first value as default value so that Open is the default.
  • Create a Text field labeled Salary Range.

Confirm that all 10 custom fields now appear in the Fields & Relationships list: Company, Title, Description, Required CGPA, Job Type, Location, Application Deadline, Number of Openings, Status, and Salary Range.

Missing a field?

If a field is not in the list, click New and create it now. Double-check the data type and label match the specifications above.

If you see a field with a typo in its label, click the field name to open its detail page, then click Edit to correct it.

Need help identifying the issue?

Help me figure out which field is missing or misconfigured on my Job Posting object.

Create the Job Required Skill junction object

A single job posting can require many skills, and a single skill can be required by many jobs. This is the same many-to-many pattern you used for Student_Skill__c. The Job_Required_Skill__c junction object sits between Job Posting and Skill, capturing not just which skills are needed but how important each one is.

  • In Object Manager, click Create | Custom Object.
  • Enter Job Required Skill in the Label field.
  • Enter Job Required Skills in the Plural Label field.
  • Change the Record Name data type to Auto Number.
  • Enter JRS-{0000} in the Display Format field.
  • Enter 1 in the Starting Number field.
  • Leave the Launch New Custom Tab Wizard checkbox unchecked.
  • Click Save.

Why no tab for this junction object?

Junction objects are accessed through their parent records' related lists, not directly from a tab. You'll see Job Required Skill records appear on Job Posting record pages, not in their own standalone tab.

Now add the three fields that connect this junction to its parents and capture skill importance.

  • Click Fields & Relationships in the left sidebar.
  • Click New.
  • Select Master-Detail Relationship and click Next.
  • Select Job Posting from the Related To dropdown and click Next.
  • Click Next through the remaining screens and click Save.

The Master-Detail relationship to Job Posting is set. Now add the Lookup relationship to Skill.

  • Click New in Fields & Relationships.
  • Select Lookup Relationship and click Next.
  • Select Skill from the Related To dropdown and click Next.
  • Click Next through the remaining screens and click Save.

Why Lookup instead of Master-Detail for Skill?

The Student_Skill__c junction uses Master-Detail for both parents. This junction is different. If Skill were a Master-Detail parent here, deleting a single Skill record would cascade-delete every Job Required Skill record that references it across all job postings.

Lookup keeps skills independent. Deleting a job posting still removes its required skill records (via the Master-Detail to Job Posting), but skills themselves are never affected.

  • Click New in Fields & Relationships.
  • Select Picklist and click Next.
  • Enter Importance Level in the Field Label field.
  • Enter the values Required, Preferred, and Nice to Have on separate lines.
  • Click Next through the remaining screens and click Save.

The Fields & Relationships list for Job_Required_Skill__c should now show three custom fields: Job Posting (Master-Detail), Skill (Lookup), and Importance Level (Picklist).

Don't see all three fields?

Make sure you are viewing the Job Required Skill object in Object Manager, not Job Posting. Both objects were created in this step, so it is easy to mix them up.

If the Skill field shows as Master-Detail instead of Lookup, delete it and recreate it. Select Lookup Relationship (not Master-Detail) on the field type screen.

Help me troubleshoot my Job Required Skill junction object fields.

✔️ Awesome, I've got everything!

Both objects are ready. Time to add test data and wire everything together.

ⓧ I'd like to double check the full setup

Here is a checklist of everything you should have after creating both objects. Confirm each one in your org.

  • Job_Posting__c object with Auto Number record name (JP-{0000}).
  • 10 custom fields on Job Posting: Company (Master-Detail), Title, Description, Required CGPA, Job Type, Location, Application Deadline, Number of Openings, Status (default Open), Salary Range.
  • Job_Required_Skill__c object with Auto Number record name (JRS-{0000}).
  • 3 custom fields on Job Required Skill: Job Posting (Master-Detail), Skill (Lookup), Importance Level (Picklist).
Create test data and verify the pipeline

Your objects exist, but the employer side of the CRM is not useful until it has data flowing through it. You'll add the Job Postings tab to the app, create a test posting under Infosys, and link required skills to it.

  • In Setup, type App Manager in the Quick Find box and select App Manager.
  • Find Student Career CRM in the list, click the dropdown arrow on the right, and select Edit.
  • Click Navigation Items in the left sidebar.
  • Move Job Postings from Available Items to Selected Items.
  • Click Save.

The Job Postings tab is now part of your Student Career CRM app. Time to create a test job posting from the Infosys company record.

  • Click the App Launcher (the grid icon in the top-left corner) and select Student Career CRM.
  • Click the Companies tab.
  • Click on the Infosys record to open it.
  • Scroll down to the Job Postings related list and click New.

Why create the posting from the Company record?

Because Job Posting has a Master-Detail relationship to Company, creating a new posting from the Infosys record automatically fills in the Company field. This saves a step and ensures the posting is correctly linked to its parent.

  • Enter Software Developer in the Title field.
  • Enter 7.0 in the Required CGPA field.
  • Select Full Time from the Job Type dropdown.
  • Set Application Deadline to any date in the future.
  • Enter 5 in the Number of Openings field.
  • Confirm that Status is already set to Open (the default you configured).
  • Click Save.

The Job Posting record saves and displays the auto-generated number (something like JP-0001). Now add the required skills to this posting.

  • On the Job Posting record page, scroll down to the Job Required Skills related list and click New.
  • In the Skill lookup field, search for and select Python.
  • Select Required from the Importance Level dropdown.
  • Click Save.
  • Click New again in the Job Required Skills related list.
  • Search for and select SQL in the Skill field.
  • Select Preferred from the Importance Level dropdown.
  • Click Save.

Both required skills are saved. Now verify that everything is connected by tracing the chain from the company level down.

Before you check, what do you expect to see on the Infosys company record? Think about which related lists should appear and what records should be in them.

  • Click the Companies tab.
  • Click on the Infosys record.
  • Scroll down to the Job Postings related list.

You should see the Software Developer posting in the related list. Click into it.

  • Click the Software Developer posting to open it.
  • Scroll down to the Job Required Skills related list.

You should see two entries: Python with importance Required, and SQL with importance Preferred. The employer side of your CRM is fully wired up.

Don't see the related lists?

If the Job Postings related list does not appear on the Infosys record, the Master-Detail relationship may have been created in the wrong direction. Go to Object Manager > Job Posting > Fields & Relationships and confirm that the Company field exists as a Master-Detail relationship.

If the Job Required Skills related list does not appear on the Job Posting record, check that Object Manager > Job Required Skill has a Master-Detail field pointing to Job Posting.

Help me troubleshoot my missing related lists on the Company and Job Posting records.

The employer side of your CRM is complete. Companies can post jobs, and each job can specify exactly which skills it requires. Next up, you'll build the application-to-placement pipeline that tracks a student from applying to getting placed.

Build the Application-to-Placement Pipeline

Your employer side is ready. Companies and job postings are connected, and each posting knows exactly which skills it requires. Now it is time to build the process that brings students and jobs together.

In this step, you will create three new objects that model the full placement pipeline: Application, Interview, and Placement. Master-Detail relationships will chain them together so deleting a parent automatically removes its children. But you will also discover a gap in your data model that needs fixing.

In this step, get ready to:
  • Create the Application custom object with its relationship fields.
  • Build the Interview and Placement objects to complete the 9-object data model.
  • Test the pipeline with intentionally bad data to expose a data integrity gap.
Create the Application custom object

The Application object is the bridge between students and job postings. When a student applies for a role, an Application record captures when they applied and where they are in the review process.

  • In Setup, click the Object Manager tab.
  • Click Create | Custom Object.
  • Enter Application for Label and Applications for Plural Label.
  • Under Record Name, change Data Type to Auto Number.
  • Set Display Format to APP-{0000} and Starting Number to 1.
  • Check Allow Reports and check Launch New Custom Tab Wizard after saving this custom object.
  • Click Save.
  • Complete the Tab Wizard by picking any icon, then clicking Next, Next, and Save.

You should land on the Application object detail page in Object Manager. The object exists, but it has no custom fields yet.

The Application object needs two relationships: one to the Job Posting it is for, and one to the Student who applied. The relationship types matter here.

  • Click Fields & Relationships in the left sidebar, then click New.
  • Select Master-Detail Relationship and click Next.
  • Select Job Posting as the related object.
  • Click Next through the remaining wizard screens, accepting defaults, then click Save & New to immediately start the next field.
  • This time, select Lookup Relationship and click Next.
  • Select Student as the related object.
  • Click Next through the remaining screens, then click Save.

Why Master-Detail for Job Posting but Lookup for Student?

A Master-Detail relationship means the child record cannot exist without its parent. If you delete the Software Developer job posting, all of its applications disappear too. This cascade delete keeps orphaned records out of the system.

The Student connection uses a Lookup relationship instead. A student can exist without any applications, and deleting a student should not silently wipe out the job posting's application history.

Now add the remaining four fields that track application details.

  • In Fields & Relationships, click New and create a Date field with the label Application Date.
  • Create a Picklist field with the label Status. Enter these values, one per line: Applied, Under Review, Shortlisted, Rejected, Selected. Set the default value to Applied.
  • Create a Long Text Area field with the label Cover Letter.
  • Create a Text Area field with the label Rejection Reason.

Return to the Fields & Relationships list for the Application object. You should see your 6 custom fields (Application_Date__c, Cover_Letter__c, Job_Posting__c, Rejection_Reason__c, Status__c, Student__c) alongside the standard fields Salesforce created automatically.

Don't see all 6 custom fields?

Make sure you clicked Save (or Save & New) on each field wizard. If you navigated away before saving, the field was not created.

If you see Job_Posting__c missing, check that you selected Job Posting (not another object) when creating the Master-Detail relationship.

Having trouble?

Create the Interview and Placement objects

The last two objects complete the placement pipeline. An Interview record tracks each round a student goes through for a specific application. A Placement record captures the final outcome when a student receives and responds to an offer.

  • Return to Object Manager and click Create | Custom Object.
  • Enter Interview for Label and Interviews for Plural Label.
  • Set Record Name to Auto Number with Display Format INT-{0000} and Starting Number 1.
  • Check Launch New Custom Tab Wizard after saving this custom object, then click Save.
  • Complete the Tab Wizard (pick any icon, Next, Next, Save).

Now add the Interview object's relationship and fields. The Interview is a child of Application, so deleting an application removes all its interview rounds.

  • In Fields & Relationships, click New and select Master-Detail Relationship.
  • Select Application as the related object. Click through the wizard and Save & New.
  • Create a Date/Time field with the label Interview Date.
  • Create a Picklist field labeled Interview Type with values: Technical, HR, Group Discussion, Aptitude.
  • Create a Text field labeled Interviewer Name.
  • Create a Long Text Area field labeled Feedback.
  • Create a Picklist field labeled Result with values: Passed, Failed, Pending. Set the default value to Pending.
  • Create a Number field labeled Round Number with 0 decimal places.

Check the Fields & Relationships list for Interview. You should see 7 custom fields: Application__c, Feedback__c, Interview_Date__c, Interview_Type__c, Interviewer_Name__c, Result__c, Round_Number__c.

One more object to go. The Placement object records the final outcome for a student, connecting them to the job they were placed in.

  • Return to Object Manager and click Create | Custom Object.
  • Enter Placement for Label and Placements for Plural Label.
  • Set Record Name to Auto Number with Display Format PLC-{0000} and Starting Number 1.
  • Check Launch New Custom Tab Wizard after saving this custom object, then click Save.
  • Complete the Tab Wizard (pick any icon, Next, Next, Save).

The Placement object needs two relationships. A student owns their placement (Master-Detail), and the placement references which job they were placed in (Lookup).

  • In Fields & Relationships, click New and select Master-Detail Relationship.
  • Select Student as the related object. Click through the wizard and Save & New.
  • Select Lookup Relationship and click Next.
  • Select Job Posting as the related object. Click through the wizard and Save.

Why is Job Posting a Lookup here?

A Placement belongs to the Student (Master-Detail), because if you remove a student from the system, their placement record should go with them. But the Job Posting is just a reference. Deleting a placement should not affect the job posting, and the job posting should survive independently.

  • Create a Date field labeled Offer Date.
  • Create a Date field labeled Joining Date.
  • Create a Currency field labeled Package Offered.
  • Create a Picklist field labeled Status with values: Offer Extended, Accepted, Declined, Joined. Set the default value to Offer Extended.
  • Create a URL field labeled Offer Letter URL.

Check the Fields & Relationships list for Placement. You should see 7 custom fields: Job_Posting__c, Joining_Date__c, Offer_Date__c, Offer_Letter_URL__c, Package_Offered__c, Status__c, Student__c.

All 9 objects exist. Now add the Interview and Placement tabs to your Lightning App so they appear in the navigation bar.

  • Open Setup and type App Manager in Quick Find.
  • Find Student Career CRM in the list, click its dropdown arrow, and select Edit.
  • Go to the Navigation Items step.
  • Move Interviews and Placements from Available Items to Selected Items.
  • Click Save.
  • Open the App Launcher (the grid icon in the top left) and select Student Career CRM.

You should see Interviews and Placements tabs in the navigation bar alongside Home, Students, Skills, Companies, and Job Postings.

Missing Interviews or Placements tabs?

Make sure you completed the Tab Wizard when creating each object. If you skipped it, go to Setup, type Tabs in Quick Find, click New under Custom Object Tabs, and create the missing tab manually.

If the tabs exist but are not showing in the app, re-open App Manager, edit Student Career CRM, and confirm both items appear in Selected Items under Navigation Items.

Still stuck?

Test the pipeline with intentionally bad data

Your data model is structurally complete. Time to test it by creating records that flow through the full pipeline. You will also deliberately enter some invalid data to see how the system handles it.

  • Click the Students tab in your app navigation.
  • Click New to create a new Student record.
  • Enter Test Bad Data for Student Name.
  • Enter not-an-email in the Email field.
  • Enter 12 for CGPA.
  • Set Department to CS.

Before you save, think about what should happen. A CGPA of 12 is impossible on a 10-point scale. The email field contains gibberish. Do you think Salesforce will stop you from saving this record?

  • Click Save.

It saved without complaint. A student with an impossible CGPA and a gibberish email is now sitting in your CRM. That is a data integrity problem, and it is exactly the gap you will fix in the next step.

Now build the full pipeline for your test student Ravi Kumar. Start by creating an Application record.

  • Click the Students tab and open the Ravi Kumar record.
  • Scroll down to the Applications related list and click New.
  • In the Job Posting lookup field, search for and select the Software Developer posting.
  • Set Application Date to today's date.
  • Leave Status at the default value of Applied and click Save.

Your Application record page appears. Now create an Interview under this application.

  • On the Application record, scroll down to the Interviews related list and click New.
  • Set Interview Type to Technical.
  • Enter 1 for Round Number.
  • Leave Result at the default value of Pending and click Save.

Finally, create a Placement record for Ravi Kumar.

  • Navigate back to the Ravi Kumar Student record.
  • Scroll down to the Placements related list and click New.
  • In the Job Posting lookup field, search for and select the Software Developer posting.
  • Enter 800000 for Package Offered.
  • Leave Status at Offer Extended and click Save.

Now verify the full pipeline is connected. Navigate back to the Ravi Kumar Student record.

  • On Ravi Kumar's record, scroll down to the Applications related list. You should see the application you just created.
  • Click into the Application record. The Interviews related list should show your Technical Round 1 interview.
  • Navigate back to Ravi Kumar's Student record. The Placements related list should show the Offer Extended placement with a package of 800000.

The pipeline is connected. Student leads to Application leads to Interview, and Student also leads to Placement. Every record is reachable through related lists.

  • Now click the Students tab and open the Test Bad Data record.
  • Look at the CGPA field showing 12 and the Email field showing not-an-email.

Why does Salesforce allow this bad data?

Salesforce field types provide basic format enforcement. A Number field rejects letters, and an Email field requires an @ symbol. But they do not enforce business rules like "CGPA must be between 0 and 10" or "the text after the @ must be a real domain."

In a real placement office, bad data means wrong eligibility decisions. A student with CGPA 12 might pass a filter that should reject them. That is exactly the problem validation rules solve.

Your 9-object data model is structurally complete, and the full placement pipeline is connected through related lists. But the system is wide open to invalid data. Next up, you will add validation rules that catch bad CGPA scores, expired deadlines, and malformed emails before they pollute your CRM.

Add Validation Rules and Lock Down Data Integrity

In the last step, you created a student called Test Bad Data with a CGPA of 12 and an email of not-an-email. Salesforce saved both without a single complaint. In a real placement office, bad data like this means wrong eligibility decisions and students applying to jobs they do not qualify for.

In this step, you will add validation rules that catch invalid data before it enters the system. By the end, a CGPA of 12, a gibberish email, and a past-due application deadline will all be blocked at the door.

In this step, get ready to:
  • Create a CGPA validation rule that restricts scores to 0-10.
  • Add validation rules for application deadlines and email format.
  • Test all three rules by fixing the bad data from the previous step.
Add the CGPA validation rule on Student__c

A validation rule is a formula that runs every time a record is saved. If the formula evaluates to TRUE, Salesforce blocks the save and displays an error message on the field.

The CGPA field should only accept values between 0 and 10. You will create a rule that flags anything outside that range.

  • Open Setup by clicking the gear icon in the top right corner.
  • Click the Object Manager tab at the top of the Setup page.
  • Find and click Student in the object list.
  • Click Validation Rules in the left sidebar.
  • Click New.

You are now in the validation rule editor. Fill in the rule details.

  • Enter CGPA_Range in the Rule Name field.
  • Make sure the Active checkbox is checked.
  • In the Error Condition Formula text area, paste the following formula:
OR(CGPA__c < 0, CGPA__c > 10)

What does this formula do?

The OR() function returns TRUE if either condition is met. If CGPA__c is less than 0 or greater than 10, the formula fires and blocks the save.

  • Click Check Syntax to confirm the formula has no errors.
  • Scroll down to the Error Message section.
  • Enter CGPA must be between 0 and 10 in the Error Message field.
  • Set Error Location to Field, then select CGPA.
  • Click Save.

Your first validation rule is active. Before you move on, take a moment to confirm it actually works.

Think about what should happen when you try to save the Test Bad Data student record, which still has a CGPA of 12. Will Salesforce let it save, or will it block you?

  • Open the App Launcher (the grid icon in the top left corner) and select Student Career CRM.
  • Click the Students tab.
  • Open the Test Bad Data student record.
  • Click the pencil icon next to the CGPA field to enter edit mode. Leave the value at 12.
  • Click Save.

Salesforce blocks the save. You should see a red error message on the CGPA field: "CGPA must be between 0 and 10". That is your validation rule doing its job.

Not seeing the error?

  • Return to Object Manager > Student > Validation Rules and confirm CGPA_Range shows as Active. If it is not, click into the rule and check the Active checkbox.
  • Make sure you did not accidentally change the CGPA value before clicking Save. The value must still be 12 (or any number above 10) to trigger the error.
  • Check that the Error Location is set to Field > CGPA. If it is set to Top of Page, the error appears at the top of the record instead of next to the field.

Still stuck? Help me troubleshoot why my CGPA_Range validation rule is not blocking a save with CGPA 12 on a Student record.

  • Click Cancel to discard the failed save. You will come back to fix this record in the final substep.
Add the Application Deadline and email validation rules

The CGPA rule protects student data. Now you need two more rules. One prevents job postings from accepting applications after the deadline has passed. The other ensures email addresses follow a valid format.

  • Return to Setup by clicking the gear icon.
  • Click the Object Manager tab.
  • Find and click Job Posting.
  • Click Validation Rules in the left sidebar, then click New.
  • Enter Application_Deadline_Future in the Rule Name field.
  • Make sure the Active checkbox is checked.
  • Paste the following formula into the Error Condition Formula text area:
Application_Deadline__c < TODAY()

What does this formula do?

TODAY() returns today's date. If the Application_Deadline__c value is earlier than today, the formula evaluates to TRUE and blocks the save. This prevents anyone from setting a deadline in the past.

  • Click Check Syntax to confirm the formula is valid.
  • Enter Application deadline must be a future date in the Error Message field.
  • Set Error Location to Field, then select Application Deadline.
  • Click Save.

Quick test before moving on. Open the Job Postings tab in your Student Career CRM app and open the Software Developer posting.

  • Click the pencil icon next to Application Deadline and change it to any date in the past (for example, yesterday).
  • Click Save.

You should see a red error: "Application deadline must be a future date". The deadline rule is working.

  • Click Cancel to discard the change and keep the original future deadline.

Now create the third and final validation rule for email format.

  • Return to Setup > Object Manager > Student.
  • Click Validation Rules in the left sidebar. You should see your CGPA_Range rule already listed.
  • Click New.
  • Enter Valid_Email in the Rule Name field.
  • Make sure the Active checkbox is checked.
  • Paste the following formula into the Error Condition Formula text area:
AND(NOT(ISBLANK(Email__c)), NOT(REGEX(Email__c, "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")))

What does this formula do?

This formula has two layers. The outer AND(NOT(ISBLANK(...))) check makes sure the rule only fires when the email field actually has a value. If the field is blank, the rule skips it entirely.

The inner REGEX() function compares the email against a pattern that requires characters before an @ sign, a domain name after it, and a dot followed by at least two letters at the end. If the email does not match this pattern, the formula returns TRUE and blocks the save.

Double backslash in formulas

The \\. in the REGEX pattern is not a typo. Salesforce uses a double backslash to represent a literal dot in regular expressions. A single dot would match any character, so the backslash tells the pattern to look for an actual period.

  • Click Check Syntax to confirm the formula is valid.
  • Enter Please enter a valid email address in the Error Message field.
  • Set Error Location to Field, then select Email.
  • Click Save.

All three validation rules are now active. The Student object has two rules (CGPA_Range and Valid_Email) and the Job Posting object has one (Application_Deadline_Future).

Test all three validation rules and fix the bad data

You tested CGPA and the deadline individually. Now run through the full correction of the Test Bad Data student to confirm all three rules work together.

  • Switch back to the Students tab in Student Career CRM.
  • Open the Test Bad Data student record.

Before you edit anything, think about what will happen if you change the CGPA to 8.0 but leave the email as not-an-email. Will the record save?

  • Click the pencil icon next to CGPA and change the value to 8.0.
  • Leave the email as not-an-email for now.
  • Click Save.

The save is blocked again, this time by the email validation rule. Even though the CGPA is now valid, the email field still fails the REGEX check. Both rules have to pass before Salesforce allows the save.

  • Click the pencil icon next to Email and change the value to test@example.com.
  • Click Save.

The record saves successfully. The Test Bad Data student now has a CGPA of 8.0 and an email of test@example.com. Both values pass validation.

One final check. Open the Software Developer job posting and confirm the deadline rule still catches past dates.

  • Click the Job Postings tab.
  • Open the Software Developer job posting.
  • Click the pencil icon next to Application Deadline and change it to yesterday's date.
  • Click Save.

You should see the error: "Application deadline must be a future date". The deadline rule is holding.

  • Click Cancel to discard the change and keep the original future deadline.

Why does the deadline rule fire on edits too?

The formula Application_Deadline__c < TODAY() runs every time a record is saved, including edits. This means an existing job posting whose deadline has naturally passed cannot be re-saved without updating the deadline to a future date.

For a placement CRM, this is the right behavior. A past-deadline posting should be corrected before any other changes are saved.

Seeing unexpected errors or missing validations?

  • Go to Object Manager > Student > Validation Rules. You should see two rules listed: CGPA_Range and Valid_Email. Confirm both show as Active.
  • Go to Object Manager > Job Posting > Validation Rules. You should see Application_Deadline_Future listed and Active.
  • If the email rule passes on invalid text, click into the rule and verify the formula was pasted exactly. A missing backslash or mismatched parenthesis can silently break the pattern.

Need more help? Help me verify that my three validation rules are set up correctly on Student__c and Job_Posting__c.

Your data model is now locked down. All 9 objects, their fields, relationships, and validation rules are complete. Next up, you will put this CRM to the test with a Secret Mission that builds real-time visibility into your placement pipeline.

Secret mission

Build a Placement Pipeline Report and Dashboard

You have built the data model. Now prove you can extract insights from it. Build a report and dashboard that a placement director would actually use to track pipeline health at a glance. You will create a custom report type, build a grouped pipeline report, and assemble a live dashboard with charts and metrics.

Clean Up Your Resources

Clean Up Your Resources

This project runs entirely in a free Salesforce Trailhead Playground, so there are no ongoing costs. Your playground does not expire as long as you log in at least once every 6 months.

Resources you used:

  • Student Career CRM Lightning App.
  • 9 custom objects with fields, relationships, and validation rules: Student, Skill, Student_Skill, Company, Job_Posting, Job_Required_Skill, Application, Interview, and Placement.
  • Placement Pipeline Report, Placement Dashboard, and Application Pipeline custom report type.
  • Test data records including students (Ravi Kumar, Test Bad Data), skills (Python, SQL, Communication), a company (Infosys), a job posting, applications, interviews, placements, and junction records.

Decide whether to keep your resources running, clean up test data to come back later, or start fresh with a new playground.

Keep everything running

No action needed. Choose this if you plan to continue to Phase 2: Flow Automation in this series. This is the recommended option.

  • Your 9 custom objects, fields, relationships, validation rules, and the Student Career CRM app all remain intact.
  • Your test data (Ravi Kumar, Infosys, the application pipeline) stays in place as a working reference.
  • Your Placement Pipeline Report and Placement Dashboard remain available.
  • Log in to your Trailhead Playground at least once every 6 months to keep it active.

Pause - I'll come back to this later

Clean up test data to reduce clutter while keeping your entire schema, Lightning App, report, and dashboard intact for later.

  • Open the App Launcher and select Student Career CRM.
  • Click the Students tab.
  • Open the Test Bad Data student record.
  • Click the dropdown arrow in the top right of the record and select Delete.
  • Confirm the deletion.
  • All custom objects, fields, validation rules, the Lightning App, and your report and dashboard remain untouched. You can pick up right where you left off.

Delete - I don't want to use this again

Remove all project resources and start fresh. The fastest path is to create a new Trailhead Playground, which gives you a clean org without manually deleting each resource.

  • Go to trailhead.salesforce.com and create a new Trailhead Playground from your profile. Your old playground remains until it expires from inactivity (6 months without login).

If you prefer to delete resources from your current playground manually, follow this order:

  • Delete the Placement Dashboard from the Dashboards tab. Open the dashboard, click the dropdown arrow, and select Delete.
  • Delete the Placement Pipeline Report from the Reports tab using the same dropdown approach.
  • Delete the Application Pipeline custom report type. Go to Setup and type Report Types in Quick Find. Select the report type and delete it.
  • Delete custom objects in dependency order using Object Manager. Start with the junction and child objects: Student_Skill, Job_Required_Skill, Interview, Placement, then Application, Job_Posting, and finally the independent objects: Student, Skill, Company. For each object, open it in Object Manager and select the delete option.
  • Delete the Student Career CRM app. Go to Setup and open App Manager. Find Student Career CRM, click the dropdown arrow, and select Delete.

Nice Work!

Nice Work!

Nice work! You just designed and built a production-grade Salesforce data model for a complete student career and placement CRM from scratch.

You've learned how to:

  • Built a complete 9-object data model (Student, Skill, Student_Skill, Company, Job_Posting, Job_Required_Skill, Application, Interview, and Placement) inside a custom Lightning App that tracks students from application through interview to placement.
  • Created many-to-many relationships using two junction objects (Student_Skill and Job_Required_Skill) with Master-Detail and Lookup relationships that cascade deletes and enforce data ownership.
  • Added 3 validation rules that enforce CGPA range (0-10), future application deadlines, and valid email format to keep bad data out of the placement pipeline.
  • Secret Mission: Created a Placement Pipeline Report and Dashboard for real-time placement visibility using a custom report type, grouped summaries, and dashboard components.

Ready to quiz yourself?