Skip to main content

Deployment statuses

A deployment is always in exactly one status.
StatusMeaningTerminal
queuedCreated, about to start.no
buildingAt least one service is building.no
deployingImages ready; containers starting.no
healthyEvery public service is ready. The TTL clock starts here for ephemeral deploys.no — can still be superseded or torn down
sleepingA PR preview is idle and scaled to zero; wakes on the next request. See Sleep.no
resumingA request arrived for a sleeping preview; scaling back up (usually 5–20s).no
failedA build, deploy, or healthcheck failed. Reason in failure_reason.yes
cancelledCancelled by you, or superseded mid-build by a newer commit.yes
supersededA newer healthy deployment for the same branch took over, or an ephemeral TTL expired.yes
queued ──► building ──► deploying ──► healthy ──► superseded
   └──────────┴─────────────┴──► cancelled / failed
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.
StatusMeaningTerminal
creatingRow exists; no deploy yet.no
deployingOne or more components in flight.no
healthyEvery component is healthy. TTL clock starts here.no
degradedAt least one component failed, but others keep serving.no
failedEvery component failed on first deploy.yes (until a redeploy)
sleeping / resumingA PR-spawned instance is idle / waking. Primary instances never sleep.no
tearing_down / torn_downTeardown 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.
KindWhenPayload
queuedDeployment created.
secrets_resolvedSecret references looked up.{ secrets: [{name, scope, source}] } — never values
vars_resolvedVariable references looked up.{ vars: [{name, scope, source, value}] } — values included
registries_resolvedPrivate-registry credentials assembled.{ registries: [...] }
service_refs_resolvedEvery ${service.*} reference matched a sibling.{ refs: [{service, field}] }
service_refs_unresolvedA ${service.*} reference couldn’t resolve; the deploy is failing.{ errors: [{ref, reason}] }, reason ∈ unknown / no_port / no_public_port
build_start / build_endPer buildable service — build started / finished (fresh or cached).
deploy_startContainers starting.
cutoverA public service’s URL is live (once per public service).
healthyEvery public service is ready.
failed / cancelledTerminal failure / cancellation.
sleeping / resuming / awakeA PR preview slept, started waking, finished waking.
gcEphemeral TTL expired; torn down.
notification_failedA Slack / Discord / webhook channel rejected delivery.{ channel_id }

Environment events

Surfaced on the environment page’s Log tab.
KindWhen
env_createdAn environment was created.
env_deploy_startAn environment deploy started.
component_deploy_start / component_deploy_endOne component’s deploy started / reached a terminal state.
component_healthy / component_failedOne component flipped healthy / failed.
service_name_conflictTwo components expose the same service name; the deploy was aborted. { service, components }
env_healthy / env_degraded / env_failedThe environment settled in that state.
env_cancelled / env_torn_downThe environment was cancelled / fully torn down.
env_cloneThe environment was cloned from another. { sourceEnvId }
env_sleeping / env_resuming / env_awakeA PR-spawned instance slept / started waking / finished waking.

Volume events

Surfaced as snapshot history on a deployment’s page.
KindWhenPayload
snapshot_takenA snapshot was captured as the new latest.{ sequence, sizeBytes }
snapshot_revertedAn in-place revert restored an earlier snapshot.{ sequence }
snapshot_prunedAn old snapshot was pruned past the retention cap.{ sequence }
clonedA preview seeded its volume from the latest snapshot.{ deploymentId }
failedA 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.
A trialing org is not gated — the card-free trial has full access until it expires.