🛠️ WHMCS Configuration Checklist
Complete WHMCS configuration and customization checklist for production deployment
📊 Export Progress
Table of Contents
Progress Summary
Pre-Flight System Requirements ✅
System requirements validation before WHMCS configuration
System Validation
Validate server stack and infrastructure
Server stack validated
PHP 8.2+ (with ionCube v13), MySQL 5.7+/MariaDB 10.3+, extensions: cURL, SOAP, GD, PDO, JSON, Mbstring, Intl, Zip
OS & firewall configured
Ubuntu 22.04 LTS or AlmaLinux 9 hardened; UFW/CSF allows 443 (HTTPS), 8443 (Plesk API), 587/465 (SMTP), 53 (DNS if self-hosting)
SSL certificate installed
Let's Encrypt or commercial certificate installed; force-SSL rewrite in virtual-host or .htaccess
WHMCS licence activated
Activate Plus or higher; verify IP matches licence portal
Backup system configured
Nightly off-site rsync or S3: full MySQL + /attachments + /downloads + /modules
Secure the Core ✅
Harden WHMCS installation security
Harden Writable Directories
Move sensitive directories outside web root
Move attachments to secure location
mv attachments /home/whmcs_storage/attachments
Move downloads to secure location
mv downloads /home/whmcs_storage/downloads
Move templates_c to secure location
mv templates_c /home/whmcs_storage/templates_c
Update configuration.php paths
Add $whmcsPath = '/home/whmcs_storage'; to configuration.php
Secure configuration file
chmod 400 configuration.php then chattr +i configuration.php
Rename admin directory
Rename /admin → /sc-admin-8256 and update $customadminpath
Enable reCAPTCHA v3
WHMCS → Configuration → System Settings → Security → Enable reCAPTCHA v3
Limit admin access by IP
Restrict admin access in .htaccess or via CSF csf.allow
Initial WHMCS Wizard & Global Settings ✅
Complete initial WHMCS setup wizard and configure global settings
Global Configuration
Configure global WHMCS settings
General Settings - Company
Name, GB-registered address, logo (SVG ≥256 px), default country = GB
Localization settings
Default currency = GBP (£); tick Auto-Update Exchange Rates (ECB) and enable EUR as secondary
Payment Gateways setup
Enable Stripe (live keys) → tick Allow Saved Cards; enable PayPal Checkout; install GoCardless module
Tax Configuration
VAT mode → "Tax Enabled", EU VAT Validation ON, default 20% rate, automatic OSS mapping
Domain Registrars
Activate Enom (API credentials) and add default nameservers ns1.spiralcorp.uk, ns2.spiralcorp.uk
Servers configuration
Add Plesk server: hostname, admin user/API token, port 8443, tick Secure. Test connection = green ✔
Friendly URLs
Enable Full Friendly Rewrite; ensure .htaccess generated
Cron setup
Add system cron */5 * * * * php -q /var/www/whmcs/crons/cron.php plus daily automation time 02:00 UTC
System Health Check
Verify System Health Status shows 0 critical issues
Create Service Plans in Plesk ✅
Create hosting service plans in Plesk before WHMCS products
Plesk Service Plans
Create service plans using Plesk CLI
Create "Starter Web" plan
plesk bin service_plan --create "Starter Web" -limits disk_space=10G bandwidth=-1 mailboxes=5 -hosting true -fp-script true -ssl true
Create "Business Pro" plan
plesk bin service_plan --create "Business Pro" -limits disk_space=25G bandwidth=-1 mailboxes=unlimited
Create "Developer VPS" plan
Create VPS service plan with appropriate resource limits
Create "Django Optimised" plan
Create Django-specific hosting plan with Python support
Create "Laravel Premium" plan
Create Laravel-specific hosting plan with PHP optimization
Create "Container Cloud" plan
Create container hosting plan with Docker support
Create "Enterprise Dedicated" plan
Create enterprise-level hosting plan with maximum resources
Verify service plan names
Double-check spelling & capitals – these names are case-sensitive when mapped in WHMCS
WHMCS Product Groups & Products ✅
Create product groups and configure 18 Spiral Corp products
Create Product Groups
Create seven product groups
Create "Web Hosting" group
Configuration → System Settings → Products/Services → Create New Group, assign Lagom Standard Cart
Create "VPS Hosting" group
Create VPS hosting product group with appropriate marketing copy
Create "Framework Hosting" group
Create framework-specific hosting group (Django, Laravel)
Create "Container Hosting" group
Create container and cloud hosting product group
Create "Dedicated Hosting" group
Create dedicated server hosting product group
Create "Development Services" group
Create development and consulting services group
Create "Add-on Services" group
Create additional services and add-ons group
Order product groups
Drag-drop order: Web Hosting, VPS Hosting, Framework Hosting, Container Hosting, Dedicated Hosting, Development Services, Add-on Services
Bulk Product Creation
Create 18 products via API or manual entry
Create bulk_products.php script
Create API script for bulk product creation with proper pricing and module settings
Configure Starter Web product
Type: hostingaccount, Module: plesk, ServicePlanName: "Starter Web", Price: £8.61/month
Configure Business Pro product
Link to "Business Pro" service plan with appropriate pricing
Configure Developer VPS product
Link to VPS service plan with configurable options
Configure Django Optimised product
Link to Django service plan with Python-specific settings
Configure Laravel Premium product
Link to Laravel service plan with PHP optimization
Configure Container Cloud product
Link to container service plan with Docker support
Configure Enterprise Dedicated product
Link to enterprise service plan with maximum resources
Verify module settings
Module Settings tab → select Plesk server, enter Service Plan Name exactly
Configure upgrade paths
Upgrades tab → enable Configurable Options upgrades
Copy direct cart links
Links tab → copy Direct Cart links for marketing
Configurable Options & Product Add-Ons ✅
Create configurable options and global add-ons
VPS Resource Options
Create configurable options for VPS products
Create "VPS Resources" option group
Configurable Options → Create New Group → VPS Resources
Add vCPU Cores option
Dropdown option: 1–8 cores with pricing tiers
Add RAM option
Slider option: 2–32 GB with pricing tiers
Add NVMe Storage option
Slider option: 10–500 GB with pricing tiers
Link to VPS products
Link VPS Resources group to Developer VPS & Container Hosting products
Global Add-Ons
Create global add-on services
Create "Premium Support SLA" addon
£25.85/mo, Department = DevOps, Welcome Email = Premium Support Welcome
Create "DevOps Automation" addon
£43.10/mo, Runs AfterModuleCreate hook to spin up GitLab runner
Create "Advanced Security" addon
£17.23/mo, Toggles ImunifyAV in Plesk via API
Configure addon settings
Configuration → System Settings → Product Addons → tick "Show on Order" & "Require Domain" = No
Email Templates ✅
Customize email templates for brand consistency
Template Customization
Customize critical email templates
Customize "Order Confirmation" template
Add VAT disclosure, expected provisioning times
Customize "Hosting Account Welcome" template
Insert Plesk login URL, temporary password placeholder, DNS propagation note
Customize "Premium Support Welcome" template
Outline 24/7 phone number & SLA terms
Create "Dev Project Kick-off" template
Inject project manager contact, Git repo access process, sprint 0 schedule
Configure template styling
Use Markdown-compatible HTML with inline CSS ≤ 600 px width
Test email variables
Include ${client_name} variables; test via Email Template Preview
Configure DMARC settings
Set DMARC-aligned From: to billing@spiralcorp.uk; DNS → DKIM/SPF pass
Support System Setup ✅
Configure support departments and ticket system
Support Configuration
Set up support departments and email integration
Create support departments
Sales (public, no authentication), Billing (clients), Technical Support (clients), DevOps (Premium Support only), Projects (hidden)
Configure email piping
Create forwarders in Postfix → /home/whmcs/scripts/pipe.php
Enable ticket ratings
Enable Ticket Ratings & satisfaction email after status Resolved for 48h
Set up email integration
Configure pop.php cron job for email piping fallback
Automation & Cron Jobs ✅
Configure automation and scheduled tasks
Cron Configuration
Set up automated tasks and scheduling
Configure cron.php
Core automation (invoices, provisioning, reminders) - */5 min
Configure pop.php
Email piping fallback - */5 min
Configure update_exchange_rates.php
Currency rates, ECB - 16:00 BST daily
Set invoice generation timing
Invoice Generation: 14 days before due
Configure suspension/termination
Suspension: 7 days overdue; Termination: 30 days
Set credit card capture timing
Credit Card Capture: 2 days before due
Payment Gateway Configuration ✅
Configure payment processors and testing
Gateway Setup
Configure payment gateways and webhooks
Configure Stripe
Developers → API Keys → set live keys; Webhook endpoint; Enable Apple Pay & Google Pay
Configure PayPal Checkout
Client ID & Secret; set Webhook for event PAYMENT.SALE.COMPLETED
Configure GoCardless
Install module; live access token; mandate description = "Spiral Corp hosting"
Test payment flows
Run end-to-end payment tests in Sandbox Mode before flipping to live
Testing Matrix ✅
Comprehensive testing before production launch
End-to-End Testing
Test all critical functionality
Test shared hosting order
End-to-end: Subscription appears in Plesk with Starter Web plan; welcome email sent
Test VPS upgrade
Upgrade Business Pro → Developer VPS: New VPS resources applied; prorata invoice issued
Test add-on purchase
Add-on active instantly; next cycle invoice includes add-on fee
Test payment failures
Stripe declined payment: Invoice status Payment Failed; auto-retry schedule enabled
Test VAT exempt EU business
Invoice shows 0% VAT, reverse-charge note present
Test ticket workflow
Email to support auto-opens ticket; SLA timer visible
Test knowledgebase
Typing "Django deploy" shows correct KB article links
Go-Live Tasks ✅
Final steps for production launch
Production Launch
Switch to live environment
Switch to live payment keys
Switch gateways from sandbox → live keys
Clean test data
Purge test clients, orders, transactions: Utilities → System → Database Status
Disable maintenance mode
Disable Maintenance Mode to allow public access
Launch announcement
Post launch announcement via Announcements module; push to RSS/Twitter
Enable production backups
Enable daily encrypted off-site backups (S3 Glacier Deep Archive, 30-day retention)