BAPI_OUTB_DELIVERY_CHANGE — Change outbound delivery header, item and pick data
BAPI_OUTB_DELIVERY_CHANGE updates an existing outbound delivery document, mirroring what VL02N does interactively: header and item field changes, picking quantity updates, and date changes. It does not commit the database itself, so the calling program must call BAPI_TRANSACTION_COMMIT afterward, and every entry in the RETURN table must be checked because a change can partially succeed at item level while failing at another.
This page covers what BAPI_OUTB_DELIVERY_CHANGE actually changes on a delivery document, the control-flag pattern that trips up most first-time callers, and why silent no-ops after this BAPI are almost always a missing commit or a missing control indicator rather than an authorization problem. It also covers the RETURN table discipline required to catch partial item-level failures.
Published 16 Sept 2026· 1,068 words
What it does
BAPI_OUTB_DELIVERY_CHANGE acts on an outbound delivery document (the LIKP/LIPS pair) and functionally mirrors transaction VL02N. It is used to change header data such as planned goods issue date, route, or shipping point flags, and item data such as delivery quantity, batch, or storage location, and to update picking quantities without opening the delivery in the GUI. It is the standard interface call for warehouse and transport systems that need to push picking confirmations, quantity corrections, or date changes back into SAP once a delivery already exists. It is not used to create deliveries and it is not used to post goods issue; those are separate BAPIs. It operates on one delivery per call.
Important parameters
- DELIVERY - the outbound delivery document number being changed, mandatory on every call.
- HEADER_DATA - the new header field values, such as planned goods issue date, route, or shipping conditions.
- HEADER_CONTROL - a matching structure of X-flags, one per field in HEADER_DATA, that tells the BAPI which of the values supplied are actually meant to overwrite the delivery. A value populated in HEADER_DATA without the matching flag set in HEADER_CONTROL is silently ignored.
- CREATE_PICK - a table used to set or adjust picking quantities per delivery item, the interface most warehouse and EWM integrations actually call this BAPI for.
- ITEM_DATA and ITEM_CONTROL - item-level equivalents of the header pair, one row per delivery item, again driven by control flags.
- RETURN - a table of BAPIRET2 messages reporting the outcome of the change, at header level and per item, including errors, warnings, and information messages.
Commit behaviour
The BAPI does not commit the database update itself. Like almost all classic BAPIs, it stages the change and returns control to the caller, who must explicitly call BAPI_TRANSACTION_COMMIT to make the change durable, or BAPI_TRANSACTION_ROLLBACK to discard it. Programs ported from a batch input recording or copied from an older interface sometimes assume the SD BAPIs auto-commit because some do inside certain frameworks; this one does not when called directly. The practical symptom of a missing commit is a call that returns a clean RETURN table with no errors, yet the delivery shows no change when reopened in VL02N a moment later, because the update was rolled back at the end of the LUW with no error raised at all.
Return handling
RETURN is a table, not a single structure, and this BAPI can populate several rows in one call: one message per rejected item alongside header-level messages. Checking only whether RETURN is initial, or only scanning for TYPE equal to E, is the single most common defect seen in interfaces built on this BAPI. Type A (abort) and type X (exit) entries occur and must be treated as hard failures, and a call can return TYPE S or W messages describing a partial success, such as one item's quantity accepted and another rejected for an unrelated reason like a batch not found or a quantity exceeding the open quantity. Interfaces that treat 'no exception raised by the function module' as success miss all of this, because the function module itself rarely raises a classic ABAP exception; the failure is communicated entirely through RETURN. Correct handling loops the full table, treats E, A, and X as failure requiring rollback, and logs S and W entries against the specific item number carried in the message's system fields so a partial rejection can be traced back to the delivery line that caused it.
ECC vs S/4HANA
BAPI_OUTB_DELIVERY_CHANGE remains valid and in active use on S/4HANA for classic outbound delivery processing; it has not been withdrawn or formally deprecated in favor of a single replacement API. Environments running embedded or decentralized EWM increasingly drive picking and confirmation through the warehouse-side integration rather than calling this BAPI directly from external systems, but for straightforward header and quantity corrections against a standard delivery it is still the interface most consultants reach for, and it behaves the same way it did on ECC.
Common pitfalls
- Setting a new value in HEADER_DATA or ITEM_DATA without setting the matching flag in HEADER_CONTROL or ITEM_CONTROL, so the value is accepted with no error and simply not applied.
- Forgetting BAPI_TRANSACTION_COMMIT after a clean RETURN, producing an update that appears to succeed in the interface log but never reaches the database.
- Calling this BAPI to adjust picking quantities on a delivery item that is already under warehouse task control in EWM, overwriting a quantity the warehouse process considers authoritative and creating a discrepancy that only surfaces at goods issue or in stock reconciliation.
- Lock contention when the delivery is open in a VL02N session or a background job is processing the same delivery, returning an enqueue error inside RETURN that generic error handling logs as a data error and retries immediately, hammering the same lock.
- Passing a delivery item number in CREATE_PICK that does not exist on the delivery, or has already been fully picked, which some releases reject cleanly and others accept with a warning message that a lazy return check will not surface.
Whose problem this is
A rejected change or a message about quantities and status belongs to the logistics execution functional consultant, who should provide the delivery number, the exact RETURN table content, and the delivery's current status in VL02N. A change that returns clean but never persists, or fails only under concurrent load, belongs to the interface developer, who should show the commit logic and any lock-retry handling around the call.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-bapis/bapi-outb-delivery-changeERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.