Home / omnistudio / calculation-procedure-design
calculation-procedure-design
Design Calculation Procedures and Matrices for pricing, rating, and rules-heavy scoring. Triggers: calculation procedure, calculation matrix, expression set, decision matrix. NOT for Salesforce CPQ price rules — use admin/cpq-pricing-rules. NOT for Flow decision logic — use flow/flow-decision-element-patterns.
Open the skill folder on GitHub
Calculation Procedure Design
Use this skill when designing a pricing, rating, scoring, or eligibility engine on OmniStudio's Business Rules Engine — and when a procedure that "looks activated" is returning null. It covers the matrix column model, the version selection rule, the invocation surfaces, and the handful of field-level facts that decide whether the design works.
The Names, Reconciled
Three vocabularies describe two artifacts. You cannot look up a field under the designer's name, so start here.
| Designer label | API object | Version object | Since |
|---|---|---|---|
| Calculation Procedure | ExpressionSet | ExpressionSetVersion | API 55.0 |
| Calculation Matrix | CalculationMatrix — the object reference labels it Decision Matrix | CalculationMatrixVersion | API 53.0 |
| — | CalculationMatrixColumn | — | API 53.0 |
An expression set is, verbatim, "a series of steps connected in a logical flow built from variables, constants, conditions, calculations, lookups, and aggregations."
Two supporting objects worth knowing exist: ExpressionSetView exposes file-based expression sets, which are "read-only templates that must be cloned before modification"; ExpsSetObjectAliasFieldVw lists the source objects, aliases, and fields an expression set uses, "for permission verification purposes."
The Column Model Is Where Designs Go Wrong
Two facts about CalculationMatrixColumn invalidate the way most people first draw a matrix.
Wildcards are a column opt-in, not a * in a cell
| Field | Type | Documented meaning |
|---|---|---|
IsWildcardColumn | boolean, default false | "Specifies that this column can contain a wildcard value such as ALL." |
WildcardColumnValue | string | "The value that indicates a wildcard, for example ALL." |
The token is whatever you set WildcardColumnValue to, on each column where IsWildcardColumn is true. A column that has not opted in treats * as a literal string no real input will ever equal — so the fallback row is dead and fails silently. Being per-column is useful: permit a wildcard on Region while requiring an exact ProductTier.
Ranges are a DataType, not a Min/Max column pair
DataType is a restricted picklist with exactly these values:
The seven DataType values are enumerated, with what each one changes about matching, in