Comparison · OCPP · 12 min read

OCPP 1.6 vs 2.0.1: What Really Changed

TransactionEvent replaces Start/Stop, Variables replace Configuration, IdTag becomes an IdToken object — the breaking changes you actually need to know before migrating your CSMS or Charge Point.

Published · Reviewed against official OCA specification
RC
By Rodolfo Carrillo
Quick answer

OCPP 2.0.1 is not backwards-compatible with 1.6. The biggest breaking changes are: StartTransaction / StopTransactionTransactionEvent; GetConfiguration / ChangeConfigurationGetVariables / SetVariables; and IdTag (string) → IdToken (object with a required type field).

Why the jump matters

OCPP 1.6 was released in 2015 and became the dominant protocol for EV charging infrastructure worldwide. OCPP 2.0.1, published in 2020, is not an incremental update — it is a ground-up redesign that addresses the structural limitations of 1.6: flat configuration keys, a binary transaction model, weak security primitives, and no native support for smart charging automation.

If you are building a new CSMS integration today, 2.0.1 is the correct target. If you maintain a 1.6 fleet, the information below will tell you exactly what breaks and what stays the same.

At a glance

Stays the same

  • WebSocket transport (OCPP-J)
  • Heartbeat mechanism
  • BootNotification concept
  • StatusNotification concept
  • Authorize flow
  • CALL / CALLRESULT / CALLERROR frame format

Breaking changes

  • Transaction message names & payloads
  • Configuration API (keys → variables)
  • Authentication token format
  • BootNotification payload structure
  • Status values (connector states)
  • Security model (certificate profiles)

Message renames & replacements

The table below maps every message that was renamed, replaced, or split across the two versions. Messages not listed here have the same name and largely the same behaviour in both versions.

OCPP 1.6 message OCPP 2.0.1 equivalent Notes
StartTransaction TransactionEvent (Started) Single message now covers start, update, and end via eventType.
StopTransaction TransactionEvent (Ended) Meter values during the session use TransactionEvent (Updated).
GetConfiguration GetVariables Keys replaced by component/variable objects. Multiple variables per request.
ChangeConfiguration SetVariables Batch updates supported; each variable reports its own status.
GetLocalListVersion GetLocalListVersion Same concept; payload slightly restructured.
SendLocalList SendLocalList IdTag entries replaced by IdToken objects.
DiagnosticsStatusNotification LogStatusNotification Renamed and status enum updated.
FirmwareStatusNotification FirmwareStatusNotification Same name, but the status enum has more granular values.
MeterValues MeterValues / TransactionEvent Periodic meter values still use MeterValues; transaction meter values are embedded in TransactionEvent.

Payload-level changes

TransactionEvent replaces StartTransaction + StopTransaction

In OCPP 1.6, a transaction requires two separate messages: StartTransaction at the start of a session and StopTransaction at the end. In OCPP 2.0.1, both are unified into TransactionEvent, which uses an eventType field to signal the lifecycle phase: Started, Updated, or Ended.

OCPP 1.6 — StartTransaction
"connectorId": 1, "idTag": "ABC123", "meterStart": 1204, "timestamp": "2025-05-12T10:00:00Z"
OCPP 2.0.1 — TransactionEvent (Started)
"eventType": "Started", "timestamp": "2025-05-12T10:00:00Z", "triggerReason":"Authorized", "seqNo": 0, "transactionInfo": "transactionId": "tx-001"

BootNotification payload restructured

The flat 1.6 payload becomes a nested structure in 2.0.1. Vendor name max length doubles from 20 to 50 characters. The new reason field is required in 2.0.1. See the BootNotification guide for the full side-by-side comparison.

Authentication & IdToken

One of the most impactful structural changes for RFID-heavy deployments is the evolution of the authorization token.

Attribute OCPP 1.6 — IdTag OCPP 2.0.1 — IdToken
Data type Plain string (max 20 chars) Object: { idToken: string, type: enum }
Token type Implicit (always RFID / plain string) Explicit: ISO14443, ISO15693, MacAddress, eMAID, EVCCID, KeyCode, Local, NoAuthorization, Central
Group token Not supported Optional groupIdToken for fleet/family grouping
Authorization result Accepted, Blocked, Expired, Invalid, ConcurrentTx Accepted, Blocked, ConcurrentTx, Expired, Invalid, NoCredit, NotAllowedTypeEVSE, NotAtThisLocation, NotAtThisTime, Unknown
OCPP 1.6 — Authorize request
"idTag": "ABC123456789"
OCPP 2.0.1 — Authorize request
"idToken": "idToken": "ABC123456789", "type": "ISO14443"

Configuration → Variables

OCPP 1.6 manages Charge Point settings through flat key-value pairs using GetConfiguration and ChangeConfiguration. OCPP 2.0.1 replaces this with a component/variable hierarchy accessed via GetVariables and SetVariables.

OCPP 1.6 — ChangeConfiguration
"key": "HeartbeatInterval", "value": "300"
OCPP 2.0.1 — SetVariables
"setVariableData": [ "component": "name": "OCPPCommCtrlr" , "variable": "name": "HeartbeatInterval" , "attributeValue": "300" ]

The variable system is more expressive but significantly more verbose. Batch operations are now native — you can get or set multiple variables in a single message — and each variable in a SetVariables response carries its own acceptance status (Accepted, Rejected, NotSupported, etc.).

