Quick answer

How to do a VA01 mass upload from Excel

PostNow.ai does a VA01 mass upload from Excel by calling BAPI_SALESORDER_CREATEFROMDAT2 once per order: an H row carries the header and sold-to, D rows carry the items and schedule lines. SAP prices it and checks availability and credit as in VA01. PostNow.ai commits only when SAP returns no error and writes each order number back as a link to VA03.

  • An order on credit block or with an incompletion log is a created order. It has a number. Release or complete it in SAP; never re-run the row.
  • Check the result on confirmed quantity and price, not on how many rows turned green.

This page is about one transaction, and it is where SAP sales order automation usually starts: sales orders from a spreadsheet that arrive in SAP priced, confirmed and ready to deliver. For choosing a method across all SAP objects, see SAP mass upload from Excel; for a first upload of any kind, how to upload data into SAP from Excel.

How PostNow.ai creates sales orders from Excel

PostNow.ai treats a sales order upload as a BAPI template: a designer builds it once against your SAP system, publishes it, and operators run their own files through it under their own SAP login.

1. Pick the BAPI and pull its structure from SAP

In the BAPI Explorer, pick BAPI_SALESORDER_CREATEFROMDAT2 from the quick list or search it. PostNow.ai reads the interface from your system, so the mapper shows the fields your release has, including the S/4HANA ones.

2. Map header, partner, item and schedule line columns

Header columns go to ORDER_HEADER_IN, the sold-to to ORDER_PARTNERS with a fixed partner role, item columns to ORDER_ITEMS_IN, and quantity and requested date to ORDER_SCHEDULES_IN. An H/D loop on a marker column (or flat rows with a split column) turns one H row and its D rows into one order. PostNow.ai fills the X-structures for you.

3. Fix what should not vary, restrict what can

Give the partner role, the division or a single order type a fixed value. Put a value list on sales organisation and order type and switch on Restrict, so Validate refuses another team's sales area. Customer number columns get leading zeros added automatically, because the SAP field uses the ALPHA conversion, so 200371 reaches SAP as 0000200371.

4. Validate, then Simulate

Validate checks the file offline: required fields, lengths, formats, dates, allowed values. Pre-Validation also asks SAP whether the customers and materials exist. Simulate calls the BAPI for real and then BAPI_TRANSACTION_ROLLBACK instead of a commit, so you see SAP's messages for pricing, partners and incompleteness without creating an order.

5. Run, and write the order number back

Run calls the BAPI once per order. If SAP returns no E or A message, PostNow.ai calls BAPI_TRANSACTION_COMMIT with wait, so the order is on the database before the next one starts; otherwise it rolls back. Map the $DOC_NO result token to an "SAP order" column and set VA03 as the Call Transaction, and each order number becomes a link that opens VA03 with the order filled in.

6. Re-run only what failed

Retry Failed re-posts only the orders whose Run Log starts with ERROR, each rebuilt whole. A normal Run checks the Run Log first and, if orders in scope were already posted, offers Skip posted rows, Post again or Cancel, so a second click on Run posts nothing twice unless someone chooses Post again.

Check: after the first five orders, open two in VA03 and compare the sold-to, ship-to, net value and confirmed quantity with the file before you run the rest.

A ready-made sheet for this is the free VA01 sales order template (H/D layout, column-to-BAPI field guide), listed with the other SD templates on the sales and distribution templates page.

BAPI_SALESORDER_CREATEFROMDAT2 vs a VA01 BDC recording: which to use

PostNow.ai can post sales orders either way. For orders with more than one item we build on the BAPI, and the table shows why.

RouteHow it postsUse it whenWatch out for
PostNow.ai: BAPI_SALESORDER_CREATEFROMDAT2One RFC call per order; commit only if SAP returns no errorMulti-item orders, repeat loads, run-only templates for operatorsInternal keys, quantity in the schedule line, item numbers matching across tables
PostNow.ai: VA01 recordingCALL TRANSACTION on an SHDB recordingOne item per order, or a custom field only the screen reachesScreens that appear only sometimes: availability check, incompleteness dialog, ship-to selection
IDoc ORDERS (process code ORDE)ALE/EDI inbound processingOrders from a customer's system on EDI, run by ITPartner profiles and IDoc monitoring; not a spreadsheet tool

