The message
// CSMS -> charge point
[2, "19223206", "RemoteStartTransaction", {
"connectorId": 1,
"idTag": "DR88231ABCD",
"chargingProfile": {
"chargingProfileId": 4471,
"stackLevel": 2,
"chargingProfilePurpose": "TxProfile",
"chargingProfileKind": "Relative",
"chargingSchedule": {
"chargingRateUnit": "W",
"chargingSchedulePeriod": [{ "startPeriod": 0, "limit": 22000 }]
}
}
}]
// Charge point -> CSMS
[3, "19223206", { "status": "Accepted" }]| Field | Notes |
|---|---|
connectorId | Optional. Omit and the charger picks; include to target a bay. |
idTag | The credential to bill against — carried onto the transaction |
chargingProfile | Optional smart charging limit applied to this session only |
Accepted means the charger will attempt to start. It does not mean charging began. The charger still has to check the connector is free, the cable is connected, and the vehicle is ready. Confirmation is the StartTransaction that follows. This is the same acknowledge-then-confirm shape as OCPI Commands, and the same mistake is made at both layers.Targeting a connector
Omitting connectorId lets the charger choose any available connector, which raises the acceptance rate. Naming one is almost always what you actually want, because a driver is physically standing at a specific bay with a cable already plugged in.
Starting the wrong bay is worse than failing: a driver watches their app say charging while nothing happens at their vehicle, and somewhere across the car park another car begins charging on their credential.
Before sending, check StatusNotification for the target connector. Preparing is the ideal state — cable connected, waiting for authorisation. Sending to a connector in Available with nothing plugged in generally results in the charger waiting and then timing out.
AuthorizeRemoteTxRequests
A configuration key that changes the behaviour of this message significantly.
| Value | Charger does | Consequence |
|---|---|---|
false | Trusts the CSMS and starts | Faster; the CSMS is responsible for authorisation |
true | Sends Authorize for the idTag first | Slower; a second authorisation round trip |
false is the usual production setting. The CSMS just decided this driver may charge — that is why it sent the command — so asking again adds latency for no new information.
Set it to true only where the charger must independently verify, such as a site with its own local authorisation policy. Be aware that on a roaming session this doubles the authorisation path: the CSMS asks the eMSP over OCPI, then the charger asks the CSMS again.
Why it fails
| Symptom | Cause | Tell the driver |
|---|---|---|
Rejected immediately | Connector busy, faulted, or unknown idTag | This charger is not available |
Accepted, no StartTransaction | Nothing plugged in, or the vehicle is not ready | Check the cable is fully inserted |
Accepted, then StartTransaction then immediate stop | CSMS refused in the idTagInfo | Authorisation problem — contact support |
| No response at all | Charger offline | Cannot reach this charger right now |
| Wrong connector starts | connectorId omitted | — a bug, not a driver-facing case |
The second row is the most common real-world failure and it is not a fault. The driver has not plugged in yet, or has not pushed the connector home. A message telling them to check the cable resolves a meaningful share of these without any support contact.
The chain from OCPI
Driver app (eMSP)
│ OCPI START_SESSION { token, location_id, evse_uid }
▼
CPO / CSMS
│ resolve evse_uid → connectorId
│ OCPP RemoteStartTransaction { idTag, connectorId }
▼
Charge point
│ OCPP StartTransaction ← the real confirmation
▼
CPO ──► OCPI CommandResult
──► OCPI Session (ACTIVE)
──► OCPI CDR at the endThree network hops, each able to fail independently. Two rules keep this honest:
- Send the OCPI CommandResult when StartTransaction arrives, not on the OCPP acknowledgement. Forwarding the acknowledgement propagates a false confirmation to the eMSP, which then shows a driver that charging began when it did not.
- Carry
authorization_referencethrough. Stitch it onto the transaction at creation, or the eventual CDR cannot be traced back to the request that caused it.
Production lessons
- Never show success on
Accepted. Wait for StartTransaction. - Always specify
connectorIdwhen the driver is at a known bay. - Check connector status first —
Preparingis the state you want. - Leave
AuthorizeRemoteTxRequestsfalse unless a site genuinely requires local verification. - Never auto-retry. A retry can produce two sessions; check for a StartTransaction first.
- Prompt about the cable on silent failure. It is the most common cause and the easiest fix.
- Measure command-to-StartTransaction latency per charger model. It sets the copy and the timeout your UI needs.
Frequently asked questions
No. It means the charger will attempt to start. It still has to confirm the connector is free, the cable is connected and the vehicle is ready. The real confirmation is the StartTransaction message that follows.
Almost always yes. Omitting it lets the charger pick any available connector, which raises acceptance rates but risks starting a different bay from the one the driver is standing at — a worse outcome than failing.
When true, the charger sends its own Authorize request for the idTag before starting, adding a second round trip. When false it trusts the CSMS and starts immediately. False is the usual production setting, since the CSMS just authorised the driver by sending the command.
Most often because nothing is plugged in, or the connector is not fully seated. It is not a fault, and prompting the driver to check the cable resolves a meaningful share of these without support contact.
When the OCPP StartTransaction arrives, not on the OCPP acknowledgement. Forwarding the acknowledgement propagates a false confirmation to the eMSP, which then tells a driver charging began when it did not.