Inventory Transaction Prerequisites — The Complete Pre-Flight Checklist

REFERENCE ⏱️ check before any goods movement OBYC OMS2 OMSY FBN1 OMX1

🎯 What this page is

A goods movement (receive, issue, transfer, scrap, reclassify…) only posts cleanly when a whole stack of things is already in place. Miss one and SAP stops you with an error. This is the complete checklist — not just the four gates we hit during Scenario 3.4, but everything, grouped into three layers: Every official T-code and error code below is verified against SAP sources (links at the bottom).

🧰 The master pre-flight checklist

Scan this before posting in a fresh plant/company code. Each row: what you need, where to check/set it, and the error you get if it's missing. Deep-dive sections follow.

You need…WhyCheck / set (T-code)Error if missing
🏛️ Layer A — System foundation (once per system / company code)
Company code, plant, storage location, purchasing org — created & assignedThe org skeleton a movement lives inSee Setup Guide / Org Structure"Plant not defined", org-level errors
Valuation level = plantS/4HANA values stock per plant; account determination keys off itOX14Wrong/again valuation & account errors
Chart of accounts assigned + G/L accounts exist (inventory, GR/IR, consumption, price-diff)Postings need real G/L accounts to hitFS00, OB62"G/L account not created in CC"
Automatic account determination maintained (BSX, WRX, GBB, PRD…)SAP must know which G/L each movement posts toOBYC → detailsM8 147
Valuation grouping code active + assigned to the valuation areaIt's part of the OBYC key — blank = no matchOMWM (activate) · OMWD (assign)M8 147 (blank val.group)
Consumption G/L is a primary cost element + has a CO assignmentP&L postings to CO need a cost objectFS00 (G/L type) · OKB9 (default)KI 235
MM posting period initialized + current period openStock postings are blocked outside the open periodOMSY (init) · MMRV (check) · MMPV (roll) → detailsM7 053
FI posting period open for the dateThe accounting document also needs an open FI periodOB52"Posting period … not open"
Number ranges: material doc + accounting doc for the yearEach document needs a number to be issuedOMBT (material doc) · FBN1 (accounting doc) → details"Number range … not maintained"
Material Ledger active for the valuation areaMandatory in S/4HANA — values every materialOMX1C+ errors
Price/quantity tolerances maintained (for GR/invoice variance)Variances beyond tolerance block or warnSee Setup Guide tolerance step · TroubleshootingM8 215 (PE)
📦 Layer B — Per-material readiness (once per material — the four gates)
Material exists with the right views (Accounting always; Purchasing/MRP as needed)A movement reads valuation + control data from these viewsMM01/MM03 → guide"View … not maintained"
Gate 2: material type quantity + value managed in this plantElse this type can't hold stock hereOMS2 → detailsM7 097
Valuation class set & consistent with the material typeIt's the last part of the OBYC keyOMSK (allowed classes)M8 147
Price control + a valid price (S = standard; V = moving avg)Value postings need a price; standard price 0 breaksAccounting 1 view (MM02)price/valuation errors
Gate 4: Material Ledger record exists for this materialS/4HANA links every valuated material to MLML_REPAIR_ML_MASTERDATA → detailsC+470
Gate 3: material extended to the exact plant + storage locationStock is counted per storage locationMMSC/MM01 → details"… does not exist"
Batch master (only if the material is batch-managed)Batch-managed stock posts against a batchMSC1N"Enter a batch"
▶️ Layer C — Per-transaction runtime (each time you post)
Gate 1: correct movement type for the action (309 vs 311…) + same base UoM for 309The code defines exactly what stock change happensMIGO → details · MIGO guidedestination locked / wrong posting
Source has unrestricted stock in that storage location (issues/transfers)You can't issue what isn't thereMMBE/MB52 to checkM7 021 (deficit)
Reference document valid & open261 needs a released order; GR needs an open PO; reservation must be validCO02 / ME23N / MB23"not permitted for goods movement"
Posting date falls in an open MM + FI periodSame as the period rows above, at posting timepick a valid dateM7 053

🏛️ Layer A — the foundation pieces that cause posting errors

Org structure and G/L accounts are covered in the Setup Guide. Here are the three that most often bite at posting time, explained from scratch.

