VBFA table — Sales Document Flow Table VBFA
VBFA stores the link between one sales document (or item) and the document it produced in the order-to-cash chain, such as order to delivery, delivery to invoice, or order to credit memo. Each row is one preceding-to-subsequent relationship, not a document itself. It is the table to query when tracing what happened downstream or upstream of a given order, delivery, or billing document.
VBFA is the document flow table that links preceding and subsequent SD documents at header and item level. This page covers the fields that actually matter, how to join it into the order-delivery-billing chain, and the recurring mistakes consultants make when they treat it as a simple one-to-one history instead of a many-to-many flow table.
Reviewed by an ERPClimb SAP consultant on 15 Sept 2026· 1,134 words
What it stores
One row in VBFA represents a single link between a preceding document (or preceding item) and a subsequent document (or subsequent item) somewhere in the sales process. A sales order line that results in two partial deliveries produces two rows. A delivery split into two invoices produces two rows on the delivery side. Header-level links, such as an order header referencing a contract header, also appear as rows with item fields set to zero. The table does not store the business documents themselves, only the fact that document A produced document B, plus the quantity and value that moved across that particular link. Reading VBFA in isolation tells nothing about the current status of either document; it only tells what was created from what, and how much.
Key fields
- MANDT - client, always the first restriction in any select
- VBELV - preceding document number (the document that was copied from)
- POSNV - preceding item number, 000000 for a header-level link
- VBELN - subsequent document number (the document created by copying)
- POSNN - subsequent item number, 000000 for a header-level link
- VBTYP_V - document category of the preceding document (order, delivery, invoice, etc.)
- VBTYP_N - document category of the subsequent document
- ERDAT - date the flow record was created, effectively the date the subsequent document was created
- RFMNG - cumulative quantity referenced by this link, in the base unit given by MEINS
- MEINS - unit of measure for RFMNG
- RFWRT - cumulative value referenced by this link, in document currency
- PLMIN - plus/minus indicator showing whether the link adds to or reduces the referenced quantity, relevant for returns and credit memos
How it joins the data model
- VBFA-VBELV = VBAK-VBELN (preceding document is a sales order header)
- VBFA-VBELV = VBAP-VBELN and VBFA-POSNV = VBAP-POSNN (preceding document is a sales order item)
- VBFA-VBELN = LIKP-VBELN (subsequent document is a delivery header)
- VBFA-VBELN = LIPS-VBELN and VBFA-POSNN = LIPS-POSNN (subsequent document is a delivery item)
- VBFA-VBELN = VBRK-VBELN (subsequent document is a billing header)
- VBFA-VBELN = VBRP-VBELN and VBFA-POSNN = VBRP-POSNN (subsequent document is a billing item)
How to read it safely
MANDT restriction is mandatory and usually handled by the environment. Beyond that, never select from VBFA without restricting on VBELV or VBELN, ideally both plus VBTYP_V or VBTYP_N to narrow the document category. The table has no natural date range field worth filtering on for performance since ERDAT reflects flow creation, not business relevance, so filtering by date alone on a large table is a full scan. In a mature production system this table can hold many years of history across every sales document ever created, so an unrestricted select against it is one of the more common ways to time out a report. Always drive the query from a known document number or a small set of them.
How to prove it in the data
Symptom: a customer disputes that an order was ever delivered. Select VBFA where VBELV equals the order number and POSNV equals the item, restricted to rows where VBTYP_N indicates a delivery. If no row exists, the order item was never copied into a delivery, which points to a blocked schedule line or missing delivery run rather than a delivery that was created and lost. If a row exists, take the VBELN from that row and check LIKP and the delivery's own status, since VBFA will still show the link even if the delivery was later cancelled.
ECC vs S/4HANA
VBFA remains a standard transparent table in S/4HANA with the same structure used in ECC; it has not been replaced by a compatibility view in the way VBUK and VBUP status handling was reworked around the simplified document status model. Existing ABAP reading VBFA directly continues to work. The practical change on S/4HANA projects is more often about volume and archiving strategy than about structure, since the table keeps growing with every document created and is a frequent candidate for data volume management discussions during system conversion.
Common pitfalls
- Treating the table as one-to-one: a single order item routinely fans out into several deliveries, and a single delivery item can be split across several invoices, so counting VBFA rows as a proxy for counting business documents overstates the real number.
- Reading RFMNG or RFWRT as the current outstanding quantity or value: these are cumulative figures for that specific link at the time it was written, not a live balance; the live balance lives in VBUP and VBUK, not in VBFA.
- Assuming a row's presence means the subsequent document is still active: VBFA is not cleaned up when a delivery or invoice is cancelled or reversed, it simply gains additional rows for the cancellation documents, so the flow has to be read alongside status fields, not instead of them.
- Forgetting the header-level rows with POSNV and POSNN both zero, which represent contract or reference-document links rather than item movements, and mixing these into item-level quantity totals produces wrong sums.
- Decoding VBTYP_V and VBTYP_N by memory or by guessing letters instead of checking the domain's fixed values, since document category codes are easy to misremember and a wrong assumption here silently misclassifies an entire report.
- Running an unrestricted select on VBFA in a copy-control troubleshooting session instead of going first to the order or delivery number directly in front of the consultant; the table is large enough that this reflex causes performance complaints that get blamed on the wrong root cause.
Whose problem this is
Document flow questions belong to the SD functional consultant responsible for order-to-cash configuration, specifically copy control between document types, since that configuration determines which links get written and with what quantity and value. Basis or data management gets involved only when the discussion turns to table growth, archiving, or performance, not when the question is why a particular link is missing.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-tables/vbfaERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.