OCPP 2.0.1 TransactionEvent

TransactionEvent is the OCPP 2.0.1 session story in one action. Instead of three 1.6 messages (start, meters, stop), the station sends the same action with eventType Started, Updated, or Ended.

The OCA white paper “What is new in OCPP 2.0.1” calls out improved transaction handling as a headline change from 1.6. The station, not the CSMS, assigns transactionId (a string). Download the official OCPP 2.0.1 specification.

Index: 2.0.1 samples. Launch simulator.

When each eventType is triggered

eventTypeWhen it fires
StartedThe session begins after Authorize or RequestStartTransaction
UpdatedPeriodic meters, trigger reasons, or mid-session state changes
EndedLocal stop, remote stop, unplug, or another terminal reason

Started sample

Charging station → CSMS
JSON[
  2,
  "cf-tx-s",
  "TransactionEvent",
  {
    "eventType": "Started",
    "timestamp": "2026-08-14T10:16:01.000Z",
    "triggerReason": "Authorized",
    "seqNo": 0,
    "transactionInfo": {
      "transactionId": "tx-1001"
    },
    "evse": {
      "id": 1,
      "connectorId": 1
    },
    "idToken": {
      "idToken": "TAG-1001",
      "type": "ISO14443"
    }
  }
]
CSMS → charging station
JSON[
  3,
  "cf-tx-s",
  {}
]

Chargeflux uses triggerReason Authorized on a local start. A remote start from the CSMS is covered on RequestStartTransaction.

Updated sample (meters)

Charging station → CSMS
JSON[
  2,
  "cf-tx-u",
  "TransactionEvent",
  {
    "eventType": "Updated",
    "timestamp": "2026-08-14T10:17:01.000Z",
    "triggerReason": "MeterValuePeriodic",
    "seqNo": 1,
    "transactionInfo": {
      "transactionId": "tx-1001"
    },
    "evse": {
      "id": 1,
      "connectorId": 1
    },
    "meterValue": [
      {
        "timestamp": "2026-08-14T10:17:01.000Z",
        "sampledValue": [
          {
            "value": 1850,
            "measurand": "Energy.Active.Import.Register",
            "unitOfMeasure": {
              "unit": "Wh"
            },
            "context": "Sample.Periodic"
          },
          {
            "value": 7400,
            "measurand": "Power.Active.Import",
            "unitOfMeasure": {
              "unit": "W"
            },
            "context": "Sample.Periodic"
          }
        ]
      }
    ]
  }
]
CSMS → charging station
JSON[
  3,
  "cf-tx-u",
  {}
]

Note unitOfMeasure.unit — 2.0.1 does not use the flat 1.6 unit field. seqNo increments so the CSMS can detect gaps.

Ended sample

Charging station → CSMS
JSON[
  2,
  "cf-tx-e",
  "TransactionEvent",
  {
    "eventType": "Ended",
    "timestamp": "2026-08-14T10:19:10.000Z",
    "triggerReason": "StopAuthorized",
    "seqNo": 4,
    "transactionInfo": {
      "transactionId": "tx-1001"
    },
    "evse": {
      "id": 1,
      "connectorId": 1
    },
    "meterValue": [
      {
        "timestamp": "2026-08-14T10:19:10.000Z",
        "sampledValue": [
          {
            "value": 5550,
            "measurand": "Energy.Active.Import.Register",
            "unitOfMeasure": {
              "unit": "Wh"
            },
            "context": "Transaction.End"
          }
        ]
      }
    ]
  }
]
CSMS → charging station
JSON[
  3,
  "cf-tx-e",
  {}
]

Chargeflux maps a local stop to StopAuthorized, a CSMS stop to RemoteStop, and an unplug to EVCommunicationLost.

Related guides

FAQ

What is TransactionEvent in OCPP 2.0.1?

A single action that reports a session start (Started), a meter or state update (Updated), or a session end (Ended). It replaces the 1.6 StartTransaction / MeterValues / StopTransaction trio.

Who assigns the transactionId in OCPP 2.0.1?

The charging station. Unlike 1.6, the CSMS does not mint the id on a StartTransaction reply. Both sides then repeat that string on later events.

Last reviewed August 2026 · Chargeflux.io