> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getveles.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Quote Line

> Field reference for the Veles Quote Line object in the Salesforce managed package.

A Veles Quote Line is **one product charge priced for one phase window** —
the reporting workhorse of the package. Lines are master-detail children of
their [Quote](https://docs.getveles.com/sfdc-managed-package/objects/quote.md) (so every quote has one
flat, reportable line list) with a lookup to their
[Phase](https://docs.getveles.com/sfdc-managed-package/objects/quote-phase.md), plus **denormalized
phase and billing attributes** so filters and rollups work without joins.

Dynamic user-defined line fields are exposed as child
[Quote Line Attribute Values](https://docs.getveles.com/sfdc-managed-package/objects/quote-line-attribute-value.md),
listed under **Attribute Values** on the line's Related tab.
Application-owned values remain first-class Quote Line fields.

> [!TIP]
>
> The denormalization is what makes admin-built rollups point-and-click. A
> rollup summary field on the Quote of `SUM(Net Amount Prorated) WHERE
>     Phase Sequence = 1 AND Billing Type = Recurring` gives "first-year
> recurring revenue" with zero code — and reconciles exactly with Phase 1's
> precomputed Recurring Revenue Prorated.

List-price detail lives here (List Unit Price / List Amount Prorated) rather than on
quote or proposal headers — sum line amounts to reconstruct list totals at
any grain. Deeper pricing internals (system prices, promotion
applications) deliberately stay in Veles.

## Bundle money: two complementary columns

A bundle prices one product across several rows: the bundle line and its
component lines. Only one grain of that money is real at a time — either the
bundle's own price (with component prices derived from it as spread shares),
or the components' prices (with the bundle's price derived as their sum).
If every row carried its Veles-displayed price in one amount column, summing
lines would count every bundle **twice**.

So each line's engine price lands in exactly **one** of two complementary
columns:

* **Net Amount** — transacted money: the row's own pricing-waterfall output.
  `0` on rows whose price is derived from other rows.
* **Allocated Amount** — derived money: what the pricing mode allocated onto
  the row, spread-down or sum-up. `0` on rows that carry their own price.

At most one of the two is non-zero on any row, so **Net Amount + Allocated
Amount = the row's whole-order value** — and an unfiltered `SUM(Net Amount)`
totals the quote correctly, always, with no bundle filter. It is also the
price Veles shows on every row but one kind: a component of a bundle sold
more than once, which Veles shows at one bundle's worth (see
[below](#a-bundle-sold-more-than-once)).
Which rows carry which column depends on the bundle's pricing mode:

| Bundle pricing mode | Bundle line | Component lines |
| - | - | - |
| Parent-priced (price set on the bundle) | Net Amount | Allocated Amount (spread % x parent) |
| Sum-of-parts (price summed from components) | Allocated Amount (= sum of components) | Net Amount |

Rows whose money sits in Allocated Amount zero their whole waterfall — unit
prices and the List pair follow Net Amount's rule, and the Discount pair is
blank, since no waterfall ran — so `Quantity x Net Unit Price = Net Amount`
holds on every row. Standalone lines always carry Net Amount. Usage lines sync real unit prices
but **null** amounts — there are no actuals at quote time. `0` means "this
money is in the row's other column, or on another row"; null means "this
number does not exist yet." Both are safe to sum.

A worked example — one 12-month phase, no proration. Suite Pro is
parent-priced at 30,000 with component spreads of 60% and 25% (deliberately
not totaling 100); Support Bundle is priced as the sum of its parts:

| Line | Billing Type | Bundle | Net Amount | Allocated Amount | Net + Allocated |
| - | - | - | - | - | - |
| Platform Fee | Recurring | | 12,000 | 0 | 12,000 |
| Implementation | One-Time | | 8,000 | 0 | 8,000 |
| Suite Pro (parent-priced bundle) | Recurring | true | 30,000 | 0 | 30,000 |
| Analytics Module (60% spread) | Recurring | | 0 | 18,000 | 18,000 |
| API Module (25% spread) | Recurring | | 0 | 7,500 | 7,500 |
| Support Bundle (sum-of-parts bundle) | Recurring | true | 0 | 15,000 | 15,000 |
| Premium Support | Recurring | | 6,000 | 0 | 6,000 |
| Dedicated CSM | Recurring | | 9,000 | 0 | 9,000 |
| API Calls | Usage | | null | null | null |

Unfiltered `SUM(Net Amount)` = 65,000 — the quote total, exactly. Had every
row carried its displayed price instead, the Support Bundle's money would
appear both on its own row (15,000) and on its components' rows (6,000 +
9,000): every sum-of-parts bundle counted exactly twice. The Suite Pro
spreads illustrate honest under-attribution: 60% + 25% leaves 4,500 of the
parent's price allocated to no component, because Veles never allocated it.

### A bundle sold more than once

The bundle is the pricing unit. When a bundle line has a quantity above 1,
under either pricing mode, each component row in Veles shows what **one**
bundle holds, and the bundle line multiplies by the number of bundles sold.
Allocated Amount stays the component's share of the whole bundle line, every
bundle included, and Net Amount on a sum-of-parts component is its price
across every bundle, so the recipes below need no change. With Suite Pro
above sold at quantity 10:

| Line | Quantity | Net Unit Price | Net Amount | Allocated Amount | Veles shows |
| - | - | - | - | - | - |
| Suite Pro (parent-priced bundle) | 10 | 30,000 | 300,000 | 0 | 300,000 |
| Analytics Module (60% spread) | 10 | 0 | 0 | 180,000 | 18,000 per bundle |
| API Module (25% spread) | 10 | 0 | 0 | 75,000 | 7,500 per bundle |

Quantity is the units the row's money is priced over across the whole
order: the line's own quantity times the bundles it rides in (a usage
line's is its own quantity). So `Quantity x Net Unit Price` is the row's
Net Amount on every row; on a row whose money is Allocated the net prices are
zero and Allocated Amount holds the whole-order value. The amount Veles shows
per bundle is the row's Net + Allocated divided by the quantities of the
bundle lines above it (follow Parent Line).

The report recipes that follow:

* **Quote totals**: sum Net Amount (run-rate) or Net Amount Prorated (window
  actuals). No filter needed.
* **Revenue by product**: the row formula `Net Amount + Allocated Amount`,
  filtered `Bundle = false` — each product counted exactly once, at any
  bundle depth.
* **Revenue by bundle**: the same formula on `Bundle = true` rows.
* **Never sum Allocated Amount by itself** — a bundle's Allocated restates
  the value of its contents; it is a per-row complement, not a total.

## Fields at a glance

| Field | API Name | Type |
| - | - | - |
| Line Name | `Name` | Text (standard name field, the line's display label) |
| Veles External ID | `Veles__External_Id__c` | Text(255), unique, external ID |
| Quote | `Veles__Quote__c` | Master-Detail(Veles Quote) |
| Phase | `Veles__Phase__c` | Lookup(Veles Quote Phase) |
| Phase Sequence | `Veles__Phase_Sequence__c` | Number(3, 0), denormalized |
| Product | `Veles__Product__c` | Lookup(Product2), optional |
| Product Name | `Veles__Product_Name__c` | Text(255), denormalized |
| Product SKU | `Veles__Product_SKU__c` | Text(255), denormalized |
| Billing Type | `Veles__Billing_Type__c` | Picklist |
| Billing Frequency | `Veles__Billing_Frequency__c` | Picklist |
| Quantity | `Veles__Quantity__c` | Number(16, 2) |
| List Unit Price | `Veles__List_Unit_Price__c` | Currency(16, 2) |
| Net Unit Price | `Veles__Net_Unit_Price__c` | Currency(16, 2) |
| Net Amount | `Veles__Net_Amount__c` | Currency(16, 2), annualized |
| List Amount | `Veles__List_Amount__c` | Currency(16, 2), annualized |
| Net Amount Prorated | `Veles__Net_Amount_Prorated__c` | Currency(16, 2) |
| List Amount Prorated | `Veles__List_Amount_Prorated__c` | Currency(16, 2) |
| Allocated Amount | `Veles__Allocated_Amount__c` | Currency(16, 2), annualized |
| Allocated Amount Prorated | `Veles__Allocated_Amount_Prorated__c` | Currency(16, 2) |
| Proration Factor | `Veles__Proration_Factor__c` | Percent(7, 4) |
| Discount % | `Veles__Discount_Percent__c` | Percent(5, 2) |
| Discount Amount | `Veles__Discount_Amount__c` | Currency(16, 2) |
| Start Date | `Veles__Start_Date__c` | Date |
| End Date | `Veles__End_Date__c` | Date |
| Months | `Veles__Months__c` | Number(4, 0) |
| Bundle | `Veles__Bundle__c` | Checkbox |
| Parent Line | `Veles__Parent_Line__c` | Lookup(Veles Quote Line) |
| Position | `Veles__Position__c` | Number(8, 2) |
| Synced At | `Veles__Synced_At__c` | DateTime |

## Field details

### Identity and structure

**Name** `Text (standard name field)`

**Line Name** — The line's name as Veles shows it (the rep's rename, else the
product name recorded on the line), cut at 80 characters. Product Name carries
it uncut.

**Veles\_\_External\_Id\_\_c** `Text(255), unique, external ID`

**Veles External ID** — The Veles quote line ID. All sync writes upsert on
this field; never edit.

**Veles\_\_Quote\_\_c** `Master-Detail(Veles Quote)`

**Quote** — The Veles quote this line belongs to. All of a quote's lines
across every phase, as one flat list — filter by Phase Sequence or Billing
Type to slice it.

**Veles\_\_Phase\_\_c** `Lookup(Veles Quote Phase)`

**Phase** — The quote phase (time window) this line is priced in. Lookup
rather than master-detail — the line's owning parent is the quote; use the
denormalized Phase Sequence field for rollup filters.

**Veles\_\_Phase\_Sequence\_\_c** `Number(3, 0)`

**Phase Sequence** — The 1-based sequence of the phase this line is priced
in, denormalized so rollup-summary filters and report filters work without
joins.

**Veles\_\_Bundle\_\_c** `Checkbox`

**Bundle** — Whether this line is a bundle: a product whose component
lines carry its detail; its components name it as their Parent Line. Set
from the line's Veles configuration, whatever the bundle's pricing mode. Product-grain reports filter `Bundle = false` and
total Net Amount + Allocated Amount — see
[Bundle money](#bundle-money-two-complementary-columns).

**Veles\_\_Parent\_Line\_\_c** `Lookup(Veles Quote Line)`

**Parent Line** — The line this line sits under: for a bundle
component, the bundle's own line. Empty for standalone lines and for the
top line of a bundle. How bundle money lands across the parent and component
rows is covered in
[Bundle money](#bundle-money-two-complementary-columns).

**Veles\_\_Position\_\_c** `Number(8, 2)`

**Position** — The line's display order within its phase, as authored in
Veles. Sort by Phase Sequence, then Position to reproduce the quote's
visual order.

### Product

**Veles\_\_Product\_\_c** `Lookup(Product2)`

**Product** — The Salesforce Product2 record matching this line's Veles
product, when the mapping is known. Enables native "revenue by product
family" report joins. May be empty — Product Name and SKU are always
populated as text so reports never break on a missing lookup.

**Veles\_\_Product\_Name\_\_c** `Text(255)`

**Product Name** — The line's name as Veles shows it (the rep's rename,
else the product name recorded on the line), stored as text so line reports
always have a label even when the Product lookup is empty. The same text as
Name, which Salesforce cuts at 80 characters.

**Veles\_\_Product\_SKU\_\_c** `Text(255)`

**Product SKU** — The product SKU recorded on the line in Veles,
denormalized as text.

### Billing

**Veles\_\_Billing\_Type\_\_c** `Picklist`

**Billing Type** — How this line's charge behaves: `Recurring` (repeats
every billing period), `One-Time` (billed once), or `Usage`
(transactional/consumption-based, billed on actuals). Set per line by
Veles at publish time. Unrestricted so new Veles billing types never break
the sync.

**Veles\_\_Billing\_Frequency\_\_c** `Picklist`

**Billing Frequency** — How often this line is billed: `Monthly`,
`Quarterly`, `Semi-Annual`, or `Annual`. Lines within the same quote can
bill on different frequencies.

### Quantity and pricing

**Veles\_\_Quantity\_\_c** `Number(16, 2)`

**Quantity** — The units this line's rate is priced over across the whole
order: the line's own quantity times the bundles it rides in, so Net Unit
Price x Quantity is the row's Net Amount. On a row whose money is Allocated
the net prices are zero and its value is in Allocated Amount instead. A
usage line's is its own quantity. Fractional quantities are possible.

**Veles\_\_List\_Unit\_Price\_\_c** `Currency(16, 2)`

**List Unit Price** — The per-unit list price before any adjustments or
discounts. This is the annualized/full-term rate, never prorated — the
window math lives in the prorated amounts. Zero on a row whose money is Allocated.

**Veles\_\_Net\_Unit\_Price\_\_c** `Currency(16, 2)`

**Net Unit Price** — The per-unit price after all discounts and
promotions. This is the annualized/full-term rate, never prorated. Zero on a row whose money is Allocated.

**Veles\_\_Net\_Amount\_\_c** `Currency(16, 2)`

**Net Amount** — The line's extended net amount, annualized/full-term (the
run-rate lens, before proration). Recurring lines' Net Amounts sum to the
phase's ARR. Base-name-annualized convention: the \_Prorated variant carries the
window actual. Carries transacted money only: `0` on bundle rows whose
price is derived from other rows, where Allocated Amount holds the value —
which is what makes the unfiltered sum correct.

