View Categories

Suspending, Unsuspending and Terminating a Service

Suspension withholds a service; termination destroys it. RackHelm keeps both as two separate things: a local status on the package, and a remote call to the control panel or registrar. Knowing which of the two a given button performs is the difference between a customer who is merely locked out and one whose server no longer exists. This article is for operators and staff.

Before you start #

Note: These actions are gated separately from ordinary order editing. Suspending needs suspend_services; bringing a service back needs unsuspend_services; cancelling or terminating needs cancel_orders; deleting a package needs delete_orders, plus cancel_orders if you also tick the remote teardown. edit_orders alone is not enough for any of them.

Local status versus the remote service #

This is the single most important distinction on this page.

Action Changes the local record Calls the remote system
Package screen → Service Status → Suspended Yes No
Package screen → Service Status → Active Yes No
Package screen → Service Status → Cancelled Yes No
Automatic overdue suspension Yes Yes
Automatic reactivation when an invoice is paid Yes Yes
Addon Terminate button Yes Yes
Delete package with Also terminate the live remote service ticked Yes Yes
Automatic overdue termination Yes Yes
Cancellation reaching its expiry date Yes Yes

Warning: Setting Service Status to Suspended on the package screen does not switch anything off. The customer’s account shows as suspended and stops being billed, but the website, server or mailbox keeps running. RackHelm has no admin button that suspends a live service on demand — remote suspension is driven only by the overdue-payment sweep.

The Service Status dropdown on a package's General Options tab, open to show Active, Pending, Failed, Suspended, Pending Cancellation and Cancelled
Each choice on this dropdown is permission-checked individually before it is applied.

Automatic suspension for non-payment #

The Suspend Overdue Services schedule does the work. On each run it:

  1. Finds every invoice still at pending or unpaid whose due date is on or before today minus the configured number of days. Both statuses count — a declined card leaves an invoice at pending, so filtering on unpaid alone would never suspend a card customer.
  2. Resolves which orders that invoice covers, following both the direct link and the invoice’s own line entries, so merged invoices are handled.
  3. For every item on those orders that is still active and not already suspended: sets the package status to suspended and queues a suspend job against the integration.
  4. Opens a support ticket telling the customer what has happened and that services reactivate automatically once paid.

The day offset comes from the Days Offsets field on that schedule and defaults to 3. Only the first value in the field is used, and anything that resolves to zero or less falls back to 3.

What the suspend job does #

  • Loads the item and its product’s active integration. If either is missing it logs a warning and stops — no status change at all.
  • Calls the driver’s suspend operation.
  • On success, writes provisioning_status = suspended.
  • On failure, writes provisioning_status = failed and stores the reason in provisioning_error, so it surfaces on the package screen and in the Pending Provisioning queue.

Bringing a service back #

Reactivation is automatic and happens the moment an invoice is settled — by the customer, by the automatic payment run, or by an operator marking it paid. RackHelm then, for each order the invoice covered:

  1. Checks whether that order still has any other overdue unpaid invoice. If it does, the services stay suspended and a line is written to the log — paying one invoice does not clear a customer who is still behind on an earlier one.
  2. Otherwise sets every suspended item back to active locally first, so the account reads correctly even if the panel call fails.
  3. Queues an unsuspend job, which calls the driver and writes provisioning_status = provisioned on success, or failed with the reason on error.

To bring a service back by hand without a payment, set Service Status to Active on the package. Remember that this is local only — if the panel really did suspend the account, you will need to lift it there as well.

Terminating a service #

Termination destroys the remote object. There are four routes to it:

Terminating a single addon #

On the package’s Package Addons tab, each active addon carries Terminate (and, while it is active, Cancel, which only marks it pending cancellation). Terminate marks the addon cancelling and dispatches the teardown immediately.

Unticking an addon and pressing Save Configuration does the same thing, which is why that save requires cancel_orders.

Deleting a package #

The Delete Package confirmation modal with an optional Also terminate the live remote service checkbox
Leaving the box unticked removes the package from billing but leaves the customer’s service running.

From All Users → the client → Packages, the bin icon opens a confirmation offering Also terminate the live remote service. With the box left clear, deletion:

  • Soft-deletes the package and its addons, retaining the record for audit.
  • Strips their lines from every outstanding invoice, reducing the invoice by exactly what those lines were worth, and voids any invoice left with nothing to bill.
  • Soft-deletes the order once it has no items left, voiding any of its remaining outstanding invoices first.
  • Leaves the remote service running.

Tick the box and the same happens, plus a teardown job per item — dispatched only after the database work has committed, so a rolled-back delete can never destroy a live service.

Automatic termination for long non-payment #

The Terminate Overdue Services schedule sweeps invoices at pending or unpaid whose due date is on or before today minus its day offset — default 7. For each order it covers, every item not already cancelled or cancelling is marked cancelling and queued for teardown, and the invoice is then voided so the customer cannot pay for a service that has been deleted.

Warning: Saving the Terminate Overdue Services schedule from the admin form always writes its Days Offsets as a list, even when you leave the field blank — and that particular job expects a single number, so it fails with a type error on its next run. If you edit that schedule, check the Queue Monitor’s failed jobs afterwards. The suspension job tolerates the list and takes its first value.

Cancellation reaching its date #

A package left at pending_cancellation is torn down by the Process Cancellations schedule once its expires_at has passed. See Order cancellations.

What the terminate job does #

  1. Loads the item, including soft-deleted ones, so a just-deleted package can still be torn down.
  2. Frees any AI SEO domain slot held by the package and deletes its local scans.
  3. If the item is an addon, it is cancelled locally, the parent order’s status is re-synced, and the parent’s resources are recalculated so the panel gets the reduced grant. Nothing is destroyed remotely — the job looks for the integration on the item’s product, and an addon line carries no product, so this branch is taken for every addon.
  4. Otherwise it calls the driver’s terminate operation. On success it writes provisioning_status = terminated and package status cancelled, and re-syncs the order’s status.
  5. On failure it writes provisioning_status = failed with the reason, and the job itself fails so it appears in the Queue Monitor.

Note: If the product has no active integration, the job logs a warning and stops without changing anything — the item stays at cancelling. That is the usual cause of a package stuck in that state.

Troubleshooting #

Symptom Cause and fix
“You do not have permission to change a service to this state.” Your role holds edit_orders but not the specific permission the transition needs — suspend_services, unsuspend_services or cancel_orders.
A package is stuck at cancelling The teardown job did not complete. Either no active integration is bound to the product (nothing happens, silently), or the driver call failed — check the Queue Monitor’s failed jobs for the item ID.
You suspended a package but the site is still up The dropdown is local only. Suspend the account on the panel yourself, or let the overdue sweep handle it.
A paid customer is still suspended They have another overdue invoice on that order. Settle or void it, then set the package back to Active.
Reactivation left the package at failed The local status was set back to active first and then the panel call failed. The reason is on the package’s General Options tab; fix it and set the status to Active again.
A deleted package’s service is still running Deletion leaves the remote service alone unless Also terminate the live remote service was ticked. Tear it down on the panel by hand.
You cannot find a “terminate” button for a whole package There is not one. Terminating a whole package is done through the delete confirmation with the teardown box ticked; the standalone terminate action is offered for addons.
A lower-ranked staff member cannot delete a package Deletion enforces a rank check on the owning account: you cannot act on a Super Admin’s records, or on an account whose highest role outranks your own.