Why recordings struggle with VA01. The item overview is a table control addressed by row index (RV45A-MABNR(01), RV45A-KWMENG(01), then (02)), and how many rows are visible depends on screen size unless the default size is forced. VA01 also shows extra screens only for some orders: practitioners report recordings that work for one item and break when an item has no stock, because the availability check screen appeared. The BAPI has no screens. The general trade-off between the two methods is in BAPI vs BDC in SAP, and how to record so a recording replays is in the BDC recording guide.

BAPI_SALESORDER_CREATEFROMDAT2 structures: what goes where

PostNow.ai shows the BAPI's parameters as SAP defines them. In a standard VA01 upload you will use these:

ParameterFilled fromTypical fields
ORDER_HEADER_IN / ORDER_HEADER_INXH row, once per orderDOC_TYPE, SALES_ORG, DISTR_CHAN, DIVISION, PURCH_NO_C (customer PO number), REQ_DATE_H, PMNTTRMS
ORDER_PARTNERSH rowPARTN_ROLE (fixed AG), PARTN_NUMB (the customer)
ORDER_ITEMS_IN / ORDER_ITEMS_INXEach D rowITM_NUMBER (10, 20, 30), MATERIAL, PLANT, SALES_UNIT, ITEM_CATEG, SHORT_TEXT
ORDER_SCHEDULES_IN / ORDER_SCHEDULES_INXEach D rowITM_NUMBER (same as the item), REQ_QTY, REQ_DATE
ORDER_CONDITIONS_IN / ORDER_CONDITIONS_INXD row, only for manual pricesITM_NUMBER, COND_TYPE, COND_VALUE, CURRENCY
SALESDOCUMENT (export)Returned by SAPThe new order number; PostNow.ai's $DOC_NO token reads it
RETURNReturned by SAPEvery message, type S, W, I, E or A
  • Quantity goes in the schedule line. REQ_QTY in ORDER_SCHEDULES_IN is the order quantity, linked to its item by ITM_NUMBER. Map ITM_NUMBER once, on the item: PostNow.ai copies it into the schedule line built from the same D row when that line has no item number of its own. Confirm on the first Simulate that each schedule line reached the right item.
  • The X-structures say which fields you sent. Every field filled in ORDER_HEADER_IN needs an X in the same field of ORDER_HEADER_INX; item and schedule line X rows also carry the key values. PostNow.ai fills both from the field types it reads from SAP and sends ambiguous cases to a review dialog.
  • Use SAP's internal keys. Order type and partner function are language-dependent. In an English logon VA01 shows order type OR and partner functions SP and SH, while the database holds TA, AG and WE; the screen converts them through conversion exits (for order types, table TAUUM). PostNow.ai applies the ALPHA conversion (leading zeros) for you; put the internal keys in the template as fixed values, or test the BAPI's CONVERT flag ("Conversion of Partner Function + Order Type") on one order.
  • The BAPI does not commit on its own. "It said saved but VA03 can't find it" comes from calling it without BAPI_TRANSACTION_COMMIT; PostNow.ai commits after every clean order.

PostNow.ai sends what the H row holds; SAP decides almost everything else from the order type, the sales area and the sold-to. That is why these three columns deserve allow-lists and a pilot.

  • Order type (DOC_TYPE) carries the document's rules, among them whether an incomplete order may be saved and the duplicate PO check. Keep one order type per template unless the file really mixes them.
  • Sales area is sales organisation, distribution channel and division together. The customer needs sales area data for exactly that combination, and each material needs its sales view for the sales organisation and channel. A customer that exists in KNA1 but not in this sales area is the most common reason a whole file fails on day one.
  • Sold-to goes into ORDER_PARTNERS with role AG, not into a header field. Leave the ship-to out and SAP's documentation says the sold-to is used as ship-to. Partner determination then fills bill-to and payer from the customer master.
  • One partner line per header. In PostNow.ai a table parameter in header scope is read once from the H row, which gives one ORDER_PARTNERS line: the sold-to. If customers order for several ship-to parties, prove how your template sends the ship-to on a Simulate first.
  • Customer PO number (PURCH_NO_C) is your duplicate guard. With "Check purchase order no." set to A on the order type (VOV8), SAP warns with message V4 115 when the sold-to already has an order with that PO number. Raise V4 115 to an error in OVAH and the BAPI returns E, PostNow.ai rolls back, and the row shows ERROR instead of creating a duplicate.

Items, schedule lines and pricing

