Work sample 05 / 17Clean-up & reconciliation
Xero clean-up and hire billing check, with an Airtable, Glide and Make asset app
How I take a hire or equipment business from a year of loosely coded Xero invoices and a paper asset log to clean books, a billing check and a yard app the crew can use.
- Area
- Clean-up & reconciliation
- Tools
- Xero · Airtable · Glide · Make
- Typical scope
- US$2,500–4,500
- Timeline
- About 4 weeks · 4 fixed milestones
Work sample: realistic data, built to show how I approach this kind of project. Not a past client job.
01The problem
Hire and equipment businesses often run two records that never meet: invoices in Xero, coded by whoever raised them, and an asset log on paper or in a spreadsheet that says what went out to which site. When the two drift apart, hire keeps running on sites that are not being billed, and the income accounts stop telling the owner which service lines pay.
The work is to straighten out a full year of Xero coding, rebuild the asset log into something reliable, check billing site by site, and then put a simple app in place so the log stays right from here on.
Owners usually notice it as
- Income coded to one catch-all account, or to different accounts for the same service
- Duplicate contacts for the same customer, with different tax defaults
- Assets on the log that nobody can find, or that came back from the wrong site
- No quick way to say which sites are on hire right now and what they should be billed
02Scope
A fixed scope agreed in writing before anything is built. The table shows what a project like this usually covers and what it leaves out.
| Area | Included |
|---|---|
| Xero coding | Full financial year of invoice lines re-coded by rule into service-line income accounts, with a review queue for anything a rule cannot place |
| Tax and contacts | Tax-code review on every line; duplicate contacts merged with the owner's sign-off |
| Asset log | Paper or spreadsheet log rebuilt into one register: duplicates, wrong-site returns and items not returned listed for follow-up |
| Billing check | Every site-asset pairing checked against what was invoiced, with under- and over-billing listed for the owner to decide |
| Asset app | Airtable base, Glide app for the yard and a Make scenario that drafts hire invoices in Xero |
| Not included | BAS lodgement, payroll and anything that needs a registered tax or BAS agent |
Typical volumes for a business of this size. The sample files are sized as described in section 05.
| Milestone | Deliverable | Timing | Share | Weeks 1–4 |
|---|---|---|---|---|
| M1 Audit and plan | Exports, data profile, coding rules agreed, findings memo | Week 1 | 20% | |
| M2 Xero clean-up | Re-coding journals, tax fixes, contact merges ready to post | Weeks 2–3 | 30% | |
| M3 Asset log and billing check | Rebuilt register, billing check by site, decision list | Week 3 | 25% | |
| M4 App, handover | Airtable, Glide and Make live, SOP and walkthrough | Week 4 | 25% |
Typical scope for this kind of project: US$2,500–4,500
About 4 weeks across 4 fixed milestones. The fixed quote follows a US$300 Systems Health Check, which confirms the volumes and the scope first. Your software subscriptions are billed to you by the vendors.
03What I fixed, and why
Construction drawing. Each stage has its own check before the next one starts.
- 01
Profile the year first
I export the Xero invoice lines, contacts and the asset log and profile them before changing anything: which accounts are used for what, how many spellings each site has, where the dates do not line up.
- 02
Code by rule, review by exception
Coding rules handle the bulk; anything a rule cannot place goes to a review queue with the reason, so nothing is guessed.
- 03
Rebuild the log as a register
One row per asset movement, sites normalised, duplicates and impossible returns flagged.
- 04
Check billing site by site
Each site-asset pairing on hire is compared with what Xero billed for the same period. The owner decides what to re-bill or credit.
- 05
Put the app on top
Airtable holds the register, Glide gives the yard a phone screen to book assets out and in, and Make drafts the hire invoice in Xero. Drafts only: a person approves before anything is sent.
04Checks
Nothing goes live on trust. These checks run before sign-off and stay in the files, so they can be re-run after every change.
- Every invoice line counted once: coded by rule, queued for review or excluded with a reason
- Re-coding journals net to zero across the year
- No contact merged without a matching business number, email or owner sign-off
- Asset register rows reconcile to the original log, row for row
- Running the Make scenario twice creates no extra drafts
| Check | What it catches | Status |
|---|---|---|
| Lines counted + voided = lines in the export | Nothing dropped or double counted | PASS |
| Income by rule (Category Rules) = income in the export | Every line falls under exactly one rule or the no-rule bucket | PASS |
| Lines by rule = counted lines | Same, by count | PASS |
| Revenue by Service total = income in the export | The new view loses nothing | PASS |
| Before (200 + 260) = after (Revenue by Service) | Re-coding moves income, it does not create it | PASS |
| Recode journals: debits = credits | Journals balance | PASS |
| Recode journals: months out of balance | Each monthly journal balances on its own | PASS |
| Recode journals: net credit to 4010-4040 and 835 = rule-coded income | Journals match the line-level coding | PASS |
| Rule-coded lines with no account | Every rule gives an account | PASS |
| Review queue = counted lines needing a person | Nothing needing a decision is hidden | PASS |
Show all 35 checks
| Check | What it catches | Status |
|---|---|---|
| Tax Review lines = counted lines with the wrong tax rate | Every tax error is listed | PASS |
| GST effect: Tax Review = Invoice Lines | Two independent calculations agree | PASS |
| Contacts whose master is missing or merged again | One level of merge, no chains | PASS |
| Contacts kept separate (similar name, different tax number) that were merged | No false merges | PASS |
| Invoice lines by contact = lines in the export | Every line belongs to a known contact | PASS |
| Duplicate dockets left in the clean log | Each docket counted once | PASS |
| Duplicate dockets removed = DUPLICATE issues | Every removal is on the issues list | PASS |
| Sites below zero at 30 June | Wrong-site returns all resolved | PASS |
| Asset Position total = net units in the log to 30 June | Position is complete | PASS |
| Fleet: should own - yard - on hire - not returned - variance | Fleet adds up | PASS |
| Stocktake variance = STOCKTAKE VARIANCE issues | Variance is raised, not absorbed | PASS |
| Billable unit-weeks: Billing Check = Hire Cycles in FY26 | Billing check is complete | PASS |
| Invoiced hire unit-weeks: Billing Check = Invoice Lines | Every hire line is matched to a site | PASS |
| Hire credits: Billing Check = Invoice Lines | Credit notes are counted | PASS |
| Make run log: errors = incidents listed | Every error execution is explained | PASS |
| Make run log: every error retried, resumed or raised | No error is dropped silently | PASS |
| Make run log: unresolved errors | Nothing left incomplete at month end | PASS |
| Make run log: S02 drafts = Make July Run | The log and the billing run agree | PASS |
| Make run log: S02 ran every day in July | A missed day would miss cycles | PASS |
| Make run log: every scenario has run history | No scenario is switched off unnoticed | PASS |
| Make July run: repeated idempotency keys | A re-run cannot double bill | PASS |
| Make July run: amount = unit-weeks x rate | Draft amounts are right | PASS |
| Exceptions: billing rows = pairs not agreeing | Every billing gap is on the register | PASS |
| Exceptions: open asset issues | Every open asset issue is on the register | PASS |
| Engine regression: line coding disagreements | Engine matches the answer key on every line | PASS |
Status read from the sample workbook. Each check is a formula, not a typed value.
05Handover
Everything is handed over in editable files you own, with the steps written down so your team is not dependent on me.
In this work sample
A full-year hire business: 2,538 Xero invoice lines on 1,853 invoices, a 1,396-row asset log and 446 site-asset pairings, in a 28-tab workbook with 26,445 formulas and 35 controls.
- Clean Xero file with the journals posted by you or your bookkeeper
- Workbook with the coding rules, register and billing check, every figure a formula
- Airtable base, Glide app and Make scenario in your accounts
- SOP for booking assets out and in, and for the monthly billing check
- A recorded walkthrough
06Files in this work sample
Screens from the sample files. Select one to open it full size.

