SfSkills Domains Docs GitHub

Home / admin / collaborative-forecasts

collaborative-forecasts

Set up, configure or troubleshoot Salesforce Collaborative Forecasts: forecast types, forecast categories, rollup methods, quota management, forecast hierarchy, manager adjustments, pipeline inspection integration.

Open the skill folder on GitHub


Collaborative Forecasts

This skill activates when a practitioner needs to design, configure, audit, or troubleshoot Salesforce Collaborative Forecasts. It covers forecast type configuration, forecast category mapping, rollup method selection, manager and owner adjustments, quota management, forecast hierarchy, and pipeline inspection integration.


Before Starting

Gather this context before working on anything in this domain:


Questions to Ask Before Configuring

Ask these before creating a single forecast type. Every row here exists because a documented behaviour punishes the wrong answer later, and several of the answers cannot be changed afterwards without purging data.

AskWhy it mattersWhat a good answer adds
"Cumulative columns or individual category columns — and who signs off before anyone adjusts?"The choice is the set of four values in forecastedCategoryApiNames; swapping sets flips Enable Cumulative Forecast Rollups org-wide, and cumulative Best Case silently includes Most LikelyThe four forecastedCategoryApiNames / displayedCategoryApiNames values to deploy, and a named owner for a one-way decision
"How many forecast types must be live at once, and are any of them pre-Summer '21 types?"Four is the hard maximum; legacy types "can be deactivated but not activated, created, or deleted" through ForecastingTypeA type inventory that separates what you can author in metadata from what you must switch on in Setup
"Role-based or territory-based — and is a Territory2Model already Active?"roleType is R or Y; a territory type also needs territory2Model and territory2FieldThe roleType value per type, and whether ETM activation blocks the forecast task (see admin/enterprise-territory-management)
"Amount or quantity, and which field is the measure?"amount and quantity are mutually exclusive on ForecastingType, and measureField on the source definition decides whether a custom currency field is legalThe exact measureField (Opportunity.Amount, OpportunitySplit.SplitAmount, a Megawatts__c-style custom field)
"Do quotas come from finance, and in what grain — per user, per product family, per territory?"Decides QuotaAmount vs QuotaQuantity, and whether ProductFamily / Territory2Id / ForecastingGroupItemId belong in the load fileA quota CSV column list with PeriodId deliberately absent (it is read-only)
"Who owns the Opportunity stage picklist, and does the release pipeline deploy StandardValueSet: OpportunityStage?"Stage→category mapping ships as forecastCategory on each standard value, whose enum says Forecast where the UI says CommitA stage mapping owned by the same release that changes stages, instead of a Setup click someone forgets
"Which reports and integrations read ForecastCategoryName?"Under cumulative rollups that field "can be null because the cumulative forecast amounts include opportunities from multiple forecast categories"A list of consumers to re-point at ForecastingItemCategory before the switch

What a proper configuration adds over just doing it: the four category API names, the measure field, the hierarchy type and the quota grain are all decided and deployable before the first type goes active, so the org never has to reach the settings that purge forecasting data, adjustments and quotas to fix a wrong guess.


Core Concepts

Forecast Types

A Forecast Type defines what a forecast measures and how it is organized. Each Forecast Type has three independent configuration dimensions:

  1. Source object — what data the forecast rolls up:
Source objectWhat it rolls up
OpportunityThe Amount field (or a custom currency field) from opportunities
Opportunity Product (Product Family)Revenue by product family from opportunity line items
Opportunity SplitsSplit percentages credited to each rep from Opportunity Revenue Splits
Product SplitsProduct-level overlay splits from Opportunity Product Splits
Line Item Schedule (Schedule Date)Revenue by schedule date from opportunity product schedules
  1. Forecast hierarchy — the organizational dimension:
