Work snippetReconciliation

Xero bank-feed and job-payment reconciliation, with an exceptions queue

How I would approach about 1,900 bank lines a month for a 40-tech HVAC contractor with three branches, so clear payments are matched by rule, grouped and part payments are proposed with a reason, and the rest go to a queue with an owner.

Work snippet with example figures.

Area
Reconciliation
Tools
Xero · ServiceM8 · Make
Typical scope
US$2,200–3,800
Timeline
About 5 weeks · 4 fixed milestones

Context and systems map

A 40-tech HVAC contractor with three branches, a finance lead and two accounts staff. Customers pay by card, direct deposit, cheque and through a payments provider. Job invoices come from ServiceM8 and the bank feed lands in Xero, and about 1,900 bank lines a month have to be matched by hand.

The systems in play

In the example a matching layer reads each bank line, finds the job invoice or invoices it pays, proposes the match with a reason, and sends anything it cannot settle to an exceptions queue with an owner.

Systems map: who uses what
SystemWhat it does for the business
Xero bank feedSource of bank statement lines, one feed per bank account.
ServiceM8Source of job invoices, job numbers and payment status.
Matching layerA scheduled flow that scores each bank line against open invoices and proposes a match. Make in the example.
Exceptions queueA list of lines that need a person, with the reason, the candidate invoices and an owner.
Finance leadOwns the rules and approves any change to them.
Accounts staffWork the queue daily.

How the data moves

  1. Bank feed line
  2. Rules and scoring
  3. Proposed match
  4. Auto-approve or queue
  5. Xero payment applied
  6. ServiceM8 marked paid
  7. Daily summary

Problem

What the owner sees

  1. Accounts staff spending days matching bank lines
  2. Customers who paid but still get a chase email
  3. Payments in Xero that never reach the job system
  4. A bank reconciliation that is always a week behind

Matching is mostly pattern: the reference, the amount, the name. A person does it well but slowly, and the errors are quiet: a payment applied to the wrong invoice, a grouped payment split by guesswork, a deposit nobody can place. The goal is to settle the clear cases by rule and to make the unclear ones visible with context.

Where the drift starts
Everyday situationWhat goes wrong
Customer pays three invoices in one transferThe line is applied to one invoice and the other two stay overdue
Reference holds a job number with a typoThe line sits unmatched until someone searches by hand
Card payments paid out net of feesThe amount never equals an invoice, so nothing matches
Part paymentThe invoice is marked paid or left open, never partly paid
Duplicate paymentBoth sit on the account and the customer is never refunded
Payment received for a cancelled jobIt is applied to the next open invoice for that customer

Approach

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

  1. LookRead-only review of three months of bank lines and invoices. Every line is classified by hand to build the rule set and the target match rate.
  2. Agree the rulesMatch keys, tolerance, grouped payments, part payments and what is never matched automatically are written down and signed.
  3. Build and testThe matching layer runs in suggest-only mode against three past months, then on live lines with a person approving every match.
  4. Go live in stepsExact matches auto-apply first. Grouped and fuzzy matches follow only after a week with no wrong match.
Rules agreed in writing (example settings)
ItemExample setting
Exact matchInvoice number or job number in the reference, and the amount equal to the open balance
Amount toleranceZero for auto-apply; up to 0.50 for a proposal, never auto-applied
Grouped paymentsAllowed when the total equals the sum of open invoices for one customer, and the references name each one
Part paymentsApplied as a part payment, never rounded up to paid
Never automaticOverpayments, payments with no customer match, and payments over 10,000.00
Queue ownershipEvery queue line has an owner and a due date of the next business day
Write-backMatched payments marked in ServiceM8 within 15 minutes
Change controlRule changes approved by the finance lead and logged

Flow and data mapping

The first table shows the decision path for each bank line. The second shows the fields the layer reads and writes.

Decision path for each bank line
StepQuestionIf yesIf no
1Is it a receipt (money in)?ContinueIgnore and log
2Does the reference name an invoice or job?Look up open balanceGo to step 4
3Does the amount equal the open balance?Auto-apply paymentProposal with reason
4Does the name and amount match one customer?Proposal for approvalExceptions queue
5Is it a group of invoices?Propose a grouped paymentExceptions queue
6Is it a duplicate of a payment already applied?Queue as possible duplicateContinue
Fields read and written (example settings)
Source or targetFieldUse
Xero bank lineDate, amount, payee, referenceMatch keys
Xero invoiceNumber, contact, amount due, due dateCandidates for the line
ServiceM8 jobJob number, invoice number, statusCross-check and write-back
Xero paymentAccount, date, amount, referenceCreated when a match is approved
Queue recordLine id, reason, candidates, owner, statusWorked daily
Match logLine id, rule used, user or automatic, timeAppend-only audit trail

Edge cases handled

Agreed in advance with the finance lead and the operations manager, and tested before go-live.

Edge cases and how each is handled
SituationHow it is handled
Reference has a transposed digitFuzzy match proposes the nearest invoice for the same customer; a person approves
Payment from a parent companyPayee name mapped to a customer group, listed for approval
Payment equals two invoices minus a credit noteCredit note included in the proposal and shown in the reason
Customer pays twiceSecond line queued as a duplicate with the first one shown; refund or credit decided by the finance lead
Payments provider batchPayout split into its charges and fees before matching, one customer line each
Bank line appears twice in the feedDetected by id and date, kept once
Invoice voided after proposalProposal expires; the line goes to the queue
Customer overpaysNever auto-applied; queued with the choice of credit or refund
Line already reconciled by handSkipped and logged

