How an SAP master data mass upload works
An SAP master data mass upload creates, changes or extends many master records in one run from a sheet, through the same interface SAP uses for a single record: materials, business partners, assets, cost centers, G/L accounts, profit centers. If you are asking how to upload master data in SAP from Excel, PostNow.ai's answer is one template per object and mode, posting through a BAPI, a recorded transaction or SAP's published API. That is the working end of SAP master data automation: Validate checks the sheet offline, Simulate lets SAP check every row and rolls it back, and Run writes the new number or SAP's message back to each row.
- Split the file by mode. A create fails when the record exists, a change fails when it does not. A file that mixes them returns errors that contradict each other.
- The organisational level sets the row count. A plant-level field needs one row per material per plant; a client-level field needs one row per material.
This page is the hub for loading SAP master data from Excel as day-to-day work: which transaction and interface each object uses, the rules every object shares, and the checks before you post. What master data is and how it is owned is covered in SAP master data management; a one-time cutover with its load order in SAP master data migration; the choice of upload method across all SAP objects in SAP mass upload from Excel.
How to upload master data in SAP with PostNow.ai
PostNow.ai runs every master data object the same way: a designer builds a template once against your SAP system and publishes it, and the people who maintain the data run it from Excel under their own SAP login. The steps below apply whether the sheet holds materials, cost centers or business partners.
- Pick the interface for the object. Search your own system's BAPIs by name, or let Find with AI suggest one from the transaction code:
BAPI_MATERIAL_SAVEDATAfor MM01,BAPI_FIXEDASSET_CREATE1for AS01,BAPI_COSTCENTER_CREATEMULTIPLEfor KS01. Where no BAPI takes the data, record the transaction instead (BDC). On S/4HANA, API mode posts to SAP's published OData and SOAP services, such asAPI_BUSINESS_PARTNERfor business partners. - Map the columns. Mapping AI matches your column headers to the interface's fields; it reads the headers only, never the cell values. Change BAPIs carry an update-flag twin for each structure (
PLANTDATAandPLANTDATAX, for example): PostNow.ai sets the flag for every field you map and copies the key fields, such as the plant, into the twin. - One template per object and mode. A create template and a change template for the same object are different templates. Values that never vary, such as the material type or the account group, become fixed values in the template; published templates are run-only, so operators cannot change the mapping.
- Fill the sheet with values SAP knows. SAP Lookup (F4 help) on the ribbon lets the person filling the sheet pick valid values for the active cell's field, such as plants, cost centers or G/L accounts, from the SAP system they are connected to.
- Validate, then Simulate. Validate checks every cell offline, in Excel: required fields, type, length, special characters, date format and decimals. In BAPI mode, Simulate calls the BAPI for every row and then
BAPI_TRANSACTION_ROLLBACKinstead of a commit, so SAP's own answers (plant not defined, record locked, account group unknown) come back without creating anything. - Run. Each row posts under the user's own SAP login, and a BAPI row is committed only when SAP returns no error. The new number (material, business partner, asset, cost center) or SAP's message lands in the row's Run Log cell, with the SAP user, time and system. Recorded templates use SAP GUI only on the user's own computer, with the user's own stored login, when the user starts the action (Record, Run, Debug or Call Transaction); never on a server, never unattended, never with someone else's login.
- Re-run only what failed. Retry Failed re-posts the rows whose Run Log starts with ERROR, scanning from the current Start Row. If you click Run again on the same sheet, PostNow.ai first lists the rows already posted and offers Skip posted rows, Post again or Cancel.
- For changes, start from SAP's current values. Mass Change downloads the current values into the template's columns and keeps a snapshot; after you edit, Review changes shows old against new and only the rows that differ are posted.
Master data objects, transactions and interfaces
PostNow.ai posts each master data object through the interface that fits it: a BAPI where SAP releases one that takes the data, a recorded transaction where it does not, and SAP's published APIs on S/4HANA. Each object has its own guide with the fields, errors and edge cases.
| Object | Transaction | How PostNow.ai posts it | What to get right |
|---|---|---|---|
| Material | MM01 create, MM02 change | BAPI_MATERIAL_SAVEDATA, SAP's create-and-change BAPI, one material per call | Each view lives at its own level: a plant view needs a row per plant. Material type and industry sector come with the create row. |
| Business partner (S/4HANA) | BP | API mode: API_BUSINESS_PARTNER. BAPI mode: BAPI_BUPA_CREATE_FROM_DATA, or an RFC function your SAP team builds on SAP's customer/vendor integration | Roles decide whether SAP also creates the customer (FLCU00/FLCU01) or supplier (FLVN00/FLVN01). Transaction BP has no batch input (KBA 1951318). |
| Vendor (ECC) | XK01 | Recording of XK01, because BAPI_VENDOR_CREATE takes no vendor data | General, company code and purchasing data; screen duplicates on tax number and bank details. |
| Customer (ECC) | XD01 | Recording of XD01, because BAPI_CUSTOMER_CREATEFROMDATA1 only copies a reference customer (SAP marks it for online store use) | General, company code and sales area data; screen duplicates on tax number. |
| Fixed asset | AS01 | BAPI_FIXEDASSET_CREATE1, or a recording of AS01 | The asset class supplies the account determination and default depreciation terms; cost center and capitalisation date per asset. Legacy assets with values go through AS91 or BAPI_FIXEDASSET_OVRTAKE_CREATE. |
| Cost center | KS01 | BAPI_COSTCENTER_CREATEMULTIPLE | The standard hierarchy node must exist, and so must the profit center the cost center carries; validity dates that fit the profit center's. |
| Profit center | KE51 | BAPI_PROFITCENTER_CREATE | Controlling area, standard hierarchy node, segment, validity dates and the company code assignments. |
| G/L account | FS00 | Recording of FS00, since the standard G/L account BAPIs (BAPI_GL_ACC_*) only read; or, where your SAP team uses GL_ACCT_MASTER_SAVE_RFC (named in SAP KBA 3589646), check in SE37 that it is remote-enabled, then find it by name in BAPI search | A chart of accounts segment plus a company code segment per company code; without the second, the account cannot be posted in that company code. |
| Bill of material | CS01 | BAPI_MATERIAL_BOM_GROUP_CREATE, or CSAP_MAT_BOM_CREATE where SE37 shows it as remote-enabled in your system (otherwise through a remote-enabled wrapper) | The header material and every component material must exist in the plant first; load multi-level BOMs level by level from the bottom so each level can be exploded and checked. |
| Pricing condition | VK11 | Recording of VK11 | SAP Note 1135984 advises against BAPI_PRICES_CONDITIONS; key combination and validity period per row. |
| HR master data | PA30 | HR_INFOTYPE_OPERATION through a remote-enabled wrapper your SAP team provides (the module itself is not remote-enabled), or a recording of PA30 | Infotype time constraints decide whether a new record delimits the old one; the file holds personal data. |
Two things follow from the table. ECC vendors, ECC customers, G/L accounts and pricing conditions usually run as recordings, which need PostNow.ai's ZPOSTNOW_* objects installed once in SAP; BAPI templates need only RFC access and the user's normal authorisations. On S/4HANA, customers and vendors move to transaction BP (see what S/4HANA changes).
Why a master data upload needs more care than a posting
PostNow.ai writes master data through the same interfaces as documents, but the consequences of a wrong row are different. A journal or a goods movement records something that happened; a mistake in one is bounded, and FB08 or a reversal movement type undoes it.

