Work snippet 18 / 30Recurring billing

Maintenance contract recurring billing in Xero, with indexation and a release schedule

How I'd approach recurring billing for a national maintenance operator with about 460 contracts, so every contract is billed once, on time and at the right price, and amounts billed in advance are held until earned.

Work snippet with example figures.

Area
Recurring billing
Tools
Xero · Contract register · Make
Typical scope
US$2,500–4,500
Timeline
About 5 weeks · 4 fixed milestones

01Context

A national maintenance operator with about 460 active service contracts across commercial buildings. Contracts are billed monthly, quarterly or annually in advance, and each renews on its own anniversary with a price review.

The systems in play

In the example the contract details sit in a mix of spreadsheets, email and a few repeating invoices in Xero. The finance lead wants every contract billed once, on time, at the right price, with the billed-in-advance amount held properly until it is earned.

Table 1Who uses what
SystemWhat it does for the business
Contract registerOne record per contract and site: customer, term, price, billing frequency, index rule, PO requirement and status. An Airtable base in the example; a spreadsheet works too.
XeroInvoices, customers, credit notes and the unearned revenue balance.
Invoice runA scheduled flow that reads the register and creates draft invoices in Xero for review. Make in the example.
Finance leadReviews the exceptions list and approves each run.
Account managersOwn renewals, price reviews and customer notices.
AccountantAgrees the treatment of amounts billed in advance and posts the release journal.

02Problem

What the owner sees

  1. Contracts that go unbilled for a quarter before anyone notices
  2. Price reviews that are applied late, or never
  3. Customers who are billed after they have cancelled
  4. Revenue that is hard to explain because billed-in-advance amounts sit in sales

Recurring billing looks simple until a contract changes. A repeating template cannot know that a site was added last week, a price review took effect yesterday, or the customer is on hold. Each change is a chance to bill wrongly or not at all.

Table 2Where the drift starts
Everyday situationWhat goes wrong
Price reviewThe template is edited late, so months are billed at the old price
Site added or removed mid-termNobody adjusts the next invoice and no credit is raised
Customer on hold or in disputeThe template keeps sending invoices to a customer who should not receive them
PO number requiredThe invoice goes out without a PO and is rejected by the customer’s accounts team
Contract endedThe repeating invoice is never switched off
Billed in advanceThe whole quarter or year appears as income in the month of billing

03Approach

Four steps, in this order. Each one ends with a result that is checked.

  1. LookA read-only review of the contracts, the Xero repeating invoices and 12 months of invoices. Every active contract is matched to what was billed.
  2. Agree the rulesBilling frequency, indexation, pro-rata, holds, credits and the treatment of amounts billed in advance are written down.
  3. Build and connectThe register becomes the source of truth. The invoice run creates drafts in Xero from it. Repeating templates are retired.
  4. CheckEvery run is compared with the register before approval. A weekly list shows contracts with nothing billed and bills with no contract.
Table 3Billing rules agreed in writing (example settings)
ItemExample setting
Source of truthThe contract register. Nothing is billed that is not in it.
Billing dateThe first day of the billing period, created as a draft on the 18th of the month before
IndexationApplied on the anniversary using the index in the contract, with a stated cap and floor. The customer notice date is tracked.
Pro-rataBy days, on a 365-day year, for any site that starts or ends inside a billing period
On holdExcluded from the run, listed on the exceptions list, and released by the account manager in writing
Purchase ordersRequired for named customers. A draft without a PO is held, not sent.
Amounts billed in advanceHeld in an unearned revenue account and released monthly from a schedule prepared from the register
ApprovalThe finance lead approves the run. The accountant approves the release journal.

04What the setup includes

What the setup includes, and why each piece is there. The detail of how it is configured is agreed in the scoping call.

Show the setup, layer by layer
Table 4The setup, layer by layer
LayerWhat is set up and why
Contract registerContracts, sites, price lines, index rules and status in one place, with a billing schedule generated for each contract.
Billing scheduleEach contract gets a dated list of invoices for the term, with the amount, the PO and the tax code for each site.
Xero items and accountsOne revenue item per service type, an unearned revenue account, and a naming rule for references.
Invoice runA scheduled flow reads the schedule and creates draft invoices. It reads before it writes and skips any contract already billed for the period.
Exceptions listMissing PO, customer on hold, unmatched contact, amount not equal to the schedule, and tax code not found.
Indexation and noticesA monthly list of contracts reaching their anniversary, the new price, the notice due date and a draft customer letter.
Unearned revenue scheduleA monthly release amount per invoice, ready for the accountant to post as a journal.
Retired repeating invoicesEach template is matched to a contract, then switched off after the first run is checked.

How the data moves

  1. Contract in the register
  2. Billing schedule
  3. Draft invoices on the 18th
  4. Exceptions list
  5. Finance review and approval
  6. Invoice sent
  7. Monthly release schedule

05Edge cases

These are agreed with the finance lead and the account managers and tested on three past months.

