WHMCSModule Networks
AUTOMATION PLATFORM ...
Article Guide

Module Installation for Hetzner Cloud VPS Servers for WHMCS Part 2

Hetzner Modules 5 Aug 2026 By Ankita
Home / Docs / Module Installation for Hetzner Cloud VPS Servers for WHMCS Part 2

Continuing from part 1 of Hetzner Cloud Module Installation for WHMCS

What gets created for you

Saving the product builds everything else automatically:

Configurable options — in a group named Hetzner Cloud Options - Product - id:

Option Type Appears when
Operating System dropdown of every installable image, live from Hetzner for the plan's CPU architecture always
Snapshots / Backups / Private Networks Yes / No only when you switch that add-on on
Volume Size (GB) quantity slider, 0 or 10–1000 only when Volumes is switched on
Floating IPs quantity slider, 0–5 only when Floating IPs is switched on
Firewall dropdown of the firewalls in your Hetzner Project, plus None only when Firewall is switched on and the Project has at least one

The architecture filter matters. An Arm plan (cax*) cannot boot an x86 image and Hetzner rejects the order outright. The list is rebuilt for the plan's architecture every time you save the product, so changing Server Type between Arm and x86 and saving is all that is needed.

These are built on all three paths: importing a plan from the addon's Products page, saving a new product, and editing an existing one. So a product that predates an add-on gains its option the next time you save it, and a product missing its Operating System list gains it the same way — there is nothing to create by hand.

An image Hetzner withdraws is hidden, not deleted, so existing services keep working.

The Operating System option is empty or missing The image list is fetched live. Check the account in Step 4 still connects, then save the product again.

Custom fields:

Field Who sees it Purpose
Server ID admin only Which Hetzner server belongs to this service. Do not edit by hand unless you are assigning an existing server.
SSH Public Key customer Attached to the new server.
Custom Cloud-Init Script customer Runs at first boot.
Rescue Password admin only Encrypted; managed automatically.
Placement Group ID admin only Places new servers in that group.
Firewall IDs admin only Comma separated, applied at creation.
Private Network IDs admin only Comma separated, attached at creation.

Selling a paid add-on

Switching an add-on on in Module Settings creates two things: a configurable option the customer chooses at checkout, and a product addon they can buy later from inside their account. Both are priced automatically from Hetzner's own rate with your Price Markup applied — you only need to change a price if you want a different margin:

  1. System Settings → Products/Services → Configurable Options.
  2. Open the group Hetzner Cloud Options - Product <id>.
  3. Click the option — for example Volume Size (GB).
  4. Adjust the price per unit if the derived one is not what you want.
  5. Save Changes.

A price already set by hand is never overwritten. The module only writes a price where no price row exists, so re-saving the product will not undo your pricing.

Check it worked: order the product as a customer and confirm the add-on appears with your price beside it.

What each one does when the customer orders it:

Add-on What happens
Snapshots Unlocks the Snapshots tab: create, restore, delete, and schedule snapshots.
Backups Hetzner's automatic backups are switched on after the server is built — they cannot be requested at creation time. Restorable from the Snapshots tab.
Volume Size (GB) A volume of that size is created before the server, attached at creation, and automounted. Price this per unit — the unit is one GB.
Floating IPs That many IPv4 floating IPs are created and assigned after the server is built. Price per unit — the unit is one IP.
Floating IPs (IPv6) The same for IPv6, priced from Hetzner's own IPv6 rate.
Firewalls Limit / Firewall Rules Limit How many firewalls and rules the customer may use. Exceeding either is refused with a message naming the limit.
Private Networks A private network is created before the server and attached at creation, using the range from Provisioning Defaults.
Firewall The chosen Project firewall is applied at creation.

Volumes have a 10 GB floor at Hetzner. Order anything between 1 and 9 and the module creates 10; set the slider's minimum to 10 on the configurable option so the customer is never charged for a size that cannot exist.

A customer who has not bought the add-on does not see the tab, and the action is refused by the server if it is sent anyway — hiding a tab is presentation, never the access control.

Do not rename or delete these options. The module finds them by name. A renamed option is treated as missing and rebuilt on the next product save, leaving you with two.

Turning an add-on off later hides it from new orders. Customers who already bought it keep it until their service is terminated — the module never removes something a customer has paid for.

