Architectural Overview
The ApexSettings metadata type controls critical org-wide switches for the Apex runtime, unit test execution engine, inbound email handlers, and historical data migration capabilities. For a Senior Salesforce Architect, version-controlling Apex.settings-meta.xml is essential for deterministic CI/CD pipelines and data migration cutovers.
For example, when migrating legacy records into Salesforce and populating CreatedDate, CreatedById, or LastModifiedDate, an architect must enable enableAuditFieldsInactiveOwner in ApexSettings before granting the corresponding system permissions inside a PermissionSet. Similarly, controlling enableDisableParallelApexTesting prevents or exposes UNABLE_TO_LOCK_ROW contention during automated test runs.
Directory Location and File Suffix
| Property | Value |
|---|---|
| Metadata Type Name | Settings (member: Apex) |
| XML Root Element | <ApexSettings> |
| SFDX Directory | force-app/main/default/settings/ |
| File Name & Suffix | Apex.settings-meta.xml |
Key Metadata Fields
| Field | Type | Description & Architectural Significance |
|---|---|---|
enableAggregateCodeCoverageOnly |
boolean |
Stores only aggregate code coverage totals rather than line-by-line coverage during test runs, speeding up large test suites at the cost of line-level detail. |
enableApexAccessRightsPref |
boolean |
Enforces explicit user profile or permission set access checks for @AuraEnabled and REST-exposed ApexClass methods. |
enableApexApprovalLockUnlock |
boolean |
Allows Apex code to lock and unlock records programmatically using Approval.lock() and Approval.unlock() methods. |
enableAuditFieldsInactiveOwner |
boolean |
Unlocks the org preference allowing Permission Sets and Profiles to grant “Set Audit Fields upon Record Creation” and “Update Records with Inactive Owners”. |
enableCompileOnDeploy |
boolean |
Compiles all Apex classes in the org during every deployment to prevent runtime compilation latency for end users after major releases. |
enableDisableParallelApexTesting |
boolean |
When set to true, disables parallel Apex test execution so unit tests run serially (preventing shared-record row lock errors in poorly isolated tests). |
enableDoNotEmailDebugLog |
boolean |
Suppresses unhandled exception emails originating from managed package code when subscriber debug logging is active. |
enableEmailToApexSubdomain |
boolean |
Appends a sandbox-specific subdomain to generated Email-to-Apex service addresses. |
enableFasterDeployment |
boolean |
Optimizes Apex compilation and validation phases during Metadata API deployments. |
enableFtMav |
boolean |
Enforces minimum API version validation rules on Apex components when required by platform updates. |
enableGaplessTestAutoNum |
boolean |
Prevents unit tests from incrementing auto-number field sequences on real org records when test records are rolled back. |
Warning
Pay close attention to enableDisableParallelApexTesting. Because the underlying UI checkbox is named Disable Parallel Apex Testing, setting <enableDisableParallelApexTesting>true</enableDisableParallelApexTesting> disables parallel testing and forces serial execution!
Declarative XML and Package Manifest Examples
Below is an architect-recommended Apex.settings-meta.xml configuration that enables Approval.lock()/unlock(), protects auto-number sequences from unit test gaps, enables audit field permissions, and keeps parallel testing active (enableDisableParallelApexTesting set to false).
<?xml version="1.0" encoding="UTF-8"?>
<ApexSettings xmlns="http://soap.sforce.com/2006/04/metadata">
<enableAggregateCodeCoverageOnly>false</enableAggregateCodeCoverageOnly>
<enableApexAccessRightsPref>true</enableApexAccessRightsPref>
<enableApexApprovalLockUnlock>true</enableApexApprovalLockUnlock>
<enableAuditFieldsInactiveOwner>true</enableAuditFieldsInactiveOwner>
<enableCompileOnDeploy>true</enableCompileOnDeploy>
<enableDisableParallelApexTesting>false</enableDisableParallelApexTesting>
<enableGaplessTestAutoNum>true</enableGaplessTestAutoNum>
</ApexSettings><?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Apex</members>
<name>Settings</name>
</types>
<version>68.0</version>
</Package>SFDX CLI Retrieval and Scratch Org Configuration
Retrieve or deploy ApexSettings directly with the Salesforce CLI:
# Retrieve ApexSettings from your org
sf project retrieve start --metadata Settings:Apex --target-org my-org
# Deploy ApexSettings to target org
sf project deploy start --metadata Settings:Apex --target-org my-orgYou can also inject ApexSettings directly into config/project-scratch-def.json so every new scratch org inherits these preferences at creation time:
{
"orgName": "Enterprise Architecture Scratch Org",
"edition": "Developer",
"settings": {
"apexSettings": {
"enableApexApprovalLockUnlock": true,
"enableAuditFieldsInactiveOwner": true,
"enableDisableParallelApexTesting": false,
"enableGaplessTestAutoNum": true
}
}
}Senior Architect Best Practices and Gotchas
- Always Enable
enableGaplessTestAutoNum: Without this setting, every time a developer or CI job runs Apex unit tests that insert records with Auto-Number fields (likeCaseNumberorInvoice_Number__c), the sequence counter increments permanently even though the test transaction rolls back. EnablingenableGaplessTestAutoNumisolates test auto-numbers from production sequences. - Dependency Order with
PermissionSet: If aPermissionSetin your repository includes<userPermissions><name>CreateAuditFields</name><enabled>true</enabled></userPermissions>,Apex.settings-meta.xmlwith<enableAuditFieldsInactiveOwner>true</enableAuditFieldsInactiveOwner>must be enabled in the org; otherwise, the permission set deployment fails withUnknown user permission: CreateAuditFields. - Compile on Deploy Trade-offs: Setting
enableCompileOnDeploytotrueis recommended for production cutovers so business users do not experience a freeze the first time a trigger runs after deployment, but keep itfalsein scratch orgs and CI validation sandboxes to keep deployment times fast.
Frequently asked questions
How do I disable parallel Apex test execution via Metadata API?
Set enableDisableParallelApexTesting to true inside force-app/main/default/settings/Apex.settings-meta.xml and deploy the Settings:Apex component.
Why is enableDisableParallelApexTesting named with a double negative?
The checkbox in Setup is labeled Disable Parallel Apex Testing, so setting enableDisableParallelApexTesting to true turns on that checkbox and forces serial test execution.
What setting allows Apex and API integrations to populate CreatedDate and CreatedById?
Setting enableAuditFieldsInactiveOwner to true in ApexSettings enables the Set Audit Fields upon Record Creation and Update Records with Inactive Owners permissions in the org.
Where is ApexSettings stored in a Salesforce DX project?
It is stored at force-app/main/default/settings/Apex.settings-meta.xml and referenced in package.xml under the Settings type with member name Apex.
Comments
Questions, corrections and tips are welcome. Comments are GitHub Discussions, so you sign in with GitHub.