HierarchyNotes
Role hierarchyThe standard Salesforce role tree; most orgs use this
Territory hierarchyUses the active Enterprise Territory Management model; requires ETM to be active
  1. Measurement field — the currency field used for rollup (Amount, Expected Revenue, or a custom field).

Up to 4 active Forecast Types are permitted by default. Each type appears as a separate tab on the Forecasts page.

Forecast Categories

Five standard forecast categories map opportunity stages to forecast buckets. The mapping is configured per org and applies globally to all Forecast Types.

CategoryTypical Stage ExamplesIncluded in Rollups
PipelineProspecting, Qualification, Needs AnalysisYes (pipeline and below)
Best CaseValue Proposition, Id. Decision MakersYes
CommitPerception Analysis, Proposal/Price QuoteYes
Most Likely(optional, configurable)Yes
ClosedClosed WonYes
OmittedClosed Lost, DisqualifiedNo — excluded from all rollups

Each opportunity stage must map to exactly one forecast category. Stages mapped to Omitted do not appear in any forecast view. There is no limit on how many stages map to each category.

Manager Judgment: An additional adjustment layer that managers can apply on top of subordinate-submitted forecasts. Not available for split-based forecast types (Opportunity Splits, Product Splits).

Rollup Methods

The rollup method controls which forecast category values are shown in each column on the forecast page:

There is no rollupType element. The rollup method is expressed by which set of four values you put in forecastedCategoryApiNames — "Changing from one set of four values to the other changes the organization setting for Enable Cumulative Forecast Rollups in Setup. If this field is omitted, the setting isn't changed" (api_meta line 117655).

RollupforecastedCategoryApiNames setWhat each column sums (object_reference ForecastingItem.ForecastingItemCategory, from line 147384)
Individual (single category)pipelineonly, bestcaseonly, commitonly, closedonlyPipelineOnly = Pipeline only. BestCaseOnly = Best Case only (adjustable). CommitOnly = Commit only (adjustable). ClosedOnly = Closed only.
Cumulativeopenpipeline, bestcaseforecast, commitforecast, closedonlyOpenPipeline = Pipeline + Best Case + Most Likely + Commit. BestCaseForecast = Best Case + Most Likely + Commit + Closed (adjustable). CommitForecast = Commit + Closed (adjustable). ClosedOnly = Closed only.

Note what the guide adds that the usual summary drops: cumulative Best Case includes Most Likely as well as Commit and Closed, and cumulative OpenPipeline does not include Closed. MostLikelyOnly / MostLikelyForecast exist as a fifth category only where Most Likely has been added.

Cumulative rollup gives managers expected revenue (committed pipeline plus won deals). Single-category rollup is useful when reps need distinct stage breakdowns; forecast category names can be customised only in single-category rollups (object_reference line 147671).

Critical constraint: treat the rollup method as a one-way decision before go-live. The rollup switch's effect on existing adjustments is UNVERIFIED (2026-09-05) — neither guide documents it — but the three purge events listed under Before Starting are documented, so export ForecastingAdjustment and ForecastingOwnerAdjustment before touching forecast-type settings regardless.

Quotas

Quotas are per-user, per-period revenue targets loaded against a specific Forecast Type. Quotas enable the "% of Quota" attainment column on the forecast page.

Quotas are enabled by globalQuotasSettings/showQuotas (api_meta line 117513; QuotasSettings subtype at 117948, showQuotas at 117958) and loaded via Data Loader / API against ForecastingQuota, or the Manage Quotas import in Setup.

ForecastingQuota field behaviour, from object_reference (grep -n "^ *ForecastingQuota *$" 5th hit, line 147887):

