Skip to content
BatteryPass

Integration

Connecting the battery passport to SAP, Business Central and Odoo securely

Which data from SAP, Business Central and Odoo belongs in the battery passport, how to keep the API connection secure and what an API key cannot do.

By Published: Updated: Facts checked: 17 min read

In short

The ERP gives the battery passport its product master, serial numbers, production confirmations and deliveries, but no reviewed passport values. The connection is secure when a technical user with minimal rights works in the ERP, an API key can only stage and read, people commit, approve and publish, and changes come back through the feed.

Key facts

Responsibility for passport data
The economic operator placing the battery on the market; it may authorise others in writing but stays responsible Source
Rights to change data
Rights to introduce, modify or update information in the passport are restricted Source
Integrity and security
Data authentication, reliability and integrity; a high level of security, fraud avoided Source
Identification of every battery
Model identification and batch, serial or product number or another element, in practice usually from the ERP Source
Passport obligation starts
18 February 2027 Source

Your ERP should feed the battery passport, but never decide on its approval. SAP, Microsoft Dynamics 365 Business Central and Odoo know the product master, the serial numbers, the production confirmations and the deliveries, and that is what the units in the passport are made from. The declared passport values, with their evidence and review, do not come from the ERP. The connection is secure when a dedicated technical user with minimal rights works in the ERP, an API key can only stage and read, and people commit, approve and publish.

How to start with spreadsheets and exports is covered in From Excel and ERP exports to a reviewed battery passport. This article is about the next step: connecting the ERP automatically and keeping that connection safe. The basics of the passport obligation are in our guide to the battery passport. Everything below describes integration patterns over the BatteryPass API, not ready-made connectors.

Which passport data lives in the ERP, and which does not?

The battery passport holds information on the battery model and on each individual battery (Art. 77(2)). The ERP mainly feeds the second level: every battery bears a model identification and a batch, serial or product number (Art. 38(6)), and that is exactly what the ERP posts during production or at goods receipt.

ERP objectTypical dataRole in the passport
Product or material masterMaterial number, GTIN, descriptionKey to the battery model; a change is a reason to check whether a new model version is due
Serial and lot numbersSerial number per batteryThe unit in the passport
Production order and confirmationCompletion or posting date, plantManufacturing date and place of the unit
Goods receipt at importersSerial numbers of imported batteriesThe unit in the passport
Outbound deliveryDelivery note, label printingNo passport content; carries the passport link from BatteryPass
Return, service or repair orderSerial number, kind of work, dateAn event in the unit's history
What the ERP contributes to the battery passport

What the ERP lacks are the declared values: detailed composition, critical raw materials and hazardous substances, performance and durability values, dismantling and safety information, the declaration of conformity. Even if your material master carries characteristics such as capacity or cell chemistry, someone has to stand behind those values with evidence (Art. 77(4)). They belong in the review process, not in an automatic sync. Which fields exist and at which level is shown on the data fields page.

Two pieces of information travel the other way: the GS1 Digital Link and the passport status. They belong on the serial number record in the ERP, so labels and delivery papers carry the right link.

What does the integration pattern over the BatteryPass API look like?

Between the ERP and BatteryPass sits a middleware: a small service run by your IT team, your integration platform or, with SAP S/4HANA Cloud, usually SAP Integration Suite. It fetches data from the ERP and calls the BatteryPass API with an organisation key. BatteryPass does not connect to your ERP today; every connection starts at the middleware.

  1. The ERP posts. A production confirmation or goods receipt creates serial numbers. An outbox table records the posting, so nothing is lost while the middleware is down.
  2. The middleware stages. It writes a CSV file in the format of an import preset and uploads it with a key that has only the import scope. BatteryPass validates every row.
  3. People decide. A member reads the validation report and commits the import, a reviewer approves the values, and only then is anything published.
  4. The middleware writes back. A second key with the read scope follows the change feed and stores link and status on the serial number record.

