The two shapes
- OCPP
- OCPI
A charge point is identified by a charger ID: whatever your CSMS already uses to name a charge point.
OCPP identity is known at connect time — you resolve the charge point during the WebSocket handshake, before any frame arrives — so you supply it once per connection and the session handle carries it for every frame.
Tenants
tenantId and tenantName are optional, and all-or-nothing: supply both or neither. A half-set pair fails validation and the message is dropped.
Use tenants when one deployment serves several distinct operators — a CPO platform hosting sub-operators, a white-label CSMS, a hub carrying several parties. The dashboard uses them to filter chargers, platforms, messages, and issues, and to report per-tenant activity.
Choosing good identifiers
Use the ID your systems already use
Use the ID your systems already use
A charger ID should be the same string your CSMS, your support tooling, and your field team all say out loud. Usually that’s the OCPP identity from the WebSocket URL path. Don’t mint an EVPanda-specific ID — you’ll spend the rest of the year translating between them.
Keep IDs stable, keep names readable
Keep IDs stable, keep names readable
platformId and tenantId group your data over time, so they must not change for the same entity. platformName and tenantName are display strings, and can be updated freely; EVPanda shows the most recent one it has seen.Don't put secrets in identity fields
Don't put secrets in identity fields
Identity is stored and shown in the dashboard. It should identify a partner or a charger, not authenticate one. Never pass a token, a Token B, or a client certificate fingerprint as an ID.
Mind the length limits
Mind the length limits
The ingestion API rejects a message whose
tenantName exceeds 32 characters, or whose other identity fields exceed 64. Long partner names get truncated at the source, not in the dashboard — trim them before you pass them in.What happens to an unattributable message
The SDK validates identity at capture, before anything is buffered. A message that fails validation is dropped silently — it is not queued, not sent, and never raises an error into your code. An identity is invalid when:- A required field is empty, missing, or whitespace only.
- Exactly one of
tenantId/tenantNameis set.
In Go, read
panda.Stats().DroppedInvalid. In Node and Python, turn on debug. See Getting started.
The HTTP adapters treat “no identity” as “don’t capture”, not as an error. A request the adapter can’t attribute is served exactly as it would have been — your partners never see a difference.