FieldPropertiesWhat it means for a load
QuotaOwnerIdCreate, UpdateThe quota owner. "The Managed Quotas user permission is required for creating, updating, or deleting quotas. (Users can only edit their subordinates' or child territories' quotas, not their own.)" (line 147888)
ForecastingTypeIdCreateRequired in practice — quotas are per forecast type; one user can hold several.
StartDateCreate, Update"The start of the quota, expressed as month and year. The date can include any day in a given month. Stored using the first date of the month." (line 148027)
PeriodIdFilter, Group, Sort — no Create/Update"Period ID for the quota. Read only." (line 147978) Never put it in a load file.
QuotaAmount / QuotaQuantityCreate, UpdateLoad exactly one, matching the type's measure.
IsAmount / IsQuantityDefaulted on create — no CreateDerived, not settable: "If true, then the adjustment is made in a revenue amount. If false, then IsQuantity must be true." (lines 147946 and 147955)
ProductFamily, Territory2Id, ForecastingGroupItemIdCreateOnly for types that have product families, a Territory2 model, or a forecast group.

Retrieve the type ids first — ForecastingType.DeveloperName "is called name in the Metadata API and Forecasting Type in custom reports" (object_reference line 148741), so the metadata name and the queryable DeveloperName are the same string.

Forecast Adjustments

Two types of adjustments exist on the forecast:

The two adjustment layers are two different objects, and the naming in the UI is easy to invert:

ObjectWho adjusts whatToggleSource
ForecastingAdjustment"an individual forecast manager's adjustment for a subordinate's or child territory's forecast via a ForecastingItem"globalAdjustmentsSettings/enableAdjustmentsobject_reference line 145555; api_meta line 117834
ForecastingOwnerAdjustment"an individual forecast user's adjustment of their own forecast, including territory forecasts they own"globalAdjustmentsSettings/enableOwnerAdjustmentsobject_reference line 147630; api_meta line 117848

Both toggles are org-wide from API 53.0 on ("All forecast types must contain the same enableAdjustments value"), and both carry the same warning: "Disabling adjustments results in adjustment data being purged."

Which columns are adjustable is set by managerAdjustableCategoryApiNames and ownerAdjustableCategoryApiNames — each read-only, each appearing exactly twice, each restricted to bestcaseforecast/commitforecast (cumulative) or bestcaseonly/commitonly (individual), and "if both … fields are being used, they must contain the same two values" (api_meta lines 117703 and 117799). ForecastingAdjustment.AdjustmentNote is capped at 255 characters and "doesn't appear in reports" (object_reference line 145600).


Mode 1 — Configure Collaborative Forecasting From Scratch

Use this mode when enabling and setting up Collaborative Forecasts for the first time or adding a new Forecast Type.

Step 1 — Enable Collaborative Forecasts. Navigate to Setup > Forecasts Settings. Enable Collaborative Forecasts for the org. Select the default forecast currency (single currency org) or confirm multi-currency settings if applicable.

Step 2 — Configure Forecast Categories. In Setup > Forecasts Settings, review the stage-to-category mapping. Map every opportunity stage to a forecast category. Confirm which stages are Omitted (Closed Lost, disqualified stages, etc.). Omitted opportunities are excluded from all rollups.

Step 3 — Create Forecast Types. For each distinct sales motion (e.g., AE Revenue by Role, SE Overlay Splits, Product Family Revenue), create a Forecast Type with:

Step 4 — Activate the type. In metadata this is the second deploy, not a separate screen: a type created through ForecastingType lands inactive and the same package must be deployed again to set active. Then confirm the four displayedCategoryApiNames values match the four forecastedCategoryApiNames values — "Always use the same 4 values for both" (api_meta line 117617).

Step 5 — Enable Forecast Users and Assign Forecast Managers. Go to each user's detail page (or bulk-configure via API) and set ForecastEnabled = true — labelled Allow Forecasting under General Information. Without this flag, a user is invisible in the forecast rollup even if they have the correct role; role assignment alone never sets it. The same enablement is also reachable from Setup > Forecasts Hierarchy > Enable Users, moving users between Available Users and Enabled Users — a second path to the same flag, not a substitute for it. Then, on the same Forecasts Hierarchy page, click Assign Manager / Edit Manager on every role that should roll up: if no forecast manager is assigned to a role, neither that role nor its subordinate roles are included in forecasts. Forecast users also need View Roles and Role Hierarchy to access role-based forecasts in Lightning Experience — assigned to all forecast users by default, so only verify it when a user cannot open the tab.

