SAP Business One: Transfer Master Data and Inventory to the MARINI Data Cloud

Sound familiar? Business Partners, items, price lists and stock levels live in SAP Business One, but three other systems need exactly the same data. The shop wants current inventory, the CRM wants customer master data, marketing automation wants to know which products exist. So you build a separate connection to B1 for each system. And when SAP renames a field or adjusts an endpoint, you get to fix it everywhere simultaneously.

MARINI, the integration platform for data integration, Data Cloud and Customer Intelligence, solves exactly this problem: You connect SAP Business One to the MARINI Data Cloud once. The master data and inventory land in the MARINI DataEngine as a structured, harmonized data model. From there, you distribute them to any number of target systems without each individual system having to poll B1 directly. One source, one schema, many targets.

After this cookbook article, you’ll have a running sync for your four most important B1 objects: Business Partners, items, price lists and stock levels. No manual exports, no inconsistencies between target systems, no N-to-1 connections that break with every schema change. Your Data Cloud becomes the single source of truth for your SAP B1 master data.

The Big Picture: Four Data Streams from SAP B1 to the Data Cloud

Before we dive into the individual steps, it’s worth looking at the big picture. This cookbook article covers four SAP B1 objects that are read via the Service Layer and transferred to the MARINI DataEngine:

SAP B1 Endpoint What’s Inside? DataEngine Data Object
BusinessPartners Customers and suppliers with addresses, contact data, classification Business Partner
Items Item master with item number, description, units Item
PriceLists / ItemPrices Price lists and item prices (as JSON field on the product) Price List
Inventory endpoint Stock levels per item and warehouse Inventory

For each of these data streams, a separate MARINI HubEngine plan is created that controls the synchronization between B1 and the DataEngine. The following diagram shows the structure:

Four endpoints on the left, four plans in the middle, four data objects on the right. Clear, transparent, maintainable. And now we’ll build this step by step.

What You Need

Before you start, here’s an overview of all the building blocks for this recipe:

API Endpoints in SAP Business One (Source System):

  • BusinessPartners: Customers and suppliers (distinguished by CardType)
  • Items: Item master incl. item number, description, unit
  • PriceLists / Products.ItemPrices: Price lists and item prices (prices are stored as JSON field ItemPrices on the product)
  • Inventory endpoint: Stock levels per item and warehouse, depending on B1 version

MARINI Platform Features:

  • DataEngine Source Module: Define data schema and store B1 data in it (Create Module)
  • HubEngine Plan: Establish connection to SAP B1, store credentials, configure sync logic (HubEngine Handbook)
  • HubEngine Mapping: Visual field mapping from B1 fields to the DataEngine schema (Field Mapping)
  • Monitoring and Logs: Monitor running synchronization

SAP-side requirement: The SAP Business One Service Layer (REST/OData) must be active on the B1 system and accessible over the network. This is the technical foundation for any MARINI connection to B1.

Understanding the Starting Position: What Lives in SAP B1, What Should Go to the Data Cloud?

The first step isn’t technical. It’s conceptual: Which B1 objects do you want to make available in the MARINI Data Cloud? This sounds trivial, but the answer determines everything that follows: the number of source modules, the field selection in mapping, the complexity of the plans.

In SAP Business One, there are four classics that are needed in almost every integration:

  1. Business Partners (BusinessPartners): Customers and suppliers, distinguished by the CardType field. Each Business Partner has a unique CardCode, a name (CardName), contact data and can have multiple addresses.
  2. Items (Items): The item master with ItemCode, ItemName, sales and purchase units as well as the current total inventory (QuantityOnStock).
  3. Price Lists (PriceLists / ItemPrices): The price lists themselves contain name and currency. However, the specific item prices are not stored directly on the price list, but as a JSON field ItemPrices on the respective product.
  4. Inventory (Inventory): Inventory exists per item and per warehouse. The appropriate endpoint varies depending on the B1 version and configuration.

Take five minutes to document the scope in writing: Which objects, which fields, which direction? This will save you iteration loops during mapping later. In this cookbook article, we work with all four objects. In practice, you can also start with one and add the others later.

The question of data direction is also important. In this scenario, SAP B1 is the leading system: Data flows from B1 to the Data Cloud (unidirectional). The DataEngine is the intermediate layer that harmonizes the B1 schema and prepares it for all target systems. Write-backs to B1 are a separate topic and not part of this article.

Create Source Modules: Business Partners and Items

Now it gets concrete. In the MARINI DataEngine, you create a separate Source Module for each B1 entity. A source module is a data container: It defines the schema, i.e. which fields are synchronized, but it doesn’t contain connection data. The actual connection to SAP B1 only emerges in the HubEngine plan (we’ll get to that shortly).

