Support by Time WHMCS module
WHMCS module that adds time-based paid technical support. Sell support as a product with a monthly hour package and per-currency hourly rate for overage. Operators log time directly from ticket pages, the module tracks usage and history, and WHMCS billable items are generated automatically every month. Supports both cyclic and One Time billing cycles.
Description
Support by Time module WHMCS
Order now | Download | Community
Support by Time WHMCS module
The Support by Time WHMCS module turns your WHMCS into a fully automated platform for selling paid technical support measured in hours. It lets you sell a recurring support plan that includes a fixed amount of hours per month, with an automatically calculated hourly rate for time used outside the package — or a one-time bucket of hours that the service consumes until it auto-terminates.
Operators log time directly from the ticket page — manually or with a built-in start/stop timer — the module aggregates totals per ticket, per service and per month, keeps a full audit trail of who logged what, and WHMCS billable items are created automatically by the daily cron.
Main features
- Hour packages — configurable number of support hours included per month per product
- Overtime billing — per-currency hourly rate charged for hours used outside the package
- Two billing modes — recurring (monthly reset) or One Time (fixed bucket of hours, auto-terminate when depleted)
- Time granularity — time tracked and entered in HH:MM (minute precision)
- Manual time entry — operators log spent time directly when responding to a ticket
- Live timer — start/stop a server-anchored timer on the ticket; a floating widget shows all running timers on every admin page
- Multi-entry per ticket — every save (or timer stop) is recorded as its own entry, so "10 min triage + 30 min fix" is preserved as two lines with individual notes and operators
- Notes & operator tracking — each entry stores an optional note and the WHMCS admin who logged it
- Audit trail — append-only log of every action (time logged, edited, deleted, timer start/stop/cancel, service ordered, ticket billed) shown on the ticket and on the service page
- Operator report — per-operator hours and entry counts for the current and previous month
- Two save actions — save time without closing the ticket, or close the ticket and save time
- Quick service ordering — when a client without an active support service opens a ticket, the operator can order one straight from the ticket page
- Ticket protection — once a ticket has been billed, its time entries are locked against edit/delete/reopen
- Past-month tickets — tickets logged in earlier months are flagged as already charged and require splitting/re-creating
- Automatic monthly billing — daily cron creates one WHMCS billable item per ticket for the previous month's overage hours
- Configurable invoice action — choose between Invoice on next cron, Add to user's next invoice or Do not invoice
- Usage notifications — email the client when monthly usage crosses configurable thresholds (e.g. 80%, 100%)
- Client transparency — card-based client area with a usage progress bar, an interactive cost calculator and a 12-month usage chart; an optional toggle reveals the operator note + name per ticket
- Multi-currency — separate hourly rate per WHMCS-configured currency
- Multi-language — 25 languages
- License verification — built-in license system with online/offline verification and admin alerts
System requirements & compatibility
The module supports PHP 7.4, 8.1 and 8.2+, shipped as a separate ionCube build per PHP version. Download the build that matches the PHP version your WHMCS runs on.
| WHMCS version | PHP version | Module build |
|---|---|---|
| WHMCS 8.x | 7.4 | php74 |
| WHMCS 8.x | 8.1 | php81 |
| WHMCS 8.x | 8.2 | php82 |
| WHMCS 9.x | 8.2 | php82 |
- WHMCS 8 → PHP 7.4 / 8.1 / 8.2 (use the matching build).
-
WHMCS 9 → PHP 8.2 (use the
php82build). -
PHP 8.2 and newer (8.3, 8.4, …) → always use the
php82build. - ionCube Loader v13 or newer (v14, v15) required.
Links
- Product page: https://puqcloud.com/whmcs-module-support-by-time.php
- Documentation: https://doc.puq.info/books/support-by-time-whmcs-module
- Support: https://puqcloud.com/submitticket.php?step=2&deptid=1
- Community: https://community.puqcloud.com/
Screenshots
Client area — home screen
Client area — usage history
Admin area — service page
Admin area — ticket time form
Changelog
Support by Time module WHMCS
Order now | Download | Community
v3.0 (2026-06-04)
-
Compatibility: supports PHP 7.4 / 8.1 / 8.2+ and WHMCS 8.x / 9.x. Published as a separate ionCube build per PHP version —
php74,php81,php82(usephp82for PHP 8.2 and any newer PHP). WHMCS 8 runs on PHP 7.4 / 8.1 / 8.2; WHMCS 9 runs on PHP 8.2. - Module rewritten on the new PUQ module skeleton:
- License class moved into the main module file (
puqSupportByTime.php) - New
puqSupportByTimeModuleSettingsclass for product configuration with structured JSON inconfigoption24 - Product configuration UI rendered through the
AdminAreaFooterOutputhook - License alert added on the WHMCS admin homepage (
AdminHomepagehook)
- License class moved into the main module file (
-
Schema versioning: new
puq_module_versionstable + migration runner so updates apply schema changes automatically and idempotently on first load. - Redesigned client area (cards, progress bar, modern stat panels)
- Redesigned ticket header (Bootstrap panels, icons)
- Redesigned admin product page (summary table, history navigator)
- AJAX ticket header: the entire time-logging header on the admin ticket page is now rendered and driven by AJAX. Save / Close+Save / Reopen / Start-Stop timer / Order service no longer reload the page.
- Multi-entry per ticket: every Save Time (and every timer stop) is recorded as its own entry instead of overwriting, so a ticket keeps a full breakdown of sessions. Each entry has its own note, operator and timestamp.
-
Per-entry notes + operator tracking: every time entry can carry an optional note (shown to the client when Show work log to client is enabled) and stores the WHMCS admin who logged it. Columns on
puqSupportByTime_items:note,admin_id,created_at,ticket_record_id. -
Parent ticket records: new
puqSupportByTime_ticketstable holds per-ticket billing state (one billable item per ticket) and a snapshot of package hours / hourly rate, whilepuqSupportByTime_itemsbecomes a pure time log. -
Live timer: Start / Stop / Cancel on the ticket page with a server-anchored running clock. New table
puqSupportByTime_timers. Stop rounds up to the nearest minute and saves a regular time entry. A floating widget on every admin page lists all of the operator's running timers. -
Audit trail: append-only log of every state change (time logged / updated / deleted, timer start / stop / cancel, service ordered, ticket billed). New table
puqSupportByTime_audit. Shown on the ticket header and on the service page. - Operator report: per-operator hours and entry counts for the current and previous month on the service page.
- Cost calculator in the client-area home screen — interactive "if I use ___ more hours" predictor.
- Usage chart in the client-area history tab — last 12 months as a Google ComboChart with a package line and bars coloured by overage status.
-
Usage notifications: email the client when monthly usage crosses configured thresholds (e.g. 80 %, 100 %). New table
puqSupportByTime_notificationsfor idempotent per-(month, threshold) tracking. - Show work log to client toggle per product — reveals the operator name + note per ticket in the client area.
- Date filter rewritten to use
Y-m-tinstead of the literal-31 - Custom admin path now read from
configuration.phpconsistently -
Backward-compatible settings migration: legacy values stored in
configoption3(hours / invoice action / item name) andconfigoption4(per-currency hourly rate) are read transparently when the newconfigoption24slot is empty, so existing v2.x products keep working without any reconfiguration. The first save through the v3.0 form moves everything intoconfigoption24.
Note: No manual reconfiguration is required after updating to v3.0 — settings are migrated automatically on first read. Re-saving the product through the new form is recommended but not mandatory.
v2.1 (2025-09-20)
- Support for custom admin path
v2.0 (2024-09-23)
- Module coded with ionCube v13
- Supported PHP versions: 7.4, 8.1, 8.2
- Compatible with WHMCS 8.11.0+
v1.3 (2023-10-19)
- Added the ability to delete reserved time positions from the admin panel
- One-Time package validation moved from daily cron to every cron run
v1.2.5 (2023-10-11)
- WHMCS 8.8.0 support
- 25 language translations added/updated
v1.2 (2023-08-02)
- One-Time support packages with hour limit
- Human-readable time display in client and admin areas
- Display and logic improvements
v1.1 (2023-03-21)
- Client area redesign
- Translation support
- WHMCS 8.6, IonCube v12, PHP 8.1 and PHP 7.4 support
- Invoice item description field
v1.0 (2022-10-01)
- First release
Installation and Configuration Guide
Step-by-step instructions for installing and configuring the Support by Time WHMCS module: WHMCS deployment, product creation, hour package and per-currency hourly rate setup.
WHMCS setup (install/update)
Support by Time module WHMCS
Order now | Download | Community
System requirements & compatibility
The module supports PHP 7.4, 8.1 and 8.2+ and is published as a separate ionCube build per PHP version. Download the build that matches the PHP version your WHMCS server actually runs on.
| WHMCS version | PHP version | Module build to download |
|---|---|---|
| WHMCS 8.x | PHP 7.4 | php74 |
| WHMCS 8.x | PHP 8.1 | php81 |
| WHMCS 8.x | PHP 8.2 | php82 |
| WHMCS 9.x | PHP 8.2 | php82 |
-
WHMCS 8 runs on PHP 7.4 / 8.1 / 8.2 — pick the build matching your PHP (
php74,php81orphp82). -
WHMCS 9 runs on PHP 8.2 — use the
php82build. -
PHP 8.2 and any newer PHP (8.3, 8.4, …): always use the
php82build. - ionCube Loader v13 or newer (v14, v15) must be installed and active.
Note: The module uses ionCube encoding. Make sure the ionCube Loader for your PHP version is installed and active on your server.
Download
The module can be ordered and downloaded from PUQ Cloud:
- Order / Download: https://puqcloud.com/whmcs-module-support-by-time.php
-
All versions and builds (browse everything): https://download.puqcloud.com/WHMCS/servers/PUQ_WHMCS-Support-by-time/ — contains the
php74/php81/php82directories, each with the latest archive and all previous versions. - Community: https://community.puqcloud.com/
- Direct download — choose the build that matches your PHP version:
# PHP 7.4 (WHMCS 8 on PHP 7.4)
wget https://download.puqcloud.com/WHMCS/servers/PUQ_WHMCS-Support-by-time/php74/PUQ_WHMCS-Support-by-time-latest.zip
# PHP 8.1 (WHMCS 8 on PHP 8.1)
wget https://download.puqcloud.com/WHMCS/servers/PUQ_WHMCS-Support-by-time/php81/PUQ_WHMCS-Support-by-time-latest.zip
# PHP 8.2 and newer (WHMCS 8 on PHP 8.2, or WHMCS 9) — use php82
wget https://download.puqcloud.com/WHMCS/servers/PUQ_WHMCS-Support-by-time/php82/PUQ_WHMCS-Support-by-time-latest.zip
Which build? Match the build to your server's PHP version, not to WHMCS: PHP 7.4 →
php74, PHP 8.1 →php81, PHP 8.2 or newer →php82.
After downloading, extract the archive:
unzip PUQ_WHMCS-Support-by-time-latest.zip
Installation
Step 1: Upload files
Extract the module archive and copy the puqSupportByTime directory to the WHMCS servers module directory:
WHMCS_WEB_DIR/modules/servers/puqSupportByTime
Step 2: Create product
- Select the PUQ Support by Time module in the Module settings section
- Configure the product parameters (see Product Configuration)
The Support by Time module is a server module without a server: no server entry is required in WHMCS System Settings → Servers — the module does not connect to any external system.
Update
Step 1: Backup
Before updating, it is recommended to back up:
- WHMCS database
- Module files in
modules/servers/puqSupportByTime/
Step 2: Upload new files
Download and extract the new version, then overwrite all files in:
WHMCS_WEB_DIR/modules/servers/puqSupportByTime/
Step 3: Verification
- Log in to the WHMCS admin panel
- Verify the home screen has no license warnings for your products
- Open one of your support products and verify all configuration values are still set
Important (v3.0): The product configuration form was redesigned. After updating to v3.0, open every Support by Time product and re-save its settings to migrate existing values into the new structured storage format.
Product Configuration
Support by Time module WHMCS
Order now | Download | Community
Add a new product to WHMCS
In the Module Settings tab select the PUQ Support by Time module (leave Server Group as None — this is a server module without a server). Two billing modes are supported, selected by the product's WHMCS billing cycle:
- Recurring billing cycle (Monthly, Quarterly, Annually, …) — the included hours reset every month and overage hours are billed automatically by the daily cron at the end of each month.
- One Time — the included hours are a fixed bucket that the service consumes ticket by ticket. When all hours are used, the service is automatically terminated by the next cron run.
Configuration parameters
All settings live in the Module Settings tab. Saving the product persists them as a single JSON document in tblproducts.configoption24 (the license key stays in configoption1).
| Parameter | Description |
|---|---|
| License key | A pre-purchased license key for the PUQ Support by Time module. The license must be active for correct operation. After saving, the verification status (and the period it is valid until) is displayed below the field. |
| Hours per month | Number of support hours included in the package. For One Time billing cycles this is the total bucket of hours. |
| Invoice action | How the billable item for overage hours is generated at month-end: Invoice on Next Cron Run, Add to User's Next Invoice, or Do not invoice. |
| Invoice item name | Description prefix used for billable items (default: Support). The final description is composed as <name> #<ticket> <YYYY-MM> <hours> Hour(s) (<currency> <rate>/Hour). |
| Show work log to client | When ON, the client sees the operator name and the per-entry note for each ticket in their service-page ticket list. Date and time spent are always shown regardless of this setting. |
| Price per hour outside the package | Hourly rate charged for time exceeding the package allocation, configured per WHMCS currency. |
| Notify thresholds (% of package) | Comma-separated percentages (e.g. 80,100). When a client's monthly usage reaches a threshold, the email template below is sent — once per threshold per month. Empty disables notifications. |
| Notification email template | WHMCS Product/Service email template used for usage alerts. Available custom variables: $puq_used_hours, $puq_package_hours, $puq_used_percentage, $puq_threshold, $puq_hours_left, $puq_used_hours_outside_package, $puq_price_per_hour, $puq_currency_prefix, $puq_currency_suffix, $puq_how_much_pay. |
Support package
Price per hour (per currency)
Usage notifications
How billing works
Recurring billing cycle
- During the month, operators log time on tickets through the Save time / Close ticket and save time form (or the live timer) in the ticket header. Each save is stored as a separate entry, and the parent ticket record snapshots
package_hoursandprice_hourthe first time it is touched. - The first daily cron of the next month scans all support services that have unbilled tickets for the previous month. The package-hour pool is allocated across that service's tickets (oldest first); for every ticket whose hours exceed the remaining pool, one billable item per ticket is created for the overage:
overage_hours × price_hour. The invoice action chosen in the product configuration determines how the billable item appears. - Tickets fully covered by the package allocation are flagged as processed (
billableid = 0) and no billable item is created for them.
One Time billing cycle
- Operators log time the same way; each entry deducts hours from the bucket.
- After the cron run, services that have used 100 % of their hours are automatically terminated through
ModuleTerminate, and their tickets/entries are flagged so no further billing is attempted.
Important notes
Warning: This module is a server module (Products/Services). It cannot be used as an addon. Attempting to use it as an addon will return an error.
License gate: Every entry point (Create / Suspend / Unsuspend / Change Package / Terminate, ticket header, configuration page) verifies the license. If
license.puqcloud.comis unreachable and the offline cache has expired, module actions fail until connectivity is restored.
Configuration storage: Starting with v3.0 the entire product configuration (hours, invoice action, item name, work-log visibility, per-currency rates, notification settings) is stored as a JSON document in
tblproducts.configoption24. Existing v2.x installations are migrated automatically — legacy values stored in the oldconfigoption3(package settings) andconfigoption4(per-currency price) slots are read transparently whenconfigoption24is empty, so no manual reconfiguration is needed. Re-saving the product through the v3.0 form is recommended (it consolidates everything intoconfigoption24) but not required.
Client Area
Overview of the client-facing features of the Support by Time WHMCS module: home screen with the current month's hour usage and overage cost, and the per-month history view.
Home screen
Support by Time module WHMCS
Order now | Download | Community
Client area home screen
After logging in to the client area and opening their support service, the customer sees a modern card-based layout with the following sections.
This month / Support package
A summary of the current period as three stat cards:
- Hours of support in the package — the hour allocation included in the product
- Hours used this month (or Hours used for One Time) — total hours logged in the current month / bucket
- Hours left this month (or Hours left) — remaining hours in the allocation
A progress bar shows the percentage of the allocation that has been consumed (it turns amber as the package fills and red at 100 %).
Billing (recurring billing cycle only)
- Price per hour — hourly rate charged for overage hours, in the client's currency
- Hours outside package — hours that have already exceeded the included allocation
-
How much to pay this month — running total of overage cost (
hours outside package × price per hour)
Cost calculator
An interactive predictor: the client enters a number of additional hours and instantly sees the estimated total for the month, with the underlying overage hours × rate calculation shown beneath it.
List of tickets
A table with all tickets that have time logged in the current period:
- Ticket number and title (clickable, opens the ticket), with the number of time entries
- Total time spent (human-readable)
- Operator and Note — shown only when Show work log to client is enabled for the product
- Date of the most recent entry
- A status badge (Open / Billed / Paid / Unpaid)
Each ticket row can be expanded to reveal its individual time entries (date, time, operator, note):
Sidebar navigation
The client area sidebar contains two menu items:
- Information — the home screen described above
- History — per-month history view (only for recurring billing cycles, see History)
Note: For One Time services, only the Information tab is shown — there is no per-month history because the service uses a single bucket of hours.
History
Support by Time module WHMCS
Order now | Download | Community
Client area history
The History tab is available in the sidebar for support services with a recurring billing cycle. It shows a per-month archive of all tickets that consumed hours, together with a 12-month usage chart.
Month navigator
Usage trend chart
A Last 12 months chart (Google ComboChart) plots Hours used as bars against the Package allocation as a dashed line. Bars are coloured by status so months with overage stand out at a glance.
Monthly summary
For the selected month the summary panel shows the package allocation, hours used, hours left, the overage rate, overage hours and the overage cost — all using the package size and hourly rate that were active when the time was logged.
Why a snapshot? Each ticket stores the package size and hourly rate that were active when the time was logged, so the history view always reflects what the customer was actually charged — even if the product configuration changes later.
Tickets table
For every ticket logged in the selected month the table shows the ticket number and title, total time spent, the most-recent date, a status badge, and — when an overage billable item exists — a direct link to the WHMCS invoice that contains it. As on the home screen, the operator and note are shown when Show work log to client is enabled, and each row can be expanded to its individual entries.
Admin Area
Administrative features available in the WHMCS admin panel: per-service summary and history on the product page, and the time-logging header injected into every ticket.
Product Home Screen
Support by Time module WHMCS
Order now | Download | Community
Admin area service page
When the administrator opens a customer's Support by Time service in WHMCS, the module adds the following panels to the service page.
License verification
If the license is invalid or unreachable, a red bar with the error message is shown. While the license is invalid, the module's lifecycle hooks (Create / Suspend / Unsuspend / Change Package / Terminate) all return errors.
Summary
A one-row summary table for the current month: month, package hours, used hours, hours left, price per hour, hours outside the package, and the calculated overage amount.
Operator report
Two side-by-side tables — This month and Last month — listing each operator who logged time on this service with their total hours and number of entries.
History (recurring billing cycle)
List of tickets
One row per ticket logged in the selected month:
| Column | Description |
|---|---|
| Ticket | Ticket number and title (links to the support ticket) |
| Total | Total time logged on the ticket, plus the number of entries |
| Operator | The operator(s) who logged time |
| Date | Date of the most recent entry |
| Billable Item | Link to the WHMCS billable item created for this ticket (if any) |
| Invoice | Link to the invoice that contains the billable item |
| Status | Open / Billed / Paid / Unpaid |
Expanding a ticket row reveals its time entries (date, time, note, operator) — each with Edit and Delete actions — followed by the per-ticket audit trail. Entries belonging to a ticket that has already been billed are locked (shown with a lock icon instead of the Edit/Delete buttons) so billed time cannot be altered.
Before any time has been logged for the selected month, the tickets list shows an empty state. The panels sit on the WHMCS service page below the standard product/billing fields:
One Time services
For services with the One Time billing cycle the panel is simplified: a single Status block with package / used / left hours, and a list of all tickets that have consumed hours from the bucket.
Floating active-timers widget
On every admin page the module shows a small floating widget in the bottom-right corner listing all timers the current operator has running, each with a live elapsed clock and a link to the ticket. It polls in the background and ticks every second, so a running timer is never lost when navigating away from the ticket.
License alert on the admin homepage
The module also adds an alert to the WHMCS admin Home page that lists every Support by Time product whose license is currently invalid or unreachable. Each entry links directly to the corresponding product configuration page so the operator can fix it in one click.
Ticket header
Support by Time module WHMCS
Order now | Download | Community
Time-logging header
Whenever an administrator opens a ticket in the WHMCS admin area, the module injects a context-aware header above the ticket. The header loads its state over AJAX and renders entirely client-side — every action (save, close, reopen, timer, order) happens without reloading the page. It detects the situation (active service, terminated service, no service, ticket charged in a previous month, ticket closed, license issue) and renders the appropriate UI.
Open ticket — time form
The default view is a panel containing:
- A drop-down with the customer's support services. Active services are listed first, then suspended; terminated services are shown disabled. Each entry shows the package allocation and remaining hours:
Service name (cycle - status) Available: 0.46/1h. - An HH:MM time input with
−/+buttons (minute steps; minutes roll over into hours). For One Time services the value is capped at the hours remaining in the bucket. - An optional Note field (visible to the client when Show work log to client is enabled on the product).
- Action buttons:
- Save time — appends the entered time as a new entry; the ticket stays open.
- Close ticket and save time — appends the entry and sets the WHMCS ticket status to Closed.
- Start — starts a live timer (see below).
Each save adds a new entry to the ticket — it does not overwrite previous entries. The running total ("Already logged") and the full breakdown are shown in the audit trail.
Audit trail
Below the form, a timeline lists every action taken on the ticket (time logged, edited, deleted, timer start/stop/cancel, service ordered), with the operator name and a relative timestamp.
Live timer
Pressing Start opens a red Timer running panel with a server-anchored running clock and Stop / Cancel buttons. Stop rounds the elapsed time up to the nearest minute and appends it as a regular time entry (with the note, if any); Cancel discards it.
After stopping, the action is recorded in the audit trail (elapsed time, added hours, new total):
Closed ticket
When the ticket is closed, the header shows a compact summary (logged time + service) plus a ReOpen button that switches the WHMCS ticket status back to Open so the operator can log more time. If the ticket has already been billed, ReOpen is refused (the time is locked).
Ticket charged in a previous month
If the ticket's time belongs to a previous month, editing is locked: the header shows a red panel with the recorded time, the service, and a hint to recreate or split the ticket if more time needs to be logged. This prevents retroactive changes after the monthly billable item has been created.
Service is terminated
If the service the ticket is attached to has been terminated, time editing is also locked and the operator is asked to recreate or split the ticket against an active service.
Client without a support service
If the client does not yet have an Active or Suspended Support by Time service, the header shows an inline order form: a drop-down with all available Support by Time products and a drop-down with available WHMCS payment methods. Submitting it creates a WHMCS order, accepts it, runs auto-setup and reloads the ticket.
License issue
When any of the customer's Support by Time products has an invalid or unreachable license, the header shows a red banner instead of the time form, with the product name and the error message returned by the license server.