WHMCS is still the hosting industry's default billing and automation platform for many providers. Its strength is the depth of its ecosystem: registrar modules, payment gateways, fraud screening, support tools, server provisioning, and a long tail of third-party add-ons. The trade-off is cost and operational care. WHMCS is ionCube-encoded, expects a traditional Linux hosting environment, and needs a correctly configured cron before automation is trustworthy.
This guide is based on the current WHMCS 9.0 documentation and pricing page, checked in April 2026. It covers a clean self-hosted install on TekLan shared hosting or a TekLan VPS.
Before You Choose WHMCS
WHMCS self-hosted licensing is monthly and based on active clients. The official pricing page currently lists:
| Plan | Active clients | Price |
|---|---|---|
| Plus | Up to 250 | $34.95/month |
| Professional | Up to 500 | $54.95/month |
| Business 1000 | Up to 1,000 | $84.95/month |
| Business 2500 | Up to 2,500 | $179.95/month |
| Business 5000 | Up to 5,000 | $284.95/month |
| Business 10000 | Up to 10,000 | $399.95/month |
That pricing can make sense if you need the WHMCS ecosystem. For a very small provider, the ongoing cost is worth comparing against Blesta or HostBill before you commit.
WHMCS stores customer records, service credentials, invoices, domain data, and payment gateway configuration. Run it under its own domain or subdomain, isolate it from ordinary customer websites, and treat it as core business infrastructure.
Current WHMCS 9.0 Requirements
For a self-hosted WHMCS 9.0 install, the official requirements are:
- Operating system: Linux.
- Web server: Apache 2.x is the validated environment. Nginx can work, but WHMCS provides limited support for non-Apache setups.
- PHP: PHP 8.2 or PHP 8.3.
- ionCube Loader: 13.0.2 or later for PHP 8.2, or 14.4.0 or later for PHP 8.3.
- Database: MySQL is required, with MySQL 8.x recommended in WHMCS's current documentation. MariaDB may work as a binary-compatible alternative.
- Required PHP extensions: default compiled PHP extensions, cURL with SSL, GD2, IMAP, ionCube Loader, JSON, PDO, PDO_MySQL using mysqlnd, Reflection, and XML.
- Recommended PHP extensions: BC Math, Fileinfo, GMP, iconv, Intl, mbstring, OpenSSL, and SOAP.
- PHP memory limit: 64 MB minimum, 128 MB recommended.
WHMCS also warns that MySQL strict mode can cause problems. On a VPS, review the WHMCS documentation and disable unsupported strict modes such as STRICT_TRANS_TABLES and ERROR_FOR_DIVISION_BY_ZERO before installing.
Installing on TekLan Shared Hosting (Enhance)
Step 1: Create a Billing Domain
Use a dedicated hostname such as billing.yourdomain.co.uk. Add it in Enhance, confirm DNS is pointing to the hosting account, and note the document root in the file manager.
Step 2: Set PHP and ionCube
In Enhance, open the website and go to Advanced → Developer tools → PHP. Select PHP 8.2 if available, then enable ionCube in the extensions list. PHP CLI and web PHP should match; a WHMCS cron running under a different PHP version is a common cause of broken automation.
If your account cannot provide the ionCube version WHMCS 9.0 needs, do not force the install on an older stack. Open a support ticket or use a VPS where the PHP and ionCube versions can be controlled directly.
Step 3: Create a Database
In Enhance, open Databases, create a new database, then create a dedicated database user with a strong password. Grant that user access to the WHMCS database. Keep the database name, username, password, and hostname handy for the installer.
Step 4: Upload WHMCS
Download WHMCS from your WHMCS account or download.whmcs.com. Upload the files to the billing domain's document root. Leave the install/ directory in place for now.
WHMCS may require write access to these directories during normal operation:
attachments/downloads/templates_c/
WHMCS lists 777 as the general writable permission for those directories on many systems, but the right value depends on the PHP handler. On shared hosting, use the least permissive setting that works; often 755 is enough when files are owned by the account user.
Step 5: Run the Web Installer
Visit https://billing.yourdomain.co.uk/install/install.php. The installer checks PHP, ionCube, extensions, database access, and file permissions. Enter your licence key, database details, and administrator account details when prompted.
When installation completes, delete the install/ directory immediately.
Step 6: Configure the System Cron
WHMCS automation depends on the system cron. It generates invoices, sends reminders, processes domain renewals, suspends overdue services, and runs provisioning tasks.
In WHMCS, go to Configuration → System Settings → Automation Settings and copy the exact cron command shown there. In Enhance, add a cron job under Advanced → Developer tools → Cron jobs and run it every five minutes. It will look similar to:
*/5 * * * * /usr/bin/php -q /var/www/[site-id]/public_html/crons/cron.php
Confirm the automation page shows a recent last-run time before you rely on WHMCS for billing.
Step 7: Force HTTPS
In Enhance, open the website's Security tab and enable Force HTTPS. Confirm the admin and client areas both load over HTTPS with no mixed-content warnings.
Installing on a TekLan VPS
WHMCS officially validates Apache on Linux, so the VPS example below uses Ubuntu 22.04 with Apache and PHP 8.2. You can use another distribution, but keep the PHP, ionCube, cron, and MySQL requirements aligned with WHMCS 9.0.
Step 1: Install Apache, MySQL, PHP, and Extensions
apt update
apt upgrade -y
apt install -y apache2 mysql-server unzip certbot python3-certbot-apache \
php8.2 libapache2-mod-php8.2 php8.2-bcmath php8.2-curl php8.2-gd \
php8.2-gmp php8.2-imap php8.2-intl php8.2-mbstring php8.2-mysql \
php8.2-soap php8.2-xml php8.2-zip
Step 2: Install ionCube Loader
cd /tmp
wget https://downloads.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xfz ioncube_loaders_lin_x86-64.tar.gz
php -i | grep extension_dir
Copy the PHP 8.2 loader into the reported extension directory, then enable it for Apache and CLI PHP:
cp ioncube/ioncube_loader_lin_8.2.so /path/to/php/extensions/
echo "zend_extension = ioncube_loader_lin_8.2.so" > /etc/php/8.2/apache2/conf.d/00-ioncube.ini
echo "zend_extension = ioncube_loader_lin_8.2.so" > /etc/php/8.2/cli/conf.d/00-ioncube.ini
systemctl restart apache2
php -v
The final command should show ionCube Loader. If CLI PHP does not show ionCube, your cron will fail even if the web installer works.
Step 3: Configure MySQL
mysql_secure_installation
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Remove strict SQL modes from sql_mode, or add a compatible value under [mysqld] if your server defines it there. Restart MySQL afterwards:
systemctl restart mysql
mysql -u root -p
CREATE DATABASE whmcs CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER 'whmcsuser'@'localhost' IDENTIFIED BY 'use-a-long-random-password';
GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, UPDATE ON whmcs.* TO 'whmcsuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Step 4: Create the Apache Virtual Host
mkdir -p /var/www/whmcs/public_html
nano /etc/apache2/sites-available/billing.yourdomain.co.uk.conf
<VirtualHost *:80>
ServerName billing.yourdomain.co.uk
DocumentRoot /var/www/whmcs/public_html
<Directory /var/www/whmcs/public_html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
a2ensite billing.yourdomain.co.uk
a2enmod rewrite
systemctl reload apache2
Step 5: Upload Files and Run the Installer
unzip /tmp/whmcs*.zip -d /var/www/whmcs/public_html/
chown -R www-data:www-data /var/www/whmcs
find /var/www/whmcs/public_html -type d -exec chmod 755 {} \;
find /var/www/whmcs/public_html -type f -exec chmod 644 {} \;
Visit http://billing.yourdomain.co.uk/install/install.php and complete the installer. Delete install/ when prompted.
Step 6: Add SSL
certbot --apache -d billing.yourdomain.co.uk
certbot renew --dry-run
Step 7: Secure Files and Configure Cron
chmod 400 /var/www/whmcs/public_html/configuration.php
Move the crons/ directory above the document root if possible, then update WHMCS with the new cron path. WHMCS recommends this for better security.
mkdir -p /var/www/whmcs/private
mv /var/www/whmcs/public_html/crons /var/www/whmcs/private/crons
chown -R www-data:www-data /var/www/whmcs/private
Copy the exact command from Automation Settings, then add it with crontab -e:
*/5 * * * * /usr/bin/php -q /var/www/whmcs/private/crons/cron.php > /dev/null 2>&1
Production Checklist
- HTTPS forced for the client and admin areas.
install/directory deleted.configuration.phpset to400.- System cron running every five minutes and showing a recent last-run time.
- WHMCS timezone matches the server timezone.
- Admin directory renamed from the default under WHMCS security settings.
- Two-factor authentication enabled for all staff users.
- Test client, order, invoice, payment gateway, suspension, and email delivery checked before launch.
WHMCS Hosting Notes
WHMCS is sensitive to PHP version, ionCube support, cron, file permissions, and email delivery. Keep it on a dedicated hostname and do not share the same document root as a marketing site. TekLan application hosting is suitable when the required PHP and ionCube combination is available. A VPS gives more control if you need custom modules, extra PHP configuration, or stricter firewall rules.
If WHMCS will provision hosting accounts, pair it with reseller hosting or a managed server product rather than manually creating customer accounts. Test suspension, unsuspension, package changes, welcome emails, invoice emails, and cancellation flows before accepting live orders.
Commercial Setup Checklist
- Create product groups that match your real hosting packages.
- Check domain pricing and renewal pricing before enabling public registration.
- Use SMTP with SPF, DKIM, and DMARC aligned to the sending domain.
- Restrict staff permissions and enable two-factor authentication.
- Document how backups and restores work for the billing system itself.
Related posts: billing software compared, reseller hosting setup checklist, and email deliverability basics.
Sources Checked
If you need help checking ionCube, PHP CLI, or cron on your TekLan account, open a support ticket.