Import presets map the columns of SAP serial number lists, Business Central item ledger entries and Odoo lots in testing. The interfaces are described on Developers.

What can an API key do, and what can it not do?

A key belongs to the organisation, not to a person. It has one to three scopes and can never do more than they allow in testing.

ScopeAllowedNot allowed
readRead models, versions, units, values with provenance, passports and exports; poll the change feedChange anything
conditionReport condition data with its measurement time; record lifecycle events such as repairsWrite declared values
importUpload its own imports, adjust the mapping, start validation, fetch the resultCommit imports, approve values
Scopes of BatteryPass API keys

No scope allows a key to publish or withdraw passports or to manage members, keys or settings. This is deliberate. The economic operator placing the battery on the market ensures that the passport information is accurate, complete and up to date (Art. 77(4)), and Article 78, point (f), requires the rights to introduce, modify or update information to be restricted. An ERP user changing a record at night should not be able to change a published passport. Declared data therefore enters the passport only through a member's decision, and through two people when the four-eyes principle is switched on. Why that matters is explained in Provenance and four-eyes review.

Further limits catch mistakes in the middleware:

  • A key only sees the imports it staged itself.
  • The commit applies exactly the state the member reviewed. If the key changes the mapping afterwards, the commit fails.
  • By default, the keys of an organisation together may have at most 20 open imports from the last seven days, upload 200 MB per day and run one validation at a time.
  • All keys together may make 600 requests per minute; above that the API answers 429 with Retry-After.

One limit is still missing: a key cannot be restricted to particular models or units. Handing a service provider a key with condition lets it report condition data for every unit of the organisation.

How do SAP, Business Central and Odoo differ at the interface?

The systems differ less in the data they hold than in how you fetch it and how you sign in. The table summarises our ERP registry, based on the vendors' documentation as we read it on 24 and 25 October 2026; where only community sources exist, the table says so.

SystemInterfaces and protocolSign-inEvents from the ERP
SAP S/4HANA Cloud Public EditionOData APIs (V4 and V2) for product, serial numbers, production orders, confirmations, outbound deliveries, goods movements, returnsOAuth 2.0 client credentials, X.509 certificate, or user and password“Product changed” business event through SAP Event Mesh, thin, not signed; documented only in community sources
SAP S/4HANA on-premise and Private EditionOP_ APIs (OData V2 and V4); MATMAS IDoc for the material masterX.509 certificate, or user and passwordMATMAS through ALE change pointers (community source); RAP business events not checked; not signed
SAP Business OneService Layer with OData V3 (/b1s/v1) and V4 (/b1s/v2)Session: POST /Login, then a session cookieNo documented webhooks; the middleware polls
Microsoft Dynamics 365 Business CentralAPI v2.0 (OData V4); a custom AL API page for serial numbersOAuth 2.0 client credentials through Microsoft Entra IDWebhook subscriptions with a validation handshake and clientState, not signed, expire after three days
Odoo 19JSON-2 API for every model; XML-RPC and JSON-RPC deprecatedAPI key as a bearer tokenOutgoing webhooks from automation rules, not signed
Interfaces, sign-in and events according to our ERP registry

Three details that cost time in projects:

  • Business Central: the standard API returns item ledger entries without serial or lot numbers, so you need a custom API page as an AL extension. Insert, modify and delete can be switched off on such a page, which keeps it read-only.
  • SAP S/4HANA Cloud: our registry notes, citing SAP Note 3772443, that with serialisation level 1 creating a serial number through the API reports success but creates nothing. Reading is not affected. Let production create serial numbers and only read them.
  • Odoo: the lot (stock.lot) has no manufacturing date. The middleware adds it, for example from the end date of the manufacturing order. Every JSON-2 call runs in its own transaction.

All 17 systems we describe patterns for are listed under Integrations, for example SAP S/4HANA Cloud, Business Central and Odoo.

How do you set up the technical user in the ERP?

