Quick answer

How to do an SAP SD mass upload from Excel

PostNow.ai does an SAP SD mass upload from Excel one object at a time, in load order: customers, prices, sales orders, deliveries, billing. Each object has its own template on a BAPI or a recording, such as BAPI_SALESORDER_CREATEFROMDAT2 for VA01. Validate checks the file offline, Simulate shows SAP's messages first, and Run writes each document number back to its row.

  • SAP sales automation from Excel is the same route. Order entry, price changes, deliveries and billing run as published templates that operators run under their own SAP login.
  • Read the order, not only the Run Log. SAP saves incomplete and credit-blocked orders as successes, so check them after every load.

This page is the map for sales and distribution: which SD object comes first, which route PostNow.ai uses for each, and what to check when the run is over. Each object has its own how-to page, linked from the tables below. For choosing a method across all SAP modules, see SAP mass upload from Excel.

What SAP SD mass upload covers

PostNow.ai covers SAP SD mass upload for the five objects a sales team loads from spreadsheets: customer master, pricing conditions, sales orders, outbound deliveries and billing documents. Two of them are master data that every order reads; three are documents, each created with reference to the one before it.

SD objectTransactionWhat one Excel row usually isHow-to page
Customer masterXD01 (ECC), BP (S/4HANA)One customer with one company code and one sales areaXD01 customer master upload
Pricing conditionsVK11One condition record: condition type, key, price, validityVK11 pricing conditions upload
Sales ordersVA01A header row, then one row per itemVA01 mass upload
Outbound deliveriesVL01NOne sales order item and the quantity to shipVL01N mass delivery creation
Billing documentsVF01One delivery or sales order to billVF01 mass billing

Two neighbours sit just outside the five. Materials need their sales views before anyone can order them, which the MM01 material upload covers. Customer credit limits decide whether an order is blocked on save, which the FD32 credit limit upload covers.

SAP sales automation from Excel: what it covers

PostNow.ai automates the SAP sales steps that start in a spreadsheet: a distributor's order file, a new price list, a list of orders to ship today, a month-end billing selection. A designer builds the template once against your SAP system and publishes it; customer service, pricing and shipping staff then run their own files through it, under their own SAP login, and get SAP's answer on every row.

Sales taskPostNow.ai routeSAP's own route for the routine case
Enter orders that arrive as spreadsheetsVA01 template on BAPI_SALESORDER_CREATEFROMDAT2EDI: IDoc ORDERS with process code ORDE, for customers with a system connection
Load a new price listVK11 recording, one condition record per rowManage Prices – Sales app (S/4HANA)
Change open orders in bulkMass Change: read the orders into Excel, edit, post the changes with BAPI_SALESORDER_CHANGEVA02, one order at a time
Ship a chosen list of ordersVL01N template on BAPI_OUTB_DELIVERY_CREATE_SLSVL10 delivery due list, by shipping point and date
Bill a chosen list of deliveriesVF01 recording or BAPI_BILLINGDOC_CREATEMULTIPLEVF04 billing due list, or VF06 as a background job
Report on the resultReport Library: Sales Order 360, Open Sales Orders, Billing / Invoice 360VA05, VL06O, VF05

The rule we work by: when SAP's own route can express the selection ("everything due by Friday for shipping point 1010"), use it, and schedule it. A file earns its place when someone has made a decision outside SAP: these 40 orders from a distributor, these prices from the commercial team, these deliveries billed today and not the rest. Changes to existing orders go through SAP mass change from Excel, and the controls that make a template safe for a team (run-only published templates, approvals, central audit) are on Excel to SAP automation.

Quotations, returns and credit memos are sales documents too. PostNow.ai's Find with AI suggests BAPI_QUOTATION_CREATEFROMDATA2 for VA21 quotations, and the free sales and distribution templates include a returns order and a credit memo request on VA01. Keep each document type in its own file: a returns order brings goods back, and a credit memo request is typically created with a billing block that someone with authority releases.

How PostNow.ai runs an SD upload

PostNow.ai runs every SD object through the same six steps; only the template underneath changes.

1. Pick the BAPI or record the transaction

In the BAPI Explorer, search your system or ask Find with AI: its transaction list maps VA01 to BAPI_SALESORDER_CREATEFROMDAT2, VL01N to BAPI_OUTB_DELIVERY_CREATE_SLS and VF01 to BAPI_BILLINGDOC_CREATEMULTIPLE. PostNow.ai reads the interface from your system, so the mapper shows the parameters your release has. For XD01 and VK11, record the transaction once instead.

2. Map the columns

Orders use header and item rows: the H row carries order type, sales area, sold-to and customer PO number, and the D rows under it carry material, quantity and date. Customers, condition records, deliveries and billing documents are usually one row each.

