---
title: "Implementation Guide"
description: "Step-by-step guide for implementing a GS1-native Battery Digital Product Passport with OpenEPCIS extensions"
canonical_url: "https://openepcis.io/docs/digital-product-passport/battery-dpp/implementation-guide"
last_updated: "2026-07-02T20:31:40.056Z"
---

<alert type="info">

**Masterdata and events** — `masterDataAvailableFor` is GS1 Web Vocabulary (no `gs1:` prefix needed). It is used to carry **lot- or serial-level masterdata** alongside an event: production batch, declaration references, incident records, regulatory citations. It must **not** carry **GTIN-level masterdata** (product name, generic specifications) — those live on the resolver, POSTed once via `POST /products/{gtin}`. Extension vocabularies (`battery:`, `eudr:`, `textile:`, `electronics:`) keep their prefix; they are declared in the document's `@context`.

</alert>

<alert type="info">

**Disclaimer**: This is **not official GS1 guidance**, but it follows official GS1 standards and best practices:

- [GS1 Digital Link](https://www.gs1.org/standards/gs1-digital-link) — Resolvable URIs as identifiers
- [EPCIS 2.0](https://ref.gs1.org/standards/epcis/) — Event-based traceability
- [GS1 Web Vocabulary](https://www.gs1.org/voc/) — Linked data terms
- [CBV 2.0](https://ref.gs1.org/standards/cbv/) — bizStep, disposition values

We use GLN for parties/locations, GTIN+serial for products, and the `regulatoryInformation` pattern from GS1 EUDR. [Feedback welcome](https://github.com/openepcis/openepcis-dpp-ready/issues)!

</alert>

## Prerequisites

Before implementing the Battery DPP, ensure you have:

- GS1 Company Prefix (for GTIN assignment)
- GLN for your organization and facilities
- EPCIS 2.0 capable repository
- GS1 Digital Link resolver (or access to GS1 Verified by GS1)

## Step 1: Assign GS1 Identifiers

### Product Identification

1. **Assign GTIN** to your battery product type:```text
GTIN: 09521234000013
```
2. **Assign Serial Numbers** to individual units:```text
Serial: BAT2024-001
Full Digital Link: https://id.gs1.org/01/09521234000013/21/BAT2024-001
```

### Organization Identification

1. **GLN for manufacturer**:```text
Manufacturer GLN: 9521234000006
URI: https://id.gs1.org/417/9521234000006
```
2. **GLN for production facility**:```text
Facility GLN: 9521234000013
URI: https://id.gs1.org/414/9521234000013
```

### Device Identification

1. **GIAI for measurement devices** (BMS, test equipment):
```text
BMS GIAI: 9521987BMS-001
URI: https://id.gs1.org/8004/9521987BMS-001
```

## Step 2: Create Product Master Data

Create a JSON-LD file containing static battery information:

```json [battery-product.jsonld]
{
  "@context": [
    {
      "gs1": "https://ref.gs1.org/voc/"
    },
    {
      "battery": "https://ref.openepcis.io/extensions/eu/battery/"
    }
  ],
  "@id": "https://id.gs1.org/01/09521234000013/21/BAT2024-001",
  "@type": ["gs1:Product"],

  "gtin": "09521234000013",
  "serialNumber": "BAT2024-001",

  "manufacturer": {
    "@id": "https://id.gs1.org/417/9521234000006",
    "@type": "gs1:Organization",
    "organizationName": "Your Company Name",
    "gln": "9521234000006"
  },

  "batteryCategory": { "@id": "battery:IndustrialBattery" },

  "battery:technicalSpecifications": {
    "@type": "battery:TechnicalSpecification",
    "battery:ratedCapacity": {
      "@type": "gs1:QuantitativeValue",
      "value": "280",
      "unitCode": "AH"
    },
    "battery:ratedEnergy": {
      "@type": "gs1:QuantitativeValue",
      "value": "14.3",
      "unitCode": "KWH"
    }
  }
}
```

### Required Fields per EU Battery Regulation

<table>
<thead>
  <tr>
    <th>
      Field
    </th>
    
    <th>
      Property
    </th>
    
    <th>
      Required
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      Unique Identifier
    </td>
    
    <td>
      <code>
        @id
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Manufacturer
    </td>
    
    <td>
      <code>
        gs1:manufacturer
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Production Date
    </td>
    
    <td>
      <code>
        gs1:productionDate
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Production Place
    </td>
    
    <td>
      <code>
        gs1:placeOfProductProvenance
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Battery Category
    </td>
    
    <td>
      <code>
        batteryCategory
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Battery Weight
    </td>
    
    <td>
      <code>
        gs1:netWeight
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Rated Capacity
    </td>
    
    <td>
      <code>
        battery:ratedCapacity
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Rated Energy
    </td>
    
    <td>
      <code>
        battery:ratedEnergy
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Material Composition
    </td>
    
    <td>
      <code>
        battery:materialComposition
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Hazardous Substances
    </td>
    
    <td>
      <code>
        battery:hazardousSubstances
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
  
  <tr>
    <td>
      Recycled Content
    </td>
    
    <td>
      <code>
        battery:recycledContent
      </code>
    </td>
    
    <td>
      Yes
    </td>
  </tr>
</tbody>
</table>

## Step 3: Publish the battery linkset

The battery passport is exposed as an IETF `application/linkset+json` document (RFC 9264). One object per `anchor` identifier, GS1 link relations as full-IRI keys, link descriptors as values. For a serialised battery you typically want at least the consumer Product Information Page, the EPCIS event history, the compliance certificates and the EU Battery Regulation conformity declaration:

```json
{
  "linkset": [
    {
      "anchor": "https://id.gs1.org/01/09521234000013/21/BAT2024-001",
      "itemDescription": "EcoCell IM-500 industrial battery module",
      "https://ref.gs1.org/voc/defaultLink": [
        { "href": "https://dpp.example.com/battery/09521234000013/BAT2024-001",
          "title": "Battery passport" }
      ],
      "https://ref.gs1.org/voc/pip": [
        { "href": "https://dpp.example.com/battery/09521234000013/BAT2024-001",
          "title": "Battery passport (consumer view)",
          "type": "text/html",
          "context": ["ALL"], "public": true }
      ],
      "https://ref.gs1.org/voc/epcis": [
        { "href": "https://api.example.com/events?MATCH_anyEPC=https%3A%2F%2Fid.gs1.org%2F01%2F09521234000013%2F21%2FBAT2024-001",
          "title": "EPCIS event history (SoH, shipping, recycling)",
          "type": "application/ld+json",
          "context": ["ALL"], "public": true }
      ],
      "https://ref.gs1.org/voc/certificationInfo": [
        { "href": "https://dpp.example.com/certs/09521234000013/BAT2024-001",
          "title": "EU Battery Regulation conformity & test reports",
          "type": "application/ld+json",
          "context": ["business", "authority"] }
      ],
      "https://ref.gs1.org/voc/productSustainabilityInfo": [
        { "href": "https://dpp.example.com/sustainability/09521234000013/BAT2024-001",
          "title": "Carbon footprint and recycled-content declaration",
          "type": "application/ld+json",
          "context": ["ALL"], "public": true }
      ]
    }
  ]
}
```

The `?linkType=` query parameter on the resolver URL takes the bare relation name (`pip`, `epcis`, `certificationInfo`, `productSustainabilityInfo`). See [Resolver Setup](/docs/digital-product-passport/resolver-setup) for hosting options.

## Step 4: Integrate EPCIS Event Capture

### Commissioning Event

Record when a battery is created. Per GS1 Germany EUDR Guideline V1.11, use `masterDataAvailableFor` for product master data (not ILMD):

```json
{
  "@context": [
    "https://ref.gs1.org/standards/epcis/epcis-context.jsonld",
    { "battery": "https://ref.openepcis.io/extensions/eu/battery/", "gs1": "https://ref.gs1.org/voc/" }
  ],
  "type": "EPCISDocument",
  "schemaVersion": "2.0",
  "epcisBody": {
    "eventList": [{
      "type": "ObjectEvent",
      "eventID": "urn:uuid:YOUR-UUID-HERE",
      "eventTime": "2024-03-15T14:30:00.000Z",
      "eventTimeZoneOffset": "+01:00",
      "epcList": ["https://id.gs1.org/01/09521234000013/21/BAT2024-001"],
      "action": "ADD",
      "bizStep": "commissioning",
      "disposition": "active",
      "readPoint": { "id": "https://id.gs1.org/414/9521234000013" },
      "sensorElementList": [{
        "sensorMetadata": {
          "deviceID": "https://id.gs1.org/8004/9521234EOL-TEST-001"
        },
        "sensorReport": [
          { "type": "battery:stateOfHealth", "value": 100, "uom": "P1" },
          { "type": "battery:stateOfCharge", "value": 50, "uom": "P1" },
          { "type": "battery:cycleCount", "value": 0 }
        ]
      }],
      "masterDataAvailableFor": [{
        "id": "https://id.gs1.org/01/09521234000013/21/BAT2024-001",
        "battery:initialCapacity": { "value": "280", "unitCode": "AH" },
        "lotNumber": "BATCH-2024-03-A"
      }]
    }]
  }
}
```

### Integration with BMS

Configure your Battery Management System to emit EPCIS events:

```javascript
// Example: BMS to EPCIS event conversion
function createSoHEvent(battery, bmsData) {
  return {
    "@type": "ObjectEvent",
    "@id": `urn:uuid:${generateUUID()}`,
    "eventTime": new Date().toISOString(),
    "epcList": [{
      "@id": battery.digitalLinkUri,
      "masterDataAvailableFor": { "@id": battery.digitalLinkUri }
    }],
    "action": "OBSERVE",
    "bizStep": "inspecting",
    "sensorElementList": [{
      "sensorMetadata": {
        "deviceID": battery.bmsUri,
        "time": new Date().toISOString()
      },
      "sensorReport": [
        { "type": "battery:stateOfHealth", "value": bmsData.soh, "uom": "P1" },
        { "type": "battery:stateOfCharge", "value": bmsData.soc, "uom": "P1" },
        { "type": "battery:cycleCount", "value": bmsData.cycles },
        { "type": "battery:internalResistance", "value": bmsData.resistance, "uom": "OHM" }
      ]
    }]
  };
}
```

## Step 5: Handle Ownership Transfers

When battery ownership changes:

```json
{
  "@context": "https://ref.gs1.org/standards/epcis/epcis-context.jsonld",
  "@type": "ObjectEvent",
  "action": "OBSERVE",
  "bizStep": "accepting",
  "disposition": "in_transit",
  "sourceList": [
    {
      "@type": "source",
      "type": "owning_party",
      "source": "https://id.gs1.org/417/9521234000006"
    }
  ],
  "destinationList": [
    {
      "@type": "destination",
      "type": "owning_party",
      "destination": "https://id.gs1.org/417/9521987000001"
    }
  ],
  "bizTransactionList": [
    {
      "@type": "bizTransaction",
      "type": "po",
      "bizTransaction": "https://buyer.example.com/orders/PO-2024-0089"
    }
  ]
}
```

## Step 6: Record Negative Events

Capture accidents, damage, or safety incidents. Use `masterDataAvailableFor` for incident data:

```json
{
  "@context": [
    "https://ref.openepcis.io/extensions/eu/battery/battery-context.jsonld",
    "https://ref.gs1.org/standards/epcis/epcis-context.jsonld"
  ],
  "type": "ObjectEvent",
  "action": "OBSERVE",
  "bizStep": "inspecting",
  "disposition": "damaged",
  "epcList": [
    "https://id.gs1.org/01/09521234000013/21/BAT2024-001"
  ],
  "battery:incidentSeverity": "Minor",
  "sensorElementList": [
    {
      "sensorReport": [
        {
          "type": "battery:stateOfHealth",
          "value": 93.8,
          "uom": "P1"
        }
      ]
    }
  ],
  "masterDataAvailableFor": [
    {
      "id": "https://id.gs1.org/01/09521234000013/21/BAT2024-001",
      "battery:incidentId": "INC-2025-00023",
      "battery:recommendedAction": "Continue monitoring. Schedule follow-up in 30 days."
    }
  ],
  "bizTransactionList": [
    {
      "type": "urn:epcglobal:cbv:btt:cert",
      "bizTransaction": "https://example.com/incidents/INC-2025-00023.pdf"
    }
  ]
}
```

## Validation

- **JSON-LD shape** — normalises against the EPCIS and battery contexts.
- **EPCIS events** — unique event `@id` (UUID), correct `bizStep` / `disposition` from CBV, `masterDataAvailableFor` on EPCs, UN/CEFACT Rec 20 unit codes.

## Next steps

- [Event Types](/docs/digital-product-passport/battery-dpp/event-types) — every EPCIS event type used by the Battery DPP
- [Complete Examples](/docs/digital-product-passport/battery-dpp/complete-examples) — end-to-end commissioning, shipment and recycling flows
- [Battery vocabulary browser](https://ref.openepcis.io/extensions/eu/battery/) — the live ontology
