WHMCS can bill a SaaS or software subscription when plans renew monthly or less often and are priced per plan, per seat or per metered unit. Each plan is a product of type Other, a provisioning module creates and locks accounts in your app, the Upgrades tab handles plan changes and the cron runs dunning. Downloadable software can use the Software Licensing addon instead.
How do SaaS billing concepts map to WHMCS?
Almost every subscription concept has a WHMCS feature behind it. The gaps are short billing periods and anything that needs code in your own app.
| SaaS concept | WHMCS feature | Note |
|---|---|---|
| Plans | One product per plan, type Other, in one product group | The group becomes the pricing table on the order form |
| Billing periods | Monthly, Quarterly, Semi-Annually, Annually, Biennially, Triennially | Nothing shorter than a month |
| Fixed-term contracts | Recurring Cycles Limit | After the last invoice the service becomes Completed |
| Seats | A Quantity configurable option, or Allow Multiple Quantities set to Yes - Scaling Service | Scaling Service rules out configurable options and custom fields |
| Free trial | A free product with Auto Terminate/Fixed Term and a Termination Email | The client upgrades to a paid plan before the term ends |
| Account lifecycle | A provisioning module, or the Software Licensing addon | You write or license this part |
| Plan changes | The Upgrades tab and your module's ChangePackage | Prorated automatically |
| Usage charges | Module metrics, or billable items through the API | Billed after the usage, on a later invoice |
| Dunning | Automation Settings, run by the cron | Reminders, retries, suspension, termination |
How do you set up SaaS plans and billing cycles in WHMCS?
Create one product per plan at Configuration > System Settings > Products/Services, choose the Other type, set Payment Type to Recurring and enable the cycles you sell. The Products page describes Other as the type for non-hosting products such as software licensing. Points that matter for SaaS:
- Setup fees are set per cycle, so you can charge one on monthly plans and waive it on annual ones.
- Set automatic setup to run as soon as the first payment is received, so accounts open only after money arrives.
- Billing is on the anniversary of the order by default. Prorata billing moves every client to one day of the month instead.
- A monthly cycle is a calendar month, so the same price covers 28 to 31 days.
For per-seat pricing, add a Quantity configurable option such as Users. You enter the unit price in the One Time/Monthly column and WHMCS multiplies it by the number chosen; set both Minimum and Maximum to show a slider. My configurable options guide covers the pricing grid. Pass the seat count to your app in the module, because WHMCS only bills it.
How does WHMCS create and lock SaaS accounts?
Through a provisioning module for hosted apps, or the Software Licensing addon for software that customers install. Without either, WHMCS still bills, and Auto Release only marks the service active and sends the welcome email while someone creates the account by hand.
A custom module lives in modules/servers/yourapp/ and implements the core module functions: Create, Suspend, Unsuspend, Terminate, Renew, ChangePassword and ChangePackage. Each returns the word success or an error staff can read. On success WHMCS updates the status: CreateAccount sets Active and sends the welcome email, SuspendAccount sets Suspended, TerminateAccount sets Terminated. My provisioning module guide shows the file structure.
The Software Licensing addon is a paid WHMCS addon for products you ship as code. You choose License Software in the product's Module Settings tab and set Key Length, Key Prefix, Allow Reissue and the domain, IP and directory checks. Its Free Trial option suspends a second copy used on the same domain. Your software includes the check code from modules/servers/licensing/check_sample_code.php, with $whmcsurl and $licensing_secret_key set, and caches the local key it returns. The check result includes the product's configurable options, so a seat limit set in WHMCS can be enforced in the software. Suspending a license sets it to Suspended, and terminating sets it to Expired.
How do plan upgrades and downgrades work?
The client changes plan in the Client Area, WHMCS credits the unused part of the current plan and charges the rest of the cycle at the new price, and the Next Due Date stays the same. List the plans each product may move to on its Upgrades tab, and tick Configurable Options there so clients can change seat counts too. Rules from the Upgrades and Downgrades page:
- Moving from a free plan to a paid one sets the Next Due Date one cycle after the upgrade.
- An upgrade order still unpaid when the cron creates the renewal invoice is canceled, and the client has to order it again.
- A promotion marked Lifetime Promotion keeps its discount through later plan changes, recalculated on the new price.
Once the upgrade is paid, WHMCS calls your module's ChangePackage. If that call fails, a client can pay for a plan your app never applied, so log every call and alert on errors.
How do you bill usage-based SaaS charges?
Either your module reports metrics that WHMCS prices, or your app prices the usage and pushes a billable item. Both land on the next invoice, after the usage happened.
| Module metrics (Usage Billing) | Billable items (API) | |
|---|---|---|
| Who measures | Your module's MetricProvider, polled by the TenantUsageMetrics cron task twice a day | Your app |
| Who prices | WHMCS: Per Unit, Total Volume or Graduated, set per product | Your app sends the total |
| When it bills | A line on the next renewal invoice | Set by invoiceaction: nextcron, nextinvoice, duedate, recur or noinvoice |
| Setup | Enable Metric Usage Invoicing on the Invoice tab of General Settings | AddBillableItem with clientid, description, amount and unit |
| Watch for | Recurring promotions do not discount usage | A retried request can bill twice; record which periods you billed |
The Usage Billing page recommends monthly cycles for metered products, because usage is captured on the Next Due Date; an annual plan would bill a year of usage at once. Metrics are the cleaner route when you write a module anyway, and clients see their usage in the Client Area.
How do SaaS cancellations work in WHMCS?
Turn on Show Cancellation Link on the Other tab of General Settings, and clients can request cancellation from the service page, either immediately, at the next cron run, or at the end of the current billing cycle. Per the Cancellations page, WHMCS then cancels unpaid invoices that hold only that service, issues a credit note when the invoice has other items, removes the service's discounts and notifies staff. If Cancellation Requests is enabled in Automation Settings, the cron runs your module's Terminate on the chosen date. Otherwise staff approve each one from Clients > Cancellation Requests.
Decide what Terminate means in your app before launch. I make it lock the account and schedule deletion later, because a client who comes back a week after canceling expects their data.
How does WHMCS handle dunning and failed payments?
The cron applies the settings at Configuration > System Settings > Automation Settings, so it should run every five minutes; see my cron guide. The settings that make up a dunning sequence:
- Invoice Generation: days before the due date that renewal invoices are created, 14 by default, with per-cycle overrides.
- Payment Capture Settings: Process Days Before Due sets the first charge to a stored card. By default a failed charge is retried daily until paid; Retry Every Week For limits retries to weekly for a set number of weeks, and Attempt Only Once stops after one try.
- Reminders: one unpaid reminder before the due date and up to three overdue reminders, plus optional late fees.
- Suspension: Enable Suspension and Suspend Days call your module's Suspend; Enable Unsuspension reverses it when the invoice is paid.
- Termination: Enable Termination and Termination Days call Terminate. Leave a long gap after suspension.
Enable Auto Cancellation can also cancel overdue invoices after a set number of days. It skips invoices with a partial payment or applied credit.
When is WHMCS the wrong billing system for a SaaS?
When billing is the hard part of your product, or you do not run WHMCS already:
- Periods shorter than a month, or live spending caps and prepaid balances.
- Usage is most of the price. WHMCS bills usage after the fact, on the next invoice.
- You need a merchant of record. With WHMCS you are the seller, so sales tax and VAT everywhere are yours.
- Checkout inside your app. The client area is a separate site, and rebuilding it through the API is real work.
- No WHMCS today. A license, a server and a cron to watch, only to bill one product.
In those cases a billing service built for SaaS usually fits better; my SaaS MVP tech stack guide compares options, and my SaaS development page covers building the product that way. WHMCS stays a good fit when you already run it for hosting and want one account, invoice and support desk for everything. If you go the WHMCS route, the module and its ChangePackage logic are what I build under WHMCS custom module development.
Last reviewed 12 October 2026. Disclosure: I sell WHMCS and web development work, so I am not neutral. I am CTO at ElySpace, a freelance developer for Marmaids LLC, and founder of WHMCSPilot and MagizAI. Setting names come from the WHMCS 9.0 documentation as I read it on that date.