One integration, one technical user, exactly the rights its workflow needs. The “units from production” workflow only reads in the ERP; the way back only writes link and status to the serial number record.

  • SAP S/4HANA Cloud Public Edition: a communication arrangement of its own per integration, with exactly the APIs it needs. Prefer OAuth 2.0 client credentials or an X.509 certificate to user and password.
  • SAP S/4HANA on-premise and Private Edition: X.509 rather than basic authentication. The system stays in your own network; the middleware reaches it through SAP Cloud Connector or a reverse proxy, never directly from the internet.
  • SAP Business One: the Service Layer only knows sessions with user and password. That makes a dedicated user with restricted authorisations all the more important, and the middleware logs out when it is done.
  • Business Central: sign in as an application through Microsoft Entra ID (service to service). Microsoft does not allow the SUPER permission set for such applications and advises granting only the permissions the integration needs.
  • Odoo 19: a dedicated bot user, as Odoo recommends for integrations. Every call is checked against that user's access rights and record rules.

Where do keys and passwords belong?

In a secrets vault, not in ERP customising. A BatteryPass key in a Z table, in AL code, in an Odoo system parameter or a server action can be read by anyone who sees the customising or the code, and it travels with transports, backups and system copies into test systems.

  • Secrets live with the middleware: in the secret store of the integration platform or your infrastructure, separate for test and production.
  • One key per integration and environment. An organisation can have up to 25 active keys. Each is shown only once; BatteryPass stores only its hash.
  • Plan rotation. BatteryPass keys do not expire: you create a new one, switch over and revoke the old one. Odoo API keys and client secrets in Microsoft Entra ID do have a lifetime. If their expiry is not in the operations plan, the integration stops one morning.
  • Secret addresses are secrets. A webhook address that is itself the protection belongs in neither tickets nor logs.

How should you handle events and webhooks from the ERP?

As a prompt, not as a data source. According to our ERP registry, none of the five systems signs its events. A middleware should therefore only conclude from an event that it needs to look, and then read the data through the API with its own credentials. A forged call then causes nothing worse than an unnecessary read.

  • SAP S/4HANA: in the cloud, business events such as “product changed” arrive through SAP Event Mesh as CloudEvents with a thin payload. On-premise, the material master can arrive as a MATMAS IDoc through ALE change pointers.
  • SAP Business One: without documented webhooks, the middleware polls at fixed intervals.
  • Business Central: when a subscription is created or renewed, Business Central checks the receiving address with a validation handshake. Notifications name only the resource and the kind of change and carry the clientState, which Microsoft describes as a shared secret for verifying them. Subscriptions expire after three days and must be renewed in time.
  • Odoo: outgoing webhooks from automation rules send an unsigned payload. Treat the middleware's receiving address as a secret.

Check a signature wherever a vendor offers one. With these five systems, what remains is the handshake, the clientState, a secret address and, above all, reading the data back through the API. BatteryPass itself does not send webhooks yet; the change feed covers the way back into the ERP.

Why use the change feed instead of polling everything?

Because otherwise the middleware would have to read every unit regularly to find the one whose passport changed. The feed reports, in the order changes become visible, what happened to which object: unit created, passport published, re-published or withdrawn, model version approved, import committed or approved, event recorded, condition data accepted in testing.

  • Thin entries. No values, no people, no personal data. The middleware then reads the object with the same key, so an intercepted feed reveals nothing.
  • No gaps. An entry appears only once every older transaction has finished, so a cursor never skips a change that commits late.
  • Filtered. The types parameter limits the feed to, say, passport changes.
  • At least once. The middleware stores the cursor only after the ERP has accepted the change. After a database restore a cursor can become invalid (cursor_reset); the middleware then starts from the beginning.

Polling about every five minutes is usually enough for labels and delivery papers and spares the request limit.

How do you make the connection safe to repeat?

Networks fail, services restart, postings arrive twice. Every step therefore has to tolerate a retry.

