Getting started

How it works

Two installs, in two different systems

Almost everything people get stuck on here comes from expecting one install. There are two, they happen in a fixed order, and the file you upload is different each time.

Goes intoWhat you uploadWhere
1. The plugin Your platform dashboard The plugin ZIP you received — whmcs-integration.zip Admin Panel → Plugins → Add Plugin
2. The addon WHMCS The ZIP the plugin generates for you, named after your prefix — e.g. my_prefix.zip Unpacked into modules/addons/, then activated at Configuration → System Settings → Addon Modules
The second file does not exist until the first install is done. The WHMCS addon is built on demand, from the prefix and names you type into the plugin's options. There is no pre-built addon in your download, and nothing in your download goes into modules/addons/ directly.

Why the addon is generated rather than shipped

A WHMCS addon module is identified by its folder name, and WHMCS calls functions named after it — my_prefix_config(), my_prefix_activate() and so on. That name has to be decided before the module exists, so the plugin writes those functions for you using the Plugin Prefix you chose. The plugin name, description and author you enter are baked in at the same time, which is what lets the addon appear inside WHMCS under your own branding rather than anyone else's.

It also means the prefix is not cosmetic. See the prefix rule.

The whole flow

  1. Install the plugin into your platform dashboard (Admin Panel → Plugins → Add Plugin).
  2. Open its options with the gear button on its row and fill in the prefix, name, descriptions and author.
  3. Download the generated addon from the Plugins button on your dashboard's Overview page.
  4. Unpack it into your WHMCS modules/addons/ directory.
  5. Activate it at Configuration → System Settings → Addon Modules.
  6. Open the addon and fill in its Settings tab — API key, sending service, and the IDs that go with it.

Installation walks through each of these with the exact buttons.

What runs once it is installed

Activating the addon creates two database tables in your WHMCS database and seeds them with 28 default message templates. From then on the addon does three things:

  • Listens for WHMCS events. Each of the 28 templates corresponds to one event — an invoice created, a ticket closed, a module suspended. When the event fires and its template is enabled, the addon fills the template's variables in and sends the result.
  • Runs one daily job. The domain renewal reminder is checked once a day by the WHMCS cron, against every active domain, and messages the client when the domain is exactly the configured number of days from expiring.
  • Gives you a Send Message tab for one-off messages to a single client.

How a message actually gets sent

The addon does not talk to any phone network itself. It calls your own platform install over its API, using the API key you saved, and your platform sends the message through whatever you already have set up — an Android device, a gateway, or a linked WhatsApp account. Two consequences worth knowing:

  • Anything that stops your platform sending — an expired subscription, a disconnected device, an exhausted credit balance — stops these messages too, and the reason comes back as the failure text in the WHMCS module log.
  • Sent messages appear in your platform dashboard's own reports, alongside everything else you send. WHMCS keeps no copy.

Recipient numbers are validated, not guessed

Client messages go to the phone number stored on the client's WHMCS profile, resolved against that client's country. Admin notifications go to the numbers you type into the template yourself, which is why those must already be in full international format.

If a number cannot be turned into a valid international number with confidence, the addon refuses to send it and records why. It does not fall back to a best guess: a wrong guess delivers a client's password or invoice to a stranger who happens to hold the number it guessed. See one client never receives anything.