KONV table — Document Pricing Conditions Table
KONV stores the pricing condition lines that were calculated and saved for a specific sales, billing, or purchasing document - one row per condition type per pricing procedure step per item. It is a saved snapshot of what was charged, not a live pricing engine; changing a master condition rate afterward does not retroactively change values already sitting in KONV for existing documents.
This page covers KONV, the SD/O2C table holding document-level pricing condition results, and how to read it without drawing the wrong conclusions from stale, inactive, or header-level rows. It focuses on the joins back to VBAK, VBAP, VBRK, KONP and KONH, and on the recurring mistakes consultants make when treating KONV as a live pricing calculation rather than a stored outcome.
Reviewed by an ERPClimb SAP consultant on 15 Sept 2026· 1,209 words
What it stores
One row of KONV represents a single pricing condition line as it existed inside one commercial document at the moment that document was priced and saved - one step of the pricing procedure, for one item, in one document. Every sales order and billing document carries a document condition number, KNUMV, and every condition type that fired during pricing (price, discount, surcharge, tax, freight) gets its own row here, tied to the item it applies to and the step number in the pricing procedure that produced it. KONV is a snapshot: it captures the value SAP calculated and stored at save time, not a live recalculation. It does not describe why a price is what it is in general terms; it describes what a specific document actually charged, at what rate, at what step, and for what reason, at the moment it was last priced and saved.
Key fields
The technical key of KONV is the combination of the first four fields below; nothing shorter uniquely identifies a row.
- MANDT - client
- KNUMV - document condition number, links back to the commercial document header (VBAK-KNUMV, VBRK-KNUMV)
- KPOSN - item number inside that document; zero denotes a header-level condition
- STUNR - step number of the pricing procedure at which the condition was calculated
- ZAEHK - counter distinguishing multiple condition rows within the same step
- KSCHL - condition type (e.g. price, discount, tax, freight)
- KRECH - calculation type (percentage, quantity-based, fixed amount)
- KAWRT - condition base value the rate was applied to
- KBETR - the rate as maintained, in whatever unit the condition type uses
- KWERT - the resulting condition value in the currency given by WAERS
- WAERS - currency of that row's condition value
- KNUMH - number of the master condition record in KONP that supplied the rate; blank for manually entered conditions
- KSTEU - condition category/control indicator
- KINAK - inactive indicator; non-blank means the condition was calculated but excluded from the final result
How it joins the data model
Every lookup into KONV starts from the document header, because KNUMV is only known once a document has been saved.
- KONV-KNUMV = VBAK-KNUMV (condition rows belong to this sales order header)
- KONV-KNUMV = VBRK-KNUMV (condition rows belong to this billing document header)
- KONV-KPOSN = VBAP-POSNR (item-level condition ties back to the specific order item, formats permitting)
- KONV-KNUMH = KONP-KNUMH (condition value traces back to the master condition record that generated it)
- KONV-KNUMV = KONH-KNUMV (header-level condition control record shares the same document condition number)
How to read it safely
MANDT restricts by client as normal, but the table itself is large - every priced document leaves several rows behind. Never select from KONV by condition type alone; the same KSCHL recurs across millions of rows for unrelated documents. Always obtain KNUMV from the document header first (VBAK or VBRK), then filter on KNUMV, and add KPOSN if only one item is of interest. Treat KINAK as mandatory in any aggregation: rows with a non-blank KINAK were calculated but excluded from the actual result, and summing KWERT without excluding them overstates totals. For volume price analysis across many documents, use the standard pricing reporting tools rather than ad hoc joins.
How to prove it in the data
Symptom: a discount that should have reduced an invoice line did not. Take the billing document number, read VBRK-KNUMV, then select KONV where KNUMV equals that value, KPOSN equals the item's position number, and KSCHL equals the discount condition type. No row at all means the condition never fired during pricing (determination or a requirement excluded it). A row with KINAK set means it fired but was deactivated - check STUNR and neighboring rows at the same step to see which condition overrode it.
ECC vs S/4HANA
KONV's underlying storage was redesigned in S/4HANA. Condition data now lives in a newer set of tables built for extensibility, removing the fixed-length limitations of the old structure. KONV is retained as a compatibility view so existing custom reports and interfaces that select from it by name continue to return correct results. New developments should read pricing data through the released interfaces for condition data rather than selecting KONV directly, since the physical storage behind it no longer matches the historical layout field for field in every scenario.
Common pitfalls
- Treating KONV as a live pricing engine: it is a saved snapshot. Changing a rate in the master condition record (KONP) does not alter amounts already stored for existing documents; the document must be re-priced and saved again for the new rate to appear.
- Summing KWERT across all rows for a document without excluding rows where KINAK is set - this counts values that were calculated but explicitly excluded from the final result, inflating totals.
- Ignoring KPOSN = 0: these are header conditions (freight, header discounts) applying to the whole document, not one item. Dropping them from an item-level report loses real value; adding them again at every item duplicates it.
- Assuming KSCHL uniquely identifies a row: the same condition type can appear more than once at different STUNR or ZAEHK values within one document when conditions are copied, split, or recalculated. The real key is the full combination, not the condition type alone.
- Confusing KBETR (the rate as maintained) with KWERT (the actual monetary effect). A percentage discount has a small KBETR and a KWERT that reflects the real currency amount deducted; reading KBETR as the money impact misstates the analysis substantially.
- Expecting a row for every condition type in the pricing procedure: conditions that never triggered because a requirement was not met or no master record matched simply do not appear. Absence in KONV is not by itself proof of a configuration defect.
- Ignoring WAERS on a row-by-row basis: KWERT is in the currency named for that specific row, which is not guaranteed to match the document's header currency for every condition, particularly tax and statistical entries.
Whose problem this is
The SD pricing/configuration consultant owns the pricing procedure and condition determination logic that produces these rows. The order-to-cash functional lead owns whether a specific document priced correctly. Basis is only pulled in for raw table growth or read performance on very high-volume systems. FI/CO gets involved when a condition's accounting relevance, such as revenue account determination, is in dispute.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tables/konvERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.