**Veles\_\_List\_Amount\_\_c** `Currency(16, 2)`

**List Amount** — The line's extended list amount, annualized/full-term
(the run-rate lens, before proration and before any adjustments or
discounts). Zero on a row whose money is Allocated.

**Veles\_\_Net\_Amount\_Prorated\_\_c** `Currency(16, 2)`

**Net Amount Prorated** — Extended net total for this line in its actual
window (prorated), after all discounts and promotions. Recurring lines sum
to the phase's Recurring Revenue Prorated; one-time lines sum to its One-Time Revenue;
together they make the Phase Contract Value and the quote's TCV. May be less than
Net Unit Price x Quantity — unit prices are full-term rates. Like Net
Amount, `0` on bundle rows whose price is derived from other rows.

**Veles\_\_List\_Amount\_Prorated\_\_c** `Currency(16, 2)`

**List Amount Prorated** — Extended list total for this line in its actual
window (prorated), before any adjustments or discounts — the same prorated
lens as Net Amount Prorated. Sum to reconstruct list-price totals at any
grain. Zero on a row whose money is Allocated.

**Veles\_\_Allocated\_Amount\_\_c** `Currency(16, 2)`

**Allocated Amount** — The value the pricing mode allocated onto this row,
annualized/full-term: a component's spread share of a parent-priced
bundle's whole line (every bundle sold), or the components' total rolled
up onto a sum-of-parts bundle line. The engine's attribution, not an ASC
606 fair-value allocation. At most one of Net Amount and Allocated Amount
is non-zero on any row — add them for the row's whole-order value. Veles
shows a component of a bundle sold more than once at one bundle's worth
(see [A bundle sold more than once](#a-bundle-sold-more-than-once)).
**Never sum this column**:
a bundle's Allocated restates the value of its contents; to total a quote,
sum Net Amount. See
[Bundle money](#bundle-money-two-complementary-columns).

**Veles\_\_Allocated\_Amount\_Prorated\_\_c** `Currency(16, 2)`

**Allocated Amount Prorated** — The window-actual companion to Allocated
Amount, on the same prorated lens as Net Amount Prorated. At most one of
Net Amount Prorated and Allocated Amount Prorated is non-zero on any row —
add them for the row's whole-order prorated value. Never sum this column;
to total a quote, sum Net Amount Prorated.

**Veles\_\_Proration\_Factor\_\_c** `Percent(7, 4)`

**Proration Factor** — How much of the line's annualized amount applies to
its actual window (day-based), computed by the Veles pricing engine and
synced. 100% means no proration. Net Amount x Proration Factor = Net
Amount Prorated.

**Veles\_\_Discount\_Percent\_\_c** `Percent(5, 2)`

**Discount %** — The rep's discount on this line, off its system price
(the list price after Veles's automatic adjustments (rules, promotions,
uplift), before the rep's discount), computed by the Veles pricing engine and
synced (matches the Veles UI and quote documents exactly).
Proration-invariant: the same at both the annualized and prorated lens. 0%
means the line carries no discount. Empty on rows whose money is Allocated.

**Veles\_\_Discount\_Amount\_\_c** `Currency(16, 2)`

**Discount Amount** — The rep's discount on this line, annualized (the
full-term lens, before proration): the line's system amount minus its Net
Amount. The system price is the list price after Veles's automatic adjustments (rules, promotions,
uplift), before the rep's discount, so this is not List
Amount minus Net Amount. Line values sum to the phase's Discount Amount.
Empty on usage lines and on rows whose money is Allocated.

### Term window

**Veles\_\_Start\_Date\_\_c** `Date`

**Start Date** — The first day of the line's own effective window, when it
has one. Lines can cover a sub-window of their phase (e.g. a mid-phase
add).

**Veles\_\_End\_Date\_\_c** `Date`

**End Date** — The last day of the line's own effective window, when it
has one.

**Veles\_\_Months\_\_c** `Number(4, 0)`

**Months** — How many months this line spans within its phase. Usually
equals the phase's months; smaller for partial-window lines.

### Sync health

**Veles\_\_Synced\_At\_\_c** `DateTime`

**Synced At** — When the Veles sync last wrote this record. Quotes, with
their phases and lines, update each time the proposal is pushed from Veles,
not on every draft edit. If this looks stale relative to activity in Veles,
check the integration status in Veles admin.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.