Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Day-to-day Salesforce org configuration — profiles, permission sets, OWD, sharing rules, FLS, the object/field data model, Flow automation, data import (Data Import Wizard, Data Loader), validation rules, duplicate management, reports, dashboards, and Agentforce admin setup. Use when configuring or reviewing declarative org settings, security/sharing, automation, or analytics. Not Apex/triggers/SOQL (see salesforce-platform-developer-1), advanced sharing architecture, deployment pipelines or aud
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 208% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 266% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 386% | 0% |
| case-21 | ✗→✓ | ▲ Improved | 248% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 398% | 0% |
The Salesforce Certified Platform Administrator credential (exam code Plat-Admn-201) covers everything an admin touches day-to-day: security and sharing models, object and field customization, Flow automation, data quality, reports and dashboards, and — as of the December 2025 refresh — foundational Agentforce AI capabilities.
This is an operational playbook, not an exam outline. A recurring principle: query the org — never assume from metadata XML. XML in a repo is not always deployed, and metadata does not carry runtime state (FLS, cache, active flows).
> Load this skill when… configuring org security (profiles, permission sets, OWD, FLS, sharing rules); building or debugging Flow automation; importing or cleaning data; setting up reports/dashboards; doing initial Agentforce agent setup. > Not this skill: Apex/triggers/SOQL → see salesforce-platform-developer-1; advanced sharing architecture, deployment pipelines, or audit monitoring → see salesforce-advanced-administrator; building or governing Agentforce agents → see salesforce-agentforce-specialist.
> Study resources: references/study-resources.md. Nonprofit/NPSP applications: salesforce-nonprofit-cloud-consultant. Org-specific rules: keep a per-org appendix in your project CLAUDE.md.
> Verify steps assume nothing about your tooling — use your project's Salesforce MCP connection, the Salesforce CLI (sf), or the Salesforce setup UI, in that order of preference. The SOQL and describe calls below are written to work through any of them.
Credential logistics and study path: see references/study-resources.md.
[volatile — verify live]; API/platform version and feature availability [volatile — verify live]; org-specific settings (OWD, active flows, installed packages, sandbox types); any cap or quota cited in this skill.[volatile — verify live] or [opinion — house style]. When in doubt, describe the object or run a SOQL query rather than trusting a tag.Access is computed by layering — reason about the whole stack, not one layer.
The layering rule (memorize the order):
Object CRUD ≠ FLS ≠ record sharing — all three must pass:
CRITICAL — SFDX field-meta.xml does NOT carry FLS. A deployed custom field is invisible to everyone — including System Administrator — until a profile or permset lists <fieldPermissions>. Always deploy <fieldPermissions> alongside every new non-required field.
Required-field exception: Required fields are always readable/editable — omit them from <fieldPermissions>. Including one fails deploy: "You cannot deploy to a required field."
ECA assignment gotcha: ECA usage is authorized on the ECA itself (ECA detail → Policies → Edit → App Policies → Select Permission Sets), not on the classic Permission Set "Assigned Connected Apps" page. Browser-AI tools edit the wrong place and report success — verify via PermissionSetAssignment query.
| Need | Use | Why | |---|---|---| | Same access for everyone in a job function | Profile baseline | One assignment, sets login/IP/layout too | | Extra access for a subset | Permission set | Additive, no profile sprawl | | Bundle several permsets for a role | Permission set group | Single assignment, manage as unit | | Remove one permission from a group | Muting permission set | Only mechanism that subtracts | | Open records above the OWD floor | Sharing rule | Grants without lowering the baseline | | One record, one person | Manual share | Surgical, owner-or-above only |
Red flags: a new SFDX field deployed with no accompanying <fieldPermissions>; a permset XML listing a required field; "grant access" attempted by editing OWD to Public (nukes the floor for everyone); assuming a permission set can revoke; trusting a browser-tool "success" on ECA assignment.
Verify against the live org:
sf sobject describe --sobject <object> / Object Manager → Fields & Relationships) — if a field you expect is missing from the output, suspect FLS.SELECT PermissionsRead, PermissionsEdit, Field FROM FieldPermissions WHERE ParentId IN (SELECT Id FROM PermissionSet WHERE Name='<permset>') (MCP / sf data query / Developer Console).SELECT AssigneeId, PermissionSet.Name FROM PermissionSetAssignment WHERE PermissionSet.Name='<permset>' (MCP / sf data query / Developer Console).Setup Audit Trail: 180-day log of Setup changes. First stop when behavior changes unexpectedly — including silent managed-package changes (see §4).
Users are deactivated, never deleted. Deactivating frees the license; freezing (Setup → Users → Freeze) blocks login immediately without freeing the license — use freeze for urgent lockout, deactivate later (blocked if the user owns open approvals).
Company settings: fiscal year, business hours (drive escalation timing), locale/language/currency. Multi-currency, once enabled, cannot be disabled.
Login & session security: login hours + IP ranges → profile only. Trusted IP ranges (skip-verification) → Network Access. MFA is mandatory for direct logins.
Sandbox creation can be gated — some orgs require a Public Group with the admin as a member before creation (check this first if sandbox creation fails).
Decision — where does a permission live?
| Setting | Profile | Permission set | Notes | |---|---|---|---| | Object CRUD | ✅ baseline | ✅ additive | Permset can't remove profile grant | | FLS | ✅ baseline | ✅ additive | Both can grant; required fields excluded | | App / tab visibility | ✅ | ✅ | | | Record type assignment | ✅ | ✅ | | | Login hours / IP ranges | ✅ only | ❌ | Profile-exclusive | | Page layout assignment | ✅ only | ❌ | Profile × record type intersection |
Red flags: trying to delete a user; putting login-hour restrictions in a permission set (impossible); enabling multi-currency "to test"; editing the System Administrator profile expecting to clone it down to a standard profile (you can't).
Relationships — pick deliberately:
| | Lookup | Master-Detail | |---|---|---| | Coupling | Loose | Tight | | Child required? | Optional | Always required | | Parent delete | Set null / restrict / cascade (configurable) | Always cascade-deletes children | | Sharing | Independent | Child inherits master's sharing | | Roll-up summary on parent? | ❌ | ✅ | | Max per object | 40 | 2 | | Reparenting | Yes | Off by default |
Roll-up summary fields exist only on the master side of a master-detail (COUNT/SUM/MIN/MAX). For a Lookup roll-up use a record-triggered Flow, Apex, or DLRS.
Lookup relationshipName must be unique per parent — two Lookups to the same parent with the same name fail deploy: "Duplicate relationship name." SOQL parent traversal keys on the field name (Parent__r.Name), not relationshipName, so renaming is safe.
Formula fields never store data — computed at read time; can't be set, indexed normally, or used as external IDs. Cross-object formulas: up to 10 hops.
Field sizing is a contract. Form/integration string lengths and picklist constraints must be derived from live Salesforce field metadata, not hand-set literals, and regenerated whenever a field is resized or a picklist changes. A field resize is rarely a one-file change: SF metadata, generated schema/validation artifacts, and data-model docs move together — all or none. Truncation at the write boundary is a fallback, not a substitute.
Record types drive page-layout assignment (profile × record type → layout) and picklist subsets. External IDs are the upsert key for idempotency and late re-linking — unique, indexed, max 25 per object (shared pool with unique custom fields).
Quick Action / Lightning cache scar: Adding fields to a Quick Action's layout via SFDX does not invalidate the runtime QA cache on Lightning contextual tabs (console:relatedRecord). New fields are silently absent even after logout/login. Cache-bust: edit any non-field-list metadata on the QA (<description>, <label>, or <layoutSectionStyle>) and redeploy — SF treats the structural change as meaningful and flushes the cache.
Lightning App Builder (LAB) — 15% of the December 2025 exam domain "Object Manager and Lightning App Builder":
Red flags: choosing master-detail when the child must sometimes exist alone (use Lookup); expecting a roll-up over a Lookup; two same-parent Lookups with identical relationshipName; hand-editing generated schema/validation files; a form max() literal that doesn't trace to the field-length source of truth; adding QA fields and not seeing them on the tab (apply the cache-bust); setting a Dynamic Forms visibility rule on a field that has Required = true at the field level (the field still enforces its required constraint even when hidden).
Verify: Describe the object (MCP / sf sobject describe --sobject <object> / Object Manager) to read true field lengths and picklist values before trusting any schema file. List objects (MCP / sf sobject list / Object Manager) to confirm an object exists before referencing it.
Workflow Rules and Process Builder reached end of support Dec 31, 2025 — build all new automation in Flow. Existing automation continues to execute; still recognize them — managed packages and legacy configs still contain them and they still fire.
Pick the flow type by trigger:
| Requirement | Flow type | |---|---| | React to a record create/update, modify the same record cheaply | Before-save record-triggered (no DML, fastest) | | React to a record save, create/update related records or send email | After-save record-triggered | | Run on a schedule over a set of records (nightly cleanup, reminders) | Scheduled flow | | User-facing wizard / form embedded in a page or Quick Action | Screen flow | | Reusable logic called by other flows/Apex/REST | Autolaunched (invocable) | | React to a Platform Event | Platform-event-triggered flow |
Before-save vs after-save is the key automation choice: before-save sets fields on the triggering record with zero added DML (fastest, no recursion); after-save runs post-commit and is required for related records, email, or Apex. Same-record field sets → before-save. Rolls-ups, child records, emails → after-save.
Governor limits (all flows + Apex + triggers share one transaction): 100 SOQL, 150 DML statements, 50k rows, 10k DML rows, 6 MB heap (sync), 10s CPU. Flows batch in 200s.
Bulkify. Never put Get/Create/Update/Delete (or SOQL/DML) inside a Loop — collect once, work in memory, one DML after the loop.
Fault paths — every faultable element needs one. Any Flow element that can fault — DML (Create/Update/Delete Records), Send Email, Action calls, HTTP callouts — must have a Fault path connector. Without it, a fault in a bulk transaction causes the entire batch to fail silently, with no user-visible error and no log entry. Best practice: connect the Fault path to a Create Records element that logs the fault message to a custom Flow_Error_Log__c object (or similar), then fault-terminate gracefully. A Flow with zero fault handling is a silent data-integrity risk in production.
Managed-package automation silently mutates your data. A managed package ships Workflow Rules, flows, and triggers in its namespace that fire on your records. When a field changes with no code of yours responsible, suspect managed-package automation first — check Setup → Workflow Rules and Flows filtered by namespace, then enable an Apex debug log in a sandbox to catch the culprit. The fix is usually deactivating the offending rule. Canonical scar: NPSP copies Phone → MobilePhone from a defaulted preferred-phone picklist on insert (worked example: salesforce-nonprofit-cloud-consultant).
Approval processes — place actions correctly: Initial Submission, Approval, Rejection, Recall, Final Approval/Rejection. Approver sources: specific user, role, queue, related-user field, or manager field.
Red flags: any Get/Create/Update/Delete element inside a Loop; before-save flow doing DML on other objects (use after-save); building a new Workflow Rule or Process Builder; assuming "the field changed itself" without checking managed-package automation; an after-save flow that re-triggers itself (recursion — add entry criteria / ISCHANGED guards); a DML, email, or action element with no Fault path (silent bulk failure).
Verify: SELECT Id, MasterLabel, TriggerType, Status FROM FlowDefinitionView WHERE Status='Active' (MCP / sf data query / Developer Console) to see what's firing; describe the affected object (MCP / sf sobject describe / Object Manager) to inspect managed-package fields before debugging mystery data changes; Setup Audit Trail for recent automation changes.
Pick the import tool:
| | Data Import Wizard | Data Loader | |---|---|---| | Max records | 50,000 | up to 5M (Bulk API 1.0) / up to 150M (Bulk API 2.0) [volatile — verify live] | | Objects | Accounts, Contacts, Leads, Campaign Members, Person Accounts, custom objects | All objects incl. custom | | Upsert by external ID | Limited | ✅ full | | Hard delete | ❌ | ✅ | | Built-in dup matching | ✅ | ❌ | | Interface | Browser wizard | Desktop app / CLI (CLI for scheduled jobs) |
The two Data Loader figures are not a conflict — they are two API modes of the same tool: the legacy Bulk API 1.0 ceiling is ~5M records, while Bulk API 2.0 raises it to ~150M (limits cheat-sheet, data-import FAQ). Throughput is bound by the org's 24h API/batch limits regardless.
On a managed-package org, prefer the package's own loader — it understands required relationships and field mappings a generic loader gets wrong (e.g. NPSP Data Import for Household/Contact/gift loads; see salesforce-nonprofit-cloud-consultant).
Recycle Bin retention is 15 days by default; orgs with Extended Retention enabled may retain up to 30 days. Hard delete (Data Loader) skips the Recycle Bin entirely and is unrecoverable.
Duplicate management: Matching Rules (define similarity) + Duplicate Rules (Alert = warn; Block = prevent save) — you need both; neither works alone.
Validation rules fire on save; TRUE → blocks the save. Use ISCHANGED(), ISNEW(), PRIORVALUE(), $Permission, $Profile to scope. Place the error on a specific field, not top-of-page.
Reports: tabular (no grouping, can't drive dashboards), summary (row groups), matrix (row × column), joined. Cross-filters = "Contacts WITHOUT applications." Custom Report Types expose object relationships not in standard types.
Dashboards: run as a fixed running user unless dynamic (runs as viewer). Folder access + running user's record access both gate what data appears.
Red flags: Data Import Wizard for >50k rows or for an unsupported object; hard delete without a backup; a dashboard exposing data because its running user is an admin; expecting a report to show records the running user can't see.
Verify: SELECT COUNT() FROM <object> (MCP / sf data query / Developer Console) to sanity-check row counts before/after import; run the report (MCP / Reports tab / Analytics REST API) to confirm output; spot-query Contacts (MCP / sf data query / list view) to verify a backfill landed.
Rules and red flags for Sales Cloud, Service Cloud, and productivity features. Full detail for lead assignment, case queues, entitlements, Omni-Channel, AppExchange, and key caps: references/sales-service-detail.md — load that file when configuring any of those features.
Quick operational callouts (load references for anything deeper):
Red flags: treating a repurposed Opportunity as a sales pipeline; editing managed-package metadata directly; adding Quick Action fields without cache-busting; expecting Standard Email-to-Case to work without an open firewall port.
Permission reasoning is identical to §1 — the same OWD + FLS + permission sets stack.
> Naming note: As of October 2025, Salesforce markets the agent platform under the "Agentforce 360" product umbrella. The Setup studio is now labeled "Agentforce Builder" (formerly Agent Builder); the exam guide may still use older terminology.
Conversation-preview testing: use Agent Builder's built-in conversation preview panel to exercise topics, actions, and instruction guardrails interactively before activation — it runs as the configured agent user so sharing/FLS gaps surface in preview rather than in a live deployment.
Red flag: assuming an agent bypasses sharing/FLS (it does not); an action that exists but is not linked to a topic (agent can't reach it); pointing an agent at PII without checking the running user's data scope; confusing Einstein feature configuration with Agentforce Agent Builder.
field-meta.xml), create the field with the correct type/length.→ gate: describe the object (sf sobject describe --sobject <object> / Object Manager) — confirm the field appears in the schema output before proceeding.
<fieldPermissions> (readable + editable) to the target permission set XML. Omit if the field is <required>true</required>.→ gate: open the permset XML and confirm the entry is present; confirm the field is not marked required (required fields fail deploy).
<description> or <label> on the QA to trigger a cache-bust (see §3).→ gate: open the layout XML and confirm the field reference appears.
sf project deploy start from the SFDX project root.→ gate: deploy log must show Deploy Succeeded; no partial-success warnings.
<description> changed.SELECT Field, PermissionsRead FROM FieldPermissions WHERE ParentId IN (SELECT Id FROM PermissionSet WHERE Name='<permset>') (MCP / sf data query / Developer Console).→ gate: field row present with PermissionsRead = true.
SELECT <Field__c> FROM <Object__c> LIMIT 1 as a non-admin user with the permset assigned.→ gate: no "Invalid field" error; value returns (even if null).
→ gate: confirm user Id and record Id are known.
→ gate: describe the object for the user's session — if the object doesn't appear, CRUD is the blocker; grant object Read on the permset.
→ gate: SELECT Field, PermissionsRead FROM FieldPermissions WHERE ParentId IN (SELECT Id FROM PermissionSet WHERE Name='<permset>') AND SobjectType='<object>' — missing rows mean no FLS. Add <fieldPermissions> and redeploy.
→ gate: SELECT Id FROM <Object__c> WHERE Id = '<recordId>' as the user — zero rows means a sharing gap. Check OWD, role hierarchy, and sharing rules; grant access at the appropriate layer.
→ gate: field returns a value; no CRUD/FLS/sharing error messages.
→ gate: confirm the package automation is identified (namespace + rule/flow name visible in Setup).
→ gate: re-run the DML and confirm the field change no longer occurs; run affected test classes to confirm no regressions.
→ gate: list of dependent components reviewed; no critical downstream failures in sandbox.
→ gate: Setup Audit Trail in production shows the deactivation event; re-run the DML and confirm behavior matches sandbox.
Five original scenarios covering the highest-value operational gotchas. Scenarios 1 and 2 are in this body; Scenarios 3–5 are in references/scenarios.md — load when diagnosing sharing-model changes, managed-package mystery writes, or Agentforce access failures.
Scenario 1 — The invisible field after SFDX deploy
> Situation: A developer deploys a new custom text field Preferred_Language__c on Contact via SFDX pipeline. The CI job reports success. A support agent logs in and the field is absent from the page layout and returns "Invalid field" when queried via SOQL. The developer confirms the field exists in Object Manager. What is happening and what is the fix?
> Competent move: No <fieldPermissions> was deployed alongside the field. SFDX field-meta.xml does not carry FLS — every non-required field starts invisible to everyone including System Administrators until a profile or permset explicitly grants Read. Fix: add <fieldPermissions> (readable + editable) to the permset XML and redeploy.
> Tempting-but-wrong: Re-run the deploy or add the field to the page layout. Both leave the root cause untouched — the field exists but is FLS-invisible; a page layout with a missing-FLS field still renders without it.
> Verify: Describe the Contact object (MCP / sf sobject describe --sobject Contact / Object Manager) — if Preferred_Language__c is absent from the field list for the current user context, FLS is the culprit. After deploying the fix, confirm: SELECT Field, PermissionsRead FROM FieldPermissions WHERE ParentId IN (SELECT Id FROM PermissionSet WHERE Name='<permset>') (MCP / sf data query / Developer Console).
Scenario 2 — Choosing between before-save and after-save Flow
> Situation: A new business rule: when an Opportunity's Stage changes to "Closed Won," automatically set a custom Close_Fiscal_Quarter__c formula-derived text field to a calculated value AND create a follow-up Task assigned to the Opportunity owner. How many flows, and of which types?
> Competent move: Two concerns, two trigger contexts. Setting Close_Fiscal_Quarter__c on the same Opportunity → before-save record-triggered flow (zero added DML, runs before commit). Creating a Task on a different record → after-save record-triggered flow (post-commit DML). A before-save flow cannot perform DML on other objects — attempting it errors.
> Tempting-but-wrong: One after-save flow that does both. Technically it works, but setting a field from after-save triggers an extra DML update on the Opportunity (a second save), consuming a DML statement and potentially re-triggering other automation. Before-save is always preferable for same-record field sets.
> Verify: In Flow Builder, confirm the first flow is Record-Triggered with "Before the record is saved" and contains no DML elements; the second uses "After the record is saved." Bulk-test with 250+ Opportunities to confirm governor limits are not breached.
Read this first. Each rule is concrete and imperative.
<fieldPermissions> alongside every new non-required field.<fieldPermissions> — the permset deploy fails. Omit all required fields.PermissionSetAssignment query.relationshipName — use role-specific suffixes.max() and picklist constraints from live field metadata; regenerate after any field resize/picklist edit; never hand-edit generated schema files.<description>/<label> and redeploy, or the new fields won't render on the contextual tab.Using this skill and hit a wall? If you find a claim contradicted by the live system or official docs, a missing rule that cost you a wrong attempt, or a decision this skill gave no criteria for — append an entry in the moment to .skill-feedback/salesforce-administrator.md at the project root (create it if absent):
date | skill last-reviewed | claim or gap | what you observed instead | evidence (error text / doc URL / query output) | suggested fix
These are harvested back into the skill via the learning loop. When the live system and this file disagree, trust the live system.
[volatile — verify live] marks, executable workflows, tool-agnostic verify steps, and the feedback protocol above. Exam logistics relocated to references/study-resources.md; last-reviewed set to 2026-06-09.[volatile — verify live]. Source: TDX 2026 blog.Independent educational content to upskill AI agents. Not affiliated with, authorized by, endorsed by, or sponsored by Salesforce, Inc. or any certification body. "Salesforce," "Salesforce Certified Platform Administrator," "Agentforce," "Einstein," "NPSP," and related marks are trademarks of Salesforce, Inc., used here solely to identify the subject matter. All other product names and brands are the property of their respective owners. Content is provided as-is, as guidance only — verify all rules, limits, and configuration steps against official Salesforce documentation and your live org before acting. Governor limits, blueprint weights, exam fees, and feature availability are subject to change at any time. No certification outcome is implied or guaranteed.
Other measured skills in the registry, with their headline benchmark lift.