---
title: "Quotes, and the sync direction problem"
url: "https://trailassembly.com/salesforce-quotes/"
topic: "Admin and Permissions"
published: "2026-09-16T12:50:22+00:00"
updated: "2026-10-06T13:56:46+00:00"
---

# Quotes, and the sync direction problem

**A Quote is a snapshot of an opportunity’s products with its own totals, dates and PDF.** One quote at a time can be synced back to the opportunity, and while that sync is on, edits flow in both directions. Most quoting problems in Salesforce are really confusion about which record is currently the source of truth.

## The object model

```apex
Opportunity
  SyncedQuoteId  -> the one quote currently syncing
  Quote
    QuoteLineItem  -> PricebookEntry
    QuoteDocument  -> a generated PDF
```

Quote sits under Opportunity as a master-detail child. QuoteLineItem mirrors OpportunityLineItem closely: it points at a [PricebookEntry](https://trailassembly.com/price-books-and-entries/), carries Quantity, UnitPrice and Discount, and derives TotalPrice. The opportunity’s price book is inherited, so a quote cannot use a different one.

Quote adds fields the opportunity does not have: `ExpirationDate`, `Status`, quote-level `Discount`, `ShippingHandling`, `Tax`, `Subtotal`, `TotalPrice` and `GrandTotal`. GrandTotal is what the customer sees, and it is the one people forget is not the same as Opportunity Amount.

Creating a quote from an opportunity copies the current line items and the billing and shipping addresses from the Account. It is a copy, not a link. Change the opportunity afterwards and the quote does not move, unless sync is on.

## The sync, and the direction problem

Starting sync sets `SyncedQuoteId` on the Opportunity. From that point:

- Adding, changing or removing a quote line item updates the opportunity products.

- Adding, changing or removing an opportunity product updates that quote’s line items.

- Opportunity Amount follows the synced quote’s line totals.

Only one quote per opportunity can sync. Starting sync on a second quote stops it on the first, and the first keeps whatever it had at that moment.

The direction problem is what this creates in practice. A rep builds three quotes at different price points, syncs quote B, then edits the opportunity products directly because that is the screen they were on. Quote B silently changes underneath them, and the PDF already sent to the customer no longer matches the record it came from. Quotes A and C are untouched and now stale.

Two habits avoid most of this. Sync only when a quote has actually been chosen, not while options are being drafted. And once a quote has been sent, treat it as frozen: clone it rather than edit it.

Stopping sync is a field update:

```apex
Opportunity o = [SELECT Id, SyncedQuoteId FROM Opportunity WHERE Id = :oppId];
o.SyncedQuoteId = null;
update o;
```

Setting `SyncedQuoteId` to a quote Id in Apex starts sync the same way the button does, which is how bulk corrections get made. A synced quote cannot be deleted until sync stops.

## Quote PDFs

Generating a PDF creates a QuoteDocument record holding the rendered file, so the document is a saved artefact rather than something re-rendered on demand. That is the right behaviour: the customer received a specific document and you keep it.

Quote templates are built in a drag-and-drop editor. They handle a header, a footer, a line item table and free text blocks, and they can show fields from Quote, Opportunity, Account, Contact and User. Conditional content is not part of it. If a section should appear only for some quotes, the template cannot do it and you need separate templates or a different document tool.

Emailing a quote attaches the QuoteDocument and logs the activity. Nothing changes the quote’s Status automatically, so “Presented” only ever means what a user clicked.

## Where quotes stop being enough

Standard quotes have no approval logic of their own beyond what you build with approval processes, no bundles or configurable products, no subscription pricing or amendment handling, and no tiered discounting. QuoteLineItem also has no schedules, so dated revenue on a quote is not a thing.

Those gaps are exactly the case for CPQ, and they are also the case for doing nothing. A business selling twelve products at list price with occasional discounts does not need CPQ, and standard quotes with a [validation rule](https://trailassembly.com/validation-rule-vs-flow/) on discount percentage will outlive the sales director who asked for the project.

## Frequently asked

**Why is the New Quote button missing?** Quotes are not enabled in Setup, or the Quotes related list is not on the opportunity layout. The feature is off by default in some orgs.

**Does the quote number mean anything?** `QuoteNumber` is an auto number owned by the platform. You cannot set your own format on it, so orgs needing a specific numbering scheme add a custom field.

**Can a quote exist without an opportunity?** No. The relationship is master-detail and required.

**What happens to quotes when the opportunity closes?** Nothing. They stay, sync stays on if it was on, and the quote remains editable unless you add a validation rule to stop it.

---

Source: https://trailassembly.com/salesforce-quotes/
Trail Assembly — independent Salesforce write-ups.