Step 6 — Load Quotas (if needed). Use Data Loader or the quota import wizard to upload ForecastingQuota records for each user, period, and forecast type. Verify attainment column appears on the forecast page after load.

Step 7 — Validate. Navigate to the Forecasts tab as a manager role. Confirm subordinate users appear in the hierarchy. Confirm stage mapping produces expected rollup totals. Check that cumulative/single-category behavior matches expectation.


Mode 2 — Audit an Existing Forecast Configuration

Use this mode when reviewing an existing setup for correctness, investigating missing data, or preparing for a change.

Check active Forecast Type count. Navigate to Setup > Forecasts Settings. Confirm the number of active types is 4 or fewer (default limit). Flag if the org is approaching the limit.

Review stage-to-category mapping. Confirm all active opportunity stages are mapped. Flag any stages mapped to Omitted that should be in the pipeline. Unintentionally-Omitted stages will silently exclude revenue from all forecasts.

Check rollup method per Forecast Type. Document the rollup method (cumulative vs single-category) for each type before making any changes. Verify method matches stakeholder reporting expectations.

Audit forecast user enablement. Query SELECT Id, Name FROM User WHERE ForecastEnabled = true AND IsActive = true. Compare against expected forecast users.

Check quota coverage. Query ForecastingQuota for coverage across expected users and periods. Flag missing quotas for active forecast users.

