How to choose an SAP mass upload method
Choose the SAP mass upload method object by object. PostNow.ai posts an Excel template through a BAPI, such as BAPI_ACC_DOCUMENT_POST for journals, or through a transaction recorded once in SHDB. Take the BAPI where one covers your fields and record where none does; MIRO and ME21N belong on their BAPIs. Then Validate, Simulate and post a 10-row pilot.
This page is for deciding how a load should run before anyone builds it. If you are doing your first upload and want the clicks, the step-by-step version is how to upload data into SAP from Excel.
SAP mass upload methods: BAPI, recording, LSMW or Migration Cockpit
PostNow.ai gives every Excel template one of two posting modes, BAPI or recorded transaction, and both run through SAP's own business logic under the user's own SAP login. The other tools in the table are SAP's.
| Method | Use it when | What to plan for |
|---|---|---|
| PostNow.ai, BAPI mode | A BAPI covers the object and your fields: journals, POs, sales orders, goods movements, materials, cost centres. Search any function module by name in your system, or describe the job to Find with AI. | Map custom fields through EXTENSIONIN; use recording mode for fields that exist only on a screen |
| PostNow.ai, recording mode | No BAPI fits, or you want the exact screens your team keys today: FS00, ECC vendor and customer masters, VK11 with SAP's own validity handling | Use a BAPI for transactions SAP does not support in batch input (MIRO, ME21N); record on the target client where screens differ by field status |
| MM17 / MASS (SAP mass maintenance) | Changing a field across existing records inside SAP | Changes existing records only. SAP mass change covers it |
| LSMW | An ECC load that already works | SAP Note 2287723: loading S/4HANA with LSMW is not recommended and at the customer's own risk SAP Note |
| S/4HANA Migration Cockpit | Initial load of SAP-delivered migration objects into a new S/4HANA system, from files, staging tables or direct transfer SAP Help | S/4HANA only, delivered objects only, built for go-live rather than month-end |
| Custom ABAP upload program | Heavy transformation logic that IT owns | Every change waits for a developer and a transport |
Every posting from PostNow.ai goes through a BAPI or CALL TRANSACTION, so SAP's checks, change documents and follow-on updates all happen as they would for a manual entry. What has to exist in SAP differs by mode: BAPI mode needs only your user's RFC authorisation, while recording mode runs through PostNow.ai's ZPOSTNOW_* recording objects, which Basis installs once per system. For the BAPI-or-recording choice in depth, see BAPI vs BDC. For a recording that replays reliably, see the BDC recording guide.
One template per object, inside Excel
A designer maps the template once to a BAPI or a recording. Anyone allowed to run it gets the same checks on every row, and SAP's answer lands beside each row.
Columns tied to BAPI fields or recorded screen fields, with leading zeros, date format and allow-lists per field.
Validate the file, optionally confirm master data exists in SAP, then Simulate.
Standard BAPI or CALL TRANSACTION under your own SAP login and authorisations.
Document number or SAP message per row in the Run Log, plus a central posting audit.
Which upload method for which SAP transaction
PostNow.ai can post most of these objects either way. The table shows the route we would start with, and the trap that decides it.
| Transaction | PostNow.ai route | Why, and the trap to know |
|---|---|---|
| FB50 / FB01 journals | BAPI BAPI_ACC_DOCUMENT_POST, or a recorded FB50 | A recorded FB50 can Simulate with =BS, so SAP runs its full document check, balance included. An FI document holds at most 999 line items (message F5 727) SAP KBA |
| FB60 vendor invoices without PO | BAPI BAPI_ACC_DOCUMENT_POST | No PO to check against, so the allow-lists and existence checks in the template carry the control |
| MIRO invoices against PO | BAPI BAPI_INCOMINGINVOICE_CREATE only | SAP does not support batch input for MIRO (SAP Note 381593), so a recording is not an option SAP Note |
| ME21N purchase orders | BAPI BAPI_PO_CREATE1, header/detail | ME21N is an Enjoy transaction and batch input is not supported for it (SAP Note 217437). PostNow.ai fills POITEMX and the other X structures for you SAP Note |
| MIGO goods movements | BAPI BAPI_GOODSMVT_CREATE | One call creates one material document, so group rows into documents before the run (next section) |
| VA01 sales orders | BAPI BAPI_SALESORDER_CREATEFROMDAT2, header/detail | Orders come back "not yet complete" when the INX flag structures are empty. PostNow.ai fills X structures from the BAPI's dictionary shape |
| MM01 / MM02 materials | BAPI BAPI_MATERIAL_SAVEDATA | One BAPI creates, changes and extends, view by view |
| XK01 / XD01 | ECC: recording. S/4HANA: BP, via BAPI_BUPA_CREATE_FROM_DATA | In S/4HANA, XK01 and XD01 lead to transaction BP, so an ECC recording will not carry over SAP Help |
| KS01 cost centres | BAPI BAPI_COSTCENTER_CREATEMULTIPLE | Validity dates per row; the controlling area must be right on every line |
| FS00 G/L accounts | Recording | One transaction maintains the chart-of-accounts and company-code segments |
| VK11 pricing conditions | Recording | SAP Note 1135984 advises against creating conditions with BAPI_PRICES_CONDITIONS. The VK11 upload guide covers keys, scales and overlapping validity |
| CS01 BOMs | Function module CSAP_MAT_BOM_CREATE | Not a BAPI, but PostNow.ai can call it the same way. Load components before the assemblies that use them |
For anything not listed, search the function module by name in PostNow.ai's BAPI mode, or type the job into Find with AI ("post a goods receipt for a purchase order"). If search is not authorised in your system, PostNow.ai offers a built-in list of common BAPIs. Copy from SAP then prefills a BAPI template from a document you created by hand, which is the fastest way to see which fields SAP actually fills. The 75 free SAP Excel templates start you from a mapped layout, for example FB50 journal entry, ME21N purchase order and MIGO goods receipt.
Header and line items from Excel: one row or many per document
PostNow.ai turns spreadsheet rows into SAP documents in one of two ways, and the choice decides whether a 600-row file posts 600 documents or 40. Make it before you map anything.
- Header/detail. A marker column labels each row H (header) or D (detail), and one header plus its details posts as one document. AutoMap H/D creates the columns. Use it when the source already separates headers from lines, such as PO headers and items.
- Flat rows. No marker column. Every row is a line item, and a split column decides where a new document starts: on a value, on change, on change ignoring blanks, or on blank. Use it for journal extracts where the reference repeats on every line.
- Sort before you split. Split "on change" starts a new document whenever the value changes. An unsorted file breaks one journal into several, and those usually fail on balance.
- Respect SAP's per-document limits. An FI document stops at 999 items.
BAPI_GOODSMVT_CREATEmakes one material document per call. Plan the split column around both.
A template is built for one grouping, so agree it with whoever prepares the file before the first month's extract arrives.
How many records can you upload to SAP at once?
PostNow.ai posts one document at a time and commits each one on its own, so volume is a question of run time rather than a row cap. A BAPI document is committed only when SAP returns no E or A message, and otherwise rolled back. A failed document never takes the good ones with it.
- Use Run Scope to pilot. Set a start row and an end row: Auto, or a preset from 10 up to 5,000. Post 10 or 25 rows, open two of the documents through their written-back numbers, then run the rest from the next row.
- Expect lock errors when work overlaps. If someone edits the same materials, or two runs touch the same records, SAP reports locks such as M3 897, "The plant data of the material & is locked by the user &" SAP KBA. These are timing problems, not data problems: check SM12, wait, then retry.
- Leave the sheet alone during the run. PostNow.ai protects the run sheet while it posts, so the rows stay exactly as they were when the run started; you can still scroll.
- Plan a person for the whole run. Runs start from the user's own computer under their own SAP login, so a large load needs a person and an open Excel session for its whole length.
- Mass Change sizes its own batches. Mass Change pulls 100 rows by default, asks for confirmation above 500, and works on flat templates.
Pre-run checklist for an SAP mass upload
PostNow.ai checks a file in layers before anything is kept in SAP. This is the order we work through before a production run; what each layer can and cannot catch is laid out in Excel to SAP automation.
- Field rules set. Leading zeros with a target length on every key field (vendor
100045becomes0000100045), and an explicit format on every date field rather than Auto. - Allow-lists where values are fixed. SAP Lookup gives F4 help from the check table. A custom list with Restrict switched on fails any value outside it at Validate, for example only company code
1010in this run. - Validate is clean, with Pre-Validation on. Tick Pre-Validation on the vendor, cost centre and plant columns so SAP confirms they exist. On a 5,000-row file, export the errors to CSV and send them back to whoever owns the data instead of fixing them yourself.
- Simulate is green. A BAPI Simulate calls the BAPI and then
BAPI_TRANSACTION_ROLLBACKinstead of a commit; a BAPI that commits inside SAP, such as the billing BAPI, is tested with its own test flag on a quality client. A recording runs SAP's full document check only if it has a Simulate OK-code, such as=BSon FB50; otherwise only the screens are checked, and balance and duplicate checks wait for the real run. - Check recording is clean. For a recorded template, the designer's Check recording flags screens a condition leaves without an OK-code and offers Add /00 for me. The same check gates Publish.
- Tested in quality first. Field status and required fields differ by client and account group. A file that passes in QAS can still fail in production for that reason alone.
- Posting period open. Check OB52 for the period your posting dates fall in before an FI load.
SAP mass upload errors: what the message means and the fix
PostNow.ai writes SAP's own message into the Run Log beside the row that caused it. Sort by that column first: 140 errors often come down to two or three causes, and one fix clears a whole group. If a message is unclear, AI Review explains it from SAP's messages and the field structure, by default without your cell values. These are the messages we see most in bulk loads.
| Message | What it means | Fix |
|---|---|---|
| F5 201 Posting period & & is not open Message text | The posting date falls in a period that is closed for that account type | Correct the date column, or have finance open the period (OB52), then Retry Failed |
| F5 727 Maximum number of items in FI reached | A document crossed 999 line items, often because the split column was unsorted or blank | Sort the file, or add a split value so each document stays under 999 lines |
| 00 349 Field & does not exist in the screen Message text | The recording fills a field the screen does not show in this system or for this data, often because of field status SAP KBA | PostNow.ai flags this drop instead of letting the value vanish. Re-record on the target client, or make the field conditional |
| M3 897 Plant data of the material is locked | Another user or run holds the lock | Check SM12, wait, then Retry Failed |
| A recording fails on a screen you did not expect | The data took the transaction down a different screen path from the recording | Run Debug in errors-only mode (E) to watch the failing screen in SAP GUI, then fix the recording or the data |
How to re-run a failed SAP upload without posting twice
PostNow.ai re-posts failures through Retry Failed. It sends only the rows whose Run Log starts with ERROR, rebuilds each failed document with all its lines, and ignores a second click while a batch is running. One detail catches people: Retry Failed scans from the current Start Row down. If you piloted rows 2 to 25 and then ran from row 26, set Start Row back to 2 before you retry, or failures in the pilot range are skipped.
- Stop keeps what is already posted. Stop cancels the rows still to come. Documents already posted stay in SAP, and the Run Log shows the last one. Resume from the next row, and reverse anything wrong with SAP's own reversal transaction.
- A dropped connection needs a look before a retry. If the link to SAP breaks while a row is in flight, check in SAP whether that document was saved before you retry the row.
- Keep the document number in the file. PostNow.ai writes the document number back per row:
$DOC_NOor the message variables for a BAPI,MSG_V1toMSG_V4for a recording. Saved with the workbook, it shows what posted, and clicking the number opens the display transaction (FB03, ME23N, MM03, VA03, XK03, XD03). - A recording's message comes after SAP's update. Recorded rows run with synchronous update, so each call waits for SAP's update task to finish before its message reaches the Run Log. The BDC recording guide lists the run settings.
Worked example: 640 accrual lines into 80 FB50 documents
PostNow.ai handles this month-end job with one BAPI template on BAPI_ACC_DOCUMENT_POST, flat rows, and a split on the reference column. Company code 1010, period 09, 640 lines from the accruals workbook, 8 lines per accrual document.
Group the rows
The sheet is sorted by the column Accrual ref (ACR-0901 to ACR-0980), and the template splits on change of that column, so 640 rows become 80 documents. Cost centres such as 4120 get leading zeros to 10 characters, and the posting date column uses DD.MM.YYYY.
Validate and check existence
Validate flags 9 rows. Six cost centres do not exist in controlling area A000, which the existence check catches, and three dates read as text after a copy-paste from email. Both get fixed in the sheet.
Simulate
Simulate calls the BAPI for every document and rolls each one back. One document, ACR-0937, comes back from SAP as out of balance by 0.01 because of a rounded amount in the source. Fix the cell and simulate again.
Pilot, then run
Run Scope rows 2 to 25 posts the first three documents. Open one through its document-number link in FB03, then run from row 26 to the end.
Retry only what failed
Four documents fail with F5 201 because their posting date is 01.10, and period 10 is not open yet. Correct the dates to 30.09, set Start Row back to 2 so the pilot range is included, then Retry Failed. Only those four documents are re-sent; the 76 posted documents are not touched.
The same template runs next month unchanged. Handing it to other people to run (roles, approvals, the template library) is covered in Excel to SAP automation.
Mass upload in S/4HANA vs ECC: what changes for your templates
PostNow.ai posts to both ECC and S/4HANA through the same two modes. What changes is which templates survive the move.
- Vendor and customer recordings do not carry over. In S/4HANA the business partner is the entry point, and XK01 and XD01 lead to BP. Rebuild these templates on BP, or on
BAPI_BUPA_CREATE_FROM_DATA, adding the supplier or customer role and company-code data as further steps. - BAPI templates usually do. A template on
BAPI_ACC_DOCUMENT_POST,BAPI_PO_CREATE1orBAPI_MATERIAL_SAVEDATAdoes not depend on a screen layout. Re-run Simulate on the new system before trusting it. - Don't build anything new on LSMW (SAP Note 2287723, in the methods table). LSMW alternatives compares replacements, and SAP data migration from Excel covers go-live loads alongside the Migration Cockpit.
What to plan for in an SAP mass upload
PostNow.ai posts through SAP's own interfaces, so these jobs stay with SAP's own transactions and checks.
- Reverse in SAP. Correct a posted document with SAP's own reversal transaction.
- Rely on SAP's duplicate checks for documents. They apply on a real run or a full Simulate. For master data, the Report Library's duplicate vendor and customer reports find duplicates before you load.
- Prove the balance with a full Simulate. A full Simulate or the run proves that debits and credits balance.
- Build chains and schedules on BAPI templates. Chains (several templates per row in sequence) and scheduled runs use BAPI mode; recorded transactions run when the user starts them.
- Map long texts through the BAPI. A BAPI's own text tables can be mapped like any other field.
- Pair templates with the Migration Cockpit for an initial S/4HANA load. SAP's tool loads its delivered migration objects; PostNow.ai templates cover the other objects and the data loads after go-live.
Mass upload guides by module and transaction
Each PostNow.ai guide below takes one area further, with the fields, structures and traps for its objects. The full list by transaction follows after the article.

SAP FICO mass posting
Journal entries, vendor invoices, G/L documents and cost centres, with period and balance checks.
SAP master data mass upload
Materials, vendors, customers, BOMs and HR master, with view completeness and S/4HANA business partners.
SAP MM mass upload
Purchase orders, requisitions, goods movements and logistics invoices, the procure-to-pay chain.
SAP SD mass upload
Sales orders, deliveries, billing and pricing condition records.
Methods and alternatives
How the techniques compare, and what replaces LSMW or GUI scripting.
Excel to SAP automation
Step-by-step first uploads, repeatable team templates, migration loads and mass changes.
