OCPP 2.0.1 is not backwards-compatible with 1.6. The biggest breaking changes are:
StartTransaction / StopTransaction → TransactionEvent;
GetConfiguration / ChangeConfiguration → GetVariables / 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.
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.
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 |
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.
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):
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.
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.
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
- 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.6vsocpp2.0.1). Migrate hardware incrementally. - Map IdTag to IdToken early. Your authorization database stores tokens as
strings today. Design the IdToken object wrapper and the
typemapping before writing any 2.0.1 transaction code — it touches every Authorize, StartTransaction, and local list operation. - Audit your configuration key usage. Build an explicit map of every
GetConfiguration/ChangeConfigurationcall 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. - Test BootNotification first. It is the entry point for every session.
Validate both the 2.0.1 request payload (nested
chargingStation, mandatoryreason) and the response handling in the 2.0.1 Validator before touching transactions. - 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.
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.
Build a frame in seconds
Form-driven payload builder — pick fields, get a valid frame, copy to clipboard.
Frequently asked questions
Is OCPP 2.0.1 backwards-compatible with OCPP 1.6?
What replaced StartTransaction and StopTransaction in OCPP 2.0.1?
What is the difference between IdTag (1.6) and IdToken (2.0.1)?
What replaced GetConfiguration and ChangeConfiguration?
Does OCPP 2.0.1 support TLS mutual authentication?
Is the Heartbeat message the same in OCPP 2.0.1?
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/