Jump to a template (13)
Loading order and dependencies
The order to cash chain loads in sequence: sales order, then outbound delivery referencing the order, then picking and post goods issue against the delivery, then the billing document. Pricing condition records should exist before the orders that will use them, otherwise every line prices at zero or fails the incompletion check. Inquiries and quotations sit ahead of the order and are optional. Shipments group deliveries that already exist, so they come last.
Use this sequence whenever these files serve as SAP migration templates in an S/4HANA migration, and again for mass loads after go live.
Using these templates with the SAP Migration Cockpit or LSMW
Sales documents load near the end of an SAP data migration, after customers and materials exist. The column to field mapping matches what the SAP Migration Cockpit and LSMW both need for the initial load. Teams use these templates to stage open sales orders and deliveries before an S/4HANA migration go live, then keep them for the mass change work that follows.
SAP Inquiry Upload Template (VA11)
Create customer inquiries in bulk. An H row starts an inquiry and the D rows under it are its items.
BAPI_INQUIRY_CREATEFROMDATA2Watch DemoStructurally identical to the quotation interface with INQUIRY_ in place of QUOTATION_. Every underlying structure is the same.
What to watchEvery structure here is identical to the quotation BAPI, but every parameter name differs. INQUIRY_ITEMS_IN, not QUOTATION_ITEMS_IN. Reusing the quotation mapping unchanged is the documented failure mode: it binds to nothing and fails silently.
Mandatory fields 8 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Document Type | INQUIRY_HEADER_IN | DOC_TYPE | AF standard inquiry. |
| Sales Organization | INQUIRY_HEADER_IN | SALES_ORG | |
| Distribution Channel | INQUIRY_HEADER_IN | DISTR_CHAN | |
| Division | INQUIRY_HEADER_IN | DIVISION | |
| Sold To Party | INQUIRY_PARTNERS | PARTN_NUMB | Partner role AG. |
| Item | INQUIRY_ITEMS_IN | ITM_NUMBER | 000010, 000020. |
| Material | INQUIRY_ITEMS_IN | MATERIAL | |
| Target Quantity | INQUIRY_ITEMS_IN | TARGET_QTY |
SAP Quotation Upload Template (VA21)
Create sales quotations in bulk. An H row starts a quotation and the D rows under it are its items.
BAPI_QUOTATION_CREATEFROMDATA2Watch DemoStructurally the sales order interface with quotation naming. Note the parameter names use ITEMS and SCHEDULES in the plural, unlike the order BAPIs.
What to watchThe parameter names differ from the sales order BAPI even though every underlying structure is identical. It is QUOTATION_ITEMS_IN here and ORDER_ITEM_IN there, plural versus singular. A mapping copied from the order template binds to nothing and the quotation is created with only its document type.
Mandatory fields 10 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Document Type | QUOTATION_HEADER_IN | DOC_TYPE | AG standard quotation. |
| Sales Organization | QUOTATION_HEADER_IN | SALES_ORG | |
| Distribution Channel | QUOTATION_HEADER_IN | DISTR_CHAN | |
| Division | QUOTATION_HEADER_IN | DIVISION | |
| Sold To Party | QUOTATION_PARTNERS | PARTN_NUMB | Partner role AG. Goes in the partner table. |
| Valid From | QUOTATION_HEADER_IN | QT_VALID_F | YYYYMMDD. |
| Valid To | QUOTATION_HEADER_IN | QT_VALID_T | YYYYMMDD. |
| Item | QUOTATION_ITEMS_IN | ITM_NUMBER | 000010, 000020. |
| Material | QUOTATION_ITEMS_IN | MATERIAL | |
| Target Quantity | QUOTATION_ITEMS_IN | TARGET_QTY |
SAP Sales Order Upload Template (VA01)
Create sales orders in bulk. An H row starts an order and the D rows under it are its items.
BAPI_SALESORDER_CREATEFROMDAT2Watch DemoThe standard sales order interface. Same pricing, same availability check and same credit check as VA01.
What to watchPartners are not optional and they are not on the header structure. The sold-to party goes into ORDER_PARTNERS with partner role AG, not into ORDER_HEADER_IN. A file that puts the customer number on the header and nowhere else produces an order with no sold-to and fails.
Mandatory fields 8 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Order Type | ORDER_HEADER_IN | DOC_TYPE | OR standard order. |
| Sales Organization | ORDER_HEADER_IN | SALES_ORG | |
| Distribution Channel | ORDER_HEADER_IN | DISTR_CHAN | |
| Division | ORDER_HEADER_IN | DIVISION | |
| Sold To Party | ORDER_PARTNERS | PARTN_NUMB | Partner role AG. Goes in ORDER_PARTNERS, not the header. |
| Item | ORDER_ITEMS_IN | ITM_NUMBER | 000010, 000020. |
| Material | ORDER_ITEMS_IN | MATERIAL | Must exist in the sales area. |
| Quantity | ORDER_SCHEDULES_IN | REQ_QTY | Goes in the schedule line, not the item. |
SAP Sales Order Change Upload Template (VA02)
Change existing sales orders in bulk. An H row identifies the order, D rows are the items being changed.
BAPI_SALESORDER_CHANGEWatch DemoThe change counterpart to the sales order create BAPI. It uses a two part update convention that is unlike the MM change BAPIs.
What to watchUPDATEFLAG takes a letter, not an X. It is I to insert, U to update and D to delete, and it sits at the front of every X structure in this BAPI. A template that labels the column X and fills it with X will not update anything. The other fields in those structures are ordinary X flags, so the two conventions sit side by side in one row.
Mandatory fields 3 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Sales Document | SALESDOCUMENT | VBELN | The order being changed. Must exist. |
| Item | ORDER_ITEM_IN | ITM_NUMBER | 000010. Also the key in the X structure. |
| Update Flag | ORDER_ITEM_INX | UPDATEFLAG | I insert, U update, D delete. A letter, not an X. |
SAP Sales Contract Upload Template (VA41)
Create customer contracts with their validity and target quantities. An H row is the contract, D rows are the items.
BAPI_CONTRACT_CREATEFROMDATAWatch DemoA sales order shaped interface with one extra table for the contract data, and no schedule lines at all.
What to watchThe contract validity is not on the header. BAPISDHD1 has one hundred and twenty two fields and not one of them is a contract start or end date. They live in CONTRACT_DATA_IN, keyed by item number, with header level validity carried on the row whose item number is zero. A sheet modelled as header plus items will produce contracts with no validity period at all.
Mandatory fields 10 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Contract Type | CONTRACT_HEADER_IN | DOC_TYPE | QP quantity contract, WK1 and WK2 value contracts. |
| Sales Organization | CONTRACT_HEADER_IN | SALES_ORG | |
| Distribution Channel | CONTRACT_HEADER_IN | DISTR_CHAN | |
| Division | CONTRACT_HEADER_IN | DIVISION | |
| Sold To Party | CONTRACT_PARTNERS | PARTN_NUMB | Partner role AG. |
| Contract Start | CONTRACT_DATA_IN | CON_ST_DAT | Header validity. Sent on the row whose item number is zero. YYYYMMDD. |
| Contract End | CONTRACT_DATA_IN | CON_EN_DAT | Header validity. YYYYMMDD. |
| Item | CONTRACT_ITEMS_IN | ITM_NUMBER | Six digits, in tens. |
| Material | CONTRACT_ITEMS_IN | MATERIAL | |
| Target Quantity | CONTRACT_ITEMS_IN | TARGET_QTY | There are no schedule lines, so the quantity lives here. |
SAP Returns Order Upload Template (VA01)
Create customer returns in bulk. An H row starts a return and the D rows under it are its items.
BAPI_SALESORDER_CREATEFROMDAT2Watch DemoThe same interface as a sales order. What makes it a return is the document type and the reference to the original order.
What to watchOrder reason is what makes a return reportable. On most configurations it is mandatory on the header for document type RE, and it is the field the business reads afterwards to understand why goods came back. A bulk return load with everything defaulted to one reason code destroys that analysis.
Mandatory fields 9 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Document Type | ORDER_HEADER_IN | DOC_TYPE | RE returns order. |
| Sales Organization | ORDER_HEADER_IN | SALES_ORG | |
| Distribution Channel | ORDER_HEADER_IN | DISTR_CHAN | |
| Division | ORDER_HEADER_IN | DIVISION | |
| Sold To Party | ORDER_PARTNERS | PARTN_NUMB | Partner role AG. |
| Order Reason | ORDER_HEADER_IN | ORD_REASON | Why the goods came back. Usually mandatory on a return. |
| Item | ORDER_ITEMS_IN | ITM_NUMBER | 000010, 000020. |
| Material | ORDER_ITEMS_IN | MATERIAL | |
| Return Quantity | ORDER_SCHEDULES_IN | REQ_QTY | Goes in the schedule line. |
SAP Credit Memo Request Upload Template (VA01)
Raise credit memo requests for approval and later billing. An H row is the request, D rows are the items.
BAPI_SALESORDER_CREATEFROMDAT2Watch DemoThe sales order interface with a different document type and an order reason, and with the quantity in a different place.
What to watchThe quantity does not go where it does on a sales order. Credit and debit memo request item categories are not schedule line relevant, so there is no schedule line to carry it and the quantity has to sit in TARGET_QTY on the item with its flag set in the X structure. Check the item category in VOV7 on your own system: if yours is schedule line relevant, fill both.
Mandatory fields 9 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Document Type | ORDER_HEADER_IN | DOC_TYPE | The sales document type. Confirm it in TVAK. |
| Sales Organization | ORDER_HEADER_IN | SALES_ORG | |
| Distribution Channel | ORDER_HEADER_IN | DISTR_CHAN | |
| Division | ORDER_HEADER_IN | DIVISION | |
| Sold To Party | ORDER_PARTNERS | PARTN_NUMB | Partner role AG. |
| Order Reason | ORDER_HEADER_IN | ORD_REASON | Three characters. Why the credit is being given. |
| Item | ORDER_ITEMS_IN | ITM_NUMBER | Six digits, in tens. |
| Material | ORDER_ITEMS_IN | MATERIAL | |
| Target Quantity | ORDER_ITEMS_IN | TARGET_QTY | Not the schedule line. This is the credited quantity. |
SAP Outbound Delivery Upload Template (VL01N)
Create outbound deliveries from sales order items. One row is one sales order item to be delivered.
BAPI_OUTB_DELIVERY_CREATE_SLSWatch DemoA deliberately small interface. It takes shipping point, a due date and a list of sales order items, and works out the rest.
What to watchRead the result from the DELIVERIES and CREATED_ITEMS tables, not from the DELIVERY export field. The BAPI can split one call into several deliveries, and when it does, the single export field is not the answer. Reading it alone is how a load appears to create one delivery when it created four.
Mandatory fields 6 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Shipping Point | SHIP_POINT | SHIP_POINT | Passed once for the whole file. Every row must match. |
| Due Date | DUE_DATE | DUE_DATE | Selection date for the whole call. YYYYMMDD. |
| Sales Order | SALES_ORDER_ITEMS | REF_DOC | The order being delivered. |
| Sales Order Item | SALES_ORDER_ITEMS | REF_ITEM | 000010, 000020. |
| Delivery Quantity | SALES_ORDER_ITEMS | DLV_QTY | In sales units. |
| Sales Unit | SALES_ORDER_ITEMS | SALES_UNIT |
SAP Outbound Delivery Change Upload Template (VL02N)
Change existing outbound deliveries. An H row identifies the delivery, D rows are the items being changed.
BAPI_OUTB_DELIVERY_CHANGEWatch DemoA control-structure interface rather than an X-flag one. The control structures use named booleans and lead with real keys.
What to watchThe delivery number has to be passed three times: as the DELIVERY parameter, in HEADER_DATA and in HEADER_CONTROL. Leave it out of the control structure and the call returns no error and does nothing. And CHG_DELQTY is overloaded: it is the switch for batch and storage location changes too, not only quantity.
Mandatory fields 2 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Delivery | DELIVERY | DELIV_NUMB | Also written into HEADER_DATA and HEADER_CONTROL. |
| Delivery Item | ITEM_DATA | DELIV_ITEM | 000010. Also the key in ITEM_CONTROL. |
SAP Post Goods Issue Upload Template (VL02N)
Post goods issue on outbound deliveries in bulk. One row is one delivery.
BAPI_OUTB_DELIVERY_CONFIRM_DECWatch DemoA deliberately small interface for the goods issue step. For a plain PGI the whole payload is four fields.
What to watchFor a plain goods issue the entire payload is four fields: the delivery number three times, and POST_GI_FLG set to X. Leave POST_GI_FLG blank, or leave the delivery number out of HEADER_CONTROL, and the call returns no error and posts nothing. SAP has a Knowledge Base Article dedicated to exactly this.
Mandatory fields 2 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Delivery | DELIVERY | DELIV_NUMB | Also written into HEADER_DATA and HEADER_CONTROL. |
| Post Goods Issue | HEADER_CONTROL | POST_GI_FLG | X. Without this the call does nothing. |
SAP Inbound Delivery Upload Template (VL31N)
Create inbound deliveries against purchase orders. An H row is the delivery, D rows are the items.
BAPI_INB_DELIVERY_SAVEREPLICAWatch DemoA replica interface: you send the whole document and it is created wholesale. There are no update flags anywhere in it.
What to watchTwo things are not where you would look for them. The header has no date field at all: every date goes in HEADER_DEADLINES as a fourteen digit UTC timestamp with a time type saying which deadline it is and a time zone beside it. And the item has no purchase order field: the link to the order lives in ITEM_REF_PURCHASE_ORDER. Miss either and the delivery is created but useless.
Mandatory fields 11 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Delivery Ref | HEADER_DATA | DELIV_NUMB | Your own key. Repeated on every table row of the delivery. |
| Delivery Type | HEADER_DATA | DLV_TYPE | EL is the standard inbound delivery type. |
| Shipping Point | HEADER_ORG | SHIP_POINT | |
| Time Type | HEADER_DEADLINES | TIMETYPE | Which deadline the timestamp is. One row per deadline. |
| Timestamp UTC | HEADER_DEADLINES | TIMESTAMP_UTC | Fourteen digits, YYYYMMDDhhmmss, in UTC. |
| Time Zone | HEADER_DEADLINES | TIMEZONE | The zone the local time was converted from. |
| Item | ITEM_DATA | ITM_NUMBER | Six digits, in tens. |
| Material | ITEM_DATA | MATERIAL | |
| Delivery Quantity | ITEM_DATA | DLV_QTY | In sales units. |
| Purchase Order | ITEM_REF_PURCHASE_ORDER | DOC_NUMBER | Not on the item structure. It goes in the reference table. |
| PO Item | ITEM_REF_PURCHASE_ORDER | ITM_NUMBER_REF | Five digits. |
SAP Shipment Upload Template (VT01N)
Group deliveries into shipments with their legs and forwarding agents. An H row is the shipment, D rows are the deliveries and stages.
BAPI_SHIPMENT_CREATEWatch DemoA shipment item is a delivery number. There is no material anywhere in this interface.
What to watchITEMDATA is not what the name suggests. BAPISHIPMENTITEM has exactly two fields, a delivery number and an itinerary position, and neither is a material or a quantity. A shipment item is a whole delivery. The transport content, meaning origin, destination, legs, agent and distance, lives in STAGEDATA, and the deliveries have to exist before you start.
Mandatory fields 2 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Shipment Type | HEADERDATA | SHIPMENT_TYPE | Four characters. |
| Transport Planning Point | HEADERDATA | TRANS_PLAN_PT |
SAP Billing Document Upload Template (VF01)
Create billing documents from deliveries or orders. One row is one reference document to be billed.
BAPI_BILLINGDOC_CREATEMULTIPLEWatch DemoA list-based interface. It takes a table of reference documents and creates a billing document for each, which is why it is named CREATEMULTIPLE.
What to watchThis BAPI has no exporting document number, and errors arrive in two places. Success comes back in the SUCCESS table as BILL_DOC, and failures can be in RETURN or in the separate ERRORS table. An empty SUCCESS table is the only reliable signal that nothing was created, so check all three.
Mandatory fields 3 fields
| Column | SAP structure | SAP field | Note |
|---|---|---|---|
| Reference Document | BILLINGDATAIN | REF_DOC | The delivery or order being billed. |
| Document Category | BILLINGDATAIN | REF_DOC_CA | C sales order, J delivery. Sits in an append structure. |
| Sales Document | BILLINGDATAIN | DOC_NUMBER | Usually the same as the reference document. |
After the template
Posting these templates to SAP
Filling in a template is the easy half. PostNow.ai is the other half: it loads the sheet, checks every row against your live SAP system, and posts it through the same SAP interface named on the template, under your own SAP user and authorisations. Nothing is written that you could not write yourself in the SAP GUI, and every row that fails is reported with the SAP message that caused it.
- Load the sheet
- Check every row in live SAP
- Post through the SAP interface
FAQ
Frequently asked questions
How do I mass create sales orders in SAP from Excel?
Fill the sales order template on this page and post it through BAPI_SALESORDER_CREATEFROMDAT2. The template uses a header row per order with detail rows per item, and it carries the partner, pricing and schedule line fields that a complete order needs. Mandatory fields are listed in the template.
Why does my sales order change fail or do nothing?
The change interface uses a flag structure alongside the data, and one field in it behaves differently from the rest. The update flag takes a letter rather than an X: I to insert an item, U to update one, D to delete one. Putting an X there is the most common reason a bulk order change appears to run and leaves the orders untouched.
How do I upload sales orders and deliveries to SAP without a custom program?
PostNow.ai posts these templates through the standard SAP sales interfaces, validating each row against your live system first. No ABAP, no transport, no screen recording to maintain when a field moves. It runs under your own SAP login, so pricing, credit checks and availability checks all behave exactly as they would in VA01.
Can I load pricing condition records from Excel?
Yes, using the pricing conditions template, which posts through BAPI_PRICES_CONDITIONS. One thing to know: the condition table key is a single flat 100 character field with no delimiters, packed from the key fields in the order the condition table defines. The template keeps those key fields as separate readable columns and packs them for you.
What is the difference between a credit memo request and a credit memo?
A credit memo request is a sales document that goes through approval, and a credit memo is the billing document created from it once released. The template on this page creates the request, which normally arrives blocked for billing so somebody has to approve it. Check the document type your business uses, because the request type and the billing type are different codes.
How do I post goods issue for many deliveries at once?
Use the post goods issue template, which posts through BAPI_OUTB_DELIVERY_CONFIRM_DEC. It takes existing deliveries and confirms them, so the deliveries have to be created and picked first. This page has separate templates for each of those steps.
Can I create billing documents in bulk?
Yes. The billing template posts through BAPI_BILLINGDOC_CREATEMULTIPLE and creates invoices from deliveries or orders that already exist. Since it processes many documents in one call, reading the results per row matters, and PostNow.ai writes the resulting billing document number back beside the row that created it.
Keep going