Xero-Hire-Billing-Cleanup-FY26.xlsx › Dashboard

Xero-Hire-Billing-Cleanup-FY26.xlsx › Invoice audit

Xero-Hire-Billing-Cleanup-FY26.xlsx › Billing check

Xero-Hire-Billing-Cleanup-FY26.xlsx › Make map

Xero-Hire-Billing-Cleanup-FY26.xlsx › Make run log

Xero-Hire-Billing-Cleanup-FY26.xlsx › Airtable schema

Xero-Hire-Billing-Cleanup-FY26.xlsx › Controls

Xero-Hire-Billing-Report.pdf · page 7

PREVIEW.png · one-page overview
| File | What it is | Size |
|---|---|---|
| Xero-Hire-Billing-Cleanup-FY26.xlsx | Workbook: re-coded invoice lines, revenue by service line, recode journals, tax review, contacts, chart fix map, asset ledger, fleet reconciliation, hire billing check, Airtable/Glide design, Make suite (10 scenarios), July run log and incidents, controls and test log | 728.1 KB |
| Xero-Hire-Billing-Report.pdf | Report (20 pages): data profile, findings, options, target design, the Make suite and its July run log, results, controls, tests, cutover, RACI, risks, SOP | 782.9 KB |
| Executive-Summary.pdf | One-page executive summary | 138.7 KB |
Tell me what’s bugging you and I’ll tell you where I’d look first.
Send a short note on Upwork about what is slowing the business down. I’ll reply with where I’d start, and whether the US$300 Systems Health Check is the right first step.