Worked example

The tables below use one month of bank lines for an example business. They show the shape of the checks, not a client result.

One month of bank lines by outcome (example figures)
OutcomeLinesShare
Auto-matched exact1,48676.8%
Matched by rule (grouped payments)21211.0%
Needs a person944.9%
Not a job receipt1437.4%
Total lines1,935100.0%
A grouped payment, proposed (example figures, US$)
ItemAmount
Bank line, reference “Inv 4471 4480 4502”3,265.40
Invoice 44711,420.00
Invoice 44801,215.40
Invoice 4502960.00
Less credit note CN-0188(330.00)
Sum of invoices less credit3,265.40
Difference0.00
Queue by reason and owner (example figures)
ReasonLinesOwnerDue
Possible duplicate9Accounts staff 1Next business day
Overpayment14Finance leadNext business day
No customer match37Accounts staff 2Next business day
Part payment to confirm21Accounts staff 1Next business day
Amount outside tolerance13Accounts staff 2Next business day
Daily summary sent at 08:00 (example settings)
ItemValue
Lines received yesterday71
Applied automatically58
Proposed and approved8
In the queue5
Oldest queue line1 day

Monitoring and alerting

The layer is watched as closely as the books: a silent failure here means bank lines pile up unmatched, so the alerts focus on volume, age and drift.

What is watched, and who hears about it
SignalThresholdAlert goes toFirst action
Bank feed has no new linesNo lines for 36 hours on a business dayFinance lead by emailFeed connection checked with the bank
Matching run failsAny failed runManaz Afzal and finance leadRun replayed from the last good line
Queue ageAny line older than 2 business daysFinance leadReassigned, reason recorded
Auto-match accuracy driftAny auto-applied line reversed by a personFinance leadRule reviewed; auto-apply paused for that rule
Large amountAny line over 10,000.00Finance leadNever auto-applied; manual review
ServiceM8 write-back failsAny failureAccounts staffPaid status set by hand and failure logged

Test plan

Every check has a written pass condition and a written fail condition before it is run. A FAIL stops the next step until it is cleared and re-run.

Test plan with PASS and FAIL conditions
IDCheckMethodPASS whenFAIL when
T1Exact match ruleFifty past exact lines replayedAll matched to the same invoice a person choseAny different invoice
T2Grouped payment ruleTwenty past grouped lines replayedProposal equals what was appliedAny proposal that differs
T3ToleranceLines 0.01 and 0.50 offProposed only, never auto-appliedAuto-applied
T4Duplicate detectionSame line inserted twice in testSecond line queuedBoth applied
T5OverpaymentTest payment above balanceQueued with optionsAuto-applied
T6Write-backApprove ten matchesServiceM8 shows paid within 15 minutesAny missing
T7ReconciliationXero bank reconciliation for a test monthStatement balance equals Xero, zero unmatchedAny difference
T8Rule logChange a rule in testChange logged with user and timeNo log entry

Go-live and rollback

Go-live is in three steps, each with a one-week gate. Turning the layer off returns the bank lines to the normal Xero matching screen with nothing lost.

Go-live steps and rollback triggers
StepOwnerGate to continueRollback trigger
Suggest-only on live linesManaz AfzalOne week, every proposal checked by a personWrong proposal rate above 2%
Exact matches auto-applyFinance leadT1, T3 pass; one week with no reversalAny wrong auto-applied payment
Grouped matches auto-applyFinance leadT2 passes; one week with no reversalAny wrong grouped payment
Daily summary and queue liveAccounts staffQueue worked to zero for five daysQueue grows for three days
RollbackFinance leadLayer switched off, queue lines reconciled by hand in XeroDecision recorded with the reason

Scope and milestones

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

Scope: what a project like this covers
AreaIncluded
Systems AuditRead-only review of three months of bank lines, invoices and payments, a 45-minute call, written findings and a fixed quote
Rule setMatch, tolerance, group and exclusion rules signed by the finance lead
Matching layerA scheduled flow that proposes and applies matches with a log
Exceptions queueA list with reason, candidates, owner and due date
Write-backPaid status sent to ServiceM8 for each applied payment
Daily summaryA short morning message with counts and the oldest line
BacktestThree past months replayed against the rules, with a written accuracy report
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 scopeChanging bank arrangements. Chasing overdue customers. Payment provider contracts. Software subscriptions (billed to you by the vendors).
Fixed milestones
MilestoneDeliverableTimingShare
M1 Audit and rulesFindings, fixed quote, rules in writingWeek 120%
M2 Layer and backtestMatching layer built, three months replayed, accuracy reportWeeks 2 to 335%
M3 Live in stepsSuggest-only, then exact matches auto-applyWeek 430%
M4 HandoverGrouped matches, queue and summary live, SOPs, handover video, 14 days of fixesWeek 515%

Typical scope for this kind of project: US$2,200–3,800

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 will say where I would 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)