Table 5Edge cases and how each is handled
SituationHow it is handled
Indexation above the capThe cap applies. The uncapped figure is shown in the register for the next review.
Customer given a price freezeIndex set to zero with an end date and a reason, visible on the schedule
Site added inside a periodA pro-rata line on the next invoice, calculated by days and shown on the exceptions list for approval
Contract ended inside a billed periodA credit note for the unexpired months, created as a draft and linked to the invoice
Customer on holdNot billed. Listed every month until released or ended.
Different PO per siteOne invoice per site where the customer requires it, with the PO in the reference
Customer paying by direct debitThe invoice is sent with the debit date and flagged in the register
Contract renewed with a new termA new schedule starts on the day after the old one ends. The old one is closed, not edited.
Amount in the draft differs from the scheduleHeld and shown with both figures, never sent
Run executed twiceNothing is created twice because each invoice carries a unique key built from contract, site and period
Who changed whatEvery register change carries a user and a date, and every invoice shows the schedule line it came from

06Worked example

The tables below use eight contracts with example figures. They show the shape of the checks, not a client result.

Table 6Contract register after the anniversary review (example data, US$)
ContractBillingValue beforeIndex appliedValue afterPer invoice
C-1042Quarterly86,400.003.4%89,337.6022,334.40
C-1057Monthly31,200.003.4%32,260.802,688.40
C-1063Quarterly148,000.003.0%152,440.0038,110.00
C-1078Annual18,600.00Price freeze18,600.0018,600.00
C-1091Monthly54,000.004.1%56,214.004,684.50
C-1102Monthly262,800.003.4%271,735.2022,644.60
C-1115Quarterly42,000.00Capped at 5.0%44,100.0011,025.00
C-1120Annual96,000.003.4%99,264.0099,264.00
Total, 8 contracts739,000.00763,951.60
Table 7Release of one quarterly invoice from unearned revenue, contract C-1042 (example data, US$)
MonthHeld at the startReleased to incomeHeld at the end
January22,334.407,444.8014,889.60
February14,889.607,444.807,444.80
March7,444.807,444.800.00
Table 8Two mid-term changes on a quarter of 90 days (example data, US$)
ChangeCalculationAmount
Site added on February 10 at 4,380.00 a year50 days remaining at 12.00 a day (4,380.00 ÷ 365)600.00 on the next invoice
Contract C-1042 ends on February 281 month unexpired, 22,334.40 ÷ 37,444.80 credit note
Table 9Monthly run: register against the Xero drafts (example data)
GroupRegister expectsDrafts createdHeld on the exceptions list
Monthly contracts1981926: 4 missing PO, 2 on hold
Quarterly contracts due this month57570
Annual contracts at anniversary880
Total drafts due2632576, each with an owner
Table 10Invoice run calendar (example settings)
Day of the monthStepOwner
15Register frozen for next month’s changesAccount managers
18Draft invoices created from the scheduleInvoice run
19 to 20Exceptions reviewed; missing POs requestedFinance lead
22Run approved and invoices sentFinance lead
1Invoice date and the first day of the periodAutomatic
5List of contracts with nothing billedFinance lead

07How the result is checked

The register is the control. Every run is compared with it before approval, and every month a second check looks for what should have been billed and was not.

Table 11Checks and pass conditions
CheckHowPass condition
Run against the registerDrafts compared to the schedule by contract, site and periodEqual in count and amount, or each difference is on the exceptions list
Nothing billedActive contracts with no invoice in their expected periodZero, or each has a named reason
Nothing billed twiceUnique key of contract, site and periodNo duplicates in the draft list or in Xero
Annual valueRegister value compared to the sum of the scheduleEqual for every contract
Unearned revenueXero balance compared to the balance worked out from the registerEqual, with the release journal approved by the accountant
IndexationAnniversary list compared to the invoices that followEvery new price applied from the right date
Retired templatesEach repeating invoice matched to a contractNone left active without a register record

08Scope and milestones

A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.

Table 12Scope: what a project like this covers
AreaIncluded
AuditRead-only review of the contracts, the Xero repeating invoices and 12 months of invoices, a 45-minute call, written findings and a fixed quote
Billing rulesThe rules in writing, signed by the finance lead and the accountant
Contract registerBuilt or cleaned from your spreadsheets, with a billing schedule per contract
Xero set-upItems, accounts and naming rules, including the unearned revenue account
Invoice runA scheduled flow that creates drafts, with a duplicate guard and an exceptions list
IndexationAnniversary list, new prices and draft customer letters
Release scheduleA monthly schedule for the accountant to post
HandoverWritten SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live
Not includedTax filing and statutory returns.
Also outside the scopeSending customer letters. Collections and chasing overdue invoices. Changing the contract terms. Software subscriptions (billed to you by the vendors).
Table 13Fixed milestones
MilestoneDeliverableTimingShare
M1 Audit and rulesFindings, a fixed quote and the billing rules in writingWeek 120%
M2 RegisterContracts loaded and checked against 12 months of billingWeeks 2 to 330%
M3 Invoice runDrafts created, exceptions list working, first run approvedWeek 435%
M4 HandoverIndexation list, release schedule, SOPs, handover video, 14 days of fixesWeek 515%

Typical scope for this kind of project: US$2,500–4,500

About 5 weeks across 4 fixed milestones. The Systems Audit (US$300, fixed) comes first and confirms the scope.

Describe what is going wrong between your job system and your books, and I'll say where I'd look first.

Send a short note through the form on the home page. I will reply with where I would start, and whether the US$300 Systems Audit is the right first step.

Hire me on Upwork (opens in a new tab)Hire me on Freelancer (opens in a new tab)