Printing is the one amenity that costs you per use — and the easiest to stop charging for
A door costs the same whether it opens twice or forty times. WiFi costs the same whether a guest streams or sleeps. Printing is the exception: every page has a marginal cost, which makes it the one amenity where not measuring is a slow transfer of money out of the business.
The amenity where measurement is the product
Door access, WiFi and printing look like the same kind of integration from a distance: a booking exists, somebody should be allowed to use something, and the permission has to disappear afterwards. Two of the three are genuinely just permissions. Printing is not.
Toner, paper, drum wear and the service contract all scale with pages. That changes what the integration has to do. For a door, "did it open" is operational curiosity. For a printer, "how many pages" is an invoice line — and if you cannot produce the number, the only options are to include printing in the price or to absorb it.
Both of those are legitimate business decisions. What is not a decision is discovering you cannot measure after you have already promised members that printing is charged per page.

A quota is a prepaid balance, not a counter
This is the mental model that makes the rest make sense. On a cost-recovery print server, the way you grant a guest twenty euros of printing is by creating a user and setting their account balance to twenty. The press-and-print machinery then draws that balance down.
So the consumed amount is not something you read directly. It is a subtraction: what you handed out, minus what remains. In Boris that is exactly how the cost is derived — the quota minus the balance still sitting on the account — alongside the cumulative page and job counters the print server keeps per user.
The implication is easy to miss and expensive: the balance is the receipt. Lose it, zero it, or read it at the wrong moment, and the cost of the stay becomes unknowable after the fact.
The bug that bills everyone the full quota
Here is the sequence that writes itself if nobody is thinking about it. The stay ends. The system revokes print access, which on most servers means zeroing the account balance so an old credential cannot print. Then a job runs that refreshes usage for finished stays.
It reads a remaining balance of zero. Quota minus zero is the whole quota. Every departing guest is now recorded as having consumed every cent of their allowance, and the figure looks plausible enough that it can survive a long time before someone notices that nobody ever prints less than exactly twenty euros.
The fix is ordering, not cleverness: capture the usage before the revoke, store it, and make any subsequent read return the stored value marked as final rather than recomputing it from a balance that no longer means anything. In Boris the revoke path does that read itself, and a later refresh on a grant that is no longer active returns the stored figure flagged stale instead of asking the server again.
Never reissue a grant someone has already spent
The second quota-specific trap. A booking gets extended, or moved, or a staff member clicks the provisioning button twice. If that reissues the credential, it sets the balance back to the full quota.
The guest now has their allowance twice, and the record of what they used in the first half is gone — not disputed, gone. So an existing active grant is refreshed in place, never recreated. It is the same discipline access control needs for a moved booking, except here the mistake has a price tag.
Expiry deserves the same care. A grant whose validity window has passed should be revoked by a scheduled sweep — reading the final usage on the way out — rather than left active indefinitely because the stay ended quietly and nobody pressed anything.
Not every platform can count, and that decides your pricing
This is the part worth settling before you buy hardware or sign anything. Print platforms differ in which of these they actually do:
- Guest accounts. Can you create a short-lived identity for someone who will be gone on Friday?
- Quotas. Can that identity carry a spend limit, or is access binary?
- Usage reporting. Can you read back pages, jobs and cost per user — not just a site total?
- Cost recovery. Does the platform price the job itself (colour, duplex, paper size), or will you be multiplying pages by a guessed average?
- Secure release. Does a job wait at the device for the person, which is what stops the tray of abandoned prints that nobody will pay for?
Boris models these as explicit capability flags per provider, and the reason is honesty in the interface: a provider that cannot report usage should not be offered a "bill this stay" button. Of the two print providers it currently connects, one supports quotas and usage and derives cost from the remaining balance, and the other does guest accounts but reports no per-user usage at all. Those are two different businesses you can run, and the choice has to be made deliberately rather than discovered at the first invoice.
Two numbers that are not the same
One last detail that ruins reports quietly. The counters a print server keeps per user are usually cumulative for the life of that user. If you create one reusable account for guests, the page count you read is every guest since installation, and the per-stay number is unrecoverable.
Per-stay accounting therefore needs per-stay identity: a user created for the booking, carrying its own quota and its own counters, revoked when the stay ends. That is more objects in the print server and considerably fewer arguments at the desk.
What we have actually tested
Since this guide is about trusting numbers, the same standard applies to it. The PaperCut provider in Boris was validated against a real PaperCut server: the connection test, the hand-written XML-RPC codec (the PHP extension for it was removed in PHP 8, so it had to be written from the spec), creating internal users, setting and reading account balances and user properties. What has not been exercised for lack of hardware is printer discovery against real queues and reading usage counters that are not zero. The other provider was built from documentation.
Which is the honest version of the buying advice in this article: ask for the capability list, then ask what has been run against real equipment. Those are different questions, and only one of them is usually answered.
Frequently asked questions
Why is printing different from the other integrations?
Because it has a per-use cost. Access control and WiFi are permissions: you grant them, you revoke them, and the economics do not change with volume. A print quota is credit you hand out, and what is left of it when the stay ends is the only thing that tells you what the stay actually cost you. A system that can show who printed but not how much cannot charge for it.
Why read the usage counter before revoking access?
Because on a quota-based system the quota is a prepaid balance, and the cost is derived from what is left of it. Revoking usually zeroes the balance — so if you read afterwards, remaining is zero and you conclude the guest consumed the entire quota. The usage has to be captured while the grant is still active, and any later read must return that stored figure rather than recomputing it.
What happens if you reissue a credential mid-stay?
On a quota system you reset a balance the guest has already spent, which hands them the allowance twice and erases the evidence of the first half. An existing active grant should be refreshed, never reissued — the same rule as access control, with money attached.
Can every print provider report usage?
No, and this is the question to settle before installing anything. Some platforms do guest accounts and release but expose no per-user counters at all. With one of those you can give a member printing and you will never be able to bill it accurately — a fine outcome if printing is included in the price, and a silent loss if it was supposed to be extra.