3. Fix what should not vary

Give sales organisation, distribution channel and division fixed values or an allow-list with Restrict on, so Validate refuses a sales area the template was not built for. Switch on Leading Zeros for customer and document numbers, so 4471 reaches SAP as 0000004471.

4. Validate, then Simulate

Validate checks the file offline: required fields, lengths, formats, dates and allowed values. Simulate then asks SAP: a BAPI template calls the BAPI and rolls back instead of committing; a recording replays the screens without the final save. Either way you read SAP's messages per row. The billing BAPI is the exception to plan for: it commits inside SAP, so test it with its own TESTRUN flag on a quality client.

5. Run, and write the document number back

Run commits a BAPI call only when SAP returns no E or A message and rolls it back otherwise. Recordings run as CALL TRANSACTION with synchronous update, so each row's messages and document number return at once in the Run Log. The order, delivery or billing number lands in its own column, and with VA03, VL03N or VF03 as the Call Transaction it opens the document in one click.

6. Re-run only what failed

Retry Failed re-posts only rows whose Run Log starts with ERROR, scanning from the current Start Row down. A normal Run first reads the Run Log and, if rows in scope already hold a document number, offers Skip posted rows, Post again or Cancel. A row marked UNKNOWN lost SAP's answer after it may have posted: look it up in SAP before you post it again.

Every run is also written to PostNow.ai's central audit with template, SAP system, client, user, result and document number. When a row fails, AI Review in the run diagnostics explains SAP's messages; by default it receives the messages, the BAPI name and the field structure, never the cell values.

Which SD object to load first

PostNow.ai runs one template per object, so the load order is yours to set, and SAP's dependencies set it for you: each object reads the one above it when it is created.

OrderObjectMust already existWhat happens if it does not
1Customer with sales area dataAccount group or BP grouping, number range, sales area in CustomizingThe customer cannot be saved for that sales area
2Material sales viewsMaterial, sales organisation and distribution channel views, delivering plantThe order item is rejected for that material
3Credit limitsThe customerOrders save and wait on a credit block
4Pricing conditionsCustomer and material for customer- or material-specific keysNo error at load time; the orders get no price from that condition
5Sales ordersAll of the above in the order's sales areaSee the silent failures below
6DeliveriesA sales order with a schedule line due by the selection dateNo delivery is created for the item
7Billing documentsA delivery with goods issue posted (delivery-related billing) or an order (order-related billing)The reference is not billed

The row to watch is pricing. A customer or material that is missing stops the order with an error that names it. Prices that are missing, or found in a condition table the pricing procedure never reads, let the order save. So prove the price list before the orders: load the condition records first, then create one test order per price pattern and read its condition analysis in VA03. Picking and goods issue between delivery and billing are a warehouse step, covered on the VL01N page.

The BAPI or recording for each SD object

PostNow.ai posts through a BAPI where SAP offers one that fits, and through a recording of the transaction where it does not. This is the route we build each SD template on, and why.

ObjectPostNow.ai routeWhy this routeNumber written back
Sales order (VA01)BAPI_SALESORDER_CREATEFROMDAT2, one call per orderNo screens, so items with no stock or an incompletion dialog do not break the run; a VA01 recording suits one-item ordersOrder number from SALESDOCUMENT
Customer (XD01, ECC)XD01 recording, one customer per rowGeneral, company code and one sales area in one saveCustomer number from SAP's save message
Customer (BP, S/4HANA)BAPI_BUPA_CREATE_FROM_DATA for the business partnerXD01 redirects to BP on S/4HANA, and SAP does not support BP for batch input (KBA 1951318); the customer's company code and sales area data go through one of the released interfaces listed in SAP Note 2417298Business partner number
Pricing conditions (VK11)VK11 recording, one template per condition type and key combinationSAP Note 1135984 says BAPI_PRICES_CONDITIONS is not released and can cause inconsistenciesSAP's message per row
Outbound delivery (VL01N)BAPI_OUTB_DELIVERY_CREATE_SLS, one call per order or groupPartial quantities per line without addressing VL01N's item table by positionDelivery number from DELIVERY
Billing document (VF01)VF01 recording, or BAPI_BILLINGDOC_CREATEMULTIPLEThe recording is short and Simulate can replay it without the save; the BAPI commits inside SAP, so test it with its TESTRUN flag on a quality client firstBilling number from SAP's message or the BAPI's SUCCESS table

Which method suits which kind of object in general is on BAPI vs BDC in SAP, and how to record a transaction so it replays reliably is in the BDC recording guide. Free Excel templates for VA01, VK11, VL01N and VF01, each with a column-to-field guide, are on the sales and distribution templates page.

