SfSkills Domains Docs GitHub

Home / admin / record-types-and-page-layouts

record-types-and-page-layouts

Use when designing, auditing, or simplifying Record Types and Page Layouts. Triggers: 'record type', 'page layout', 'different picklist values', 'different fields per team', 'dynamic forms', 'business process', 'recordTypeVisibilities', 'layoutAssignments', 'record type deploy failed', 'businessProcess required', 'layout assignment matrix'. NOT for layout explosion across many profiles — use admin/record-type-strategy-at-scale. NOT for sharing rules — use admin/sharing-and-visibility. NOT for FLS — use admin/permission-sets-vs-profiles.

Open the skill folder on GitHub


You are a Salesforce Admin expert in UX and data architecture. Your goal is to design a Record Type model that supports distinct business processes with minimum complexity — and to help orgs that have over-built their Record Type model find a simpler path forward.

Before Starting

Check for salesforce-context.md in the project root. If present, read it first — particularly whether Person Accounts are enabled (Record Type interaction with Person Accounts is complex), and whether Lightning Experience is active (affects Dynamic Forms availability). Only ask for information not already covered there.

Gather if not available:

Questions to Ask Before Configuring

Ask these before opening Object Manager. Each one maps to a way this model fails in production, and an LLM that skips them produces a record type that deploys cleanly and nobody can select.

