Line Item Fields
Pinion stores a quote’s economics on the line item — the per-product row under an Opportunity or a Quote. Beyond the standard Salesforce columns (Quantity, UnitPrice, TotalPrice, Discount), Pinion adds a set of custom fields that carry the configuration behind each line: which bundle it belongs to, which segment of an MDQ schedule it represents, which attributes the rep chose, how the price was reached, and what it rolls up to.
This page is the reference for those fields. It’s aimed at admins, report builders, and anyone integrating with the data — reps never see most of these directly; they’re populated automatically when a configuration is saved and synced.
Twin fields
Pinion is object-agnostic: the same package drives quoting on either OpportunityLineItem or QuoteLineItem, chosen per org with ConfiguratorSettings__mdt.TargetObject__c. To make that work, every custom field below exists on both objects — same API name, same data type. They are twin fields.
This has two practical consequences:
- One configuration, either object. Whichever line object your org quotes on, the fields, the math, and this reference are identical. Nothing in a bundle, a pricing method, or a report has to be re-authored to move between Opportunity- and Quote-based quoting.
- They copy automatically on Quote Sync. When a Quote syncs to its Opportunity, Salesforce natively copies the standard fields (
Quantity,UnitPrice,Discount). Pinion mirrors Salesforce CPQ’s twin-field model for the rest: every custom field that exists on bothQuoteLineItemandOpportunityLineItemwith the same API name and type is copied to the synced Opportunity line automatically. There’s no admin setup and no field list to maintain — adding a twin field to both objects is all it takes for sync to carry it.
Configuration attributes on the line
When a product is configured with attributes, the rep’s choices are recorded on the resulting line two ways — one for fidelity, one for reporting.
AttributeSnapshot__c — the full record
AttributeSnapshot__c holds the complete set of chosen attributes as JSON — every attribute on the product and the value the rep selected. It’s the authoritative, lossless record of how the line was configured, and it’s what Pinion reads back when re-opening a configuration. Because it’s JSON, it’s perfect for fidelity but awkward for reports and list views.
AttrKey1–5__c / AttrValue1–5__c — the reporting columns
To make attributes reportable without parsing JSON, Pinion projects the first five attributes into flat columns — five key/value pairs:
AttrKey1__c…AttrKey5__c— the attribute’s API name (e.g.license_type).AttrValue1__c…AttrValue5__c— the value chosen for that attribute (e.g.Pro).
They’re auto-populated from AttributeSnapshot__c on save, filled slot 1→5 in the product’s attribute display order. Because they’re plain text fields, you can group, filter, and chart on them directly — e.g. a report grouped by AttrValue1__c to see the mix of license tiers across a pipeline, with no JSON handling.
DimensionalAttributeOverrides__c carries per-segment attribute overrides (JSON) for dimensional attributes — where an attribute’s value changes from one segment to the next.
Field reference
Every field below is a twin (present on both OpportunityLineItem and QuoteLineItem) and is stamped on save. Standard fields (Quantity, UnitPrice, TotalPrice, Discount) are noted where they interact with a Pinion field.
Quantity
The distinction here is the one that trips people up most, so it leads the reference.
| Field | Function |
|---|---|
UserQuantity__c | The raw quantity the rep entered in the configurator. |
Quantity (standard) | The effective / billable quantity — UserQuantity__c scaled by bundle option multipliers and segment proration. This is what the line is actually priced and billed on. |
Pricing
| Field | Function |
|---|---|
UnitPrice (standard) | The final per-unit price the pricing waterfall produced. |
BlockPrice__c | The resolved per-unit price when the product is on block (tiered) pricing. |
ContractedPrice__c | The resolved contracted per-unit price when a negotiated rate applies to this account + product. |
SpecialPrice__c | A manually-set special price for the line, when the rep overrides the computed unit price. |
UpliftedPrice__c | The effective unit price after cumulative MDQ uplift. Computed automatically; rep-overridable when Uplift Editable is enabled on the Price Dimension. |
Uplift__c | The cumulative uplift percentage applied to this segment. For segment N at X%, the multiplier is (1 + X/100)^(N-1). |
AdditionalDiscount__c | The line-level discount value — read as a percent of List Price or a fixed amount per DiscountType__c. |
DiscountType__c | How AdditionalDiscount__c is interpreted — Percent (of List Price) or Amount (fixed dollars). |
Bundle
| Field | Function |
|---|---|
BundlePrice__c | Roll-up of the total Sales Price across all child option lines linked via ParentBundle__c — the bundle parent’s total. |
BundlePricingModel__c | The rep-selected pricing model for this bundle parent — Standard, Roll-Up, or Itemized. (Distinct from Product2.PricingModel__c, which lists the models a product allows.) Null on non-bundles and on children. |
ItemizedPrice__c | The individually entered price for a bundle option under Itemized / Roll-Up pricing. Preserved across model switches so option prices restore when toggling modes. |
BundleDiscount__c / BundleDiscountType__c | A bundle-level discount and how it’s read (percent vs. amount). |
ParentBundle__c | Links a child option line to its parent bundle line — the field that builds the bundle hierarchy. Set automatically by the configurator. |
DiscountLineItem__c | Links a bundle parent to its discount-child line (a discount product included in the bundle). |
InstanceName__c | The rep-given name for a bundle instance (e.g. Production, Staging) when multiple instances of the same bundle are added. |
ConfigGroupId__c | Groups the lines that came from one configuration / bundle instance together. |
MDQ & segments
These describe a line that is one segment of a multi-dimensional quote schedule.
| Field | Function |
|---|---|
PriceDimension__c | The Price Dimension record that generated this segment (stored as text — managed packages can’t create lookups from standard objects to package custom objects). |
SegmentIndex__c | The segment’s position within its group (1, 2, 3 …) — used for ordering and uplift math. |
SegmentKey__c | The key grouping all segments of one MDQ product instance together; stable across amendments and renewals. |
SegmentLabel__c | The display label shown in the configurator (e.g. Year 1, Q2 2025). |
StartDate__c / EndDate__c | The line’s term bounds — drive MRR and the generated revenue schedules. |
EffectiveDate__c | When an amendment change takes effect; the proration anchor (billing delta is prorated from this date to the contract end). |
CoTermDate__c | The co-termination date when a line is aligned to an existing contract’s end. |
Usage & metered
Populated when the line is a metered product — a committed base subscription plus a display-only projected overage. The rep supplies only the dimension and estimated usage; every other field is resolved server-side from the trusted usage rate card on Save & Sync.
| Field | Function |
|---|---|
UsageDimension__c | The usage dimension quoted on the line (the metered thing — e.g. API calls). |
UsageUnitOfMeasure__c | The dimension’s unit of measure, stamped for display (e.g. “API calls”). |
UsageEntitlement__c | The included entitlement on this line — units covered before overage is charged. Server-resolved from the dimension, or a rep override when the dimension marks the entitlement editable. |
OverageRate__c | The resolved per-unit overage rate. For a flat card, the single rate; for a graduated card, the rate the projection walk uses. Server-resolved, or a rep override when the dimension marks the rate editable. |
EstimatedUsage__c | The rep’s projected consumption for the period — a quoting input only, never billed. Drives the projected overage. |
ProjectedOverage__c | The projected overage charge — max(0, EstimatedUsage__c − UsageEntitlement__c) priced across the rate card in the card’s pricing model. Display-only / non-contractual in v1 — it does not add to the committed TotalPrice. Recomputed server-side and reconciles to the configurator to the cent. |
Discounts & promotions
| Field | Function |
|---|---|
DiscountSchedule__c | The discount schedule resolved for the line (volume / term tiers). |
PromoCode__c | The promotion code applied to the line. |
PromoDiscount__c / PromoDiscountUnit__c | The promo’s discount value and whether it’s read as a percent or a fixed amount. |
Percent-of-Total
| Field | Function |
|---|---|
PercentOfTotalBase__c | Audit field for Percent-of-Total lines: the scoped base this line’s price was computed against — the summed TotalPrice of the other same-currency lines in scope, excluding itself and all other Percent-of-Total lines. UnitPrice = PercentOfTotalBase__c × Percent / 100. Stamped in the line currency; never converted. Blank on other lines. |
Amendment & change tracking
Populated when a line is created by an amendment or renewal, capturing what changed against the source contract.
| Field | Function |
|---|---|
ChangeType__c | What this amendment did to the line — added, updated, or removed. |
OriginalQuantity__c / NewQuantity__c | The quantity before and after the amendment. |
OriginalSalesPrice__c / NewSalesPrice__c | The price before and after the amendment. |
SourceSubscription__c | The Subscription__c this line was renewed or amended from. |
ReviewRequired__c | Flags a line for rep review (e.g. an amended line whose price moved and needs a second look). |
Rollups
Recurring-revenue measures, stamped on save. All three are stored in the line’s own currency and never converted.
| Field | Function |
|---|---|
MRR__c | Monthly Recurring Revenue — recurring lines amortise booked value over the term in months (TotalPrice / termMonths); One-Time lines are 0. |
ARR__c | Annual Recurring Revenue — MRR × 12; 0 for One-Time lines. |
TCV__c | Total Contract Value — the line’s booked value over its term (TotalPrice), including One-Time charges. |
Provenance & grouping
| Field | Function |
|---|---|
AppliedWaterfallId__c / AppliedWaterfallVersion__c | Which pricing waterfall — and which published version of it — priced this line. The audit trail for why the unit price is what it is. |
LineGroup__c | Groups the line into a named section in the Quote Line Editor; lines in the same group render together under a section header with a subtotal. |
Related
- Pricing Methods ▸ Overview — the waterfall that fills the pricing fields.
- Catalog ▸ Attributes — where the
AttrKey/AttrValuecolumns come from. - Pricing Methods ▸ MDQ — segments, uplift, and the segment fields.
- Bundles ▸ Pricing Models — how
BundlePricingModel__candItemizedPrice__cbehave. - Pricing Methods ▸ Percent of Total — the
PercentOfTotalBase__caudit field. - Pricing Methods ▸ Usage & Metered Billing — how the usage fields compose into a projected overage.