PostNow.ai creates the orders in sheet order, one after another, and SAP prices and checks availability for each one as it is created.

  • Row order is an allocation rule. The availability check confirms against what earlier orders have already taken. When stock is short, the customers at the top of the sheet get it. Sort the file on purpose (priority, requested date) before you run it, not after.
  • Requested is not confirmed. You send REQ_QTY and REQ_DATE; SAP writes the confirmed quantity and date into the schedule lines in VBEP. An order with zero confirmed quantity is still a created order.
  • Let pricing find the price. Leave ORDER_CONDITIONS_IN empty and the pricing procedure reads the condition records, exactly as in VA01. If those records came from a VK11 load, the VK11 upload guide shows how to prove they are the ones pricing reads.
  • Manual prices depend on the condition type. Whether a PR00 value from the file wins depends on the condition type's manual entry setting in V/06. Practitioners report the BAPI price ignored, or a second PR00 line next to the determined one. Simulate one order with a manual price and read the item's Conditions tab before you rely on it.
  • Wrong prices rarely raise errors. A customer with the wrong price group gets a valid price from a valid record. Compare net value per order against what the file expects for a sample, every time.
Two sales orders of 70 units against 100 units available: whichever order is created first is confirmed 70, the second only 30
Same stock, same demand: the order created first is confirmed in full. In a mass upload, sheet order decides which customer that is.

Incompletion log and credit block: what counts as success

PostNow.ai marks a row by what SAP did: committed or rolled back. SAP also saves orders that still need work, so read the outcomes like this:

What SAP didWhat you seeOrder exists?What to do
Saved, complete, no blockSuccess messages in RETURN (for example V4 233 "SALES_HEADER_IN has been processed successfully" and V1 311 "... has been saved"); order number in SALESDOCUMENTYesNothing
Saved with an incompletion logWarning V1 555 "The sales document is not yet complete: Edit data" plus the save messageYesComplete it in VA02 (Edit › Incompletion log) or from the V.02 list. Do not re-run.
Saved and put on credit blockOften no credit message in RETURN at all; the order is saved with credit status B (not OK)YesThe credit team releases it. Do not re-run.
RejectedE message(s), often ending with V4 219 "Sales document was not changed"No (rolled back)Read the messages above the last one, fix the row, Retry Failed

Incompletion. Whether an incomplete order may be saved depends on the sales document type. Where it may, the BAPI saves with the warning, and the log blocks what its configuration says: missing payment terms, for example, allow delivery but block billing. In PostNow.ai the Run Log cell of a successful row shows SAP's first non-warning message, so read incompletion (V1 555) from the incomplete-orders check below, after every load.

Credit block. In classic credit management, OVA8 sets the reaction and the Status/Block indicator per credit control area, risk category and credit group. With the block on, the order is saved with credit status CMGST = B and waits for a release, in ECC usually in VKM1. On S/4HANA, SAP Credit Management may release through documented credit decisions instead; ask your credit team. Either way the row is a success, and re-running it creates a second order with the same demand.

Unclear outcomes. If a call times out or is interrupted after it may have reached SAP, PostNow.ai writes UNKNOWN rather than ERROR, so Retry Failed leaves it alone. Look the order up in VA05 by the customer PO number before doing anything else.

Worked example: 40 orders for sales organisation 1010

PostNow.ai handles this with one published BAPI template and one run. Customer service has 40 standard orders for sales organisation 1010, channel 10, division 00, plant 1010. Order 1 is for sold-to 200371, customer PO PO-77120, requested delivery 15.12.2026, with three items: 120 EA of TG-1001, 40 EA of TG-1002 and 15 EA of TG-1004 at a manually agreed price of 412.00 USD.

  1. Lay out the sheet. Row 2 is H: order type, the sales area, 200371, PO-77120, 20261215. Rows 3 to 5 are D: items 10, 20, 30 with material, quantity, unit and plant. Only row 5 fills the condition columns (PR00, 412.00, USD).
  2. Sort first. Two materials are short this month, so the sheet is sorted by customer priority, then requested date.
  3. Validate. Formats, allow-lists and Pre-Validation are clean: every customer and material exists.
  4. Simulate. Order 17 fails: customer 200388 exists, but not in sales organisation 1010, channel 10. Pre-Validation checks that a customer exists, not its sales area, so this is the step that catches it. That order is taken out and sent to master data. Order 6 shows V1 555, because its customer has no payment terms in this sales area. The other 38 come back clean.
  5. Pilot, then run. If an approval policy covers the template, Run waits until someone other than the submitter approves this exact data. Run orders 1 to 5 and check them in VA03, including the Conditions tab of item 30. Then set the start row back to 2 and run the rest; the guard offers to skip the five already posted.
  6. Read the results. 39 orders get a number in the "SAP order" column. Order 6 is in V.02 for its payment terms. Order 22 for customer 200402 is saved on credit block and goes to the credit team with its number. Neither is re-run.
