Salesforce Platform Developer I (PD1) — Complete Study Guide 2025
This is the most comprehensive free Salesforce Platform Developer I study guide available. From Apex basics to governor limits to Lightning Web Components — everything you need to pass PD1 in 2025.
PD1 Exam Facts
- Questions: 60 | Time: 105 min | Pass: 65% | Fee: $200
- Prerequisites: None formal, but Admin knowledge strongly recommended
Topic 1: Developer Fundamentals (23%)
Salesforce Data Model
Everything in Salesforce is built on objects — think database tables. Standard objects (Account, Contact, Opportunity) and Custom objects (__c suffix). Every object has fields (columns) and records (rows). Objects relate to each other via Lookup or Master-Detail relationships.
SOQL (Salesforce Object Query Language)
// Basic SOQL query
List<Account> accounts = [SELECT Id, Name, Industry FROM Account WHERE Industry = 'Technology' LIMIT 100];
// With relationship query
List<Contact> contacts = [SELECT Id, Name, Account.Name FROM Contact WHERE Account.Industry = 'Technology'];
Key rules: Never put SOQL inside a loop (causes governor limit violation). Always query what you need, not SELECT *.
DML Operations
insert myRecord; // Create
update myRecord; // Update
upsert myRecord; // Create or update
delete myRecord; // Delete
undelete myRecord; // Restore from recycle bin
Key rules: Never put DML inside a loop. Always operate on collections (Lists), never single records in triggers.
Topic 2: Process Automation and Logic (30% — LARGEST)
Apex Triggers
trigger AccountTrigger on Account (before insert, before update, after insert) {
if (Trigger.isBefore && Trigger.isInsert) {
AccountTriggerHandler.handleBeforeInsert(Trigger.new);
}
}
Best practice: One trigger per object. Move logic to a handler class. Always bulkify — write code that handles collections, not single records.
Bulkification
// ❌ WRONG — SOQL in loop
for (Account acc : Trigger.new) {
Contact c = [SELECT Id FROM Contact WHERE AccountId = :acc.Id]; // violates governor limit
}
// ✅ CORRECT — query outside loop
Map<Id, List<Contact>> contactsByAccount = new Map<Id, List<Contact>>();
for (Contact c : [SELECT Id, AccountId FROM Contact WHERE AccountId IN :Trigger.newMap.keySet()]) {
if (!contactsByAccount.containsKey(c.AccountId)) {
contactsByAccount.put(c.AccountId, new List<Contact>());
}
contactsByAccount.get(c.AccountId).add(c);
}
Asynchronous Apex
- @future: Simple async. Can’t be called from batch. Can make HTTP callouts.
- Queueable: Chainable. Supports complex types as parameters.
- Batch Apex: Processes millions of records in chunks. Implements Database.Batchable.
- Schedulable Apex: Runs on a schedule (cron syntax). Implements Schedulable.
Topic 3: User Interface (25%)
Lightning Web Components
// greeting.html
<template>
<lightning-card title="Hello">
<p>Hello, {name}!</p>
</lightning-card>
</template>
// greeting.js
import { LightningElement, api } from 'lwc';
export default class Greeting extends LightningElement {
@api name;
}
Key decorators: @api (public property, accessible from parent), @track (reactive private property — deprecated in favor of plain reactive properties), @wire (for Salesforce data).
LWC Lifecycle Hooks
- constructor(): Component initialized. Don’t access DOM here.
- connectedCallback(): Component inserted into DOM. Use for initialization logic.
- renderedCallback(): After every render. Use for DOM manipulation.
- disconnectedCallback(): Component removed from DOM. Use for cleanup.
Topic 4: Testing, Debugging and Deployment (22%)
Test Classes
@isTest
public class AccountTriggerTest {
@testSetup
static void setup() {
Account acc = new Account(Name = 'Test Account');
insert acc;
}
@isTest
static void testAccountInsert() {
Account acc = [SELECT Id, Name FROM Account WHERE Name = 'Test Account' LIMIT 1];
System.assertNotEquals(null, acc.Id, 'Account should have been inserted');
System.assertEquals('Test Account', acc.Name, 'Name should match');
}
}
Requirements: 75% code coverage to deploy to production. Use Test.startTest()/Test.stopTest() to reset governor limits. Use @testSetup for shared data. Always include System.assert() statements.
Governor Limits to Memorize
- SOQL queries per transaction: 100 (synchronous) / 200 (async)
- SOQL rows returned: 50,000
- DML statements: 150
- DML records: 10,000
- Heap size: 6 MB (sync) / 12 MB (async)
- CPU time: 10,000 ms (sync) / 60,000 ms (async)
- Future method calls: 50
- Batch size max: 2,000
8-Week PD1 Study Plan
Weeks 1-2: Salesforce Fundamentals
If you don’t have the Admin cert, complete “Admin Basics” first. Then: “Apex Basics & Database” Trailhead, “SOQL for Admins”.
Weeks 3-4: Apex Deep Dive
Complete “Apex Triggers” Trailhead. Build real triggers in a Developer Edition org. Write 5+ triggers with proper bulkification. Build complete test classes for each.
Weeks 5-6: LWC + Async Apex
Complete “Lightning Web Components Basics” Trailhead. Build 3 LWCs. Complete “Asynchronous Apex” module. Build a batch job and a schedulable class.
Week 7: Practice Exam Intensive
Take full PD1 practice tests from Dumpsforce. Focus on scenario questions — identify governor limit violations, correct trigger patterns, LWC syntax errors.
Week 8: Weak Areas + Book Exam
Target 85%+ on practice tests. Focus on any topic below 70% from your practice results. Book the exam.
Start Practicing Now
Try 5 free Salesforce PD1 practice questions at Dumpsforce. Full set available with instant access and 100% money-back guarantee.





