---
title: "Opportunity products and revenue schedules"
url: "https://trailassembly.com/opportunity-products-and-schedules/"
topic: "Admin and Permissions"
published: "2026-09-16T05:27:44+00:00"
updated: "2026-10-06T13:56:19+00:00"
---

# Opportunity products and revenue schedules

**An opportunity product (OpportunityLineItem) is a priced product on a deal, and a schedule breaks that line into dated instalments of revenue, quantity, or both.** Schedules solve a real problem and they cost you almost every convenient way of reporting on the opportunity. Decide whether you need dated revenue before turning them on, because turning them off later loses the schedule records.

## The line item

OpportunityLineItem points at a [PricebookEntry](https://trailassembly.com/price-books-and-entries/), not at a Product2 directly. It carries `Quantity`, `UnitPrice`, `TotalPrice` and an optional `Discount`, and the opportunity’s `Amount` becomes a roll-up of the lines the moment the first line exists.

That roll-up is the behaviour people forget. Before any line items, Amount is a free field a rep types into. After the first line, it is read-only and calculated. Anything that wrote to Amount stops working, silently for a declarative tool and loudly for Apex.

`TotalPrice` and `UnitPrice` are the same field wearing two hats. Set one and the other derives from Quantity. Setting both in the same DML raises an error, which catches integrations that helpfully populate everything they have.

## What schedules are for

Two types, and they can be combined:

- **Revenue schedules** split the line’s amount across dates. A twelve-month subscription becomes twelve dated rows.

- **Quantity schedules** split the quantity across dates, and revenue is then derived per instalment from unit price.

Enable them in Setup under Product Schedules Settings, then enable them per product on Product2. A product can have revenue, quantity, both, or neither, and the product setting controls whether the schedule button appears on the line.

Salesforce can generate a schedule automatically from an installment period and number of installments defined on the product, or the user can build one by hand. Hand-built schedules are the common case, because real contracts rarely divide evenly.

## The reporting cost

This is the part people discover late. OpportunityLineItemSchedule is a child of the line item, which is a child of the opportunity. Standard report types give you either opportunities with products, or opportunities with products and schedules, and the second one multiplies your rows.

Consequences worth knowing before you commit:

- Any report at schedule grain repeats the opportunity’s fields on every instalment row. Summing Amount at that grain overstates it by the number of instalments.

- [Roll-up summary](https://trailassembly.com/flow-rollup-without-master-detail/) fields from schedules to the opportunity do not exist, because the relationship is two levels deep.

- Dashboards mixing deal counts and scheduled revenue need two separate report types and two components.

- Opportunity list views and Kanban show Amount, which is the total, not the amount landing this quarter. Sales leaders looking at pipeline see contract value while finance sees phased revenue, and both are right.

The schedule row itself is small:

```apex
SELECT Id, OpportunityLineItemId, ScheduleDate, Revenue,
       Quantity, Type, Description
FROM OpportunityLineItemSchedule
WHERE ScheduleDate = THIS_FISCAL_QUARTER
```

`Type` distinguishes Revenue from Quantity rows. A line with both schedule kinds produces both, so filter on it or you will double count.

## What deletes a schedule

Changing the quantity or the sales price on a line item re-creates the schedule and discards the existing rows, including any manual dates and split amounts someone spent an afternoon setting up. There is no warning that says so in those words. Removing the product from the opportunity obviously removes everything beneath it.

Disabling schedules for a product removes the ability to view or edit existing schedules for that product, and disabling the feature org-wide deletes schedule data. Export before you experiment.

## When to skip schedules

If you only need a start and end date on a subscription line, two custom date fields on OpportunityLineItem are cheaper and report better. If finance needs monthly recognised revenue that survives the opportunity closing, a custom revenue object owned by finance, populated at Closed Won, is the build that lasts. Schedules sit awkwardly between the two: detailed enough to complicate reporting, tied closely enough to the opportunity that they are not really a revenue ledger.

Use them when sales genuinely needs dated revenue visible on the deal itself during the sales cycle. That is a narrower case than most implementations assume.

## Frequently asked

**Do schedules survive Closed Won?** Yes, the records stay on the line item. They are not copied anywhere and nothing downstream reads them unless you build it.

**Can a flow create schedule rows?** Yes, OpportunityLineItemSchedule is createable through the API and through flow record-create elements. Doing this in bulk needs care, since each line can carry many rows.

**Why is the schedule button missing?** Either the feature is off org-wide, or the product’s schedule type is set to none. Both, usually.

**Do quotes carry schedules?** QuoteLineItem does not have schedules. Syncing a quote to an opportunity does not build them.

---

Source: https://trailassembly.com/opportunity-products-and-schedules/
Trail Assembly — independent Salesforce write-ups.