Start with the source module for Business Partners. The most important fields:

B1 Field Description Note
CardCode Unique ID of the Business Partner Primary key
CardName Name (company or person)
CardType Type: Customer, Supplier or Lead Filter basis
EmailAddress Email address
Phone1 Phone number
BPAddresses Addresses (collection) Embedded list

BPAddresses deserves special attention: This is an embedded collection. Each Business Partner can have multiple addresses (delivery address, billing address, etc.), which are represented as a list of address objects with street, postal code, city, country and address type. Whether you map this collection flat (as comma-separated fields) or structured (as a separate relation in the DataEngine) depends on your target scenario. For starters, the flat variant is sufficient.

Then the source module for Items:

B1 Field Description Note
ItemCode Unique item number Primary key
ItemName Item description
SalesUnit Sales unit
PurchaseUnit Purchase unit
QuantityOnStock Total inventory (aggregated) Not per warehouse

The MARINI Help Center shows in detail how to create a source module. The process is identical for both modules: Create new module, define fields, set primary key, save.

Create Source Modules: Price Lists and Inventory

We continue with the two remaining objects. Both have a special feature that you should consider when building the source module.

Price lists and item prices: In SAP B1, there is the PriceLists endpoint that delivers the metadata of the price lists: name, currency, basic information. However, the specific item prices are not stored there, but as a JSON field ItemPrices on the respective product (under Items). When creating the source module for prices, you therefore need to decide:

  • Variant A: You synchronize the price list metadata (PriceLists) as a standalone object and pull the item prices separately via ItemPrices in the items module.
  • Variant B: You build a combined module that merges price list reference and item price.

For getting started, variant A is recommended: clean separation, less complexity in mapping. You can establish the link between price list and item price later via a lookup in the DataEngine.

Inventory: Stock levels in SAP B1 are complex: They exist per item and per warehouse (Warehouse). Which endpoint delivers the current stock levels per warehouse depends on the B1 version and configuration.

The inventory endpoints in SAP Business One vary depending on version and setup. Before you build the source module, research the appropriate endpoint for your installation in the SAP B1 documentation. If you’re unsure: The MARINI team will help you identify the right endpoint.

However, the basic structure of the DataEngine object for inventory always remains the same:

Field Description
Item reference Reference to ItemCode from the items module
Warehouse Warehouse code or warehouse name
Quantity Available stock
Unit Quantity unit (if different)

Done! Four source modules have been created: Business Partners, Items, Price Lists and Inventory. Each module knows its schema, but none yet has a connection to SAP B1. That’s coming now.

Create HubEngine Plan: Configure Connection to SAP B1

Only now, after all source modules are in place, is the connection to SAP Business One established. In the MARINI HubEngine, you create a plan for this. The plan is the central unit: This is where you store access credentials, define sync logic and link the source modules as synchronization targets.

For the connection to SAP B1, you need the following credentials:

