> ## Documentation Index
> Fetch the complete documentation index at: https://dynamo-csms.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Commission Your First Charge Point Using Dynamo CSMS

> Walk through the installer workflow — sign up, get a project assignment, register a charge point, and hand it over to the site owner.

This guide covers the end-to-end installer workflow in Dynamo CSMS. You will sign up as an installer, retrieve your project assignment, register a charge point, start the commissioning process, and complete the handover to the site owner.

<Note>
  Installers are assigned to projects by the CPO or site owner. You cannot create a project yourself — a CPO must first create the project and add you to it before you can commission charge points under that project.
</Note>

## Prerequisites

* A terminal with `curl` installed.
* A project ID provided by the CPO or site owner who hired you.
* Physical access to the charge point hardware and its serial number.

<Steps>
  <Step title="Sign up as an installer">
    Create your installer account using the signup endpoint. This is separate from the CPO Developer Portal — it is designed for field technicians who authenticate on a per-job basis.

    ```bash theme={null}
    curl -X POST https://api.dynamo-csms.com/api/v1/installer/signup \
      -H "Content-Type: application/json" \
      -d '{
        "email": "alex@acme-ev-installs.com",
        "password": "your-secure-password",
        "full_name": "Alex Technician",
        "phone": "+447700900123",
        "company": "Acme EV Installations"
      }'
    ```

    ```json theme={null}
    {
      "installer_id": "ins_01hx9k2m3n4p",
      "email": "alex@acme-ev-installs.com",
      "status": "pending_verification",
      "message": "Check your email to verify your account before logging in."
    }
    ```

    After verifying your email address, your account status changes to `active`.
  </Step>

  <Step title="Log in and obtain an access token">
    Exchange your credentials for a short-lived access token. Include this token as a Bearer token in all subsequent requests.

    ```bash theme={null}
    curl -X POST https://api.dynamo-csms.com/api/v1/installer/login \
      -H "Content-Type: application/json" \
      -d '{
        "email": "alex@acme-ev-installs.com",
        "password": "your-secure-password"
      }'
    ```

    ```json theme={null}
    {
      "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_type": "Bearer",
      "expires_in": 3600,
      "installer_id": "ins_01hx9k2m3n4p"
    }
    ```

    The token expires after one hour. Call the login endpoint again to refresh it.

    <Tip>
      Store the `access_token` value in a variable in your shell session so you don't have to paste it into every command: `export TOKEN="eyJhbGci..."`.
    </Tip>
  </Step>

  <Step title="Retrieve your project assignment">
    List the projects you have been assigned to. The CPO or site owner adds your installer ID to a project before you arrive on site.

    ```bash theme={null}
    curl -X GET https://api.dynamo-csms.com/api/v1/installer/projects \
      -H "Authorization: Bearer $TOKEN"
    ```

    ```json theme={null}
    {
      "projects": [
        {
          "project_id": "proj_01hx5t6u7v8w",
          "name": "Riverside Business Park — Phase 1",
          "site_address": "Unit 12, Riverside Business Park, London E1W 3SJ",
          "charge_points_expected": 6,
          "charge_points_commissioned": 0,
          "status": "in_progress",
          "assigned_at": "2026-04-28T08:00:00Z"
        }
      ]
    }
    ```

    Note the `project_id` — you will use it when registering charge points and completing the handover.

    <Warning>
      If no projects appear in the list, ask the CPO to verify they have added your `installer_id` (`ins_01hx9k2m3n4p`) to the project in their portal.
    </Warning>
  </Step>

  <Step title="Register the charge point">
    Register the physical charge point against your project. You will need the serial number printed on the hardware label, and the OCPP protocol the unit uses.

    ```bash theme={null}
    curl -X POST https://api.dynamo-csms.com/api/v1/installer/charge-points \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "project_id": "proj_01hx5t6u7v8w",
        "serial_number": "SN-ABX-20240501-007",
        "model": "Alpitronic HYC300",
        "vendor": "Alpitronic",
        "ocpp_version": "2.0.1",
        "max_power_kw": 300,
        "connector_count": 2,
        "location": {
          "latitude": 51.5074,
          "longitude": -0.1278,
          "description": "Bay 4, Level P1"
        }
      }'
    ```

    ```json theme={null}
    {
      "charge_point_id": "cp_01hxab1c2d3e",
      "ocpp_endpoint": "wss://ocpp.dynamo-csms.com/ocpp/2.0.1/cp_01hxab1c2d3e",
      "status": "registered",
      "provisioning_password": "ocpp-prov-secret-xyz",
      "created_at": "2026-05-01T10:23:00Z"
    }
    ```

    Configure the charge point's OCPP backend URL to the `ocpp_endpoint` value returned in the response, and enter the `provisioning_password` as the OCPP Basic Auth password. Consult the charge point manufacturer's manual for where to enter these settings.
  </Step>

  <Step title="Start commissioning">
    Once the charge point is powered and has connected to the OCPP backend, start the commissioning sequence. This triggers automated checks: connectivity verification, firmware version recording, and initial heartbeat confirmation.

    ```bash theme={null}
    curl -X POST https://api.dynamo-csms.com/api/v1/installer/commissioning/cp_01hxab1c2d3e/start \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "run_connectivity_test": true,
        "run_meter_calibration": true,
        "notes": "Installed in underground car park — check signal strength."
      }'
    ```

    ```json theme={null}
    {
      "commissioning_id": "comm_01hxef4g5h6i",
      "charge_point_id": "cp_01hxab1c2d3e",
      "status": "in_progress",
      "checks": [
        { "name": "ocpp_connection", "status": "passed" },
        { "name": "heartbeat", "status": "passed" },
        { "name": "meter_calibration", "status": "in_progress" },
        { "name": "firmware_version", "status": "passed", "value": "3.4.1" }
      ],
      "started_at": "2026-05-01T10:31:00Z"
    }
    ```

    Poll the commissioning status or wait for the webhook event `commissioning.completed` to confirm all checks have passed before proceeding to handover.

    <Tip>
      Ask the CPO to configure a webhook endpoint for `commissioning.completed` events before you arrive on site. This means the site owner receives an instant notification when the charger goes live. See the [Webhooks guide](/guides/webhooks).
    </Tip>
  </Step>

  <Step title="Complete handover to the site owner">
    After all commissioning checks pass, mark the project as handed over. This transfers operational responsibility from you to the site owner and locks the project against further installer modifications.

    ```bash theme={null}
    curl -X POST https://api.dynamo-csms.com/api/v1/installer/projects/proj_01hx5t6u7v8w/complete-handover \
      -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" \
      -d '{
        "signed_by": "Alex Technician",
        "handover_notes": "All 6 bays commissioned. Bay 3 connector 2 required firmware update — completed on site.",
        "site_contact_name": "Sarah Owen",
        "site_contact_email": "s.owen@riversidebp.co.uk"
      }'
    ```

    ```json theme={null}
    {
      "project_id": "proj_01hx5t6u7v8w",
      "status": "handed_over",
      "handover_certificate_url": "https://api.dynamo-csms.com/certificates/proj_01hx5t6u7v8w.pdf",
      "handed_over_at": "2026-05-01T14:45:00Z"
    }
    ```

    The `handover_certificate_url` points to a signed PDF you can download and share with the site owner for their records. The CPO and site owner both receive an email notification confirming the handover.
  </Step>
