New to this track? Our Salesforce Certified Platform Foundations exam prep is the recommended first step. See our certification path to understand where this certification fits. The Salesforce Certified Platform Developer exam weights Process Automation and Logic most heavily (28%), see the full breakdown, study tips, and practice questions below.
The certification was previously known as Platform Developer I (PD1). Many candidates still search for “Platform Developer 1”, while the current official name is Salesforce Certified Platform Developer.
Quick Knowledge Check
A developer writes a trigger that runs a SOQL query inside a for loop. What governor limit risk does this create?
▶ Reveal answer
SOQL inside a loop will hit the 100 SOQL query limit if the loop iterates over more than 100 records. Fix: run one SOQL query before the loop using WHERE Id IN :idSet, store results in a Map<Id, SObject>, and look up records inside the loop with no additional queries.
Sample practice questions and answers are below ↓
Free practice • No sign-up required
$200 exam • 68% passing score • Free practice
Salesforce Certified Platform Developer I (PD1): Free Practice Exam & Study Guide (2026)
Platform Developer I (PD1) tests whether you can build custom applications on the Salesforce platform with Apex and Lightning Web Components: triggers and governor limits, asynchronous patterns, the data model, and test classes. The exam is 60 scored questions in 105 minutes, with a 68% pass mark, weighted towards Process Automation and Logic (28%) and Developer Fundamentals (27%).
Recommended Prerequisites
We recommend completing this certification first to prepare you better.
| Official exam name and code | Salesforce Certified Platform Developer (PD1) |
|---|---|
| Questions | 60 |
| Time allotted | 105 min |
| Passing score | 68% |
| Exam fee | $200 |
| Retake fee | $100 |
| Prerequisite certifications | Recommended preparation: Salesforce Certified Platform Foundations |
| Study guide release | Summer '26 |
Salesforce Certified Platform Developer Exam Weightage by Section
1. Developer Fundamentals (27%)
27%2. Process Automation and Logic (28%)
28%3. User Interface (25%)
25%4. Testing, Debugging, and Deployment (20%)
20%Exam Topics
Last updated:
Who is the Platform Developer I exam for?
- Developers new to Salesforce: You have programming experience in Java, JavaScript, or another language and want to build on the Salesforce platform using Apex and LWC.
- Admins transitioning to development: You passed ADM-201 and want to move beyond declarative tools into custom code, triggers, and integrations.
- Full-stack developers at SI partners: Your firm requires PD1 certification for project staffing, and you need to validate Salesforce-specific development skills.
Exam Fees & Registration
Exam Fee
$200
One-time registration fee
Retake Fee
$100
If you need to retake the exam
Comparing certs? View all Salesforce exam fees in one place →
Certification Validity
Maintenance and renewal requirements vary. Check the issuer’s current credential page for requirements that apply to you.
How to Register
Check current Salesforce Certified Platform Developer (PD1) credential and registration details with the issuer.
View official credential detailsOfficial references: Use the issuer’s current materials to confirm exam objectives, format, and fees before booking.
Official sources: Exam guide·Salesforce exam pricing·Independent exam-prep resource; details may change.
Why This Certification Matters
PD1 is the standard developer cert.
It is required for many technical and architect paths.
Exam Tips
- 1Logic and User Interface are 50% combined, Apex triggers, LWC, and when to use each.
- 2Know governor limits: SOQL 100, DML 150, etc., and how to avoid hitting them.
- 3Testing: minimum code coverage, positive and negative tests, Test.runAs().
- 4Understand @AuraEnabled, @InvocableMethod, and when to use REST vs SOAP.
Prerequisites
- •Programming experience (Java, C#, or similar)
- •Administrator or App Builder recommended
Focus Areas
- •Apex and Triggers
- •Lightning Web Components
- •Testing and Deployment
- •Governor Limits
Study Strategy
Code daily in a dev org.
Build a small LWC + Apex feature and write tests.
Memorize key governor limits and practice debugging scenarios.
Exam Format and First-Attempt Readiness
The Salesforce Certified Platform Developer exam has 60 questions in 105 min, passing score 68%. Most Salesforce exams test scenario-based decisions. Focus on when to use each feature, not just terms.
- Study Process Automation and Logic and Developer Fundamentals first, together they carry 55% of the exam.
- Do timed question sets. Build pacing and confidence.
- Review why wrong answers are wrong. It improves scenario reasoning.
- Book the exam once your mock scores are steady at 80%+.
Suggested study timeline for PD1 (6–10 weeks)
Suggested study timeline for PD1 (6–10 weeks)
PD1 requires hands-on coding practice, not just reading. Budget time for Apex exercises in a Developer Edition org alongside study.
- Weeks 1–2: Developer Fundamentals (27%), objects, relationships, schema design, SOQL basics
- Weeks 2–3: Process Automation and Logic (28%): Apex basics, governor limits, bulkification patterns
- Weeks 3–5: Apex triggers and classes, before/after triggers, handler pattern, async Apex (future, batch, queueable)
- Weeks 5–6: Testing, Debugging, and Deployment (20%), test class structure, mock callouts, code coverage, debug logs
- Weeks 6–7: User Interface (25%): LWC basics, Aura, Visualforce, change sets, sandboxes
- Weeks 7–8: Full mock exams and targeted weak-area review
Already an admin? Reduce Weeks 1–2 to 3–4 days, you already know the data model and platform fundamentals.
Is the PD1 Exam Hard?
Is the PD1 Exam Hard?
The Salesforce Platform Developer I exam is considered moderately difficult: harder than ADM-201, but accessible to candidates with 3–6 months of real Apex development experience. The challenge is that most questions present actual code and require you to reason about governor limits, async patterns, and trigger behaviour under realistic conditions.
- 60 scored questions in 105 minutes, roughly 1.75 minutes per question.
- 68% passing score: you need 41 of 60 correct, so you can miss up to 19 and still pass.
- Code-heavy: expect 30–40% of questions to include Apex code snippets.
- Scenario-based: most questions describe a business or technical requirement and ask for the right approach.
- No multiple-select trick: PD1 uses single-best-answer format (unlike ADM-201 which has some multiple-select).
Pass Rate Guidance
Candidates who pass PD1 typically score 80%+ on at least 3 full-length mock exams before booking. If you’re scoring below 70% on mocks. Focus on governor limits and bulkification, those two topics cover over 30% of the exam combined.
PD1 Exam Format Explained
PD1 Exam Format Explained
The exam is proctored online or at a test centre through Webassessor. Here is the format:
Exam logistics
| Fee | $200 |
| Retake | $100 |
| Passing score | 68% |
| Questions | 60 multiple-choice |
| Time | 105 min |
How Many Questions Are Code-Based?
About 30-40% of questions include Apex code snippets or pseudocode. You need to read the code, identify issues (governor limit violations, bulkification failures, incorrect trigger context), and select the correct fix or outcome. Another 30-40% are scenario-based without code, describing a business requirement and asking which approach is best.
Best Way to Pass on Your First Attempt
- Write real Apex code: Set up a Developer Edition org and build triggers, batch classes, and test classes. Reading alone is not sufficient for PD1.
- Memorise governor limits: 100 SOQL queries, 150 DML statements, 50K query rows, 6MB heap, 10s CPU. These numbers appear in nearly every mock and the real exam.
- Master the trigger handler pattern: One trigger per object, all logic in a handler class. Know when to use before vs after triggers and the full order of execution.
- Practice reading code under time pressure: At 1.8 minutes per question, you need to parse code snippets quickly. Time yourself on practice exams.
Platform Developer I: Key Concepts for the Exam
Apex Governor Limits & the Limits Class
Governor limits prevent any one transaction from monopolising shared platform resources. Key synchronous limits: 100 SOQL queries, 150 DML statements, 50,000 records returned from queries, 6 MB heap size, 10 seconds CPU time. Asynchronous limits are generally 2× the synchronous limits. Use Limits.getQueries() and Limits.getLimitQueries() from the Apex Common Classes (the Limits class) to check usage at runtime. The exam tests which limit applies to a given code scenario and what to change.
Bulkification: Never Put SOQL or DML Inside a Loop
The core Apex pattern: query records before loops using a single SOQL with IN:triggerIdSet, collect changes in a List or Map inside loops, then perform DML after loops. Map<Id, SObject> is the workhorse, used to relate trigger records to queried related records by Id. Use Database.insert(records, false) for partial success (returns SaveResult array). The exam presents code with SOQL/DML in a loop and asks you to identify the issue or fix it.
Apex Triggers: Order of Execution & Handler Pattern
Before triggers fire before the record is saved. Use them to validate or modify field values before save (changes to Trigger.new persist without extra DML). After triggers fire after the record is committed. Use them when you need the record Id or to update related records. Key context variables: Trigger.new, Trigger.old (not available on insert), Trigger.isInsert, Trigger.isUpdate. Best practice: one trigger per object, all logic delegated to a handler class. The Order of Execution for a save: validation rules → before triggers → system validation → after triggers → workflow rules → DML commit → flows (record-triggered).
SOQL: Relationships, Aggregates & SOSL
Child-to-parent query: SELECT Id, Account.Name FROM Contact (dot notation). Parent-to-child: SELECT Id, (SELECT Id FROM Contacts) FROM Account (subquery). Aggregate functions: COUNT(), SUM(), AVG(), require GROUP BY. SOSL searches multiple objects simultaneously: FIND ’term’ IN ALL FIELDS RETURNING Account, Contact. Use SOSL for cross-object searches; use SOQL when you know the object.
Process Automation: Flow vs. Apex Triggers
The exam tests when to use declarative automation (Flow) vs. programmatic automation (Apex Triggers). Use Flow for standard CRUD operations, approval automation, and complex UI flows without code. Use Apex Triggers when you need cross-object logic beyond Flow’s capabilities, governor limit control, or callout scheduling. Both can fire on the same record, the Order of Execution determines which runs first (Flow runs before After Triggers in record-triggered contexts). Key PD1 topic: if Flow can do it declaratively, prefer Flow; if it needs Apex Classes, Limits, or Database class methods, use Apex.
Testing Framework: SeeAllData, Test.startTest & HttpCalloutMock
Minimum 75% code coverage required across all Apex to deploy to production. Test classes use @isTest. Test data is isolated by default (SeeAllData=false), create all test data explicitly using @TestSetup or within each test method. Test.startTest() resets governor limits and marks the start of the tested code; Test.stopTest() forces async operations (future methods, batch jobs) to complete synchronously. Mock HTTP callouts with Test.setMock(HttpCalloutMock.class, mockImpl). @TestVisible exposes private members to test classes without making them public.
Lightning Web Components (LWC): Wire Service & @AuraEnabled
LWC is the modern Salesforce UI framework. Key decorators: @track (reactive private properties), @api (public properties exposed to parent), @wire (reactive Apex method calls). The @wire decorator connects an LWC to an Apex method marked @AuraEnabled(cacheable=true), the cacheable flag is required for @wire. Use lightning-record-form for standard record CRUD without writing Apex. Communication between components uses CustomEvent (child to parent) and LightningMessageService (unrelated components).
Core Apex Code Patterns for PD1
The PD1 exam presents real Apex code in 30–40% of questions. These three patterns appear most frequently, understand them at a read-and-reason level, not just from a definition.
1. Bulk-Safe Trigger with Handler Class
One trigger per object, all logic in a handler class. SOQL runs once outside the loop; DML runs once after the loop.
// AccountTrigger.triggertrigger AccountTrigger on Account (before insert, after insert) { AccountTriggerHandler handler = new AccountTriggerHandler(); if (Trigger.isBefore && Trigger.isInsert) { handler.onBeforeInsert(Trigger.new); } if (Trigger.isAfter && Trigger.isInsert) { handler.onAfterInsert(Trigger.new); }} // AccountTriggerHandler.clspublic class AccountTriggerHandler { public void onBeforeInsert(List<Account> newAccounts) { // Validate or set field values, no DML needed, changes persist for (Account acc : newAccounts) { if (acc.Industry == null) { acc.Industry = 'Technology'; } } } public void onAfterInsert(List<Account> newAccounts) { // Collect Ids, run one SOQL, perform one DML outside loop Set<Id> accountIds = new Map<Id, Account>(newAccounts).keySet(); List<Contact> contacts = [SELECT Id, AccountId FROM Contact WHERE AccountId IN :accountIds]; List<Contact> toUpdate = new List<Contact>(); for (Contact c : contacts) { c.Description = 'Processed'; toUpdate.add(c); } update toUpdate; // Single DML, not inside loop }}2. Database Class with Partial Success & Error Handling
Use Database.insert(records, false) to allow partial success; inspect the SaveResult array for errors.
List<Account> accountsToInsert = new List<Account>();accountsToInsert.add(new Account(Name = 'Valid Account'));accountsToInsert.add(new Account()); // Missing required field, will fail // allOrNone = false → partial success allowedDatabase.SaveResult[] results = Database.insert(accountsToInsert, false); for (Database.SaveResult sr : results) { if (sr.isSuccess()) { System.debug('Inserted: ' + sr.getId()); } else { for (Database.Error err : sr.getErrors()) { System.debug('Error: ' + err.getMessage() + ' Fields: ' + err.getFields()); } }}3. Test Class with HttpCalloutMock
HTTP callouts cannot run in tests, implement HttpCalloutMock and register it with Test.setMock().
// Mock implementation@isTestglobal class MockHttpCallout implements HttpCalloutMock { global HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setHeader('Content-Type', 'application/json'); res.setBody('{"status":"success"}'); res.setStatusCode(200); return res; }} // Test class@isTestprivate class CalloutServiceTest { @isTest static void testCalloutSuccess() { Test.setMock(HttpCalloutMock.class, new MockHttpCallout()); Test.startTest(); String result = CalloutService.makeCallout('https://api.example.com'); Test.stopTest(); // Forces async to complete System.assertEquals('success', result, 'Expected success status'); }}All automation that fires on a single DML operation, before/after triggers, Record-Triggered Flows, and Process Builder, runs inside one execution context. Governor limits (SOQL queries, DML statements, CPU time) accumulate across all of them, not per-automation. This is why bulkification and avoiding recursive updates matters for PD1.
How to Pass the Platform Developer I (PD1) Exam
PD1 is a code-heavy exam where most questions present Apex code or describe a development scenario and ask you to identify the issue, fix, or best practice. Understanding governor limits, bulkification patterns, and test methodology at a deep practical level is what separates passing candidates from failing ones.
Governor Limit Questions, the Pattern to Recognise
The exam will show you Apex code and ask “what is wrong with this code?” The answer is almost always SOQL or DML inside a for loop. Look for for (Account a: accounts) { insert contact; }, that’s DML in a loop, and it will hit the 150 DML statement limit. The fix: collect records in a List inside the loop, then call insert contactList; after the loop. For SOQL: use Maps populated with a single query before the loop, not a query inside the loop.
Testing Questions, the Three Rules to Memorise
(1) Minimum 75% code coverage across the entire org (not per class) to deploy. (2) Test data must be created in the test method, do not rely on org data (@isTest(SeeAllData=false) is the default). (3) HTTP callout tests require a mock implementation, use Test.setMock(HttpCalloutMock.class, mockImpl). Questions often say “a developer’s test class fails when calling an external API” the answer is always to implement HttpCalloutMock.
Async Apex Selection: Which Method for Which Scenario
Use Future methods for simple one-off async operations (HTTP callouts from triggers, mixed DML). Use Batch Apex when processing more than 10,000 records (up to 50 million). Use Queueable Apex when you need chaining (one job triggers another) or need to pass complex objects between async contexts. Use Scheduled Apex for time-based execution. Exam tip: if the question says “millions of records” or “process in chunks” the answer is Batch Apex. If it says “chain jobs”: Queueable.
Trigger Scenarios: Before vs After
When the question says “set a field value before the record is saved” use a before trigger (changes to Trigger.new persist without a DML call). When the question says “create a related record after an account is created” use an after trigger (the account Id exists after save). When the question says “prevent a record from being saved if a condition is not met” use addError() in a before trigger. Never call a SOQL query in a trigger without first checking bulkification patterns.
Exam Strategy
PD1 questions often include realistic-looking Apex code snippets. Read code carefully, the “wrong answer” in the options often uses the right method name but in the wrong context (e.g., using a future method where a queueable is needed, or using DML before a callout). Passing score is 68% (41/60 questions). Aim for 80%+ on full mock exams, the additional buffer accounts for exam-day stress and unfamiliar question phrasing. Complete the official Trailhead PD1 Trailmix before booking.
Is the Salesforce Certified Platform Developer (PD1) Exam Hard?
DifficultyChallenging; plan about 8-16 weeks of focused prep.
Book When ReadyScore 80%+ on three timed mocks before scheduling.
Use Practice, Not DumpsOriginal practice questions build skill without risking your credential.
Exam format: 60 questions, 105 min, 68% passing score.
Salesforce Certified Platform Developer Practice Questions (With Explanations)
Test your knowledge with these 15 sample questions . Select the requested number of answers, then check your selection.
Question 1: A developer needs to create a trigger that fires after a record is inserted and updated. Which trigger events should be used?
Key takeaway: The 'after insert' and 'after update' trigger events fire after the record is saved to the database, which is required when you need to access the record Id or related records.
Show correct answer and explanation
Correct answer: A. after insert, after update
The 'after insert' and 'after update' trigger events fire after the record is saved to the database, which is required when you need to access the record Id or related records.
- 'before insert, before update' fires prior to save, when the record doesn't yet have an Id, insufficient for logic needing the saved record or related records.
- 'after insert, before update' mixes timing incorrectly for this scenario's need to run after both operations.
- 'isInsert, isUpdate' are trigger context variables, not trigger event names, this option misidentifies the concept being asked about.
Question 2: What is the governor limit for the maximum number of SOQL queries in a single transaction?
Key takeaway: The synchronous governor limit for SOQL queries is 100 per transaction.
Show correct answer and explanation
Correct answer: B. 100 queries
The synchronous governor limit for SOQL queries is 100 per transaction. For asynchronous contexts, the limit is 200.
- 50 understates the actual synchronous SOQL limit of 100.
- 150 overstates the actual synchronous SOQL limit of 100.
- 200 is the asynchronous limit, not the synchronous limit this question asks about.
Question 3: Which annotation is used to expose an Apex method as a REST web service?
Key takeaway: The @RestResource annotation is used at the class level to expose an Apex class as a REST resource.
Show correct answer and explanation
Correct answer: A. @RestResource
The @RestResource annotation is used at the class level to expose an Apex class as a REST resource. Individual methods use @HttpGet, @HttpPost, etc.
- @HttpGet is a method-level annotation for REST verbs, not the class-level annotation that exposes the class itself as a REST resource.
- @RemoteAction exposes Apex to Visualforce remoting, unrelated to REST web services.
- @AuraEnabled exposes methods to Lightning components, not REST API consumers.
Question 4: A developer writes a SOQL query: SELECT Id, Name FROM Account WHERE Name LIKE '%tech%'. What will this query return?
Key takeaway: The % wildcard matches any number of characters.
Show correct answer and explanation
Correct answer: C. Accounts where Name contains 'tech'
The % wildcard matches any number of characters. Using %tech% matches any Account where the Name contains 'tech' anywhere in the string.
- 'starts with' would require the pattern 'tech%' (no leading wildcard), not '%tech%'.
- 'ends with' would require the pattern '%tech' (no trailing wildcard), not '%tech%'.
- 'equals' would require no wildcards at all: LIKE with wildcards never means exact equality.
Question 5: Which method should be used to perform DML operations inside a for loop safely?
Key takeaway: To avoid hitting governor limits, you should always collect records in a list during the loop and perform DML operations outside the loop (bulk processing).
Show correct answer and explanation
Correct answer: C. Collect records in a list and perform DML outside the loop
To avoid hitting governor limits, you should always collect records in a list during the loop and perform DML operations outside the loop (bulk processing).
- Database.insert() alone doesn't address the loop-placement issue: DML inside a loop is the problem regardless of which insert method is used.
- A plain insert statement inside a loop has the same governor-limit risk as any DML call inside a loop.
- @future methods don't solve bulkification, they move work asynchronously but don't fix DML-in-a-loop patterns.
Question 6: What is the minimum code coverage required for Apex classes and triggers to be deployed to production?
Key takeaway: Salesforce requires at least 75% code coverage for Apex classes and triggers to be deployed to production.
Show correct answer and explanation
Correct answer: B. 75%
Salesforce requires at least 75% code coverage for Apex classes and triggers to be deployed to production. This ensures code quality and reliability.
- 60% is below Salesforce's actual required threshold of 75%.
- 80% overstates the actual required minimum, though it's often recommended as a safety margin.
- 100% is not required by Salesforce, though desirable in some rigorous engineering practices.
Question 7: Which annotation is used to make an Apex method available to Lightning Web Components?
Key takeaway: The @AuraEnabled annotation makes an Apex method available to Lightning Web Components (LWC) and Aura components, allowing them to call server-side logic.
Show correct answer and explanation
Correct answer: A. @AuraEnabled
The @AuraEnabled annotation makes an Apex method available to Lightning Web Components (LWC) and Aura components, allowing them to call server-side logic.
- @RemoteAction exposes methods to Visualforce remoting, not modern LWC/Aura components.
- @RestResource exposes a class as a REST API endpoint, unrelated to LWC method calls.
- @InvocableMethod exposes Apex to Flow and Process Builder, not LWC.
Question 8: A developer wants to create a trigger that processes records in bulk. What is the best practice?
Key takeaway: Best practice is to collect records in a list during iteration and process them in bulk outside the loop to avoid hitting governor limits.
Show correct answer and explanation
Correct answer: B. Collect records in a list and process outside the loop
Best practice is to collect records in a list during iteration and process them in bulk outside the loop to avoid hitting governor limits.
- Processing one record at a time in a loop is the anti-pattern that causes governor limit issues, not the best practice.
- @future methods don't solve bulkification, they simply defer execution asynchronously.
- 'Synchronous methods only' doesn't address the bulk-processing requirement at all.
Question 9: What is the governor limit for DML statements in a single transaction?
Key takeaway: The synchronous governor limit for DML statements (insert, update, delete, upsert, etc.
Show correct answer and explanation
Correct answer: B. 150 DML statements
The synchronous governor limit for DML statements (insert, update, delete, upsert, etc.) is 150 per transaction.
- 100 DML statements understates the actual synchronous limit of 150.
- 200 DML statements overstates the actual synchronous limit of 150.
- The DML statement limit is not unlimited: Salesforce enforces a specific cap to protect the multi-tenant platform.
Question 10: Which method is used to handle partial success in DML operations?
Key takeaway: Database.
Show correct answer and explanation
Correct answer: A. Database.insert()
Database.insert() returns a Database.SaveResult array, allowing you to handle partial success. The insert statement throws an exception if any record fails.
- A plain insert statement throws an exception on any failure, it doesn't support partial success handling.
- 'Database.insert() with allOrNone parameter' set to true behaves like the plain insert statement (all-or-nothing); it's the default false setting on Database.insert() that enables partial success.
- 'All of the above' is incorrect since the plain insert statement specifically does NOT support partial success.
Question 11: What is the purpose of Test.runAs() in Apex test classes?
Key takeaway: Test.
Show correct answer and explanation
Correct answer: A. To test with different user permissions
Test.runAs() allows you to execute test code in the context of a specific user, enabling you to test with different user permissions and sharing rules.
- Test.runAs() doesn't test asynchronous code, that's unrelated to its purpose of switching user context.
- Test.runAs() isn't specific to batch class testing, it applies to any Apex test scenario needing a different user context.
- Test.runAs() isn't specific to trigger testing, it's a general user-context testing mechanism usable anywhere.
Question 12: Which exception type should be thrown when validation fails in Apex?
Key takeaway: DmlException is thrown when DML operations fail.
Show correct answer and explanation
Correct answer: B. DmlException
DmlException is thrown when DML operations fail. For custom validation errors, you can throw DmlException with a custom message.
- A generic Exception doesn't carry the DML-specific context that DmlException provides for failed database operations.
- AuraHandledException is specifically for surfacing errors to Lightning components, not general DML failure handling.
- A custom exception class can be used, but DmlException is the standard, built-in type specifically for DML failures.
Question 13: A developer wants to query related records in a single SOQL query. Which clause should be used?
Key takeaway: SOQL uses relationship queries (dot notation) to query related records, such as 'SELECT Id, Account.
Show correct answer and explanation
Correct answer: C. Relationship query (dot notation)
SOQL uses relationship queries (dot notation) to query related records, such as 'SELECT Id, Account.Name FROM Contact' to get the Account name for each Contact.
- JOIN is not valid SOQL syntax: SOQL uses relationship dot-notation instead of SQL-style joins.
- INNER JOIN is SQL syntax, not valid SOQL: Salesforce's query language doesn't support this keyword.
- A subquery (parent-to-child) is a different SOQL technique for retrieving child records, not the dot-notation syntax used for the parent-to-child scenario described here.
Question 14: What is the purpose of the @TestVisible annotation?
Key takeaway: @TestVisible allows test classes to access private methods and variables, enabling better test coverage without making them public.
Show correct answer and explanation
Correct answer: B. To make a private method or variable accessible to test classes
@TestVisible allows test classes to access private methods and variables, enabling better test coverage without making them public.
- 'To make a method available to test classes' is too broad; @TestVisible specifically exposes private members, not general method availability.
- @TestVisible doesn't mark a class as a test class, that's unrelated to its actual purpose.
- @TestVisible doesn't enable test coverage tracking, that's a platform-level, automatic measurement, not something this annotation controls.
Question 15: Which governor limit applies to the number of records processed in a single transaction?
Key takeaway: The governor limit for the number of records processed in a single transaction is 200,000 records for synchronous contexts and 1,000,000 for asynchronous contexts.
Show correct answer and explanation
Correct answer: D. 200,000 records
The governor limit for the number of records processed in a single transaction is 200,000 records for synchronous contexts and 1,000,000 for asynchronous contexts.
- 10,000 records understates the actual synchronous governor limit of 200,000.
- 50,000 records understates the actual synchronous governor limit of 200,000.
- 100,000 records understates the actual synchronous governor limit of 200,000.
Get the Full PD1 Question Bank
Most candidates book the exam after scoring 80%+ on full mocks.
If you’re planning to test this quarter, aim to complete full mocks at least 10–14 days before your exam date.
Contact us for more information on our full 60-question mock exams and a personalized study plan. Use the contact form.
Request Mock Exams & Study PlanPD1 Study Resources
- PD1 Practice Questions →Governor limits, bulkification, 75% coverage rule, and a mock-test benchmark to pass first attempt.
- PD1 vs PD2: Which Should You Take First? →Difficulty comparison, what changes between the two exams, and when you are ready for PD2.
- What comes after PD1? Platform Developer II →Advanced Apex, integrations, and design patterns. Requires PD1 certification.
- Full Salesforce Developer Certification Path →Step-by-step guide: PD1 → JavaScript Developer I → PD2 → Integration Architect.
Coming from the admin track? ADM-201 exam tips (Summer '26) covers the Salesforce fundamentals that overlap with PD1.
Salesforce Certified Platform Developer (PD1) Exam FAQs
- What is covered on the Salesforce Certified Platform Developer (PD1) exam?
- The Salesforce Certified Platform Developer (PD1) exam (formerly Salesforce Certified Platform Developer I) covers section-wise weightage as shown above. Use the exam topics and practice questions on this page to align your study with the official outline.
- What programming languages do I need to know for Platform Developer I?
- You need to know Apex (Salesforce's Java-like language) and JavaScript for Lightning Web Components. Experience with Java, C#, or similar object-oriented languages is helpful, but you can learn Apex through Trailhead and hands-on practice.
- How much coding experience do I need for Platform Developer I?
- While some programming experience is helpful, you can learn Apex and Lightning Web Components through Trailhead. The exam focuses on understanding when to use code vs declarative tools, governor limits, testing, and basic Apex/LWC concepts rather than advanced programming.
- What is the PD1 passing score and exam format in Summer '26?
- The Platform Developer I (PD1) exam has 60 multiple-choice questions, 105 minutes, and a passing score of 68% (41 correct). Salesforce may include 5 unscored pilot questions. The exam costs $200 USD (retake $100 USD) and is available online-proctored or at a test center.
- What are the most common reasons candidates fail PD1?
- Common failure points: (1) not knowing governor limits (SOQL 100/transaction, DML 150/transaction) and when they trigger, (2) writing DML or SOQL inside a for loop, the exam's most common trap, (3) misunderstanding the 75% code coverage rule and how Test.startTest()/stopTest() affect limit resets, and (4) confusing @AuraEnabled, @RestResource, and @InvocableMethod annotations.
Honest Cert Breakdown
Difficulty: Hard
4/5Apex, SOQL, LWC, governor limits, test classes. Requires real coding experience; this is not a study-your-way-through exam. Hands-on org work is essential.
Salary Range
$98,000–$138,000 / year
US average for certified professionals • Updated Summer '26 • Source: Salesforce Talent Ecosystem
Is it worth it?
Essential for any Salesforce developer career. Consistently high demand and a clear salary ceiling above non-certified developers.
PD1 Exam at a Glance
60
Questions
105 min
Time Limit
68%
Passing Score
$200
Exam Fee
Retake fee: $100. No hard prerequisites required (ADM-201 knowledge assumed). 5 unscored pilot questions included, you cannot identify them.
PD1 Exam Sections and Weightage
Process Automation and Logic and Developer Fundamentals together account for 55% of the exam. Master Apex and the platform data model first.
Apex classes, triggers, governor limits, bulkification, async Apex (Future, Batch, Queueable, Scheduled)
Test classes, @isTest, Test.startTest/stopTest, code coverage (75% minimum), debugging tools, change sets, metadata API
Lightning Web Components (LWC), Aura components, Visualforce basics, @wire service, lightning-record-form, JavaScript in LWC
REST vs SOAP callouts, HttpRequest, HTTP methods (GET/POST/PUT/DELETE), JSON parsing, Named Credentials, external services
Platform basics, MVC pattern, declarative vs programmatic, object relationships, sharing model fundamentals
What Each Section Actually Tests
Process Automation and Logic (28%)
The heart of the PD1 exam. Apex governor limits are per transaction: SOQL is limited to 100 queries synchronously and 200 asynchronously; DML statements to 150; and records retrieved by SOQL queries to 50,000. CPU time is limited to 10,000ms synchronously and 60,000ms asynchronously. The callout limit is 100 per transaction. Bulkification is a specific governor limit scenario; you must know why SOQL or DML inside a for-loop violates limits and how to fix it using List/Map patterns. These are general per-transaction limits; the applicable context and documented exceptions matter, and exceeding a governor limit can cause an unhandled runtime exception. Async Apex: Future methods (simple callouts, @future(callout=true), cannot be monitored); Batch Apex (Database.Batchable interface, 3 methods: start/execute/finish, up to 50M records in batches of 200 default); Queueable (can be chained, accepts non-primitive types); Scheduled (Schedulable interface, cron expression). Most common mistake: confusing when to use Future vs Queueable; Queueable is preferred when you need chaining or non-primitive parameters.
Verify current values and context-specific exceptions in Salesforce's Apex Governor Limits quick reference and Execution Governors and Limits.
Testing, Debugging, and Deployment (20%)
Test class rules the exam enforces: 75% code coverage minimum for deployment (not per-class, across the org), @isTest annotation on class and methods, Test.startTest() / Test.stopTest() resets governor limits and forces async execution, System.assert/assertEquals/assertNotEquals for assertions. Test data isolation: @isTest(SeeAllData=false) is the default, test classes cannot see real org data unless SeeAllData=true (avoid this). Use Test.getStandardPricebookId() for price book in tests. Deployment: sandbox → production via change sets or metadata API. SFDX/SF CLI: sfdx force:source:push (scratch org), force:source:retrieve, force:mdapi:deploy. Debugging: Developer Console, Debug Logs, SOQL Query Plan, anonymous Apex for testing.
User Interface (25%)
Lightning Web Components (LWC) dominate this section. Key concepts: @api (public property, passed from parent), @track (reactive private property, deprecated in newer versions, all properties reactive now), @wire (calls Apex or standard library functions declaratively). Component lifecycle hooks: constructor(), connectedCallback(), renderedCallback(), disconnectedCallback(). LWC to Apex: @AuraEnabled on Apex methods, cacheable=true for wire, without cacheable for imperative calls. LWC events: custom events bubble with composed+bubbles options. Aura: still tested at lower depth, know component lifecycle, Aura events vs LWC custom events, and that Aura can contain LWC but not vice versa.
Integration (tested within Process Automation and Logic)
REST vs SOAP: REST uses JSON, lightweight, stateless, simpler to implement; SOAP uses WSDL/XML, stricter contract, legacy systems. Callouts: HttpRequest object, HttpRequest.setEndpoint(), HttpRequest.setMethod('GET'), Http.send(). Named Credentials store endpoint + authentication. Use them for credentials security. Callouts cannot be made from Apex triggers without @future(callout=true) or Queueable. Inbound: REST API (standard /services/data/vXX.0/ endpoints), SOAP API (WSDL import), Bulk API (CSV-based, high-volume). Apex allows 100 callouts per transaction.
Developer Fundamentals (27%)
MVC pattern (Model = objects/fields, View = Visualforce/LWC, Controller = Apex), declarative vs programmatic development, when to choose each. Object relationships (master-detail, lookup, many-to-many via junction object), sharing model basics (OWD, role hierarchy, sharing rules, with sharing / without sharing in Apex). Know that with sharing enforces the running user’s sharing rules; without sharing ignores them (admin context).
Critical Apex Patterns for the Exam
Bulkified Trigger Pattern (always correct):
trigger AccountTrigger on Account (before insert, before update) {
List<Id> accountIds = new List<Id>();
for (Account acc : Trigger.new) {
accountIds.add(acc.Id); // collect IDs
}
// SOQL OUTSIDE the loop, queries all at once
Map<Id, Contact> contacts = new Map<Id, Contact>(
[SELECT Id, AccountId FROM Contact WHERE AccountId IN :accountIds]
);
}Async Apex Decision Tree:
- Need a callout from a trigger? → @future(callout=true)
- Need to chain jobs or pass non-primitive data? → Queueable
- Need to process millions of records? → Batch Apex (Database.Batchable)
- Need to run daily/weekly automatically? → Schedulable (implements Schedulable)
Trigger context variables (must memorise):
- Trigger.new, new record values (insert, update, undelete)
- Trigger.old, old record values (update, delete)
- Trigger.newMap / Trigger.oldMap: Maps of Id to record
- Trigger.isBefore / Trigger.isAfter, when in the execution order
6-Week PD1 Study Plan
Week 1: Apex Fundamentals and Governor Limits (30%): Apex syntax, data types, SOQL, SOSL, DML operations, governor limits. Practice in Developer Edition org: write a simple trigger with SOQL outside the loop. Complete Trailhead “Apex Basics & Database” and “Apex Triggers” modules.
Week 2: Async Apex (part of 30%): Future methods, Batch Apex, Queueable, Schedulable. Learn the interfaces and method signatures by writing each type. Practice: write a batch class that updates all Contacts missing an email. Run it in anonymous Apex. Verify with System.debug logs.
Week 3: Testing and Deployment (25%): Test class structure, @isTest annotations, Test.startTest/stopTest, code coverage, mock callouts (HttpCalloutMock), and static resources for test data. Practice: write a test class for your batch Apex that achieves 100% coverage.
Week 4: LWC and User Interface (23%): LWC component anatomy (HTML/JS/CSS/XML), @api, @wire, @track, component communication (events, pubsub), lightning-record-form, lightning-datatable. Practice: build a simple LWC that displays accounts using @wire(getRecord).
Week 5: Integration and Fundamentals (22%): REST/SOAP callouts, HttpRequest, Named Credentials, inbound REST API, Bulk API overview. Review MVC, sharing model (with sharing / without sharing). Study integration patterns: outbound (Apex callouts) and inbound (custom REST endpoints with @RestResource).
Week 6: Full timed mock exams (60 Q / 105 min), weak-area targeted revision. Score 80%+ consistently (PD1 passing is 68%, aim 10 points above) before booking.
How to Approach PD1 Scenario Questions
- Governor limit questions: If you see SOQL or DML inside a for-loop in the code; that is wrong. The fix is always to collect IDs in a list, query outside the loop, and store results in a Map. Eliminate all answers that put SOQL/DML inside loops.
- Test class questions: If the scenario mentions “code coverage” below 75%, you need to add test methods. If it mentions tests passing locally but failing on deployment, the issue is usually SeeAllData=true (test relies on org data). System.assert is required, inserting a record without asserting is insufficient coverage.
- Async Apex questions: Identify the constraint: needs a callout from a trigger → Future. Needs chaining or SObject parameter → Queueable. Processes large datasets → Batch. Needs to run on a schedule → Scheduled. Needs to be monitored with status → Batch (has System.scheduleBatch and Apex Jobs UI).
- LWC questions: If a parent component needs to pass data to a child, use @api. If a child needs to notify a parent, fire a custom event with this.dispatchEvent(new CustomEvent(’eventname’, { detail: data })). If you need to call Apex imperatively, import the method and call it in connectedCallback() or a click handler.
How to Know You’re Ready
80%+ on 3 timed full mocks (60 Q / 105 min) before booking
PD1 passing score is 68%. The code-reading questions are designed to look ambiguous, a candidate who understands governor limits and bulkification can eliminate 2 of 4 answers immediately on most questions. If you are consistently failing governor limit questions, spend another week writing Apex in a Developer Edition org. Hands-on writing is the fastest way to internalise these patterns.
Top 10 Topics to Review the Day Before
- Governor limits per transaction: SOQL 100 synchronous / 200 asynchronous; DML 150; SOQL-retrieved rows 50,000; callouts 100; CPU 10,000ms synchronous / 60,000ms asynchronous
- Bulkification pattern: SOQL/DML outside loops, use Collections and Maps
- Trigger.new vs Trigger.old vs Trigger.newMap/oldMap and when each is available
- Before trigger vs After trigger; before is used to set field values (no DML needed), after is used to query related records
- @isTest, Test.startTest/stopTest purpose, resets limits, forces async execution
- 75% code coverage minimum for deployment, calculated across org, not per class
- Future vs Queueable vs Batch vs Scheduled, constraints and use cases
- @AuraEnabled(cacheable=true) for @wire, @AuraEnabled for imperative calls
- with sharing vs without sharing, sharing rules enforcement on Apex classes
- REST callout pattern: HttpRequest, Http.send(), getStatusCode(), getBody()
Related Guides
Practice With Real Exam-Style Questions
Apply this study guide with free PD1 practice questions, exam weightage breakdown, and prep tips:
Your Next Certification Step
After this certification, consider: Platform Developer II, Platform App Builder, or JavaScript Developer I.
Topic Difficulty Heatmap
Which topics are a gimme vs which ones trap confident candidates. Use this to prioritise your final-week revision. These are our own topic groupings for study planning, not the official exam sections, those and their weightings are in the credential's exam guide.
| Topic | Difficulty | Study Tip |
|---|---|---|
| Data Modeling and Management | Moderate | SOQL relationship queries (parent-to-child, child-to-parent) and relationship field naming conventions. |
| Logic and Process Automation | Trap ⚠ | SOQL/DML inside loops, every loop in a code snippet should trigger a governor limit check. |
| User Interface | Moderate | LWC component lifecycle hooks (@wire, @api, @track) and when each is appropriate. |
| Testing, Debugging, and Deployment | Hard | System.assert() is required, coverage without assertions is meaningless. HttpCalloutMock for callout tests. |
| Integration and APIs | Hard | REST vs SOAP, Named Credentials, and when to use each integration pattern in a scenario. |
Difficulty based on analysis of common candidate errors across each exam section.
Ready to Test Your Knowledge?
Try the Platform Developer I (PD1) free practice exam, scored with full explanations.
Platform Developer I (PD1) Free Practice Exam →Quick Answer: Best Way to Pass PD1
- Logic and Process Automation is 28% of the exam, master Apex triggers, governor limits, and async patterns first.
- Write real Apex code every day. PD1 scenarios require you to identify bugs and select correct patterns, not just recall facts.
- Take timed mocks (60 questions / 105 minutes). You are ready when you consistently score 80%+, the passing score is 68%.
PD1 Exam Weightage at a Glance
Focus time proportionally. The top three sections cover 73% of the exam.
Apex, triggers, async (Future, Batch, Queueable)
Platform concepts, data model, security model
SOQL, SOSL, DML, relationships, schema
75% coverage rule, Test.runAs(), debugging tools
LWC basics, @AuraEnabled, Lightning Data Service
Governor Limits You Must Know Cold
PD1 tests governor limits directly and through scenario questions. Memorise these before exam day:
| Limit | Synchronous | Asynchronous |
|---|---|---|
| SOQL queries per transaction | 100 | 200 |
| DML statements per transaction | 150 | 150 |
| Records per DML operation | 10,000 | 10,000 |
| Total records retrieved by SOQL | 50,000 | 50,000 |
| Apex CPU time | 10,000 ms | 60,000 ms |
The exam will ask you to identify code that violates these limits, especially SOQL/DML inside for loops.
4-Week PD1 Study Plan
Week 1: Salesforce Fundamentals & Data Modeling (45%): Platform data model, object relationships (lookup vs master-detail), field types, schema builder, SOQL (relationship queries, aggregate functions, dynamic SOQL), SOSL, and DML operations.
Week 2: Logic and Process Automation (28%): Apex fundamentals, trigger events (before/after, isNew, isUpdate, isDelete), bulkification patterns, governor limits, async Apex (Future, Batch, Queueable, Scheduled), and error handling.
Week 3: Testing, Deployment & UI (27%): Writing @isTest classes, Test.startTest()/stopTest(), Test.runAs(), mock data, 75% coverage requirement, debugging logs, changeset/metadata deployment, and LWC fundamentals (@api, @wire, @AuraEnabled).
Week 4: Full timed mock exams (60 Q / 105 min), weak-area targeted revision, and final review of governor limit scenarios before booking.
How to Handle PD1 Scenario Questions
Most PD1 questions give you a code snippet or business requirement and ask you to identify the problem or select the best implementation. Two strategies work here:
- Code review questions: Look for DML or SOQL inside a loop first; that is the most common governor limit trap. If you see it, the answer involves moving operations outside the loop.
- Requirement questions: Map the requirement to the right async tool. Use Future for single-record callouts, Batch for large data volumes, Queueable for chaining jobs, and Scheduled for time-based execution.
- Testing questions: If the scenario asks about code coverage or test data, remember: 75% overall is required, @TestVisible exposes private members, and Test.runAs() tests user-context behaviour.
Booking Readiness Benchmark
PD1 passing score is 68% (41/60 questions). Use this benchmark before scheduling:
80%+ on 3 timed full mocks (60 Q / 105 min), one week apart
The 10-point buffer above the passing score accounts for first-attempt nerves and unfamiliar question phrasing. If you are failing the Logic & Process Automation questions consistently, spend another week on triggers and async Apex before booking.
3 Concepts That Fail Most PD1 Candidates
These are not the hardest topics; they are the ones where candidates are most confidently wrong. Learn the distinction early.
1. SOQL Inside For-Loops: The Governor Limit That Kills Your Score
The 101-query governor limit means any SOQL statement inside a loop will fail at runtime when processing more than 100 records. Exam scenarios show code snippets and ask you to identify the bug. The wrong-answer trap is selecting “reduce batch size” the correct fix is always “move the SOQL outside the loop and use a Map or List.” Train yourself to scan every for-loop in a code snippet and ask: is there a SOQL or DML statement inside?
2. @wire vs @api vs @track: One Wrong Decorator, One Wrong Answer
LWC decorator questions are a guaranteed exam topic. @wire connects a property to a Salesforce data service (Apex or UI API) reactively. @api exposes a property or method to a parent component; it is public. @track is largely deprecated in modern LWC; plain properties are now reactive by default. The trap: candidates use @track thinking it makes a property “reactive” when @wire is what actually connects to the server.
3. Test Classes: Coverage Is Not Enough: Assertions Are Required
A test class that runs code and hits 75% coverage but contains no System.assert() statements is considered invalid for certification purposes. Exam questions often show a test method and ask what is wrong; the correct answer is “no assertions” even if coverage looks sufficient. Also know: callout mocks require HttpCalloutMock implementation, and calling a real endpoint in a test will throw an exception, not just fail silently.
Questions Candidates Ask
What is the PD1 exam format?
What are the highest-weight PD1 topics?
How long does it take to prepare for PD1?
What is the hardest part of the PD1 exam?
What concepts do most PD1 candidates get wrong?
Why do most PD1 candidates fail questions about SOQL Inside For-Loops: The Governor Limit That Kills...?
Why do most PD1 candidates fail questions about @wire vs @api vs @track: One Wrong Decorator, One Wr...?
@wire connects a property to a Salesforce data service (Apex or UI API) reactively. @api exposes a property or method to a parent component; it is public. @track is l...Why do most PD1 candidates fail questions about Test Classes: Coverage Is Not Enough?
System.assert() statements is considered invalid for certification purposes. Exam questions often show a test method and ask what is wrong; the correct answer is "no assertions" even if coverage looks sufficient. Also know: callout mocks require Related Study Resources
Next Step
Apply these tips with real exam-style practice questions:
After this exam, consider Platform Developer II or Platform App Builder next.
Share or cite this study guide
Free to link from a forum post, study repo or article. Copy the Markdown and paste it anywhere.