An option set to No means no access. The switch in Module Settings only says the product sells the add-on; it never grants it. A customer who declined the option, or bought nothing, does not get the feature — and the action is refused server-side, not merely hidden.

Add-ons bought after the order

Every paid add-on is also created as a product addon, so a customer who did not buy at checkout can add it later from Services → the service → Addons. They are deliberately hidden from the order form, because the configurable option already covers that moment and offering both would sell the same thing twice.

Add-on How many one service may buy
Backups, Private Networks one — it unlocks a feature, so a second is meaningless
Snapshots, Volumes one, sold in blocks: 10, 20, 50 or 100 GB
Floating IP (IPv4) two
Floating IP (IPv6) two

Once a service reaches the limit the add-on disappears from its list. You are not limited — an administrator can still assign resources by hand from the addon panel.

These are per product, named Backups - <Your Product> and so on, each carrying its own price. That is deliberate: one shared addon across every product could only ever hold a single price, which would be wrong for all but one of them.

Upgrading from an earlier build? Older versions created one shared addon per feature. The next product save replaces it with the per-product set; glance at Setup → Product Addons afterwards and remove any leftovers.


Step 6 — Place a test order

Order the product as a customer would and mark the invoice paid.

Check it worked: the service becomes Active, the Server ID field fills in, and the dashboard appears on the service.

"This service has no Server ID assigned yet, and the product has no Location/Server Type configured" Finish the Provisioning section in Step 5.

"No Operating System was selected for this order" Either set a default image in Module Settings, or ensure the Operating System configurable option is assigned to the product.

"Unauthorized" The API token has been revoked or downgraded to read-only. Replace it in Step 4.

The server is created but the service still shows an error The server exists in Hetzner. Open the addon's Servers page, find it, and use Assign to link it to the service — no need to delete anything.


Step 7 — Decide what customers can do

Every switch is under Module Settings → Client Area Features. A switch that is off removes the tab and refuses the action if someone tries to send it directly.

Switch Controls
Console The browser console tab
Network IPs, reverse DNS, floating IPs, private networks
Private Networks Private network management inside the Network tab. Sold as a paid add-on.
Traffic The usage graphs
Reinstall Rebuilding from an image — destructive
ISO Images Mounting ISOs
Snapshots Snapshots, scheduled snapshots and backups. Sold as a paid add-on.
Firewall Firewall rules
Tasks Hetzner's own action history
Power Actions The master switch for all power buttons
Power: Stop / Reboot / Shutdown / Reset Each button individually
Reset Password Issuing a new root password
Rename · Protection · Rescue System Self-explanatory
Primary IP · Change Plan Administrator tools

A common setup: leave Power Actions on, leave Shutdown on, and switch Reset off, so customers can ask the OS to shut down but cannot pull the plug.


Using the dashboard

Main Section — state badge, rename, and the power buttons you allowed. Plus Console, Reset Password, and the CPU / Memory / Storage / Traffic tiles.

Overview — mounted ISO, protection switches, rescue system, region with coordinates, credentials, and billing including the daily rate and how much has accrued this period.

Console — a full remote console in the browser. The server must be running. If rescue mode is armed, the rescue root password is shown here with a copy button.

Network — IPv4 and IPv6 with inline reverse DNS. IPv6 PTR records are edited per address, because a Hetzner IPv6 allocation is a /64 network rather than one address.

Traffic — network traffic, network packets, CPU, disk throughput and disk IOPS, over Live (last five minutes, refreshing every five seconds), Today, Yesterday, Last 7 Days, Current Month, Last Month or a custom range. There is no memory graph: Hetzner does not publish memory usage at all.

Reinstall — pick an image and rebuild. Shows what is installed now, names the image in the confirmation, and refuses while protection is on. Alongside Hetzner's own images, the list includes any snapshot you have published (see below), grouped under Custom — or under Windows when the name you gave it says so. Only images built for the server's own CPU architecture are offered, so an Arm plan is never shown an x86 build it cannot boot.

Snapshots — create, restore and delete snapshots; automatic backups appear in the same list and can be restored. A schedule can take one daily or weekly and keep the newest N, pruning the rest. The default is weekly, keeping four; change it per service or leave it alone.