</Steps>

## Commissioning checklist

Before you complete the handover, verify all of the following on site:

* Charge point is powered and the display shows a ready or available state.
* OCPP connection is established (the `ocpp_connection` commissioning check shows `passed`).
* At least one heartbeat has been received by the platform.
* Meter calibration is complete if the charge point supports it.
* Emergency stop button has been tested.
* Cable management and enclosure IP rating have been visually inspected.
* Site owner or their representative has been briefed on how to report faults.

## Troubleshooting common issues

<AccordionGroup>
  <Accordion title="The charge point does not appear in my project">
    Verify the `project_id` you used when registering the charge point matches the project returned by `GET /api/v1/installer/projects`. If they differ, contact the CPO to re-assign you to the correct project.
  </Accordion>

  <Accordion title="The OCPP connection check keeps failing">
    Check that the charge point has been configured with the exact `ocpp_endpoint` URL returned during registration. Common issues include missing trailing slashes, incorrect protocol (`ws://` vs `wss://`), and firewall rules blocking outbound WebSocket traffic on port 443.
  </Accordion>

  <Accordion title="My access token expired mid-job">
    Tokens expire after 60 minutes. Call `POST /api/v1/installer/login` again with your credentials to obtain a fresh token. Commissioning state is saved server-side, so you can resume from the last completed check.
  </Accordion>

  <Accordion title="The handover endpoint returns 403 Forbidden">
    Handover is only available when all charge points in the project have a commissioning status of `completed`. Check the commissioning status of each charge point in the project and resolve any outstanding failures first.
  </Accordion>
</AccordionGroup>
