VorticPanel

Administration

Email templates

Settings → Edit the wording of each email (/admin/settings/emails) lists every email the panel sends. Each has a subject and a plain-text message with {{variables}}. Clicking a variable inserts it at the cursor, and the preview fills in example values as you type.

  • All variables (top right) lists every variable with what it holds, an example, and which emails can use it; click one to copy it. Hovering a variable in the editor shows what it holds too.
  • Changing, resetting or test-sending an email needs the “Outgoing email” permission, since emails carry sign-in and setup links. Other staff can read them.
  • A variable the email doesn’t have is flagged, and the API refuses to save it.
  • Templates are written as plain text. Each email goes out twice in one message: as that text, and in a styled layout with your brand name and colour (Settings → Branding). The preview’s Styled and Plain text switch shows both.
  • Nothing typed into a template or filled in by a variable is treated as HTML.
  • Required emails can’t be switched off.
  • Reset to default brings back the built-in wording, and Send test sends the saved version.
  • A reseller’s customers get the reseller’s brand name, support email and billing link.

Buttons and details boxes

Two ways of writing that come out nicer in the styled email:

Write Styled email Plain text
[Manage your server]({{server.link}}) on a line of its own A button in your brand colour Manage your server: https://…
Two or more Label: value lines in a row A details box, values in a fixed-width font The lines as written

A button whose link is empty (say, no billing link is set) is left out.

Login details

Server ready and Server reinstalled include how to sign in: the IP address, the username (root, or Administrator on Windows), the password the panel generated, and the command to connect. They ask the customer to change the password after they first sign in. This matters most when a billing panel creates the server, since the customer never sees the password in the panel.

  • If SSH keys were picked, the password reads “None: sign in with the SSH key you chose”.
  • The password is only in the email. Webhooks and the notification in the panel never carry it.
  • To stop sending passwords by email, take {{server.password}} out of both templates.

Variables in every email

{{brand.name}}, {{panel.url}}, {{support.email}}, {{customer.name}}

For example: Your server {{server.hostname}} is ready at {{server.ip}}.

The emails

Email When it’s sent Extra variables
Welcome An account is created, by billing, a reseller or staff customer.email, setup.link
Server ready A new server finished building and booted server.name, server.hostname, server.ip, server.location, server.image, server.username, server.password, server.connect, server.link
Server reinstalled A server finished reinstalling with a new operating system The same as Server ready
Password reset (required) Someone asks to reset their password reset.link, reset.expires, request.ip
New sign-in (required) An account signs in from a device it hasn’t used before sign_in.device, sign_in.ip, sign_in.location, sign_in.time, security.link
New way to sign in (required) A passkey or API token is added to an account change.what, change.ip, change.time, security.link
Server suspended A server is suspended, by billing or staff server.name, server.hostname, suspension.reason, billing.url
Server unsuspended A suspended server is released server.name, server.hostname, server.link
GPU instance ready A new GPU instance has its image and is running instance.name, instance.gpus, instance.location, instance.image, instance.address, instance.ssh (the ssh command with its port), instance.jupyter (the JupyterLab link with its token, kept out of the email log), instance.link
GPU instance image changed A GPU instance was started afresh or changed to another image The same as GPU instance ready
GPU instance suspended A GPU instance is suspended, by billing or staff instance.name, suspension.reason, billing.url
GPU instance unsuspended A suspended GPU instance is released and running again instance.name, instance.link
Server’s IP addresses changed Staff move a server to a node its addresses don’t work on, and choose to email the customer (or press Email customer on the transfer) server.name, server.hostname, server.ip, server.location, server.link, addresses.changes (each old address and its replacement, one per line), addresses.status (whether the server already uses them)
Traffic warning A server has used 90% of its monthly traffic server.name, server.hostname, traffic.used, traffic.limit, traffic.percent, traffic.resets, traffic.overage, server.link
Maintenance scheduled Maintenance is announced for nodes running someone’s servers maintenance.title, maintenance.window, maintenance.details, maintenance.servers, status.url
Backup failed A scheduled backup fails server.name, server.hostname, backup.error, backup.last_good, server.link
Team invitation A customer invites someone to their team invite.from, invite.servers, invite.link
Staff invitation (required) Someone is invited to the staff invite.from, invite.role, setup.link
Other notifications A notification without its own email, for people who get that topic by email notification.title, notification.body, notification.link

Subjects are up to 200 characters and messages up to 20,000.

The variables that let someone in (server.password, setup.link, reset.link, invite.link and a GPU instance’s instance.jupyter link, which has its login token in it) can’t go in a subject, and in the message they have to stand on their own or be a button’s whole link, like [Choose a new password]({{reset.link}}). Glued to other text, as in https://example.com/?t={{reset.link}}, they’d send the link somewhere else, so the editor flags it and the API refuses to save it.

Email log

Administration → Email log (/admin/email-log) lists every email the panel tried to send, newest first: who it went to, the subject, and whether it was Sent, Failed or Not sent because that email is switched off. Clicking one shows your mail server’s exact answer (for example a 550 for an address that doesn’t exist) and the message as it was sent.

  • Server passwords, GPU instances’ JupyterLab links and the links in welcome, password reset and invitation emails are blanked out in the log, in the subject as well as the message, so it can’t be used to get into anyone’s account or server.
  • Search by address, name or subject, or filter by status or by email. A customer’s page has an Emails button that shows everything sent to them.
  • Staff need the Audit log permission to see it. The last 20,000 emails are kept.
  • In the API: GET /admin/email-log and GET /admin/email-log/{id}.

Every word has to appear. ↑ ↓ to move, Enter to open.