StepBehaviour on a retry
Upload an importA second upload creates a second import; its rows count as duplicates once the first is committed. No unit is created twice.
Report condition dataBatteryPass skips measurements that are not newer than the stored one.
Report a repair as an eventThe middleware remembers the order number it recorded an event for and does not report it again.
Write link and status to the ERPThe same link and status produce the same record.
Response 429Wait as long as Retry-After says; otherwise retry with growing intervals and some randomness.
What happens on a retry

What should you log?

Enough to answer any question later, and nothing that gives a secret away. BatteryPass logs every change a key makes with the key as the actor: the staged import, the validation it started, the reported event, the accepted condition data. BatteryPass does not log reads by keys or by signed-in members; reads of restricted tiers through a grant per email address are logged.

The middleware's log should hold, per run, the import id, the number of rows, warnings and errors, the stored feed cursor and, on errors, the code and request_id of the error response. It should not hold keys, passwords, tokens, webhook addresses, passport content or customer data. The middleware should raise an alert on 401 and 403 (key revoked or scope missing), on failed validations, on a cursor_reset and on subscriptions or keys about to expire.

Which workflows fit which system?

Our registry describes five workflows that do not depend on a particular ERP:

  • Units from production

    Serial numbers from the production confirmation or goods receipt are staged as an import; members review, commit and approve before any passport appears.

  • Passport links back into the ERP

    The middleware follows the change feed and writes the GS1 Digital Link and the passport status to the serial number record in the ERP, so labels and delivery papers carry it.

  • Condition data from BMS and service

    A battery management system or a service tool reports measurements such as capacity fade or cycles; BatteryPass accepts newer measurements and publishes according to the organisation's policy.

  • Returns and repairs as lifecycle events

    Completed repairs, inspections and component replacements from service or return orders appear as events in the unit's history.

  • Product change leads to a new model version

    A change to the product master in the ERP triggers a notification; a member creates a new model version in BatteryPass. Declared data is never written automatically.

WorkflowScopesTriggerSystems
Units from productionimportProduction confirmation or goods receipt in the ERPAll five
Passport links back into the ERPreadPassport published, re-published or withdrawn in BatteryPassAll five
Condition data from BMS and serviceread, conditionNew measurements in the BMS or service toolSAP S/4HANA cloud and on-premise; otherwise straight from the BMS
Returns and repairsread, conditionCompletion of a service, repair or return orderAll five
Product change leads to a new model versionreadChange to the product or material masterAll five
Workflows, scopes and systems according to our ERP registry

Condition data rarely comes from the ERP. It comes from the battery management system, which for stationary storage already has to hold the Annex VII data (Art. 14(1)). In BatteryPass it counts as a measurement, not a declaration. A product change, by contrast, never writes to the passport automatically: the middleware notifies the person responsible, who creates the new model version and has it approved.

What is ready, and what is planned?

  • API keys with three scopes, import by key and the change feed are in testing.
  • The integration patterns for 17 ERP systems are in testing. They are patterns over the API, not ready-made connectors; your IT team, IT service provider or integration platform builds the connection.
  • Managed ERP connections, starting with Odoo, are planned. We do not give a date.

BatteryPass holds no certification for any of these systems and has no agreement with their vendors. The check date in the registry is the day we read the documentation, not a test by the vendor. Responsibility for the passport data stays with the economic operator. The Commission points out that the Battery Regulation does not regulate solution providers and that relying on one is entirely the economic operator's decision (FAQ 10.3). What to look for when choosing is covered in Choosing battery passport software; whether building your own pays off, in Build or buy.

Where do you start?

  1. Run the process once without the ERP: export, import, validation report, approval, publication.
  2. Pick the counterpart in the ERP: which posting creates the serial number, and where should link and status go?
  3. Create a technical user with read access to product, serial numbers and production and write access only to the link and status fields.
  4. Create two keys: one with import, one with read, per environment.
  5. Put the secrets in the middleware's vault and schedule rotation around expiry dates.
  6. Set up the outbox and the cursor, so nothing is lost and nothing arrives twice.
  7. Set up logging and alerts for 401, 403, failed validations and cursor_reset.
  8. Go live with one model and only then connect further models and plants.

