Log inTalk to us
Getting started

Check that a project is ready to go live

Before drivers pay at your chargers, a project needs a payment account, prices, tax, your branding and chargers that are connected and configured the way the project expects. GET /v1/tenants/{tenant_id}/go-live checks all of it in one read and tells you what is left to fix.

The report is read-only. It is computed from what Ivora already recorded: your project settings, tariffs, locations and keys, and the configuration each charger last reported. Nothing is sent to a charger and nothing is changed. Any project member can read it (stations:read), including a viewer and an API key bound to the project.

# Set IVORA_API_KEY securely in your shell environment first.
curl --fail-with-body https://api.ivoracharge.com/v1/tenants/TENANT_ID/go-live \
  -H "Authorization: Bearer $IVORA_API_KEY"

Reading the report

overall is the verdict:

overallMeaning
readyEvery check passes or does not apply.
ready_with_warningsNothing blocks going live, but some checks warn. Read them first.
not_readyAt least one check fails. Fix those before drivers pay.

payment_mode is live where the environment takes real card payments and test where no real card is charged.

Each entry in checks has:

  • status: pass, warn, fail or n/a (the check does not apply to this project, for example QR stickers when you have none);
  • reason: one line on the result;
  • fix: how to fix it, when the status is warn or fail;
  • dashboard_path: the dashboard page that fixes it, relative to the project (for example settings/payouts);
  • counts: how many items (stations, connectors, locations...) have each status, and items: the ones that did not pass, worst first (at most 100).
{
  "tenant_id": 18,
  "overall": "not_ready",
  "payment_mode": "live",
  "checked_at": "2026-11-04T12:00:00+00:00",
  "counts": {"pass": 11, "warn": 2, "fail": 1, "n/a": 1},
  "checks": [
    {
      "id": "tariffs",
      "title": "Tariffs",
      "status": "fail",
      "reason": "1 of 8 connectors cannot be billed",
      "fix": "Give every connector a tariff (its own, its location's default or the project's default) in the project's currency, with an authorization hold within the card range.",
      "dashboard_path": "tariffs",
      "counts": {"pass": 7, "warn": 0, "fail": 1, "n/a": 0},
      "items": [
        {"kind": "connector", "id": "41/2", "name": "CP-0041 connector 2", "status": "fail",
         "reason": "No tariff: no own tariff and no location or project default"}
      ]
    }
  ]
}

The checks

idPasses whenFails or warns when
paymentsThe project's Stripe account is active and takes charges, as Stripe last reported it (the reason says when; open Settings, Payouts to refresh).Fails without an account, while it awaits approval, while charges are disabled, or when the account cannot be read right now (readiness is never assumed).
currencyThe project's default currency is supported and is the one its Stripe account takes.Fails on a mismatch (for example a CAD project with a US account); warns when the account cannot be read to compare.
taxEach location states its tax, or is in a place without a charging tax preset. Taxed locations say whether prices include tax.Warns for a location in a Canadian province or territory, or a US state with a charging tax preset, that has no tax set, and for a location without a country. US sales tax is yours to add where it applies.
tariffsEvery connector has a usable tariff: its own, its location's default or the project's default.Fails for a connector without a tariff, with an archived one, in another currency than the project's or the Stripe account's, or with an authorization hold outside the card range (GET /v1/currencies). Free tariffs need no hold.
business_profileDriver branding is set with a support contact and a terms page.Fails without branding (drivers see Ivora's name); warns without a support email or page, or without a terms page.
chargers_onlineEvery charger is connected.Fails for an offline charger or a project without chargers; warns for a connected charger that has been silent for longer than 15 minutes and three heartbeats.
charger_configurationIvora recorded each charger's configuration.Warns for a charger whose configuration was never read. Refresh it while the charger is online.
charger_urlThe connection URL each charger reports leads to the project: the base URL once, followed by its charger ID once, or your own OCPP domain.Fails when the URL names the charger ID twice or leads to another path; warns for another host, which works only while a proxy forwards the charger. n/a for chargers that do not report their URL.
charger_securityEach charger has a connection password.Fails without one; warns when the charger reports security profile 0 although a password is stored.
heartbeat_intervalEach charger uses the heartbeat interval set for the project or the station.Warns when it reports another one.
offline_authorizationNo charger with paid tariffs may start charging while offline.Warns when LocalAuthorizeOffline, LocalAuthListEnabled or AllowOfflineTxForUnknownId (or their OCPP 2.x variables) are on at a charger with paid tariffs: drivers may charge unbilled while it is offline.
screen_priceCharger screens that can show a price show the current one.Warns when the price is off at a charger with paid tariffs, not sent yet, refused, or different from the price its tariff gives now. n/a for chargers without a screen price Ivora can set.
checkout_keyDriver checkout runs on project credentials: a project API key or a checkout app.Fails when it runs on a team member's personal key, which stops working when that person leaves; warns when no driver checkout is set up.
qr_codesEach registered QR sticker points at one of the project's stations and EVSEs.Fails for a sticker of a station or EVSE the project no longer has.
payment_domainYour custom payment domain is active.Fails when the domain chosen for checkout is not active (checkout then uses Ivora's domain); warns for another domain that is not active yet. n/a without a custom domain.

A very large project can have more stations, locations, tariffs or recorded charger settings than one report reads (5,000 of each). The checks those reads feed then warn and their reason ends with incomplete: ...; they never pass on a partial read.

The report needs the charging core: if it cannot be read, the request fails with 502 or 503 instead of returning a partial report. Try again later.

Run the check again after each fix: it reads the current state every time.