⚠
Pilot in a quality client first. A wrong order is corrected in VA02 or rejected with a reason for rejection, like one typed by hand.

Checklist before a VA01 mass upload

PostNow.ai enforces formats and allow-lists in the template; this list covers the decisions that stay with customer service and the SD team.

  • Every customer has sales area data for the file's sales area; every material has its sales view.
  • Order type and partner role go in the form your system accepts, proven on one test order.
  • Schedule lines carry their item's number, and quantities are in REQ_QTY.
  • The file is sorted by the allocation rule the business agreed.
  • Manual price columns are empty unless intended, and one manual price has been checked on the Conditions tab.
  • Customer PO numbers are filled, and you know whether V4 115 is a warning or an error.
  • Simulate shows no E messages, and five orders in a quality client match the file in VA03.
  • Someone owns the blocked and incomplete orders the load will produce.

Sales order upload errors and what they mean

PostNow.ai writes SAP's error text into the Run Log of the order's header row; these are the ones you are most likely to meet on a first load.

MessageWhat it usually meansFix
V4 219 Sales document was not changedThe summary line after a rejection. The real cause is in the messages before it: a missing mandatory field, a sales area the customer lacks, a missing configuration entryRead the earlier E message, or create the same order once in VA01 and compare
An error naming order type OR or partner function SPThe screen code was sent instead of the internal keySend the internal key (TA for a standard order, AG for sold-to) or test the CONVERT flag
Material numbers provided in equivalent fields differ (S/4HANA)Long material number handling: MATERIAL and MATERIAL_LONG disagreeMap the material to MATERIAL_LONG on S/4HANA and test one order with two items
PostNow.ai: "No rows in the Run Log column (A) are marked ERROR"Retry Failed found nothing to re-post from the current Start Row downSet Start Row back to 2 after a pilot; blocked and incomplete orders are not errors

For a failed row, AI Review in the run diagnostics explains SAP's messages in plain language. By default it receives the messages, the BAPI name and the field structure, never the cell values.

How to check sales orders after a mass upload

PostNow.ai gives you the first check per order: the Run Log, the order number column with its VA03 link, and the central audit, which records each order's template, SAP system, client, user, result and document number. The rest comes from SAP.

  • VA03 for a sample: sold-to and ship-to on the partner screen, net value, the Conditions tab of an item, and the confirmed quantity on the schedule line.
  • V.02 lists incomplete sales documents; VKM1 (ECC) lists credit-blocked ones; VA05 lists orders by sold-to, material or PO number.
  • Tables: VBAK header, VBAP items, VBEP schedule lines with confirmed quantity, VBPA partners, VBUV incompletion log. Credit status CMGST is in VBUK on ECC and in VBAK on S/4HANA.
  • Report Library in PostNow.ai: Sales Order 360 (SD-06) puts header, items, schedule lines with confirmed quantity and status into Excel, and Incomplete / Blocked Orders (SD-16) lists incompletion log entries by missing field, with header delivery and billing blocks; check credit status in your credit release transaction. Operators can run both under their own SAP authorisations. The columns of the first are shown on the SAP sales order report in Excel page; the rest is in the Report Library.

Reconcile on three numbers per load: orders created against orders in the file, requested against confirmed quantity, and expected against actual net value. A load where every row is green but half the quantity is unconfirmed has not finished its job.

What to plan for in a VA01 upload

PostNow.ai posts through the BAPI or the screen, so SAP's own sales rules decide every result.

  • Sort the sheet by priority when stock is short. Orders are created in sheet order, so the orders at the top get the first claim on available stock. Product allocation or backorder processing in SAP can change the confirmation later.
  • Correct created orders in VA02. Stop cancels the orders not yet sent; created orders stay in SAP and are corrected in VA02.
  • Test the template for several explicit partners. The header row sends one partner line per order, so prove a template with extra partners on a Simulate first.
  • Give configurable materials, free goods, third-party items and returns their own templates. They have their own data shapes or rules in SAP.
  • Record on stable screens. Recordings follow the screen and run when a user starts them.
  • Keep the PostNow.ai portal reachable for approved templates. The approval check runs against the portal; if the portal cannot be reached, the check lets the run through.

Making a template like this repeatable for a team (designers who build, operators who only run, a published template in the central library) is covered in Excel to SAP automation.

VA01 mass upload on S/4HANA: what changes