Automatic account determination — OBYC (the #1 posting-error source)

What: Every goods movement creates an accounting document — but you never type the G/L accounts. SAP looks them up automatically in OBYC using a key: chart of accounts + transaction key + valuation grouping code + account modifier + valuation class. If any combination has no G/L, the posting dies.

The transaction keys you must maintain (for normal MM):

KeyWhat it postsEasy example
BSXInventory / stock accountIron goes into stock → debit inventory G/L 300000
WRXGR/IR clearingGR credits, invoice debits this "goods received, not invoiced" account
GBBOffsetting entry for movements (split by a modifier)VBR = consumption to cost center/order; BSA = initial stock; INV = inventory differences; VAX/VAY = goods issue for sales
PRDPrice differencesStandard-price material received at a different value → the gap posts here
alsoUMB (revaluation gain/loss), FR1–FR4 (freight), KBS (account-assigned, from the PO)maintain as your scenarios need them

How (when you hit M8 147): the error names the exact key + valuation class. OBYC → double-click that transaction key → enter your chart of accounts → fill the G/L for the valuation class shown → Save. Re-post.

Error if missing: M8 147 — "Account determination for entry [chart] [key] [val.group] [modifier] [val.class] not possible."

Posting periods must be open — OMSY · MMRV · MMPV · OB52

What: SAP only lets you post into the current open period (and, if allowed, the one previous). MM and FI track this separately — both must be open for your posting date.

  • OMSY — initialize the MM period for a company code. Done once, before the first ever posting. Without it you can't post at all.
  • MMRV — check which MM period is currently open (and tick "allow posting to previous period" if you need it).
  • MMPV — roll forward: close the current month and open the next. You must go month by month in sequence (can't jump). ⚠️ Confusing wording (LIVE-TESTED question): although the program is called "close period", the Period field = the NEW month you want to OPEN — entering 07 means "make July the open month". It closes the OLD month (June) as a side effect; the old month stays postable as "previous period". Door analogy: MM keeps one door open at a time — MMPV opens the next door, and shutting the old one is automatic.
  • OB52 — open/close the FI posting periods (per account type). A closed FI period blocks the accounting document even when MM is open.

Easy example: it's June but MM is still on April → you get M7 053. Run MMPV for April→May, then May→June, and check OB52 has June open.

Error if missing/closed: M7 053 — "Posting only possible in periods YYYY/MM and YYYY/MM in company code."

✅ LIVE-TESTED (Scenario 5 GR, July 2026): PSPK was still on period 06 when July began — MIGO refused with exactly this message. Fix took 2 minutes: MMRV showed 06 → MMPV · PSPK · Period 07 · 2026 · radio button "Check and close period" (the default — verify first, then turn the page; "Check period only" = rehearsal that changes nothing; "Close period only" = skips the safety checks, don't) → Execute → posted. On real projects MMPV runs as a scheduled job at midnight on the 1st — on IDES, you are that job at every month change.

Number ranges — OMBT (material doc) · FBN1 (accounting doc)

What: Each goods movement issues a material document, and (when value changes) an accounting document. Both pull their number from a range that must exist for the fiscal year.

  • OMBT — material-document number ranges (by transaction/year).
  • FBN1 — accounting-document number ranges, per company code; either year-specific or year 9999 (= any year). A common "works in 2025, fails in 2026" bug is a missing range for the new year.

Error if missing: "For object … number range … not maintained for the year" — the document can't be created.

📦 Layer B — the four per-material gates (what we hit live)

1 Use the right movement type

What: The movement type (top-right in MIGO, next to Action + Reference) tells SAP exactly what stock change you mean.

Why it matters
311 = move the same material between storage locations — SAP locks the destination to the source. 309 = move to a different material; only then does the destination Material field open.
Easy example
311 = carrying the same box from shelf RAWM to WIPS. 309 = re-labelling "Iron Grade-A" as "Iron Grade-B".

Rule for 309: both materials need the same base unit of measure (e.g. both TO); the material type need not match (ROH→HALB allowed).

On 311 you simply can't enter a different destination material.

2 Make the material type quantity + value managed (OMS2)

What: Each material type (ROH, HALB, FERT…) has Quantity updating and Value updating switches per valuation area (= plant). Off = that type can't hold stock there.

Why it matters
On a new plant like PK01, ROH was on (iron posts) but HALB was off → billets refused.
Easy example
The warehouse was licensed to store raw iron but not semi-finished billets. Tick the licence on.

How: OMS2 → material type HALB → Quantity/value updating → valuation area PK01 → tick Qty + Value → Save (Customizing request).

Error if missing: M7 097 "No stock posting possible … not managed on a quantity basis."

3 Extend the material to the plant + storage location (MM01 / MMSC)

What: A material is layered (client → plant → storage location → valuation). Stock is counted at storage-location level, so it must "exist" there.

Why it matters
No record in RAWM = no bucket to post into, even if it exists in WIPS.
Easy example
HALB-BILLET-01 had a shelf in WIPS but none in RAWM, so RAWM postings failed.

How: MMSC (quick) → material + plant + new SLoc → Save. Or MM01 → storage views → see create vs extend.

Error if missing: "Material … plant … SLoc … does not exist."

4 Connect the material to the Material Ledger (OMX1 / repair)

What: In S/4HANA the Material Ledger is mandatory — every valuated material needs an ML record. Turning value updating on (Gate 2) for a material that never had one leaves it disconnected.

Why it matters
SAP can't value the stock without the ML record, so it blocks the change.
Easy example
Head office had no price card for the billet in Karachi until you create it.

How: confirm ML active (OMX1, PK01) → SE38 → ML_REPAIR_ML_MASTERDATA (material + valuation area, test then real). Whole new valuation area never started → FCML4H_STARTUP.

Error if missing: C+470 "Missing connection of material … to the material ledger."

✅ The order to do them (so you don't bounce between errors)

  1. Foundation first (Layer A) — confirm OBYC, valuation grouping (OMWD/OMWM), periods (OMSY/MMPV/OB52), number ranges (OMBT/FBN1), ML active (OMX1). Mostly one-time.
  2. Gate 2 — OMS2: switch on Qty + Value updating for the material type in the plant.
  3. Gate 4 — ML repair: only needed for materials created BEFORE you enabled value updating — run FML_REPAIR_ML_MASTERDATA (the S/4HANA name, with the leading F — registry). Materials created after the switch are born healthy.
  4. Gate 3 — MMSC: extend the material to the exact storage location.
  5. Confirm the source has unrestricted stock; pick a posting date in the open period.
  6. Gate 1 — MIGO: pick the correct movement type and post.

🚀 New Company Code / Plant Fast-Track — open every gate BEFORE it bites

Bringing a new company code or plant to life (e.g. PSAE / AE01 for the inter-company scenarios)? Think of config as the building vs. your apartment: client level = the building everyone shares; company code = each company's own apartment; plant = each factory's own room.

🟢 Already SHARED (client / chart level — never redo): the chart of accounts INT (the account catalog) · the OBYC address book (per chart — the whole valuation-class chain works in every company using INT) · pricing config (tables, access sequences, condition types, schemas — only the OMFO determination row is per purchasing org) · material types & their number ranges · valuation classes + OMSK · movement types · BP config, payment terms, purchasing groups, material groups, units · PO document types (NB/UB). Rule of thumb: rules and catalogs are shared; drawers, clocks and licenses are per-company or per-plant — every posting error lives in the second group.

🟠 One extra per-company item easy to forget: business partners — a vendor/customer's Reconciliation Account is per company code, so every BP you will use in the new company needs its company-code role data extended there (BP → new CC → recon account + payment terms).

Everything else per-company/per-plant can be mass-copied from your proven company code. Do these six moves ONCE, in this order, and you will never meet the error families again:

#MoveHowError family it kills
1All G/L drawers in one runCheck SE16N → SKB1 → the new company code. 0 rows → OBY2 (Copy company code G/L accounts: source = proven CC, target = new CC) copies every account's local card at once. Some rows exist → FS15 instead (select accounts, batch-input; more flexible)."G/L account … does not exist in company code …" — the whole 893010/792000/410000 saga
2Material-type licensesOMS2 → tick Qty + Value updating for the material types you will move, for the NEW valuation area (plant). Do this BEFORE creating/extending materials there — later materials are born with their Material-Ledger page.ME062 · M7 097 · and it prevents C+470 entirely
3Plant Parameters rowSPRO → MM → Inventory Management and Physical Inventory → Plant Parameters → Copy a default plant → the new plant.M7 001 (T159L)
4Period clocksOMSY initialize MM periods for the new CC · confirm OB52 FI periods.M7 053 · "CC does not exist or not fully maintained"
5FI number rangesFBN1 → copy all intervals from the proven CC (copy-all works into an EMPTY company code) · spot-check OBA7 doc-type→range mapping.NR751 · F5150
6TolerancesOMR6 (and friends) → create the tolerance keys for the new CC, same values as the proven one.M8 215

Golden ordering rule (the C+470 scar): gates first, materials second. A material created after moves 1–2 is born complete; a material created before them needs repair tools. And when extending materials to the new plant, always type the storage location in the Org Levels popup — storage data from birth means the T159L defaults are never even consulted. For a company code that doesn't exist yet: EC01 copy-company-code clones customizing wholesale at creation time — see the Setup Guide.

🚨 Error → cause → fix (quick lookup)

ErrorWhat it really meansFix
M8 147No G/L mapped for this account-determination keyOBYC → maintain the named key + valuation class (check OMWD grouping)
M7 053Posting date outside the open MM/FI periodMMRV to check, MMPV to roll, OB52 for FI
M7 097Material type not quantity-managed in this plantOMS2 → tick Qty + Value updating (Gate 2)
C+470Valuated material has no Material Ledger recordML_REPAIR_ML_MASTERDATA (Gate 4)
"… does not exist"Material not extended to that storage locationMMSC / MM01 (Gate 3)
M7 021Deficit — not enough unrestricted stock to issue/transferCheck stock (MMBE); receive or pick a SLoc that has it
KI 235P&L (cost element) posted without a CO objectGive a cost center/order, or set a default in OKB9
"Number range … not maintained"No document number range for the fiscal yearFBN1 (accounting) / OMBT (material)
Can't change destination material (309)On movement 311, or different base UoMSwitch to 309; ensure both share the base UoM (Gate 1)

💡 A note on the example we used

We forced iron (ROH) → billet (HALB) with movement 309 to learn these gates — but that's not how iron really becomes a billet. In real life iron is consumed into a production order (movement 261) and the billet comes back as a goods receipt (movement 101). 309 is for like-for-like reclassification (e.g. iron Grade-A → iron Grade-B) — so the cleanest practice is RM-IRON-01 → RM-IRON-02 (both ROH, both TO), which is already past every gate. The HALB gate-fixing is still worth it — you need it for the production goods receipt (101).

📚 Verified against

← Came from
Scenario 3.4 — Material Reclassification (309)
Related →
Troubleshooting — every error & fix