Skip to content
Shahid Malla

How to Set Up WHMCS for SaaS and Subscription Billing

How to bill a SaaS or software product with WHMCS: plans and cycles, provisioning through a custom module or the Software Licensing addon, upgrades, usage charges, cancellations, dunning and when to use something else.

· Published · Updated · 8 min read
On this page (8 sections)

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 conceptWHMCS featureNote
PlansOne product per plan, type Other, in one product groupThe group becomes the pricing table on the order form
Billing periodsMonthly, Quarterly, Semi-Annually, Annually, Biennially, TrienniallyNothing shorter than a month
Fixed-term contractsRecurring Cycles LimitAfter the last invoice the service becomes Completed
SeatsA Quantity configurable option, or Allow Multiple Quantities set to Yes - Scaling ServiceScaling Service rules out configurable options and custom fields
Free trialA free product with Auto Terminate/Fixed Term and a Termination EmailThe client upgrades to a paid plan before the term ends
Account lifecycleA provisioning module, or the Software Licensing addonYou write or license this part
Plan changesThe Upgrades tab and your module's ChangePackageProrated automatically
Usage chargesModule metrics, or billable items through the APIBilled after the usage, on a later invoice
DunningAutomation Settings, run by the cronReminders, 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 measuresYour module's MetricProvider, polled by the TenantUsageMetrics cron task twice a dayYour app
Who pricesWHMCS: Per Unit, Total Volume or Graduated, set per productYour app sends the total
When it billsA line on the next renewal invoiceSet by invoiceaction: nextcron, nextinvoice, duedate, recur or noinvoice
SetupEnable Metric Usage Invoicing on the Invoice tab of General SettingsAddBillableItem with clientid, description, amount and unit
Watch forRecurring promotions do not discount usageA 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:

  1. Invoice Generation: days before the due date that renewal invoices are created, 14 by default, with per-cycle overrides.
  2. 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.
  3. Reminders: one unpaid reminder before the due date and up to three overdue reminders, plus optional late fees.
  4. Suspension: Enable Suspension and Suspend Days call your module's Suspend; Enable Unsuspension reverses it when the invoice is paid.
  5. 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.

Share this article

Shahid Malla

Written by

Shahid Malla

Freelance WHMCS developer and web designer with 13+ years of client work. CTO at ElySpace, freelance developer for Marmaids LLC, and founder of WHMCSPilot and MagizAI.

Got a project like this?

Tell me what you need and I will send a written quote within one business day.