- Errors compound. A material master is read by every purchase order, goods movement, planning run and report that touches it. A wrong purchasing group keeps producing wrong orders until someone corrects the record.
- There is no reversal document. The only way back from a wrong change is to write the previous value again. SAP's change documents record the old value, but nothing replays them.
- Detection is late. A wrong journal shows up in a reconciliation. A wrong master record shows up weeks later as a buyer asking why an order went to the wrong plant, with no obvious link to the upload.
That is why master data uploads deserve a stricter test than transactional ones: run Simulate on the whole file, post a pilot with Run Scope on a few rows, and open the result in the display transaction (MM03, BP, AS03, KS03) before the full run.
Create, change and extend: three different uploads
PostNow.ai treats create, change and extend as separate templates, because SAP rejects each one for the opposite reason. Knowing which one you are doing decides the shape of the file, the checks and what a failure means.

| Mode | What it does | SAP rejects it when | The risk to manage |
|---|---|---|---|
| Create | A new record: a material, a business partner, a cost center | The record already exists (with external numbering) | Duplicates. A second vendor for the same company is a valid record that quietly splits spend and payments. |
| Change | A new value in a field of an existing record | The record or its segment does not exist | Overwriting a value nobody kept. Download the current values first (Mass Change starts with that download). |
| Extend | A new organisational segment on an existing record: a material to a new plant, a vendor to a new company code, a customer to a new sales area | The parent record is missing | Partial coverage: the extension lands in some plants and not others, and nothing errors. |
Extensions are routinely filed as creates, because "we need this material in the new plant" sounds like creating something. With BAPI_MATERIAL_SAVEDATA the difference is one key: the same call creates, changes or extends, depending on whether the material and the plant segment already exist. That is also why key columns are never edited on a change sheet: a plant typed over with a new plant extends the material instead of changing it.
Organisational levels decide your row count
A PostNow.ai master data template has one row per record per organisational unit the field lives at, so the first design question is the level of each field. Getting it wrong produces no error, only a change that landed in one plant and not the others.