Parameter Description
Server URL Address of the SAP B1 Service Layer (e.g. https://b1-server:50000/b1s/v1)
CompanyDB Name of the company database in B1
Username SAP B1 user with Service Layer permission
Password Associated password

SAP Business One uses session-based authentication: The MARINI HubEngine logs in with username and password, receives a session ID and uses it for all subsequent API calls. This happens automatically, you don’t have to worry about token refresh or session management.

After saving the plan, you perform a connection test. If the connection is established, you can explore the available endpoints and confirm that BusinessPartners, Items, PriceLists and the inventory endpoint are accessible. The HubEngine Handbook provides detailed instructions for plan configuration.

Check the timezone: If the SAP B1 server and the MARINI platform are operated in different timezones, this can affect date synchronization. A quick check in the plan settings will save you debugging time later.

Whether you create one plan for all four objects or four separate plans depends on your setup. In practice, separate plans per object have proven successful: You can start, stop and monitor each sync independently. If the inventory sync gets stuck, Business Partners and Items continue to run anyway.

HubEngine Mapping: Assign and Transform Fields

The connection is established. The source modules know their schema. Now you bring both together: In HubEngine Mapping, you assign a field in the DataEngine data object to each field from the B1 endpoint.

For Business Partners, the mapping looks like this as an example:

B1 Field (Source) DataEngine Field (Target) Note
CardCode partner_id Primary key, required field
CardName name
CardType type Customer, Supplier or Lead
EmailAddress email
Phone1 phone

The same principle applies to Items (ItemCodeitem_id, ItemNamename, etc.), price lists and inventory. In addition to pure field assignment, the MARINI HubEngine also offers transformation rules in mapping: Reformat values, set conditions (e.g. only synchronize records with CardType = Customer), define required fields and implement validations.

Three tips for clean mapping:

  1. Primary keys first: Define for each data object which field is the unique identifier. For Business Partners, this is CardCode, for Items ItemCode. Without a primary key, the DataEngine cannot distinguish updates from new records.
  2. Harmonize field names: In the DataEngine, you’re free in naming. Use this: Instead of keeping CardCode and ItemCode in the DataEngine, choose descriptive, system-independent names like partner_id and item_id. This makes the data easier to consume for target systems.
  3. Think about collections separately: Embedded lists like BPAddresses require their own mapping (or their own data object with relation). Consider in advance whether the addresses should be mapped flat in the same data object or modeled as a separate entity with 1:n relationship.

Start and Monitor Synchronization

Plans configured, mapping established. Now it gets serious: You start the first synchronization. This happens with one click in the HubEngine plan. The MARINI HubEngine reads the data from the B1 endpoints, applies the mapping and writes the results to the DataEngine data objects.

On the first run, all records are transferred (initial sync). After that, the HubEngine only synchronizes changes (delta sync), based on timestamps or change markers from B1. This keeps run times short and the load on the B1 server low.

Use the monitoring and logs in the MARINI platform to observe the sync:

  • Sync status: Successful, failed or still running, visible per plan
  • Record counter: How many records were read, written, skipped?
  • Error logs: Which records could not be synchronized and why? Typical causes: Required field empty, data type mismatch, invalid value
  • Alerts: Configurable notifications for errors or anomalies

Take a close look at the error logs after the first run. The most common problems with B1 sync:

  • Empty required fields: A Business Partner without CardCode cannot be written. Solution: Required field validation in mapping or data cleanup in B1.
  • Special characters in field values: Some B1 installations contain historical data with unusual characters. The DataEngine logs these cases so you can clean them up specifically.
  • Inventory endpoint not accessible: If the inventory endpoint is named differently depending on the B1 version, this becomes apparent here at the latest. The error message leads you to the correct endpoint.

For production operation, you define a sync rhythm. Master data like Business Partners and Items change rarely. Daily or hourly sync is usually sufficient. Inventory can be updated more frequently, depending on how time-critical the inventory information is for your target systems.

Check and Use Data in the DataEngine

The data is flowing. But is it flowing correctly? After the first successful sync, you open the data objects in the MARINI DataEngine and check randomly:

  • Do the field values match? Did CardCode really arrive as partner_id?
  • Are the data types correct? Number fields as numbers, date fields as dates?
  • What do the address collections look like? Were the BPAddresses cleanly mapped?
  • Do the inventory quantities match? Compare an item in B1 and in the DataEngine randomly.

If everything fits, you now have a central, harmonized data model of your SAP B1 master data in the MARINI Data Cloud. From here, it gets exciting: The DataEngine is not a dead end, but the starting point for everything else.

You can build ETL pipelines on this data that transform, enrich and forward the data to target systems. You can define workflows that automatically trigger an action for new Business Partners. And you can immediately analyze and search the data via the DataEngine Quickstart.

Summary and Outlook

In this cookbook article, you’ve brought four SAP B1 data streams into the MARINI Data Cloud: Business Partners, items, price lists and inventory. The architecture: one source module per object, one HubEngine plan per sync, clean mapping in between. SAP B1 remains the leading system, the DataEngine becomes the central hub from which all target systems are served.

What you’ve gained:

  • One source instead of many: Each target system (CRM, shop, marketing automation) gets the data from the DataEngine, not directly from B1.
  • Schema changes in one place: If B1 renames a field, you adjust one mapping, not five separate connections.
  • Consistency across system boundaries: All target systems work with the same, current master data.

What Comes Next

The master data in the Data Cloud is the foundation. From here, you can build in many directions:

  • Items and inventory to the shop: Automatically supply Shopware or Shopify with current product data and availability.
  • Business Partners to CRM: Feed HubSpot, Salesforce or Dynamics 365 Sales with current customer master data.
  • Price lists for sales: Make current prices available in CRM or in the quotation process.
  • Inventory changes in real-time: Shorten inventory sync interval and pass inventory changes to all connected systems.
  • Build Golden Record: Based on the B1 master data, create a deduplicated, cross-system master data model that serves as the single source of truth for all target systems.

Further Resources

All Help Center articles that help you with implementation:

You’re stuck or have questions about your specific B1 setup? No problem. Get in touch with us, we’ll help you. Whether it’s about the right inventory endpoint, complex address collections or the optimal sync rhythm: The MARINI team has implemented SAP B1 integrations in many variants and is happy to support you.

Marini Systems GmbH | Website | Datenschutz­erklärung | Impressum