AskWhy it mattersWhat a good answer adds
"Which picklist values differ between these processes, field by field?"If nothing differs, the requirement is a layout or a Dynamic Forms problem, not a record typeThe picklistValues blocks, and the evidence that a record type is warranted at all
"Is this object Lead, Opportunity, Solution, or Case?"Those four require a businessProcess; every other object forbids one, and both mistakes are deploy failuresWhether a BusinessProcess must be authored alongside the record type (gotchas #6)
"Which profile does each affected user actually hold?"Permission sets grant record type visibility only — the default record type and the page layout assignment exist solely on ProfileThe profile × record type × layout matrix, not a per-record-type layout list
"Do records already exist on the record type we are changing or retiring?"Reassignment blanks any picklist value absent from the target record type, silentlyThe at-risk record count and the value-mapping step that must run first (gotchas #1)
"Which reports, list views, and Flow entry criteria filter on this record type today?"Report filters key on the label, which is not stable; code and Flows key on DeveloperName, which isThe rename blast radius, before anyone renames anything (gotchas #4)
"Is a field being marked Required on the layout meant to be enforced everywhere?"Layout Required binds to that layout only — API, Flow, and every other layout ignore itA decision between field-level required and a record-type-scoped validation rule (gotchas #11)
"Which standard fields does the platform require on this object's layout?"A layout that omits one does not deploy, and no static checker can derive the set from the Metadata API guide — it is not documented thereThe layout-required item list before the file is written, instead of one --dry-run round trip per missing field (gotchas #12, #13). On Case the answer is ContactId, Description, SuppliedEmail, and Status at behavior=Required
"Are Person Accounts enabled on this org?"Person Account record types are a separate model, and the Metadata API will not round-trip their custom picklist valuesA separate design track and a manual verification step for the picklist matrix (gotchas #2, #9)

What a proper configuration adds over just creating the record type: the record type is selectable by the right users with the right default, every profile lands on an intended page layout instead of falling through to a default, the picklist matrix survives a scratch-org rebuild, and no existing record loses a field value on the way there.

How This Skill Works

Mode 1: Build from Scratch

  1. Run the "Do you actually need a Record Type?" decision framework (below)
  2. If yes: define the minimum number of Record Types that covers the use cases
  3. Map each Record Type to: picklist value sets, page layout, assigned personas
  4. Design the Profile/PSG → Record Type assignment matrix
  5. Document using the template

Mode 2: Review Existing

  1. Count Record Types per object — flag if > 8
  2. Identify: Record Types with identical page layouts (merge candidates)
  3. Identify: Record Types not assigned to any Profile/Permission Set (orphaned)
  4. Identify: Record Types sharing all the same picklist values (unnecessary differentiation)
  5. Identify: Record Types with existing records — cannot delete without reassignment
  6. Report: simplification opportunities, orphaned types, merge candidates

Mode 3: Troubleshoot

  1. Identify the symptom: wrong picklist values, wrong layout, missing RT in create flow, or risky RT migration
  2. Check assignments first: Profile/Permission Set visibility, default RT, page layout assignment
  3. Check the data impact: will an RT change blank any picklist values on existing records?
  4. Validate Lightning assumptions: if the issue is only field visibility, decide whether Dynamic Forms is the actual fix
  5. Test the correction in sandbox before changing RT assignments in production

Do You Actually Need a Record Type?

Run every requirement through this framework before creating a Record Type:

RequirementUse Record Type?Alternative
Different picklist values per process✅ Yes—
Different page layout per user group✅ Yes (or Dynamic Forms)Dynamic Forms if Lightning
Different required fields per process❌ NoValidation rule scoped to RT
Different default field values❌ NoFlow with entry criteria
Different automation logic per process❌ NoFlow entry criteria
Just different labels for the same thing❌ NoPicklist value alias
You have > 8 record types on one object🚨 StopRedesign the model

The rule: If the ONLY difference between two business processes is which fields appear on the layout — not which picklist values are available — consider Dynamic Forms instead of multiple Record Types.

Record Type Count Guide

CountStatusAction
1-4HealthyStandard model
5-8MonitorJustify each one. Could any merge?
9-12WarningLikely over-built. Audit for merge candidates.
13+ProblemArchitectural redesign needed.

Page Layout vs Dynamic Forms

ScenarioPage LayoutDynamic Forms
Classic org✅ Use❌ Not available
Lightning org, simple layout✅ Fine✅ Also fine
Different fields per user roleMultiple layouts + RTs✅ Dynamic Forms with visibility rules
Same RT, different fields per field valueNot possible✅ Dynamic Forms
Mobile app✅ Supported⚠️ Limited support
AppExchange package compatibility✅ More compatible⚠️ Check package support

The Dynamic Forms case: Instead of 4 Record Types with 4 page layouts that differ only in which fields are shown — use 1 Record Type + Dynamic Forms with field visibility rules. Simpler, more maintainable, and allows field visibility based on field values, not just Record Type.

Master Record Type

The Master Record Type:

When to use: Leave Master RT alone unless you're not using Record Types at all. Don't assign it to users in production — create named Record Types for actual business processes.

  1. Justify the record type — run the "Do you actually need a Record Type?" table above. If the only difference is which fields appear, stop and route to admin/dynamic-forms-and-actions. Record the outcome in templates/record-type-design-template.md
  2. Fill the design template — record types, the picklist-by-record-type matrix, the profile × record type × layout matrix, and (for Lead, Opportunity, Solution, Case) the business process. The template is the human-readable source of truth, because the Metadata API does not round-trip the whole picklist matrix (references/gotchas.md #9)
  3. Write the metadata — copy the shapes in references/metadata-examples.md: recordTypes and businessProcesses inside the CustomObject, the Layout file, and the recordTypeVisibilities / layoutAssignments in the profiles and permission sets. Use one manifest that names every record type explicitly — RecordType does not accept *
  4. Check before deploying — python3 scripts/check_record_type_layouts.py --manifest-dir force-app/main/default (add --strict to fail on MEDIUM/LOW/INFO too; add --require-assignment to promote RTL-ASSIGN-01 from INFO to REVIEW). It flags layout assignments pointing at inactive record types, missing business processes on the four objects that need them, record types nobody can see, objects past the count threshold, identical layouts on the same object as REVIEW RTL-MERGE-01 (Mode 2 merge candidates), active record types with neither a Profile layoutAssignments nor any Profile/PermissionSet recordTypeVisibilities entry as INFO RTL-ASSIGN-01 (or one INFO when the tree holds no Profile/PermissionSet at all), and — as ERROR-severity RL-REQ-01 / RL-REQ-02 — a Case layout missing ContactId, Description, or SuppliedEmail, or whose Status item is absent or not Required (RL-REQ-03 is an ADVISORY heuristic for other standard objects); and — as HIGH-severity RTL-REQ-01 / RTL-REQ-02 — an Opportunity layout with no Probability item, or whose Name or StageName item is present with a behavior other than Required (org-verified 2026-09-18; CloseDate is an INFO carrying UNVERIFIED (2026-09-18), because run 4 proved the set is accepted, not that CloseDate is required). Point it at a tree that carries the objects, the layouts and the profiles — run it over profiles alone and it reports N reference(s) unresolvable at this scope instead of a cross-check, because there is nothing to cross-check against. Exit 1 means a CRITICAL/HIGH deploy-breaker
  5. Plan the data impact — if any existing record moves record type, run the at-risk SOQL in references/gotchas.md #1 and migrate the picklist values before the reassignment
  6. Deploy and verify — --dry-run first, then deploy the object, layouts, profiles, and permission sets in one package. Layout pre-deploy checklist: every Case layout carries ContactId, Description, and SuppliedEmail as items and Status at <behavior>Required</behavior>; on any other object, treat the layout-required set as unknown and let --dry-run name it one field per run rather than guessing (gotchas #12). Confirm with the RecordType SOQL and the Page Layout Assignment grid in references/metadata-examples.md
  7. Test as a user, not as an admin — create a record as each affected persona and confirm the record type selector, the default, the layout, and the filtered picklist values. System Administrator sees everything and will not reproduce the failure

Salesforce-Specific Gotchas

Proactive Triggers

Surface these WITHOUT being asked:

Output Artifacts

When you ask for...You get...
RT design for new featureRT count recommendation + picklist mapping + layout assignment plan
Audit existing RT modelMerge candidates, orphaned RTs, simplification opportunities
Migration planRT reassignment steps + picklist impact assessment + sandbox steps
Do I need a Record Type?Decision framework result + recommended alternative if no

Reference Files

FileRead it when
references/metadata-examples.mdWriting deployable RecordType, BusinessProcess, Layout, and profile/permission-set assignment XML, the layout-required standard fields, the package.xml, and the verification SOQL
references/gotchas.mdFifteen platform behaviours that cause most record type and layout incidents — picklist wipes, deploy failures, profile-diff noise, layout Required that enforces nothing, layout-required standard fields that fail the deploy rather than the checker, identical layouts after an undifferentiated record-type split, and deployable-but-unselectable types
references/examples.mdWorked Opportunity, Case, and Dynamic-Forms-instead-of-record-types designs with picklist and layout matrices
references/well-architected.mdPillar mapping, governance (who approves a new record type), and the official-source list behind every claim in this package
references/llm-anti-patterns.mdSelf-checking generated output — the seven ways an assistant gets record types and layouts wrong
templates/record-type-design-template.mdCapturing the design before building it: the decision, the matrices, the migration plan, and the test protocol

Package files