Security profile

OCPP 1.6 left security largely to the implementer. OCPP 2.0.1 defines three mandatory security profiles, each building on the previous (Open Charge Alliance, 2020):

1

Security Profile 1 — HTTP Basic Auth over TLS

Username/password in the WebSocket upgrade request, transported over a TLS channel. Minimum acceptable in most production networks.

2

Security Profile 2 — Client-side TLS certificate

The Charge Point presents a certificate signed by the CSMS CA. The CSMS authenticates the device without a password. Eliminates shared-secret risks.

3

Security Profile 3 — Mutual TLS (mTLS)

Both sides present certificates. The gold standard for high-security deployments. Required for some regulatory environments in Europe.

New in 2.0.1 only

These messages and capabilities have no equivalent in OCPP 1.6:

Feature / Message What it does
NotifyEvent Charge Point reports hardware/software events to the CSMS (door open, connector fault, etc.) using a structured component/variable/event hierarchy.
NotifyReport Response to a GetReport request — delivers a paginated list of all component variables and their current values.
SetMonitoringBase / Level CSMS configures the monitoring threshold profile on the Charge Point, replacing ad-hoc alert configuration in 1.6.
GetChargingProfiles CSMS retrieves active smart charging profiles. In 1.6, profiles could only be cleared or overwritten, never read back.
InstallCertificate / DeleteCertificate CSMS manages the Charge Point's certificate store over-the-air — required for Profile 2 and 3 deployments.
PublishFirmware / UnpublishFirmware Local controller acts as firmware distribution point for Charge Points on the same local network, reducing WAN load in large deployments.

Migration tips

  1. Run both versions in parallel. Most production CSMSes support 1.6 and 2.0.1 simultaneously. Route Charge Points by the OCPP version declared in their WebSocket subprotocol header (ocpp1.6 vs ocpp2.0.1). Migrate hardware incrementally.
  2. Map IdTag to IdToken early. Your authorization database stores tokens as strings today. Design the IdToken object wrapper and the type mapping before writing any 2.0.1 transaction code — it touches every Authorize, StartTransaction, and local list operation.
  3. Audit your configuration key usage. Build an explicit map of every GetConfiguration / ChangeConfiguration call in your CSMS and find the corresponding 2.0.1 component/variable name. The OCA published a compatibility appendix that covers the most common standard configuration keys.
  4. Test BootNotification first. It is the entry point for every session. Validate both the 2.0.1 request payload (nested chargingStation, mandatory reason) and the response handling in the 2.0.1 Validator before touching transactions.
  5. Plan for TransactionEvent's seqNo. Every TransactionEvent carries a sequence number. Missed events must be retransmitted in order. Your Charge Point firmware needs a persistent queue if it reconnects mid-transaction.
RC

Rodolfo Carrillo

OCPP integration engineer and creator of OCPP Tools. All articles are verified against the official Open Charge Alliance specification and tested using the on-site tools.

Tool

Build a frame in seconds

Form-driven payload builder — pick fields, get a valid frame, copy to clipboard.

Open Builder →

Frequently asked questions

Is OCPP 2.0.1 backwards-compatible with OCPP 1.6?
No. OCPP 2.0.1 is not backwards-compatible. Message names, payload structures, and field names changed significantly. A 1.6 Charge Point cannot communicate with a 2.0.1-only CSMS without protocol translation. Many CSMS vendors support both versions simultaneously.
What replaced StartTransaction and StopTransaction in OCPP 2.0.1?
Both messages were replaced by a single TransactionEvent message. It carries an eventType field (Started, Updated, or Ended) that covers the entire transaction lifecycle, including intermediate updates like meter values during a session.
What is the difference between IdTag (1.6) and IdToken (2.0.1)?
In OCPP 1.6, an IdTag is a plain string (max 20 characters). In OCPP 2.0.1, IdToken is an object with an idToken string field and a required type field (ISO14443, ISO15693, MacAddress, eMAID, EVCCID, KeyCode, Local, NoAuthorization, or Central). This allows different authentication technologies to coexist.
What replaced GetConfiguration and ChangeConfiguration?
In OCPP 2.0.1, GetConfiguration and ChangeConfiguration were replaced by GetVariables and SetVariables. Variables use a component/variable hierarchy instead of flat key strings, enabling more structured configuration management.
Does OCPP 2.0.1 support TLS mutual authentication?
Yes. OCPP 2.0.1 defines Security Profile 3 which requires mutual TLS (mTLS) — both the Charge Point and the CSMS must present valid certificates. Profiles 1 and 2 cover basic HTTP auth and one-way TLS respectively.
Is the Heartbeat message the same in OCPP 2.0.1?
Yes. Heartbeat works identically in both versions — an empty request payload, a response with currentTime. The interval is still set by the CSMS in the BootNotification response.

Sources & further reading

  • · Open Charge Alliance. (2015). Open Charge Point Protocol 1.6, Edition 2. https://openchargealliance.org/my-oca/ocpp/
  • · Open Charge Alliance. (2020). Open Charge Point Protocol 2.0.1. https://openchargealliance.org/my-oca/ocpp/
  • · Open Charge Alliance. (2020). OCPP 2.0.1 Security Whitepaper, Edition 2. https://openchargealliance.org/my-oca/ocpp/
Last technical review: May 12, 2025

Continue learning