Deployment statuses
A deployment is always in exactly one status.| Status | Meaning | Terminal |
|---|---|---|
queued | Created, about to start. | no |
building | At least one service is building. | no |
deploying | Images ready; containers starting. | no |
healthy | Every public service is ready. The TTL clock starts here for ephemeral deploys. | no — can still be superseded or torn down |
sleeping | A PR preview is idle and scaled to zero; wakes on the next request. See Sleep. | no |
resuming | A request arrived for a sleeping preview; scaling back up (usually 5–20s). | no |
failed | A build, deploy, or healthcheck failed. Reason in failure_reason. | yes |
cancelled | Cancelled by you, or superseded mid-build by a newer commit. | yes |
superseded | A newer healthy deployment for the same branch took over, or an ephemeral TTL expired. | yes |
cancelled and failed are reachable from any non-terminal status; superseded only from healthy. The deployments list shows status as a coloured pill and can filter to one status at a time.
Environment statuses
Environments have their own state machine, separate from their component deployments.| Status | Meaning | Terminal |
|---|---|---|
creating | Row exists; no deploy yet. | no |
deploying | One or more components in flight. | no |
healthy | Every component is healthy. TTL clock starts here. | no |
degraded | At least one component failed, but others keep serving. | no |
failed | Every component failed on first deploy. | yes (until a redeploy) |
sleeping / resuming | A PR-spawned instance is idle / waking. Primary instances never sleep. | no |
tearing_down / torn_down | Teardown in progress / complete. The row stays for history. | torn_down: yes |
degraded is soft — redeploying the failing component flips it back to healthy. See Environment lifecycle.
Deployment events
Every state change writes an event. These form the timeline on the deployment page.| Kind | When | Payload |
|---|---|---|
queued | Deployment created. | — |
secrets_resolved | Secret references looked up. | { secrets: [{name, scope, source}] } — never values |
vars_resolved | Variable references looked up. | { vars: [{name, scope, source, value}] } — values included |
registries_resolved | Private-registry credentials assembled. | { registries: [...] } |
service_refs_resolved | Every ${service.*} reference matched a sibling. | { refs: [{service, field}] } |
service_refs_unresolved | A ${service.*} reference couldn’t resolve; the deploy is failing. | { errors: [{ref, reason}] }, reason ∈ unknown / no_port / no_public_port |
build_start / build_end | Per buildable service — build started / finished (fresh or cached). | — |
deploy_start | Containers starting. | — |
cutover | A public service’s URL is live (once per public service). | — |
healthy | Every public service is ready. | — |
failed / cancelled | Terminal failure / cancellation. | — |
sleeping / resuming / awake | A PR preview slept, started waking, finished waking. | — |
gc | Ephemeral TTL expired; torn down. | — |
notification_failed | A Slack / Discord / webhook channel rejected delivery. | { channel_id } |
Environment events
Surfaced on the environment page’s Log tab.| Kind | When |
|---|---|
env_created | An environment was created. |
env_deploy_start | An environment deploy started. |
component_deploy_start / component_deploy_end | One component’s deploy started / reached a terminal state. |
component_healthy / component_failed | One component flipped healthy / failed. |
service_name_conflict | Two components expose the same service name; the deploy was aborted. { service, components } |
env_healthy / env_degraded / env_failed | The environment settled in that state. |
env_cancelled / env_torn_down | The environment was cancelled / fully torn down. |
env_clone | The environment was cloned from another. { sourceEnvId } |
env_sleeping / env_resuming / env_awake | A PR-spawned instance slept / started waking / finished waking. |
Volume events
Surfaced as snapshot history on a deployment’s page.| Kind | When | Payload |
|---|---|---|
snapshot_taken | A snapshot was captured as the new latest. | { sequence, sizeBytes } |
snapshot_reverted | An in-place revert restored an earlier snapshot. | { sequence } |
snapshot_pruned | An old snapshot was pruned past the retention cap. | { sequence } |
cloned | A preview seeded its volume from the latest snapshot. | { deploymentId } |
failed | A volume operation errored. | { error } |
Billing gating
Write actions (deploy, create environment, add a member, provision storage) are gated on the org’s billing state:- Paused (suspended). When a card-free trial expires, or a paid invoice fails, and the grace period elapses without payment, the org is paused: every environment is scaled to zero and write actions return 402 Payment Required with
billing: organization is suspended for non-payment. Adding a payment method on Settings → Billing resumes the org and scales its environments back up automatically. - No plan assigned. In the rare case an org has no plan at all (no default plan is configured for the install), the API returns 402 Payment Required with
billing: organization has no plan assigned, and the console routes to the plan picker.