| Level | Rows in the file | Typical fields |
|---|---|---|
| Client | One per record | Material description, base unit, material group; business partner name and address |
| Company code | One per record per company code | Reconciliation account, payment terms, dunning procedure; the G/L account's company code segment |
| Plant or sales area | One per record per plant or sales area | MRP type, purchasing group, profit center on the material; shipping conditions and pricing procedure on the customer |
| Storage location or valuation area | One per record per location or valuation area | Storage bin, valuation class, price control |
Four thousand materials changing their material group is four thousand rows. The same four thousand materials changing their MRP type in six plants is twenty-four thousand. Before you build the file, ask at which level each field lives; if the answer is not obvious, check the table behind the field (MARA client, MARC plant, MBEW valuation area, LFB1 and KNB1 company code, KNVV sales area).
A change never creates a segment. A material with no MRP view in plant 1720 cannot have its MRP type changed there, and the error reads as if the material were missing. Where part of the population lacks the segment, that part is an extend run, and it goes first.
Checks before you post master data
PostNow.ai splits the checks between Excel and SAP: Validate checks the sheet offline, and everything that depends on what exists in SAP is checked by SAP itself, in Simulate and again at Run. Six classes of failure apply to every object, whatever its field names.

| Check | Where it is caught | What to do |
|---|---|---|
| Formats: required, type, length, date, decimals, characters | PostNow.ai Validate, offline in Excel | Fix the cells Validate flags before anything reaches SAP. |
| Record exists, or does not | SAP, in Simulate and Run | Split the file by mode (above). |
| Segment present | SAP, in Simulate and Run | Run the extend file first. |
| Referenced values valid: account group, material type, cost center category, payment terms | SAP, in Simulate and Run; SAP Lookup while filling the sheet | Pick values from the target system, not the one the file was built in. |
| No duplicate identity | Before the run, by screening (next section) | Screen on tax number, bank details and external reference. |
| Record not locked | SAP, at Run | Wait and re-post with Retry Failed; nothing in the data is wrong. |
The check most often missed is the referenced value. A file built against a sandbox carries account groups, material types or payment terms that were never transported to the client you load into. The error reads like bad data and hits whole blocks of rows at once; the cause is usually one missing transport.
Duplicate vendors and customers: screen on identity, not name
PostNow.ai's Report Library has two ready-made reports for this screen: Duplicate Master Data (Vendors) groups vendors by name, country and VAT number with a count, and Duplicate Customers does the same with name, tax number and country. Sort by the count, and every group above one is a candidate to check before you create more.
Materials and BOMs are identified by a number, so duplicates are rare. Vendors and customers are identified by who they are, and the same company appears under several spellings while two different subsidiaries can share a name. The fields that identify an organisation:
- Tax or VAT registration number. The strongest single signal where it is captured.
- Bank account details. They catch organisations that were renamed or acquired.
- Company registration number. As reliable as the tax number where present.
- The source system's reference. Where the list comes from a CRM or procurement platform, store that key on the SAP record so the link survives.
Screen the file against itself as well as against SAP. A consolidated list often contains the same organisation twice, and a check against SAP cannot see that because neither copy exists yet. A COUNTIF on the tax number column finds it in seconds. For cleansing a whole population, see SAP data quality and master data cleansing.
Leading zeros, keys and formats that break master data uploads
PostNow.ai reads every key from the sheet as it stands, so a key that Excel has changed reaches SAP changed. Most "record does not exist" errors in master data runs start here.
- Leading zeros. SAP stores numeric keys padded: material 100234 is
000000000000100234in an 18-character field, and vendor, customer and cost center numbers are padded too. A column formatted as a number drops the zeros. Keep key columns as text, and switch on Leading Zeros for the field in the template (with a target length where the field needs one), so PostNow.ai pads the value before it is sent. - Material number length. In S/4HANA the material number can be up to 40 characters once the extended material number is switched on (SAP Note 2267140). A template built on ECC with an 18-character material column needs that column widened before longer numbers are used.
- Trailing spaces. "CC-1000 " is not "CC-1000". Spaces survive copy and paste and are invisible on screen; trim key columns as routine.
- Dates and decimals. A file prepared with one regional setting and opened with another can turn 01.02 into 2 January or 1 February. Validate checks the date format and decimal places per field before the run.
SAP master data automation from Excel: what it covers
With PostNow.ai, SAP master data automation means the upload no longer depends on one person: a designer publishes a template per object and mode to the central library, operators run it under their own SAP login, and every row comes back with SAP's answer. It sits between two things teams already have. Governance sets the rules (who may create a vendor, which fields are mandatory, who approves), and SAP's own product for governed, workflow-based creation is SAP Master Data Governance (MDG). Day-to-day management owns the records and their quality, as described in SAP master data management. The Excel upload is where those rules meet volume.
| What is automated | How PostNow.ai does it |
|---|---|
| The load | One published template per object and mode, posting through a BAPI, a recorded transaction or an API service, with the result written to each row |
| The rules in the file | Fixed values, allowed-value lists, required fields and leading-zero padding set by the designer; Validate checks them offline before anything is sent |
| Approval | When an approval policy covers the template, Run waits until someone other than the submitter approves that exact data in the PostNow.ai portal |
| Audit | The Run Log cell of each row holds SAP's message with user, time and system; the portal's Posting Audit keeps an append-only record of every posting |
| Changes to existing records | Mass Change: download current values, edit in Excel, review old against new, post the changed rows |
| Quality checks that write nothing | Report Library reports such as Master Data Completeness Audit (materials with no plant, valuation or sales view) and the two duplicate reports run in Excel without posting |
SAP keeps its own trail as well: a record written through a BAPI or a recorded transaction produces the same change documents as manual maintenance, so the standard change displays (MM04, or the change history in BP) show who changed what.
If a team is wary of writing to production, run the read-only reports first: how many vendors share a VAT number, how many materials lack a plant view. That turns "our master data is messy" into a number someone can act on.
What S/4HANA changes for master data uploads
PostNow.ai uses the same BAPI templates on ECC and S/4HANA wherever the BAPI exists in both, as BAPI_MATERIAL_SAVEDATA, BAPI_COSTCENTER_CREATEMULTIPLE and BAPI_PROFITCENTER_CREATE do. The large change is on the partner side.
- Customers and vendors become business partners. On S/4HANA, XD01 and XK01 send you to transaction BP (message
MD_BP028), and the partner's customer or supplier roles create the customer and supplier data behind it, kept in step by customer/vendor integration (CVI). A company you both buy from and sell to is one partner with roles on both sides. - BP is loaded through an interface. SAP KBA 1951318 says batch input is not supported in transaction BP, so the routes are API mode with
API_BUSINESS_PARTNERor BAPI mode withBAPI_BUPA_CREATE_FROM_DATAor a CVI-based RFC function; the business partner mass upload guide compares them. ECC recordings of XD01 and XK01 are replaced by BP templates in API or BAPI mode. - Re-test recordings after a conversion. A recording replays screens, so check recorded templates in Debug on the converted system before operators run them. BAPI templates need a check that the mapped fields are still the ones you want.
Which object first: dependencies between master data uploads
PostNow.ai runs one template at a time, so the order of the runs is yours to set, and it follows what each object refers to. For day-to-day work the chain is short:
- Configuration is transported, not uploaded. Account groups, material types, cost center categories and number ranges arrive by transport, with their own lead time.
- Profit centers before cost centers, because a cost center carries its profit center; hierarchy nodes before the records that sit in them.
- G/L accounts in the company code before assets and postings that use them, and cost centers before the assets that carry them.
- Components before the BOMs that use them, and materials before the pricing conditions and purchasing data that name them.
- Create, then extend, then change. The record exists, then it reaches the right plants and company codes, then its fields are tuned.
A cutover is a different job, with mock loads, reconciliation and a fixed load sequence across every object; that is covered in SAP data migration and, for the master data part, SAP master data migration.
Worked example: extending 240 materials to a new plant
PostNow.ai handles this with one extend template on BAPI_MATERIAL_SAVEDATA and one run. Plant 1720 opens next month, and 240 purchased materials that already exist in plant 1710 need purchasing, MRP and accounting data in 1720. A check of MARC in SE16N shows none of them in 1720 yet, so the whole file is an extend run, with one row per material.
| Column | BAPI field | Value |
|---|---|---|
| Material | HEADDATA-MATERIAL | From the sheet, e.g. TG-1001, TG-1002 |
| Views | PURCHASE_VIEW, MRP_VIEW, ACCOUNT_VIEW | Fixed value X in the template |
| Plant | PLANTDATA-PLANT | Fixed value 1720; PostNow.ai copies it into PLANTDATAX |
| Purchasing group, MRP type, MRP controller | PUR_GROUP, MRP_TYPE, MRP_CTRLER | From the sheet, e.g. 001, PD, 001 |
| Lot size, procurement type | LOTSIZEKEY, PROC_TYPE | EX, F |
| Valuation | VALUATIONDATA-VAL_AREA, VAL_CLASS, PRICE_CTRL, MOVING_PR | 1720, 3100, V, the price from plant 1710 |
- Validate. Three cells are flagged: a purchasing group typed with four characters (the field holds three) and two blank MRP types. All three are fixed in the sheet.
- Simulate. 236 rows pass. Four return SAP's message that valuation class 3100 is not allowed for their material type: they are semi-finished goods, and the requester confirms the right class.
- Pilot. Run Scope posts rows 2 to 4. MM03 for plant 1720 shows the purchasing, MRP and accounting views as intended.
- Run. The other 237 rows post. Each Run Log cell holds SAP's confirmation with the SAP user, time and system.
- Check. SE16N on
MARCfor plant 1720 returns 240 entries, and a test purchase requisition for one material in 1720 picks up the new purchasing group.
The extend file stays with the plant project as the record of what was requested and what SAP answered. A later change to the MRP controller is a change run on a separate template, starting from a Mass Change download.
Approvals and who owns a master data file
PostNow.ai ties the approval to the data: the approval is matched to a fingerprint of the file, so a file changed after approval needs a new one, and the submitter cannot approve their own run. That fits how master data is usually controlled: the file, not four thousand single records, is what gets reviewed.
- The business owns the meaning. What a material group signifies, which supplier belongs in which account group. Give the requester the template, so the request arrives in the shape SAP needs.
- Data governance owns the standard: naming, mandatory fields, the duplicate rule and approval thresholds. Involve it in the first run, not the third.
- The operator owns the mechanics: mode, organisational level, mapping and the test. With PostNow.ai, designers build templates and operators only run them, which keeps the two duties apart.
- Keep the before-values for every change. They are the rollback and the evidence at once.
Checklist before an SAP master data mass upload
PostNow.ai checks formats and keeps operators on the published template; this list covers the decisions that stay with the master data team.
- The file holds one mode only: create, change or extend.
- The row count matches the organisational level of every field in the file.
- Every segment a change touches already exists; missing segments are in an extend run that goes first.
- Key columns are text, with leading zeros where SAP expects them, and trimmed.
- Referenced values (account group, material type, plant, payment terms) exist in the target client, not only where the file was built.
- Vendors and customers were screened on tax number and bank details, against SAP and against the file itself.
- For a change run, the current values were downloaded and kept.
- The objects this file refers to were loaded first.
- Simulate ran clean on the whole file, and a pilot of a few rows was checked in the display transaction.
- Number range intervals have room for the records this run creates.
What to plan for in a master data mass upload
PostNow.ai writes master data through SAP's own interfaces, so SAP's checks, number ranges and locks decide every result.
- Schedule around locks. A record open in a user's session or a background job returns a lock error. Run large changes outside working hours and re-post the locked rows with Retry Failed.
- Batch by organisational unit. One plant, company code or sales area per run gives failures a common cause and a batch you can describe in one sentence.
- Name an owner per template. Configuration drifts; a template proven against last year's plants needs someone who re-tests it when a new plant or company code arrives.
- Prove creates with a transaction. A record count shows that records exist; a test purchase order, posting or depreciation run shows they work.
Making templates repeatable for a team (designers who build, operators who run, a central library and approvals) is covered in Excel to SAP automation; BAPI against recording in detail in BAPI vs BDC in SAP.