CheckNavigation / SOQLFlag If
Active Forecast Type countSELECT Id, DeveloperName, MasterLabel, IsActive, IsPlatformType FROM ForecastingType WHERE IsActive = trueMore than 4 active (IsPlatformType = true marks a legacy pre-Summer '21 type you cannot recreate)
Unmapped stagesSetup > Forecasts Settings > Stage MappingAny active stage has no category
Unenabled forecast usersSELECT Id, Name, UserRoleId FROM User WHERE ForecastEnabled = false AND IsActive = true AND UserRoleId != nullA user in a forecasting role is not enabled
Roles with no forecast managerSELECT Id, Name, ParentRoleId FROM UserRole WHERE ForecastUserId = nullAny role that should roll up — the branch below it drops out too
Missing quotasSELECT ForecastingTypeId, COUNT(Id) FROM ForecastingQuota WHERE StartDate = THIS_FISCAL_QUARTER GROUP BY ForecastingTypeId — resolve ids with SELECT Id, DeveloperName, IsActive FROM ForecastingTypeAny active type with zero quota rows for the current period

Mode 3 — Troubleshoot Forecast Data Issues

Use this mode when forecast rollups show unexpected amounts, users are missing from the hierarchy, or adjustments behave unexpectedly.

Users missing from forecast hierarchy:

Forecasts tab blank or inaccessible in Lightning Experience:

Opportunities not appearing in forecast:

Adjustment missing after rollup method change:

Quota attainment not showing:


Decision Guidance

SituationRecommended ApproachReason
Sales team covers one product and one hierarchySingle Opportunity Forecast Type with role hierarchySimplest configuration; easiest for reps to understand
Multiple sales motions (AE direct + SE overlay)Separate Forecast Types: Opportunity Splits for AE, Product Splits for SE overlayEach motion needs independent rollup and hierarchy
Managers need to see total expected revenue (Commit + Closed) in one columnUse cumulative rollupCumulative Commit column = Commit + Closed; accurate expected-revenue view
Finance team needs stage-by-stage pipeline viewUse single-category rollupEach column shows exactly one stage bucket; no accumulation
Switching rollup method on a live typeExport adjustments first; communicate to managers; schedule off-peakAdjustment deletion is irreversible
Quotas for 500+ usersUse Data Loader against ForecastingQuota object; reference ForecastingTypeIdImport wizard has volume limitations
Territory-based forecasting alongside role-basedAdd a second Forecast Type with territory hierarchy selectedCompletely independent of the role-based type; both coexist within 4-type limit

  1. Answer the seven questions above and retrieve what already exists. sf project retrieve start --metadata "Settings:Forecasting" ForecastingType ForecastingSourceDefinition ForecastingTypeSource "StandardValueSet:OpportunityStage" --target-org <sandbox>. The settings land in settings/Forecasting.settings-meta.xml — not ForecastingSettings.settings. Fill in templates/collaborative-forecasts-template.md as you go.
  2. Write the org-wide block first. enableForecasts, all eight forecastingCategoryMappings, globalAdjustmentsSettings, globalForecastRangeSettings, globalQuotasSettings — copy the shapes from references/metadata-examples.md § "Two forecast types in one Forecasting.settings". Orgs using either rollup style "must include all eight occurrences of this subtype".
  3. Deploy the stage→category mapping in the same change as the stages. StandardValueSet: OpportunityStage, one forecastCategory per standardValue, using the metadata enum (Omitted, Pipeline, BestCase, Forecast, Closed) — Forecast is the value the UI labels Commit. See references/gotchas.md Gotcha 10.
  4. Author the forecast types, then run the checker. For legacy types, a forecastingTypeSettings block with the exact name from the guide's enum; for anything new, a .forecastingType plus .forecastingSourceDefinition plus .forecastingTypeSource triple. Then: python3 skills/admin/collaborative-forecasts/scripts/check_collaborative_forecasts.py --manifest-dir force-app/main/default, which enforces the category-enum, date-type, amount/quantity and quota-CSV rules the platform will otherwise fail on silently.
  5. Deploy twice. sf project deploy validate then sf project deploy start, then run the same deploy again: a new forecast type "is created in the inactive state" on the first pass and only the second pass flips active. Order is ForecastingSettings → ForecastingType → ForecastingSourceDefinition → ForecastingTypeSource, applied automatically when all four are in one package.
  6. Enable the people, not just the metadata. Set User.ForecastEnabled = true for every forecast user and UserRole.ForecastUserId for every role that must roll up; both are updateable via API, so this is a Data Loader step, not a click-through. Verify with the two SOQL queries in references/metadata-examples.md § Verification.
  7. Load quotas, then verify the numbers, not the record count. Load ForecastingQuota with QuotaOwnerId, ForecastingTypeId, StartDate, and exactly one of QuotaAmount / QuotaQuantity; omit PeriodId and IsAmount/IsQuantity. Then query ForecastingItem as a manager and reconcile against a pipeline report before handing the tab to sales.

Review Checklist

Run through these before marking Collaborative Forecasts setup complete:


Salesforce-Specific Gotchas

Non-obvious platform behaviors that cause real production problems:

  1. Switching rollup method deletes all adjustments permanently — When you change a Forecast Type from single-category to cumulative rollup (or vice versa), Salesforce deletes all existing manager adjustments and owner adjustments for that type with no warning and no recovery path. Always capture adjustment values via Data Loader before making the change if they need to be preserved.
  2. ForecastEnabled must be set per user — role alone is not enough — A user with the correct role in the role hierarchy will be completely invisible in the forecast rollup unless their ForecastEnabled field is set to true. New users are not automatically enabled. Include ForecastEnabled = true in every user provisioning workflow.
  3. Manager Judgment is not available for split-based Forecast Types — For Forecast Types sourced from Opportunity Splits or Product Splits, Manager Judgment is silently unavailable. Managers cannot adjust subordinate forecast totals on these types. Communicate this to sales managers before rollout.
  4. Omitted stages are silently excluded from every rollup — Any opportunity stage mapped to Omitted is excluded from all forecast rollup totals, including Pipeline. A revenue-generating stage mistakenly mapped to Omitted causes revenue to disappear from forecasts with no error message. Audit stage mapping carefully and re-audit whenever stage picklists change.
  5. A quota load fails on the columns you added, not the date you feared — ForecastingQuota.StartDate accepts any day in the target month and is stored as the first of the month, so a date shift is not the usual cause of blank attainment. The real load-breakers are read-only and derived fields: PeriodId is read-only, and IsAmount/IsQuantity have no Create property. See references/gotchas.md Gotcha 5.
  6. A new forecast type deploys inactive — the first deploy never turns it on — Types available only in API 52.0 and later are created in the inactive state; the guide's instruction is to deploy the zip file twice. Legacy pre-Summer '21 types are the inverse: they can be deactivated but not activated, created, or deleted through ForecastingType. See references/gotchas.md Gotcha 11.
  7. ForecastCategoryName goes null under cumulative rollups — Cumulative forecast amounts span multiple forecast categories, so the field that identifies a single category has nothing to hold. Reports and integrations that group on it break at the moment the org switches. See references/gotchas.md Gotcha 12.
  8. The metadata enum for the Commit category is spelled Forecast — On StandardValueSet: OpportunityStage, the deployable forecastCategory values are Omitted, Pipeline, BestCase, Forecast, Closed. Deploying Commit fails; deploying nothing leaves the stage unmapped. See references/gotchas.md Gotcha 10.

Output Artifacts

ArtifactFile / objectNotes
ForecastingSettingssettings/Forecasting.settings-meta.xml; package.xml member Forecasting under <name>Settings</name>Org-wide: enableForecasts, eight forecastingCategoryMappings, global adjustment / range / quota settings, and one forecastingTypeSettings block per legacy type. API 28.0+, restructured at 30.0 and 53.0.
ForecastingTypeforecastingTypes/<name>.forecastingType-meta.xmlAPI 52.0+. active, amount/quantity, dateType, developerName, masterLabel, roleType (R/Y), territory2Model, opportunitySplitType, opptyLineItemSplitType.
ForecastingSourceDefinitionforecastingSourceDefinitions/<name>.forecastingSourceDefinition-meta.xmlAPI 52.0+. sourceObject, measureField, dateField, userField, categoryField, familyField, territory2Field.
ForecastingTypeSourceForecastingTypeSources/<name>.forecastingTypeSource-meta.xmlAPI 52.0+. Joins a source definition to a type; parentSourceDefinition + relationField for non-Opportunity sources.
ForecastingFilter / ForecastingFilterConditionforecastingFilters/ and ForecastingFilterConditions/API 55.0+. Filter logic supports AND only; "a forecast type can contain up to three filter conditions".
StandardValueSet: OpportunityStagestandardValueSets/OpportunityStage.standardValueSet-meta.xmlCarries forecastCategory per stage — the deployable stage-to-category mapping.
ForecastingQuotadata recordsPer-user or per-territory, per-period quota. Loaded via Data Loader; requires the Managed Quotas permission.
ForecastingAdjustment / ForecastingOwnerAdjustmentdata recordsManager and owner adjustments. Export both before any settings change that can purge them.

Reference Files

FileRead it when
references/metadata-examples.mdYou are about to write or deploy XML — two-type Forecasting.settings, a custom ForecastingType + source definition + type source, the stage StandardValueSet, the quota CSV, package.xml, deploy order, and the verification queries
references/gotchas.mdSomething works in Setup but not in metadata, or a deploy/load succeeded and the forecast is still wrong — 13 grounded platform behaviours
references/examples.mdYou want a worked end-to-end scenario: two forecast types for a direct + overlay motion, and a diagnosis of revenue that vanished after a stage change
references/well-architected.mdYou are choosing between forecast types, hierarchies, or rollup styles and need the tradeoff framing plus the source list
references/llm-anti-patterns.mdYou are reviewing AI-generated forecast configuration or guidance before it reaches an org

Package files