Services
Some monthly charges cannot be counted from the PBX. A fibre circuit, a mobile SIM, a leased line, a licence you resell, a maintenance contract: the PBX has never heard of any of them, and they belong to one customer rather than to everybody on a rate plan.
That is what a service is. Nothing in Vodia Billing knows what these products are — an NBN service in Australia, an FTTC line in the UK, Glasfaser in Germany, fibra in Spain. A service is a description, a currency, a price, and a customer who has one.
Services are configured in two places, and the split is the whole idea:
- Catalogue → Service catalogue is a price list. It sells nothing.
- Tenants → Services is where a customer is given one, and it holds its own price.
Why not a flat rate on the plan
A flat recurring row is the obvious place to put a circuit, and it fails for
two reasons.
Scope. A flat row bills every tenant on that plan. Customer-specific services therefore force a plan per customer, and plans stop being plans.
A silent collision. Recurring charges are keyed on
{system, domain, basis, period, subtype, frequency}, and a flat row's key is
its description. Two rows both described "NBN 100" share one key, so only one
of them ever bills — no error, no second line, and the second circuit simply
not charged. Vodia Billing now refuses to save two identically described flat
rows for exactly this reason, and names this page in the refusal.
A service is keyed on its own assignment, so three identical circuits are three charges and three invoice lines.
The catalogue
Catalogue → Add service. One row per product you sell:
| Field | Notes |
|---|---|
| Description | Prints on the invoice. Authored in your language, printed verbatim |
| Currency | Lives on the item, exactly as it does for hardware |
| Price | A starting point, copied onto each assignment |
| Cost | Optional. Blank leaves margin blank rather than showing a false 100% |
| SKU | Optional. Appears in the biller export |
| Category, supplier | Optional, free text. Not a closed list |
| How often | Monthly, quarterly or annual — the default for new assignments |
Editing the catalogue never re-prices a customer
This is the one rule worth reading twice. A hardware item fills in a one-time charge form once. A service catalogue entry would otherwise be read every month, so a price rise here would silently re-price every customer who has that service on the next bill run.
It does not. The price is copied onto the assignment when the service is given to a customer, and the catalogue is then out of the loop. Re-pricing a customer is an edit to their assignment, which is a decision somebody makes deliberately.
Archiving an item follows the same logic: it leaves the price list, and customers who already have it keep being charged, because they still have the service. Ending somebody's service is done on the tenant.
Assigning a service
Tenants → Services → Assign a service. The catalogue fills the form in and every field stays editable — a negotiated price is normal.
| Field | Notes |
|---|---|
| From the catalogue | Which product this is. Only items in the tenant's own currency are offered |
| Description | What the service is. Prints on the invoice |
| Label | Which one this is. Optional, and see below |
| Quantity | One or more |
| Each / Cost each | This customer's price, not the list price |
| How often | Monthly, quarterly or annual |
| Billing month | Quarterly and annual only — the month it appears on an invoice |
| First month | The first period it bills |
| Last month | Blank means open-ended |
One row per instance, and the label
Three circuits at three sites are three assignments, each with its own label — a street, a site name, a circuit or service id, a phone number. The label prints under the description, which is what makes three identical services three lines a customer can actually check:
NBN 100
Head office · AVC10000000 99.00
NBN 100
Branch office · AVC20000000 99.00
They also end independently, which is the practical reason instances beat a quantity: one site closes, one assignment gets a last month, the others carry on untouched.
Use quantity when the things genuinely are interchangeable — ten extra mailboxes, five fax lines. One assignment, quantity 10, one invoice line.
Currency
An item priced in AUD cannot be assigned to a tenant billing in USD. The refusal names both currencies rather than converting, defaulting, or billing a number that means nothing. Add the row in the currency you sell in — currency lives on the item.
If a tenant's currency is changed after a service was assigned, that service stops billing and says so in the bill run's unpriced list. It bills nothing rather than billing the wrong currency quietly.
Whole months, both ends
First month and Last month are months, not dates. A service turned on
mid-month bills the full month.
That is deliberate. Vodia Billing does not guess whether your commercial terms prorate a part-month — the same decision it makes for a tenant onboarded mid-period. If your terms do prorate, add a one-time credit for the difference, which puts a figure and a reason on the invoice rather than arithmetic nobody can check.
Ending a service is its last month. That keeps the history: past invoices still refer to something that exists.
Editing a service that has already billed
Change a price or a quantity and Vodia Billing re-cuts the charge in every period that is not yet invoiced or exported, and tells you which periods it left alone:
re-cut 2026-11 · left 2026-10 as invoiced
A finalized line is never rewritten. If a period is already on an issued invoice, the change applies from the next one.
Removing an assignment outright is refused once any of its charges has been invoiced or exported. Set a last month instead — the refusal says so, and names the periods involved.
What a service is not
Not counted as a line for per-unit tax. A US 911 fee counts access lines:
extensions, DIDs, licences, trunk channels. A fibre circuit is not an access
line, so services are deliberately excluded from that count. An invoice with
two circuits and two extensions shows 911 fee (2 × 0.35), not four.
Not goods. A service falls in the recurring tax bucket, so a percentage component on recurring applies to it. Hardware is goods; a circuit is a service.
Not a plan basis. service cannot be added to a rate plan's recurring
rows, and the API refuses it by name. A service is assigned to a tenant and
priced on that assignment.
Not snapshot-derived. No snapshot, no partial-period flag, no highest-observed window. The quantity is what you wrote down. Services therefore bill for a period that has no snapshots at all, and for a tenant with no sell plan.
In Xero and QuickBooks
A service line is handed over as a recurring line, under whatever revenue account your existing recurring mapping uses. No extra configuration.
The line description carries the label:
NBN 100 — Head office · AVC10000000 99.00
NBN 100 — Branch office · AVC20000000 99.00
On Xero (Shape 1) the accounting system's own mailer sends the document, so that description is what the customer reads. Without the label they would receive two identical lines.
In the biller export
Service rows are typed RECURRING, with the SKU in the
direction_or_subtype column and the description with its label in
number_or_desc:
"RECURRING","...","hq.northwind-example.com","2026-11","","FTTC80","NBN 100 — Head office · AVC10000000","","","1","","99.0000","USD","NW-1041",""
The amount column is the extended total, so a biller that ignores the
quantity column still charges the right money.
Worked example
Northwind Telecom resells two fibre circuits to their head-office tenant.
Catalogue:
| Description | Currency | Price | Cost | How often |
|---|---|---|---|---|
| NBN 100 | USD | 99.00 | 89.00 | monthly |
Assignments on hq.northwind-example.com:
| Description | Label | Qty | Each | First month | Last month |
|---|---|---|---|---|---|
| NBN 100 | Head office · AVC10000000 | 1 | 99.00 | 2026-11 | |
| NBN 100 | Branch office · AVC20000000 | 1 | 99.00 | 2026-11 |
On the November invoice:
| Item | Qty | Amount |
|---|---|---|
| NBN 100 — Head office · AVC10000000 | 1 | 99.00 |
| NBN 100 — Branch office · AVC20000000 | 1 | 99.00 |
Margin is 10.00 per circuit, which reaches the margin report because a cost was entered. Both lines fall in the recurring tax bucket. Neither is counted by a per-line 911 fee.
The branch closes in February
Set the branch assignment's last month to 2026-01. It bills November,
December and January, and stops. The head-office circuit is untouched, and the
invoices already issued still refer to a service that exists.