By this process should have run with real serial numbers.

Frequently asked questions

Can our ERP publish passports through the API?

No. An API key can read, report condition data and events, and stage imports. Only members of your organisation can commit an import, approve values, publish and withdraw. Declared data therefore reaches the passport only through a person's decision.

Do we need a separate key for every integration?

We recommend it: one key per integration and environment, each with only the scopes it needs. An organisation can have up to 25 active keys, and revoking one does not stop the others.

Do Business Central or Odoo sign their webhooks?

Not according to our ERP registry. Business Central checks the receiving address with a handshake and sends the clientState along; Odoo does not sign the payload of its webhooks. Treat an event as a prompt and read the data through the API afterwards.

Is there a ready-made Odoo connector?

Not yet. Managed ERP connections, starting with Odoo, are planned. Until then we describe an integration pattern over Odoo's JSON-2 API and the BatteryPass API that your IT team or IT service provider builds.

What happens if the middleware uploads the same file twice?

A second import is created. Its rows count as duplicates once the first import is committed, so no unit is created twice.

Do BatteryPass API keys expire?

No. You rotate a key by creating a new one, switching the middleware over and revoking the old one. Odoo API keys and client secrets in Microsoft Entra ID, on the other hand, have a lifetime that belongs in your operations plan.

Does our ERP need to be reachable from the internet?

No. BatteryPass does not connect to your ERP today; every call starts at the middleware. The middleware reaches an SAP system in your own network through SAP Cloud Connector or a reverse proxy, for example.

Sources

  1. Regulation (EU) 2023/1542, Article 77: Battery passport · Publications Office of the European Union (EUR-Lex) · accessed 25 October 2026
  2. Regulation (EU) 2023/1542, Article 78: Technical design and operation of the battery passport · Publications Office of the European Union (EUR-Lex) · accessed 25 October 2026
  3. Regulation (EU) 2023/1542, Article 38: Obligations of manufacturers (identification of batteries) · Publications Office of the European Union (EUR-Lex) · accessed 25 October 2026
  4. Regulation (EU) 2023/1542, Article 14: Information on the state of health and expected lifetime · Publications Office of the European Union (EUR-Lex) · accessed 25 October 2026
  5. Regulation (EU) 2023/1542, Annex XIII: Information to be included in the battery passport · Publications Office of the European Union (EUR-Lex) · accessed 25 October 2026
  6. EU Digital Product Passport FAQ for Batteries (questions 2.1 and 10.3) · European Commission, DG GROW · accessed 25 October 2026
  7. Working with webhooks (Business Central API v2.0) · Microsoft Learn · accessed 25 October 2026
  8. Using Service to Service Authentication (Business Central) · Microsoft Learn · accessed 25 October 2026
  9. itemLedgerEntry resource type (Business Central API v2.0) · Microsoft Learn · accessed 25 October 2026
  10. Developing a custom API (Business Central) · Microsoft Learn · accessed 25 October 2026
  11. External JSON-2 API (Odoo 19.0) · Odoo S.A. · accessed 25 October 2026
  12. Webhooks (Odoo 19.0, Studio) · Odoo S.A. · accessed 25 October 2026
  13. Logging in and logging out using Service Layer API (SAP Business One) · SAP Learning · accessed 25 October 2026

This article reflects the law as we checked it against the linked primary sources on 25 October 2026. It is not legal advice; the text published in the Official Journal of the EU prevails.

About the author

BatteryPass-Redaktion

BatteryPass product and regulation team

We build BatteryPass and read the Battery Regulation, the Commission's guidance and the ERP vendors' documentation in the original for it. Drafts are written with AI assistance; people review every article, and every regulatory statement links to its primary source.