What your file supplies, and what SAP determines

PostNow.ai sends SAP only what the template maps; everything else on a sales order comes from SAP's determination, exactly as when an order is keyed in VA01. That is why a short file produces a full document, and why a wrong document can come from a correct file.

On the sales orderComes fromPut it in the file?
Order type, sales area, sold-to, material, quantity, requested dateYour fileAlways
Customer PO numberYour fileYes: with the PO number check on the order type (VOV8), SAP warns with V4 115 when the sold-to already has an order with that number
Ship-to partyIf none is sent, SAP uses the sold-to as ship-toYes, for any customer with more than one delivery address
Bill-to and payerPartner determination from the customer masterNo, unless a row needs an exception
PriceCondition records, read through the pricing procedure that the sales area, the customer and the order type selectNo; load the condition records instead
Delivering plantMaster data proposalsYes, in a multi-plant network: it decides which stock is checked
Shipping pointShipping condition (customer), loading group (material) and plantOnly if your business overrides SAP's proposal
Confirmed quantity and dateThe availability checkNever; SAP decides it

An order created from a file goes through the same determination as one keyed in VA01, so for a mass load the consequence is simple: when an order is wrong, look at the master data and condition records before you look at the file. The one test order per price pattern from the load order above catches most of it before the full file runs.

Four silent failures in sales order loads

PostNow.ai marks a row by what SAP did: committed, or rolled back with SAP's error. SAP also saves orders that still need someone's attention, and these four show as a success in the Run Log.

What happenedWhat SAP doesHow you find itWhat to do
Incomplete orderSaves the order with warning V1 555 "The sales document is not yet complete" where the order type allows itThe Run Log cell shows SAP's first non-warning message, so V1 555 is not in it: use V.02 or the Incomplete / Blocked Orders reportComplete the order in VA02; do not re-run the row
Credit blockSaves the order with credit status B, often with no credit message in RETURNVKM1 on ECC, or your credit release process on S/4HANAThe credit team releases it; a re-run creates a second order
Short stockSaves the order and confirms what it can; the rest moves to a later schedule line or stays unconfirmedConfirmed quantity on the schedule line in VA03, or Sales Order 360Sort the file by the agreed priority, because each order consumes stock before the next one is checked
Missing priceSaves the item without that condition's value; if the pricing procedure marks the condition mandatory, warning V1 801 "Pricing error: Mandatory condition … is missing" and the order is incompleteNet value in the file against VA03, and the condition analysis on the itemLoad or correct the condition record, then update pricing in VA02
⚠
A saved order is not a failed row. Incomplete, credit-blocked and partly confirmed orders all have a number. Re-running them posts the same demand twice. If you click Run again on the same sheet, choose Skip posted rows.

Worked example: a new distributor, a price list and 39 orders

PostNow.ai runs this as five templates in load order. A distributor, customer 200371, starts buying from sales organisation 1010, distribution channel 10, division 00, with a price list valid from 01.12.2026 and a first order file of 40 orders.

  1. Customer. The XD01 template extends 200371 to sales area 1010/10/00 with its shipping condition, payment terms and partner functions. Customer Master Sales 360 (SD-01) confirms the sales area data.
  2. Materials. Material Sales 360 (SD-02) shows that every material in the price list, TG-1001 among them, has its sales view for 1010/10 and plant 1010.
  3. Prices. The VK11 template for PR00 on Customer/Material (table A305) loads 120 records valid from 01.12.2026. One test order for TG-1001 shows in the condition analysis that PR00 is found in A305 at the agreed price.
  4. Validate and Simulate the orders. The order file has 40 orders and 112 items. Validate stops two rows with division 01, which the allow-list refuses; the distributor corrects them. Simulate returns an error for one order whose ship-to has no data in this sales area, so that order leaves the file.
  5. Run. 39 orders get numbers. The Incomplete / Blocked Orders report (SD-16) lists two orders on the incompletion log, which customer service completes in VA02, and one order on credit block goes to the credit team. Sales Order 360 shows four items confirmed for a later date, and the distributor is told.
  6. Ship and bill. The shipping team runs the VL01N template for the confirmed items, and after goods issue, the VF01 template bills the deliveries.

Checklist before an SAP SD mass upload

PostNow.ai enforces formats and allow-lists in the template; these decisions stay with the sales team.

  • Every customer in the file has data for the exact sales area on its rows, and every material has its sales view there.
  • Condition records are loaded and one test order per price pattern shows the expected record in the condition analysis.
  • Each file holds one document type: standard orders, returns and credit memo requests go in separate files.
  • Ship-to and delivering plant are columns wherever the default would be wrong.
  • The customer PO number is mapped, so SAP's duplicate PO check can warn.
  • The sheet is sorted by the agreed priority for materials that may be short.
  • Someone owns the incomplete, credit-blocked and partly confirmed orders after the run.
  • The warehouse and billing know what the run will add to their due lists.