PostNow.ai uses the same BAPI on ECC and S/4HANA, because BAPI_SALESORDER_CREATEFROMDAT2 and VA01 are still there; a few things around them moved.

  • Status tables are gone. The header and item status fields of VBUK and VBUP moved into VBAK and VBAP. Queries written for ECC that join VBUK need changing; PostNow.ai's Sales Order 360 report switches its source when it detects S/4HANA.
  • Customers are Business Partners. A sold-to needs the customer role and sales area data, maintained through BP. Missing BP roles surface as sales area or partner errors on the order.
  • Long material numbers. If the 40-character material number is active, use the MATERIAL_LONG field that SAP added to the BAPI structures.

Customer master data for these orders is covered in customer master upload (XD01), the wider SD picture in SAP SD mass upload, and the order-to-cash steps around the order in SAP process automation.

Frequently asked questions

How do I create sales orders in SAP from Excel?
With PostNow.ai you map an Excel sheet to BAPI_SALESORDER_CREATEFROMDAT2: an H row per order for the header and sold-to, D rows for the items with quantity and date in the schedule line. Validate and Simulate check the file and show SAP's messages first. Run creates one order per H row under your own SAP login, commits only when SAP returns no error, and writes the order number back as a link to VA03.
Can I do a VA01 mass upload with a BDC recording?
Yes, for simple one-item orders with a stable screen sequence: PostNow.ai can replay a VA01 recording made in SHDB. VA01 shows some screens only for some orders, such as the availability check when stock is short, and a recording breaks when a screen appears that it did not record. For multi-item orders BAPI_SALESORDER_CREATEFROMDAT2 is the safer route because it has no screens.
Which structures does BAPI_SALESORDER_CREATEFROMDAT2 need?
At minimum ORDER_HEADER_IN with order type and sales area, ORDER_PARTNERS with the sold-to in role AG, ORDER_ITEMS_IN with item number and material, and ORDER_SCHEDULES_IN with the same item number and the quantity in REQ_QTY. Each has an X-structure (ORDER_HEADER_INX, ORDER_ITEMS_INX, ORDER_SCHEDULES_INX) that flags the fields you filled. ORDER_CONDITIONS_IN is only needed for manual prices.
Is a sales order on credit block a failed upload?
No. The order is saved, has a number and waits for a credit release, often with no credit message in the BAPI's RETURN table. Treat the row as a success, pass the order number to the credit team, and never re-run it, because that creates a second order.
Why is my uploaded sales order incomplete?
Data the incompletion procedure requires is missing, for example payment terms or a partner. If the order type allows it, the BAPI saves the order with warning V1 555. Open the log in VA02 (Edit, Incompletion log) or list all incomplete orders in V.02, and fix the master data before the next load.
Should I send order type OR or TA to BAPI_SALESORDER_CREATEFROMDAT2?
Send the internal key: TA for a standard order, AG for sold-to and WE for ship-to. OR, SP and SH are what an English logon shows on the VA01 screen, which converts them through conversion exits; an RFC call that passes the internal format does not. PostNow.ai adds leading zeros automatically; set the internal keys as fixed values, or test the BAPI's CONVERT flag on one order.
How do I avoid creating duplicate sales orders from Excel?
Fill the customer PO number and let the order type's duplicate check warn with V4 115, or raise that message to an error in OVAH so the BAPI rejects the duplicate. In PostNow.ai, Run also offers to skip rows that were already posted, and Retry Failed only re-posts rows marked ERROR.
How do I check sales orders after a mass upload?
Start with PostNow.ai's Run Log and the order number column, which opens each order in VA03. Check a sample for partners, net value and confirmed quantity, then list incomplete orders in V.02 and blocked ones in your credit release transaction. For the whole load, read VBAK, VBAP and VBEP or run Sales Order 360 from the PostNow.ai Report Library.
What is SAP sales order automation?
SAP sales order automation means creating sales orders in SAP without keying each one into VA01, whether they arrive by EDI, from a web shop or in a spreadsheet. For orders kept in Excel, PostNow.ai posts each H row and its items through BAPI_SALESORDER_CREATEFROMDAT2 with SAP's pricing, availability and credit checks, and writes the order number back to the row. Operators run the published template under their own SAP login.
Your order file. SAP's pricing.

Create your next batch of SAP sales orders from Excel

Map the order once, let SAP price and check every order in Simulate, then post and get each sales order number back on its rows.

Start free trial
  • 14-day free trial
  • Works with ECC and S/4HANA
  • Your data stays in your systems