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

FieldTypeRequiredDescription
eventTypeTransactionEventEnumTypeRequiredStarted, Updated or Ended.
timestampdateTimeRequiredWhen the event occurred.
triggerReasonTriggerReasonEnumTypeRequiredWhat caused this event to be sent.
seqNointegerRequiredSequence number within the transaction, starting at 0.
transactionInfoTransactionTypeRequiredContains transactionId and optionally chargingState, stoppedReason and remoteStartId.
offlinebooleanOptionalTrue when the event was generated while disconnected. Defaults to false.
meterValueMeterValue[]OptionalMeter readings attached to this event.
evseEVSETypeOptionalWhich EVSE and connector. Required on the Started event.
idTokenIdTokenTypeOptionalThe token. Required on Started unless the transaction began without authorization.
numberOfPhasesUsedintegerOptionalPhases actually in use.
cableMaxCurrentintegerOptionalMaximum current the attached cable supports, in amperes.
reservationIdintegerOptionalThe reservation this transaction fulfils.
json
[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

FieldTypeRequiredDescription
totalCostdecimalOptionalRunning cost of the transaction, when the CSMS tracks cost.
chargingPriorityintegerOptionalPriority from -9 to 9, used by smart charging.
idTokenInfoIdTokenInfoTypeOptionalAuthorization result. Returned on Started when an idToken was supplied.
updatedPersonalMessageMessageContentTypeOptionalA message to show the driver.
json
[3, "19223201", {
  "idTokenInfo": { "status": "Accepted" },
  "totalCost": 4.35
}]

Values

TransactionEventEnumType

ValueMeaning
StartedThe transaction has begun. Carries evse and usually idToken.
UpdatedAn in-progress update — meter values, a state change, a periodic sample.
EndedThe transaction has finished. transactionInfo.stoppedReason says why.

ChargingStateEnumType

ValueMeaning
ChargingEnergy is flowing.
EVConnectedCable connected, not charging.
SuspendedEVThe vehicle paused the draw.
SuspendedEVSEThe station paused delivery.
IdleNo vehicle connected.

TriggerReasonEnumType (selected)

ValueMeaning
AuthorizedA token was authorized.
CablePluggedInThe cable was connected.
ChargingStateChangedThe charging state changed.
MeterValuePeriodicA periodic meter sample.
MeterValueClockA clock-aligned meter sample.
EVCommunicationLostCommunication with the vehicle was lost.
RemoteStartA RequestStartTransaction.
RemoteStopA RequestStopTransaction.
StopAuthorizedA token authorized the stop.
EVDepartedThe 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.