GLPI already knows how many pages each printer has printed. What is missing is turning that into an invoice. Print Counters, a free NexTool module for GLPI 10, 11 and 12, uses the counters the inventory already collects to calculate cost per page, allowance and overage, and to close each billing period without a spreadsheet.
The problem
Companies that outsource printing usually pay a fixed amount with a page allowance and a price for each page over it. Every month someone writes down each printer's counter, subtracts last month's, adds up the fleet and checks the allowance. It is manual, error-prone work, and checking the supplier's invoice gets postponed until after it has been paid.
GLPI collects each printer's counter through the GLPI Agent network inventory and shows the series in the printer's Page counters tab. But it has no notion of price, allowance or billing period. The best-known community plugin for this, Infotel's Printercounters, does its own SNMP polling; its latest version, 2.0.2, came out in February 2025 for GLPI 10, the plugin's setup.php only accepts versions below GLPI 11, and the repository is archived.
How Print Counters works
The module never talks to the printer: it reads what the native GLPI inventory stores, one reading per printer per day, with the cumulative counter. A period's consumption is the closing reading minus the opening one, never the sum of the daily readings, which would multiply the invoice by the number of inventoried days.
- Cascading cost per page. In the Costs tab, each rule applies to a printer, a model or an entity, with a B&W and a color price and a start and end date. The most specific rule wins: the printer's; if there is none, the model's; otherwise, the entity's. An entity rule marked Applies to sub-entities is inherited by the child entities.
- Contracts with a fleet-wide allowance. The Contracts tab holds the fixed period amount, the B&W and color pages included, the overage price, the closing day and the printers. Day 1 means the calendar month; day 15 creates periods from the 15th to the 14th of the next month. The allowance belongs to the whole fleet, not to each device: the overage is whatever exceeds the consolidated total.
- Automatic consolidation and closing. Readings are reconsolidated every 6 hours and, with Automatic closing on (the default), overdue periods close on their own once a day. In the Billing tab you can Reconsolidate readings, open the Detail by printer and Close a period by hand.
- Counters tab on the printer. On the printer's own record: B&W and color pages for the period, cost per page, which rule the price came from, the period amount and the contract it belongs to, or Not under contract.
- Notifications in the bell. Low toner, printer without readings, consumption above average, allowance exceeded while the period is still open, and period closed. Each notification opens the printer or the Billing tab.
Two numbers: the printer amount and the contract total
The module calculates two different things. The first is the amount per printer: pages in the period times the cost per page from the Costs tab. It tells you how much each device or department costs, and it exists even for a printer that is not under contract.
The second is the period total, the figure that goes on the outsourcing invoice: fixed amount plus overage, calculated with the contract's overage price and not with the cost table. That is why the Total in the Billing tab is not the sum of the printer amounts.
Example: a contract with 10,000 B&W pages included, a fixed amount of 1,500.00 and an overage price of 0.08 per page. If the fleet prints 12,500 B&W pages in the period, the overage is 2,500 pages, or 200.00, and the total comes to 1,700.00, whichever printer did the printing.
What happens when a reading is not what you expect
A wrong print invoice almost always starts with a counter that behaved oddly. The module handles each case explicitly instead of assuming zero:
- Printer with no reading in the period. It shows as “no reading”, never as zero pages. Zero would say it printed nothing; no reading says nobody knows.
- Inventory that started mid-period. With no reading before the period, the starting point is the first reading inside it. Starting from zero would bill the device's entire history at once.
- Counter that went backwards. A reset or a device swap. The printer is flagged “counter reset” and nothing is charged for the period, because the real consumption cannot be determined. The new reading becomes the starting point of the next period.
- Color device that only reports the total. If the device does not split B&W from color, the whole volume is counted as B&W and the printer tab warns about it.
A printer with no reading or with a reset marks the period as having incomplete data, and the statement carries a warning in its footer.
The CSV statement and checking the supplier's invoice
The Download CSV button in the Billing tab produces the period statement, ready for Excel, in UTF-8 with correct accents, semicolon-separated and with a decimal comma (the format Excel expects in Brazilian Portuguese). Each row is a printer, with opening and closing B&W and color counters, pages, cost per page, amount and status. The footer shows the allowance, pages, overage, fixed amount, overage amount and total.
For an open period, the statement reconsolidates the readings on the spot and comes out as a preview, without saving anything, with a line warning that the figures may still change. A closed period does not change: the allowance and prices are copied from the contract at closing, and a later price adjustment does not rewrite an invoice that has already gone out.
To check the supplier's invoice, compare the statement's counters with their report, printer by printer. A small difference is usually about the date: the module uses the last inventory reading up to the end of the period, and the supplier may have read the device on another day. A large difference usually comes from a printer with no reading, a reset or a color device counted as B&W.
When you adjust the price per page, the whole period uses the price in force on its last day. Start the new price on the first day of a period.
Symptom and likely cause
| Symptom | Likely cause |
|---|---|
| Printer amounts at zero | No rule in the Costs tab: the printer shows “no cost rule found”. |
| No period in the Billing tab | A period is only created for an active contract within its validity dates. |
| Printer with “no reading” | The inventory did not reach the device. Check the Page counters tab. |
| Period that does not close by itself | Automatic closing is off in the Settings tab, or GLPI's automatic actions are not running. |
| Low toner notification never arrives | The printer only reports “OK”, with no percentage, or the profile lacks the Receive module notifications right. |
| No consumption spike notification | The alert compares with the average of the latest closed periods and needs at least 2 of them. |
How to enable it
- Update the NexTool plugin to version 6.49.0 or newer.
- In NexTool, in the module list, install and enable Print Counters.
- In the Costs tab, create at least one price-per-page rule, for the entity, the model or the printer.
- In the Contracts tab, fill in the allowance, overage, fixed amount, closing day and the contract's printers.
- In the Settings tab, adjust the notification thresholds: Low toner (%), default 15; Stalled counter (days), default 7; and Consumption spike (%), default 50.
- In Administration > Profiles, give each profile only what it needs, such as View billing, Close billing period and Receive module notifications.
Prerequisite: the GLPI Agent must reach the printers over SNMP. If the Page counters tab is empty, the module will have nothing to bill either.
Who it is for
Companies that outsource printing and want to check the invoice before paying it; providers that rent out printers and bill per page; and IT teams that want to know how much each department prints and be warned before the toner runs out.
With several entities, each one only edits its own costs and contracts; recursive ones from the parent entity appear in the children for reference only.
Compatibility
- GLPI: 10, 11 and 12, with the same package
- Plan: free
- Plugin: NexTool 6.49.0 or newer
- Counter source: native GLPI inventory, through the GLPI Agent
Next step
Print Counters is part of NexTool, an ecosystem of modules that extend GLPI without code customization. See every feature on the module page or talk to the team if you need help getting printer inventory to work.
Sources: Infotel, Printercounters 2.0.2 (GitHub); Infotel, Printercounters setup.php (GLPI version requirements).
Reviewed by the NexTool Solutions team.
Comments
Comments on this post come from GitHub (giscus). When you load them, your browser connects to GitHub, which receives your IP address and may set its own cookies.
To load them automatically, enable functional cookies