Snapshot storage is charged per GB per month by Hetzner. Every kept snapshot adds to that bill. Choose the retention count deliberately, and consider billing snapshot storage through metric billing so the cost is visible on the customer's invoice rather than absorbed by you.

Volumes — resize and rename. Customers cannot delete a volume; it holds their data and is only released when the service is terminated.

Firewall — rules, and applying an existing Project firewall.

Tasks — Hetzner's own action list, including actions taken outside WHMCS.


Offering your own image to customers

A customer can only rebuild from their own server's snapshots — rebuilding from someone else's would hand over that customer's data.

To offer a prepared build to everyone — a Windows install you made from an ISO, say, or a configured application stack — publish it. The whole workflow lives on one page:

  1. Build a server and configure it exactly as you want the template to be.
  2. Open Addons → Hetzner Cloud Manager → Snapshots.
  3. Pick the Project, choose that server, and give the snapshot a description.
  4. Tick Publish as an installable image and type the name customers should see.
  5. Press Take Snapshot.

It appears in the Reinstall picker for every service in that Project on the same CPU architecture, under Custom — name it with the word Windows and it is grouped under Windows instead, which is what makes a Windows build you prepared from an ISO installable by a customer. The table below lists every snapshot in the Project with its size, OS and published state; Delete removes one (clearing delete-protection first) and withdraws it from the picker.

Check it worked: open any service on that Project, go to Reinstall, and find your image under Custom or Windows.

Shut the server down first for a fully consistent image. A snapshot taken from a running disk catches it mid-write, which is fine for a web server and risky for a database.

Snapshot storage is charged per GB per month for as long as the image exists, whether or not anyone installs from it. A published template is a standing cost — keep one copy, not one per revision.

Publish only images you are entitled to distribute. A Windows snapshot carries the licensing terms of the Windows installation inside it.

Already published something from Resources? That panel still works and shows the same list — the Snapshots tab simply adds the ability to create the snapshot rather than only publish one that already exists.


Upgrades and downgrades

The customer uses Services → Upgrade/Downgrade. WHMCS raises an invoice. Only when it is paid does the module change the server type. Nothing in the dashboard lets a customer move themselves to a bigger plan without paying.

The disk is deliberately not grown. A Hetzner disk can never shrink again, so growing it would lock the service out of every smaller plan permanently.

"The server must be powered off before its plan can be changed" Expected — Hetzner requires it. The module powers it off, changes it, and starts it again if it was running.

"The server did not power off within 60 seconds, so its plan was left unchanged." A guest that ignores the shutdown request. Stop the server from the dashboard and run the change again. Nothing was changed, so it is safe to retry.

"This plan change moves the server from ..." Refused on purpose. The installed operating system cannot boot on the other CPU architecture, so the change would leave the customer with a dead server. Order a new service on the target plan and migrate the data.


Suspension and termination

Suspend does what you chose in Lifecycle. A suspended customer sees the reason and can do nothing else.

Terminate releases everything the service was paying for, in this order:

  1. Delete and rebuild protection are cleared on the server.
  2. Firewalls are detached from the server. They are never deleted — a firewall is usually shared across customers, and deleting one would strip the rules from every other server using it. Remove unused firewalls yourself from the addon's Resources page.
  3. Attached volumes have their delete-protection cleared, then are detached and deleted.
  4. Snapshots and automatic backups belonging to the server have their delete-protection cleared, then are deleted. Hetzner bills snapshot storage per GB per month whether or not the server still exists, so leaving them behind would keep charging you forever.
  5. Floating IPs are unprotected, unassigned and deleted.
  6. The server is deleted.
  7. The SSH key that was uploaded for this service is deleted from the Project, so keys do not accumulate.
  8. The service's username, password, IPv4 and IPv6 are cleared in WHMCS, so a terminated service shows no stale credentials.

If you chose Power off and keep the server, the server is stopped and every resource above is left alone — and it all keeps costing you money at Hetzner.

Termination is refused unless the service is Active or Suspended. A stray call against an already-terminated service cannot delete anything.

Part 3 of Hetzner Cloud Module Installation for WHMCS

Have Questions About This Article?

Our dedicated support engineers are available 24/7 to assist with your configuration.

Contact Support Client Area
Hello!
Swity AI Assistant