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:

  1. 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.
  2. 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 both QuoteLineItem and OpportunityLineItem with 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__cAttrKey5__c — the attribute’s API name (e.g. license_type).
  • AttrValue1__cAttrValue5__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.

FieldFunction
UserQuantity__cThe 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

FieldFunction
UnitPrice (standard)The final per-unit price the pricing waterfall produced.
BlockPrice__cThe resolved per-unit price when the product is on block (tiered) pricing.
ContractedPrice__cThe resolved contracted per-unit price when a negotiated rate applies to this account + product.
SpecialPrice__cA manually-set special price for the line, when the rep overrides the computed unit price.
UpliftedPrice__cThe effective unit price after cumulative MDQ uplift. Computed automatically; rep-overridable when Uplift Editable is enabled on the Price Dimension.
Uplift__cThe cumulative uplift percentage applied to this segment. For segment N at X%, the multiplier is (1 + X/100)^(N-1).
AdditionalDiscount__cThe line-level discount value — read as a percent of List Price or a fixed amount per DiscountType__c.
DiscountType__cHow AdditionalDiscount__c is interpreted — Percent (of List Price) or Amount (fixed dollars).

Bundle

FieldFunction
BundlePrice__cRoll-up of the total Sales Price across all child option lines linked via ParentBundle__c — the bundle parent’s total.
BundlePricingModel__cThe 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__cThe 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__cA bundle-level discount and how it’s read (percent vs. amount).
ParentBundle__cLinks a child option line to its parent bundle line — the field that builds the bundle hierarchy. Set automatically by the configurator.
DiscountLineItem__cLinks a bundle parent to its discount-child line (a discount product included in the bundle).
InstanceName__cThe rep-given name for a bundle instance (e.g. Production, Staging) when multiple instances of the same bundle are added.
ConfigGroupId__cGroups 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.

FieldFunction
PriceDimension__cThe Price Dimension record that generated this segment (stored as text — managed packages can’t create lookups from standard objects to package custom objects).
SegmentIndex__cThe segment’s position within its group (1, 2, 3 …) — used for ordering and uplift math.
SegmentKey__cThe key grouping all segments of one MDQ product instance together; stable across amendments and renewals.
SegmentLabel__cThe display label shown in the configurator (e.g. Year 1, Q2 2025).
StartDate__c / EndDate__cThe line’s term bounds — drive MRR and the generated revenue schedules.
EffectiveDate__cWhen an amendment change takes effect; the proration anchor (billing delta is prorated from this date to the contract end).
CoTermDate__cThe 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.

FieldFunction
UsageDimension__cThe usage dimension quoted on the line (the metered thing — e.g. API calls).
UsageUnitOfMeasure__cThe dimension’s unit of measure, stamped for display (e.g. “API calls”).
UsageEntitlement__cThe 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__cThe 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__cThe rep’s projected consumption for the period — a quoting input only, never billed. Drives the projected overage.
ProjectedOverage__cThe 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

FieldFunction
DiscountSchedule__cThe discount schedule resolved for the line (volume / term tiers).
PromoCode__cThe promotion code applied to the line.
PromoDiscount__c / PromoDiscountUnit__cThe promo’s discount value and whether it’s read as a percent or a fixed amount.

Percent-of-Total

FieldFunction
PercentOfTotalBase__cAudit 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.

FieldFunction
ChangeType__cWhat this amendment did to the line — added, updated, or removed.
OriginalQuantity__c / NewQuantity__cThe quantity before and after the amendment.
OriginalSalesPrice__c / NewSalesPrice__cThe price before and after the amendment.
SourceSubscription__cThe Subscription__c this line was renewed or amended from.
ReviewRequired__cFlags 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.

FieldFunction
MRR__cMonthly Recurring Revenue — recurring lines amortise booked value over the term in months (TotalPrice / termMonths); One-Time lines are 0.
ARR__cAnnual Recurring Revenue — MRR × 12; 0 for One-Time lines.
TCV__cTotal Contract Value — the line’s booked value over its term (TotalPrice), including One-Time charges.

Provenance & grouping

FieldFunction
AppliedWaterfallId__c / AppliedWaterfallVersion__cWhich pricing waterfall — and which published version of it — priced this line. The audit trail for why the unit price is what it is.
LineGroup__cGroups 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.