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:
overall | Meaning |
|---|---|
ready | Every check passes or does not apply. |
ready_with_warnings | Nothing blocks going live, but some checks warn. Read them first. |
not_ready | At 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,failorn/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 iswarnorfail;dashboard_path: the dashboard page that fixes it, relative to the project (for examplesettings/payouts);counts: how many items (stations, connectors, locations...) have each status, anditems: 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
id | Passes when | Fails or warns when |
|---|---|---|
payments | The 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). |
currency | The 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. |
tax | Each 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. |
tariffs | Every 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_profile | Driver 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_online | Every 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_configuration | Ivora recorded each charger's configuration. | Warns for a charger whose configuration was never read. Refresh it while the charger is online. |
charger_url | The 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_security | Each charger has a connection password. | Fails without one; warns when the charger reports security profile 0 although a password is stored. |
heartbeat_interval | Each charger uses the heartbeat interval set for the project or the station. | Warns when it reports another one. |
offline_authorization | No 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_price | Charger 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_key | Driver 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_codes | Each 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_domain | Your 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.



