Architectural Overview
In Sales Cloud implementations, transitioning from basic pipeline tracking to structured commercial negotiation requires standard Quoting capabilities. Sales representatives generate formal customer proposals, track quote revisions, generate PDF contracts, and synchronize line items with Opportunities.
The QuoteSettings metadata type represents the administrative settings governing Sales Cloud Quotes. Setting enableQuote to true provisions the standard Quote, QuoteLineItem, and QuoteDocument objects, while unlocking native bidirectional synchronization (QuoteSync) between the active quote and the parent Opportunity.
In CI/CD automation and scratch org provisioning, deploying QuoteSettings prior to code or layouts that reference Quote is critical for build stability.
Directory and File Conventions
In SFDX source format, QuoteSettings is managed in the settings/ directory as Settings:Quote:
| Property | Value |
|---|---|
| Metadata Type Name | Settings (member: Quote) / QuoteSettings |
| SFDX Directory | force-app/main/default/settings/ |
| File Suffix | .settings-meta.xml |
| Full File Path | force-app/main/default/settings/Quote.settings-meta.xml |
| Scratch Org Setting Key | quoteSettings |
Key Metadata Fields
The XML schema of QuoteSettings contains the primary enablement switch:
| Field Name | Field Type | Required | Architectural Description |
|---|---|---|---|
enableQuote |
boolean |
Yes | Provisions the standard Quote object hierarchy and synchronization engine. |
Note
Once enabled, page layouts for Opportunity and Quote must be configured to expose the Quotes related list and Sync button.
Declarative XML and Package Manifest Examples
Below is a production Quote.settings-meta.xml configuration:
<?xml version="1.0" encoding="UTF-8"?>
<QuoteSettings xmlns="http://soap.sforce.com/2006/04/metadata">
<enableQuote>true</enableQuote>
</QuoteSettings>Scratch Org Definition Configuration
{
"orgName": "Sales Cloud Quoting Scratch Org",
"edition": "Enterprise",
"settings": {
"quoteSettings": {
"enableQuote": true
}
}
}Package Manifest (package.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>Quote</members>
<name>Settings</name>
</types>
<version>68.0</version>
</Package>CLI Retrieval and Deployment Commands
Manage QuoteSettings using the Salesforce CLI:
# Retrieve QuoteSettings from the org
sf project retrieve start --metadata Settings:Quote
# Deploy QuoteSettings to the target org
sf project deploy start --metadata Settings:Quote
# Validate settings deployment without committing changes
sf project deploy validate --metadata Settings:QuoteArchitect Best Practices and Gotchas
- CI/CD Build Dependencies: If any ApexClass, trigger, or Flow references
QuoteorQuoteLineItem,QuoteSettingsmust be deployed first; otherwise, deployments fail withsObject type does not exist. - Quote Synchronization Automation: When Quote Sync is active, modifications to
QuoteLineItemautomatically trigger updates onOpportunityLineItem(and vice-versa). Ensure Apex triggers and record-triggered flows on both objects include recursion protection. - Product and Pricebook Dependencies: Quoting requires products to have active price book entries in the opportunity’s selected price book.
Warning
Disabling Quotes in an org where active quote synchronizations exist is blocked by Salesforce until all synchronizations are severed.
Frequently asked questions
What core functionality is unlocked by enabling QuoteSettings?
It enables standard Sales Cloud Quotes, provisions Quote and QuoteLineItem objects, and activates native Quote-to-Opportunity synchronization.
Where is QuoteSettings located in an SFDX source project?
It resides at force-app/main/default/settings/Quote.settings-meta.xml and is retrieved using the Settings:Quote identifier.
Why does deploying an Apex class referencing QuoteLineItem fail in scratch orgs?
The QuoteLineItem object does not exist until enableQuote is set to true in QuoteSettings or scratch org definition files.
Can QuoteSettings be disabled after quotes have been created?
Disabling Quotes is blocked if active synchronizations exist between Quotes and Opportunities, requiring sync termination first.
Comments
Questions, corrections and tips are welcome. Comments are GitHub Discussions, so you sign in with GitHub.