TransactionEvent
The single message that replaces StartTransaction, StopTransaction and in-session MeterValues from 1.6.
- Version
- OCPP 2.0.1
- Direction
- Charge Point → CSMS
- Functional block
- Transactions
This is the biggest structural change in 2.0.1. Where 1.6 had three message types with separate correlation rules, 2.0.1 has one message with an eventType of Started, Updated or Ended.
The other half of the change is that the charging station generates the `transactionId`, not the CSMS. A station no longer has to wait for a server to name a session it has already begun, which is what makes offline transaction handling dramatically simpler than it was in 1.6.
seqNo numbers the events within a transaction so the CSMS can detect gaps and order a batch that arrived out of sequence after a reconnect.
Request
| Field | Type | Required | Description |
|---|---|---|---|
eventType | TransactionEventEnumType | Required | Started, Updated or Ended. |
timestamp | dateTime | Required | When the event occurred. |
triggerReason | TriggerReasonEnumType | Required | What caused this event to be sent. |
seqNo | integer | Required | Sequence number within the transaction, starting at 0. |
transactionInfo | TransactionType | Required | Contains transactionId and optionally chargingState, stoppedReason and remoteStartId. |
offline | boolean | Optional | True when the event was generated while disconnected. Defaults to false. |
meterValue | MeterValue[] | Optional | Meter readings attached to this event. |
evse | EVSEType | Optional | Which EVSE and connector. Required on the Started event. |
idToken | IdTokenType | Optional | The token. Required on Started unless the transaction began without authorization. |
numberOfPhasesUsed | integer | Optional | Phases actually in use. |
cableMaxCurrent | integer | Optional | Maximum current the attached cable supports, in amperes. |
reservationId | integer | Optional | The reservation this transaction fulfils. |
[2, "19223201", "TransactionEvent", {
"eventType": "Started",
"timestamp": "2026-09-09T10:22:00Z",
"triggerReason": "Authorized",
"seqNo": 0,
"transactionInfo": {
"transactionId": "a1b2c3d4-0001",
"chargingState": "Charging"
},
"evse": { "id": 1, "connectorId": 1 },
"idToken": { "idToken": "04A1B2C3D4E580", "type": "ISO14443" },
"meterValue": [{
"timestamp": "2026-09-09T10:22:00Z",
"sampledValue": [{ "value": 1204500, "measurand": "Energy.Active.Import.Register", "unitOfMeasure": { "unit": "Wh" } }]
}]
}]Response
| Field | Type | Required | Description |
|---|---|---|---|
totalCost | decimal | Optional | Running cost of the transaction, when the CSMS tracks cost. |
chargingPriority | integer | Optional | Priority from -9 to 9, used by smart charging. |
idTokenInfo | IdTokenInfoType | Optional | Authorization result. Returned on Started when an idToken was supplied. |
updatedPersonalMessage | MessageContentType | Optional | A message to show the driver. |
[3, "19223201", {
"idTokenInfo": { "status": "Accepted" },
"totalCost": 4.35
}]Values
TransactionEventEnumType
| Value | Meaning |
|---|---|
Started | The transaction has begun. Carries evse and usually idToken. |
Updated | An in-progress update — meter values, a state change, a periodic sample. |
Ended | The transaction has finished. transactionInfo.stoppedReason says why. |
ChargingStateEnumType
| Value | Meaning |
|---|---|
Charging | Energy is flowing. |
EVConnected | Cable connected, not charging. |
SuspendedEV | The vehicle paused the draw. |
SuspendedEVSE | The station paused delivery. |
Idle | No vehicle connected. |
TriggerReasonEnumType (selected)
| Value | Meaning |
|---|---|
Authorized | A token was authorized. |
CablePluggedIn | The cable was connected. |
ChargingStateChanged | The charging state changed. |
MeterValuePeriodic | A periodic meter sample. |
MeterValueClock | A clock-aligned meter sample. |
EVCommunicationLost | Communication with the vehicle was lost. |
RemoteStart | A RequestStartTransaction. |
RemoteStop | A RequestStopTransaction. |
StopAuthorized | A token authorized the stop. |
EVDeparted | The vehicle left. |
Implementation notes
The station owns the transaction id. It is a string, not the integer 1.6 used, and it is generated locally. Any CSMS logic that assigned ids has nothing to do here.
`chargingState` is where the detail went. StatusNotification collapsed Charging and SuspendedEV into Occupied, so this field is now the only place that distinction exists.
Honour `offline: true`. It marks events generated during a disconnection, replayed later with their original timestamps. Treating them as live produces out-of-order sessions.
seqNo gaps mean lost events. A CSMS should detect them rather than assume the sequence is complete.