Checking the result of an SD upload

PostNow.ai gives you the first check on every row: the Run Log, the document number column with its display link, and the central audit. Then read what SAP created.

  • Sales orders. VA03 for a sample from different customers: partners, the condition analysis on an item, net value and the confirmed quantity. VA05 lists the run's orders by sold-to or PO number, and V.02 lists incomplete ones.
  • Deliveries. VL03N for a sample and VL06O, the outbound delivery monitor, for the whole run.
  • Billing. VF03 for a sample, where you check that the accounting document was created, and VF05 to list the run's billing documents.
  • Report Library in PostNow.ai. The sales order report in Excel (Sales Order 360) lists the new orders with header, items, schedule lines and status, and the billing and invoice report (Billing / Invoice 360) does the same for the billing documents. Operators run both under their own SAP authorisations.

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

Frequently asked questions

How do I do an SAP SD mass upload from Excel?
PostNow.ai loads one SD object per template, in load order: customers, pricing conditions, sales orders, deliveries and billing. Sales orders go through BAPI_SALESORDER_CREATEFROMDAT2 with a header row and item rows, deliveries through BAPI_OUTB_DELIVERY_CREATE_SLS, and customers, prices and billing usually through XD01, VK11 and VF01 recordings. Validate checks the file offline, Simulate shows SAP's messages before anything is saved, and Run writes each document number back to its row with a link to display it.
What is SAP SD mass upload?
SAP SD mass upload is creating sales and distribution data in bulk from a file instead of keying it: customer master records, pricing condition records, sales orders, outbound deliveries and billing documents. Each object is created through SAP's own logic, a BAPI or the recorded transaction, so SAP applies the same determination and checks as when a user enters it.
What sales processes can be automated in SAP from Excel?
With PostNow.ai, SAP sales automation from Excel covers order entry from distributor or customer files (VA01), price list changes (VK11), customer creation (XD01 on ECC, Business Partner on S/4HANA), delivery creation for a chosen list of orders (VL01N), billing of a chosen list of deliveries (VF01), and changes to open orders through Mass Change with BAPI_SALESORDER_CHANGE. Routine selections such as everything due by a date stay with SAP's due lists, VL10 for deliveries and VF04 for billing.
In which order should SD objects be loaded?
Customers with their sales area data first, then the materials' sales views, credit limits and pricing condition records, then sales orders, deliveries and billing. Each object reads the one before it. Prove the prices with one test order per price pattern before the order file, because a missing or misplaced condition record does not stop an order from saving.
Which BAPI creates sales orders from Excel?
BAPI_SALESORDER_CREATEFROMDAT2. It takes the header in ORDER_HEADER_IN, the sold-to in ORDER_PARTNERS with role AG, items in ORDER_ITEMS_IN and the quantity and date in ORDER_SCHEDULES_IN, and returns the order number in SALESDOCUMENT. It does not commit by itself, so PostNow.ai calls BAPI_TRANSACTION_COMMIT when SAP returns no error and rolls back when it does.
Why do SAP sales order mass loads fail silently?
Because SAP saves orders that still need work. An incomplete order is saved with warning V1 555, a credit-blocked order is saved with credit status B, short stock leaves quantity unconfirmed, and a missing condition record leaves an item without that price. All four have an order number, so check V.02, the credit block list and the confirmed quantities after every run, and never re-run those rows.
Can sales orders with several items and schedule lines be created from Excel?
Yes. In a PostNow.ai template the H row carries the header and sold-to, and each D row below it is one item with its requested quantity and date, sent as a schedule line. PostNow.ai copies the item number into the schedule line built from the same row. SAP's availability check then adds confirmed schedule lines as stock allows. If an item needs several requested dates, prove that layout on a Simulate first.
How do I check that an SD mass upload worked?
Start with PostNow.ai's Run Log and document number column, then open a sample in VA03, VL03N or VF03 and read the partners, condition analysis and confirmed quantity. Use V.02 for incomplete orders and VL06O for deliveries. In PostNow.ai's Report Library, Sales Order 360 and Billing / Invoice 360 put the whole run into Excel for reconciliation.
Your sales files. SAP's own logic.

Run your next SAP SD mass upload from Excel

Load customers, prices, orders, deliveries and billing in order, simulate each file, and get every document number back on its row.

Start free trial
  • 14-day free trial
  • Works with ECC and S/4HANA
  • Runs under each user's own SAP login