Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Advanced declarative Salesforce administration — the full sharing/security model (role hierarchy, owner/criteria sharing rules, muting and session-based permission sets), complex Flow automation and order-of-execution debugging, custom object and relationship design (master-detail, junctions, DLRS roll-ups), data management (Data Loader, duplicate/matching rules, External IDs), sandbox strategy, SFDX deployment, and auditing/monitoring (Setup Audit Trail, Field History, Event Monitoring). Use wh
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 413% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 289% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 441% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 376% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 561% | 0% |
> This file is an operational playbook, not an exam outline. Each section states > the rule as an actionable instruction, gives the real limit/number, tells you when to > pick one tool over another, and flags the anti-patterns to catch in review. Read the > Operational Rules Quick Reference near the bottom first.
The Salesforce Certified Advanced Administrator (Salesforce Certified Platform Administrator II, exam code Plat-Admn-301) extends the Administrator credential into complex declarative problem-solving: full sharing and security, advanced Flow and approval automation, custom object design, deployment pipelines, and org-health monitoring.
> Load this skill when… designing or debugging the full sharing/security model (OWD, role hierarchy, sharing rules, muting permsets, session-based permsets); debugging Flow order-of-execution or recursion bugs; planning SFDX deployment pipelines or sandbox strategy; setting up auditing (Field History, Event Monitoring, debug logs). > Not this skill: day-to-day org config, basic profiles/permsets, simple Flow builds → see salesforce-administrator; Apex triggers, SOQL, code review → see salesforce-platform-developer-1.
> Study resources: references/study-resources.md. NPSP applications: salesforce-nonprofit-cloud-consultant. Org-specific rules: 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]; sandbox refresh intervals and storage quotas [volatile — verify live]; Field History retention windows [volatile — verify live]; feature availability and retirement dates (e.g. Workflow Rules/Process Builder retirement); any cap or quota cited in this skill.[volatile — verify live] or [opinion — house style]. When in doubt, query the org directly before acting.Access is additive-only. The stack: OWD (baseline) → role hierarchy → sharing rules → manual/Apex sharing. Every layer only widens access. To restrict, lower the OWD — sharing rules cannot take access away.
FLS ≠ object access ≠ record access — three independent gates. Full object Read + INVALID_FIELD on a query = FLS not granted. Verify all three when access fails.
field-meta.xml grants FLS to no one. Deploy a <fieldPermissions> entry in a permset/profile alongside every new custom field or every query returns "Invalid field" — including for System Administrator.<fieldPermissions>. Deploy fails: "You cannot deploy to a required field."Decision table — profiles vs. permission sets vs. permission set groups:
| Need | Use | Why | |---|---|---| | Org-wide baseline (login hours, IP ranges, default record type, one profile per user) | Profile | Exactly one profile per user; it's the floor | | Grant extra access to a subset of users (an API user, staff reporting fields) | Permission Set | Additive, reusable, assign many per user | | Bundle 5+ permsets for a job role | Permission Set Group | Aggregates permsets; use Muting Permission Sets to subtract | | Elevated access only during a verified/MFA session | Session-based permission set | Time-boxed privilege escalation |
Salesforce's strategic direction: permission-set-first — new grants in permsets, thin profiles.
Key limits: Field History Tracking ≤ 20 fields/object [volatile — verify live]. Approval steps ≤ 30 [volatile — verify live].
Red flags:
<fieldPermissions> → silently fails every query. Catch in every field-add PR.Verify against the live org:
sf sobject describe --sobject <object> / Object Manager) — if the field is absent from the output, FLS is missing.SELECT Id,Field__c FROM Obj__c LIMIT 1 (MCP / sf data query / Developer Console) → INVALID_FIELD = FLS problem, not object access.SELECT Id FROM PermissionSetAssignment WHERE AssigneeId='…' AND PermissionSet.Name='…' (MCP / sf data query / Developer Console) — never trust a UI toast, especially for ECA.Pick the relationship type by the lifecycle and reporting you need, not by habit:
| Relationship | Use when | Consequences | |---|---|---| | Master-Detail | Child can't exist without parent; you need roll-up summaries; child shares parent's sharing | Cascade delete; child inherits OWD/sharing; max 2 MD per object; reparenting off by default | | Lookup | Records are independent; either side can exist alone | No roll-up summary (need DLRS/Apex/flow); independent sharing; can be required or optional | | Junction (2 MD) | True many-to-many (e.g. Person A ↔ Person B relationships, donor soft credits) | First MD = primary (controls detail's ownership/sharing); deleting either master deletes the junction |
relationshipName must be unique per parent. Duplicate name → deploy fails. SOQL traversal keys on the field name (Parent_Object__r.Name), so renaming the relationshipName is safe.Red flags:
console:relatedRecord) doesn't invalidate on deploy. Cache-bust: edit any non-field-list metadata (<description>, <label>, or <layoutSectionStyle>) and redeploy.Verify against the live org:
sf sobject list, or Setup → Object Manager) to confirm an object's API name before referencing it.sf sobject describe / Object Manager) to read relationship fields, relationshipNames, and picklist values before writing SOQL or a flow that traverses them.Memorize the order of execution — most automation bugs are an ordering surprise:
Tool selection — pick the cheapest tool that does the job:
| Need | Use | Don't use | |---|---|---| | Block bad data at save | Validation rule | A flow (slower, can't stop save as cleanly) | | Set a field on the same record at save | Before-save record-triggered flow | After-save flow (extra DML, slower, recursion risk) | | Update related records / send email / call Apex | After-save record-triggered flow | Before-save (can't do related-record DML) | | Compute a value read-only | Formula field | Any automation (no storage, no recompute cost) | | Complex branching, bulk loops, callouts, >limits | Apex trigger / invocable | Stacked flows that blow CPU/SOQL limits | | Multi-user, long-running, multi-stage | Flow Orchestration | A single mega-flow |
Bulkify. Never put SOQL/DML inside a loop (Get/Update inside a Flow loop = same problem). Query once into a collection, work in memory, one DML after the loop. Limits: 100 SOQL, 50k rows, 150 DML, 10k DML rows, 10s CPU (60s async), 6 MB heap, 100 callouts [volatile — verify live].
Red flags:
ISCHANGED entry condition, or a static guard.npe01 workflow overwrites Phone → MobilePhone on insert based on PreferredPhone__c. Use a debug log trace flag to find the actual writer.Verify against the live org:
a record during DML — this is how a hidden managed-package overwrite gets caught.
sf data query / Developer Console) before/after a test write to confirm a flow set the field you expect (and didn't clobber another).Deep dive — Approval Process quirks and Territory Management: references/approval-territory.md — load when configuring multi-step approvals, record-lock automation collisions, or Enterprise Territory Management.
Prevent bad data at entry, then de-dup what slips through. Entry-time controls (required fields, picklists, validation rules) are cheaper than cleanup. For cleanup: Matching Rules define similarity; Duplicate Rules define the action (block / alert / report). They are configured separately — you need both.
Import tool selection:
| Tool | Records | Objects | Use when | |---|---|---|---| | Data Import Wizard | up to 50,000 | Accounts, Contacts, Leads, Solutions, custom objects — NOT Opportunities | Quick UI import, simple de-dup | | Data Loader | up to ~5M (Bulk API 1.0) / up to ~150M (Bulk API 2.0) [volatile — verify live] | All objects incl. Opportunities | Large volume, CLI/batch, upsert via External ID |
Some managed packages provide a purpose-built import tool that enforces their data model (e.g. NPSP Data Importer/BDI for Contact/Account/Opp with Household matching — see salesforce-nonprofit-cloud-consultant).
Red flags:
Verify against the live org:
sf data query / a list view) to confirm a record exists / matched before an upsert.COUNT() query (MCP / sf data query / Developer Console) to sanity-check row counts pre/post import.Know which log answers which question, and its retention:
| Question | Tool | Retention | |---|---|---| | Who changed a setup/metadata setting? | Setup Audit Trail (downloadable CSV) | 6 months (180 days) [volatile — verify live] | | Who logged in / from where / failed logins? | Login History | 6 months | | What changed on this record's fields? | Field History Tracking (≤20 fields/object) | 18 months in UI; archive to FieldHistoryArchive Big Object beyond | | What did this Apex/flow transaction do? | Debug Logs (trace flag) | ~24h or until 1,000 entries / size cap | | API calls, report exports, URI, anomalies? | Event Monitoring ELF (add-on) | 1 day or 30 days by license |
Set a trace flag on the running user to capture a transaction — this is the tool that catches hidden managed-package automation.
CreatedById (insert only), LastModifiedById (user edits),SystemModstamp (any change incl. system/automation). Use SystemModstamp to find automation-touched records, LastModifiedById for human edits.
Red flags:
History or Event Monitoring before you need the history.
Verify against the live org:
sf sobject describe / Object Manager) to confirm which fields have history tracking enabled before promising an audit trail exists.SELECT … FROM Obj__History WHERE … (MCP / sf data query / Developer Console) to read tracked changes directly.Sandbox selection by data need and refresh cadence:
| Sandbox | Data | Refresh interval | Use for | |---|---|---|---| | Developer | Metadata only | 1 day | Dev/unit work | | Developer Pro | Metadata only, larger storage | 1 day | Bigger dev datasets | | Partial Copy | Metadata + sample data (template) | 5 days [volatile — verify live] | Integration/UAT with representative data | | Full | Metadata + ALL data | 29 days [volatile — verify live] | Staging, perf, final pre-prod validation |
Deployment-tool decision:
sf project deploy start. Run from the SFDX project root — running from the repo root gives InvalidProjectWorkspaceError.Red flags:
field-meta.xml carries FLS — it does not (see Security). Deploy the permset alongside.connectedApp-meta.xml may return "You can't create a connected app." Workaround: use an External Client App (ECA).Verify before/after a deploy:
gotcha above at the layer it bites.
sf sobject describe / Object Manager) to confirm the new field is API-visible (proves FLS landed, not just the field).sf data query / Developer Console) to confirm the field is selectable, not INVALID_FIELD.Sales Cloud (Price Books, schedules, Opportunity splits, Collaborative Forecasting), Service Cloud (Knowledge, Entitlements/Milestones, Omni-Channel), and Experience Cloud (site types, Experience Builder, member profiles, Audience Targeting) shape: references/cloud-applications.md — load when configuring multi-cloud features or Experience Cloud portals.
→ gate: run SELECT SobjectType, DefaultAccess FROM OrgWideDefault (or Setup → Sharing Settings) to capture the baseline before any change.
→ gate: sharing recalculation may take minutes; confirm the sharing job completed (Setup → Sharing Settings → Recalculate if needed).
→ gate: as a test user in each affected persona, run SELECT Id FROM <Object__c> and confirm the expected rows are returned.
→ gate: zero rows (or only owned records) returned for excluded persona.
→ gate: Setup Audit Trail shows the OWD change; re-run persona spot-checks in production.
→ gate: test-insert one record in the sandbox and confirm no automation fires (no field changes, no child records created).
--serial mode if DML lock contention is expected.→ gate: Data Loader success file shows expected row count; error file is empty or contains only expected failures.
SELECT Id, <key fields> FROM <Object__c> WHERE ExternalId__c IN (:sampleIds) — confirm field values landed correctly.→ gate: no truncation, no blank required fields, parent lookups resolved.
→ gate: test-insert one more record and confirm automation fires as expected.
→ gate: sample parent records show correct SUM/COUNT values matching the loaded children.
sf project deploy start --dry-run --target-org <prod alias> (validation-only deploy).→ gate: validation completes with Deploy Succeeded (Validation Only) — no component errors; coverage gate (≥75%) passes.
→ gate: zero errors and zero unexpected warnings in the validation report.
sf project deploy start --target-org <prod alias>.→ gate: Deploy Succeeded; confirm component count matches the validation run.
sf sobject describe --sobject <object> --target-org <prod alias> and confirm the field is API-visible (proves FLS landed).→ gate: field appears in describe output with updateable: true (or nillable: true for optional fields).
SELECT <newField__c> FROM <Object__c> LIMIT 1.→ gate: no INVALID_FIELD error; field returns a value or null (not an exception).
Operational judgment checks covering high-value gotchas. Scenarios 1 and 2 are here; Scenarios 3–5 are in references/scenarios.md — load when diagnosing sharing-model tightening, Lookup-to-rollup gaps, or Flow recursion bugs.
Scenario 1 — The invisible field after deployment
> Situation: A developer deploys a new Restricted_Notes__c field on Contact via SFDX sf project deploy start. A sales rep immediately reports the field is missing from their SOQL query results; no error, just absent. A System Administrator can also not SELECT it in a workbench query. > > Competent move: Recognize that field-meta.xml deploys the field schema but grants FLS to nobody — including System Administrator. Deploy a permission set that includes a <fieldPermissions> entry for the field (readable + editable as appropriate), then assign it or include it in a permission set group. Verify by describing the Contact object (MCP / sf sobject describe --sobject Contact / Object Manager) — the field should now appear in the field list for the running user. > > Tempting-but-wrong: Checking the page layout or assuming System Administrator bypasses FLS. System Admin does bypass most object/record security but does not bypass FLS for fields not in a profile/permset (this is a common misconception — FLS applies to all profiles including System Administrator unless explicitly granted). > > Verify: Run SELECT Id, Restricted_Notes__c FROM Contact LIMIT 1 (MCP / sf data query / Developer Console) — transitions from INVALID_FIELD to a valid result once FLS is in place. Also describe the Contact object and confirm the field appears with updateable: true.
Scenario 2 — Approval process and automation collision
> Situation: An after-save flow is configured to stamp an Approved_Date__c field on an Opportunity the moment StageName changes to "Closed Won." In UAT, submitters report the flow errors with "ENTITY_IS_LOCKED" after they approve a deal. The same flow works fine on records that were never submitted for approval. > > Competent move: Approval submission locks the record. After-save flows fire when the approver clicks Approve, but the record is still locked at that point. Move the field-stamp logic into a before-save record-triggered flow triggered when StageName becomes "Closed Won" — before-save flows run before the lock check, and they use no DML (they modify the in-flight record). Alternatively, use a final-approval action (Workflow Field Update or Flow) that runs in the approval process's own unlock context. > > Tempting-but-wrong: Adding a Recall step before the flow runs — this adds operational friction and doesn't fix the root cause. Also wrong: using an Apex trigger without Database.setSavepoint awareness — same lock error. > > Verify: After moving to before-save, submit a test Opportunity for approval and approve it — confirm Approved_Date__c is set and no ENTITY_IS_LOCKED error in the debug log.
Read this first. Each is imperative and concrete.
sharing rule to take access away.
<fieldPermissions> in a permset/profile for every new SFDX custom field — thefield-meta.xml grants FLS to no one.
<fieldPermissions> on a <required>true</required> field — deploy fails;omit required fields.
layouts.
PermissionSetAssignment SOQL, never a UI successtoast.
relationshipNames unique per parent object (role-specific suffixes).inside a flow loop, no SOQL/DML inside an Apex loop.
extra DML); use after-save only for related-record DML / email / Apex.
put the check in entry criteria.
ISCHANGED, or static flag) on any automationthat updates its own object.
own code — use a debug log trace flag.
[volatile — verify live].Duplicate Rule are required for de-dup.
data storage are separate quotas.
sf project … from the SFDX project root, not the repo root.<description>) when addedfields don't render on Lightning tabs.
Event Monitoring beforehand.
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-advanced-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.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 Advanced Administrator," "Salesforce Certified Platform Administrator II," "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.