Work snippetPayments + credits
Credit notes, part payments and overpayments between ServiceM8 and Xero
How I would approach the invoices that are not paid in full for an 18-tech electrical business, so a credit, a part payment, an overpayment or a cent of tax rounding leaves the same balance in the job system and in Xero.
Work snippet with example figures.
- Area
- Payments + credits
- Tools
- ServiceM8 · Xero
- Typical scope
- US$2,000–3,500
- Timeline
- About 5 weeks · 4 fixed milestones
Context and systems map
An 18-tech electrical business with one branch, a bookkeeper and an outside accountant. ServiceM8 raises job invoices and Xero holds the ledger. Most invoices are paid in full, and the rest are the problem: part payments, credit notes after a job is changed, overpayments and tax lines that do not add up to the cent.
The systems in play
In the example each of those situations is mapped to a written rule, so that the job system and Xero show the same balance for the same invoice, and every difference of even one cent has a reason.
| System | What it does for the business |
|---|---|
| ServiceM8 | Raises invoices, records payments and credits against a job. |
| Xero | Holds invoices, credit notes, payments, prepayments and overpayments. |
| Exceptions list | A weekly list of invoices where the two systems show different balances. |
| Rules sheet | One written page for each situation: what is created, where, and who approves. |
| Bookkeeper | Works the list and approves refunds and write-offs. |
| Accountant | Signs off the treatment of rounding and tax differences. |
How the data moves
- Job changes after invoicing
- Credit note or adjustment
- Payment received
- Applied in Xero
- Balance compared
- Exceptions list
- Approved action
Problem
What the owner sees
- Customer statements that disagree with the invoice
- Credit notes that sit unapplied while the customer is chased
- Overpayments nobody refunds
- A cent here and there that makes reconciliation fail
Native sync handles the clean case well. The rest depends on the order in which things happen: a payment before a credit note, two part payments, a refund after an overpayment. Without written rules each case is handled differently by whoever is working that day.
| Everyday situation | What goes wrong |
|---|---|
| Credit note issued after a part payment | The credit is applied to the wrong invoice or left unallocated |
| Part payment recorded in one system only | The balance in Xero and in the job system differ |
| Overpayment | The extra sits as an unapplied payment for months |
| Tax rounding | Per-line tax in one system and per-invoice tax in the other differ by a cent |
| Mixed tax codes on one invoice | A tax-free line is taxed or the reverse |
| Invoice voided after a payment | The payment is orphaned and the customer shows a credit |
Approach
Four steps, in this order. Each one ends with a result that is checked.
- LookA read-only comparison of invoice balances between ServiceM8 and Xero for 12 months, listing every difference and its cause.
- Agree the rulesOne written rule for each situation: credit, part payment, overpayment, refund, write-off and rounding.
- Build and testRules are applied in a test file, then to the open exceptions with approval, then to new items weekly.
- Keep it matchedA weekly balance comparison and an exceptions list with owners.
| Item | Example setting |
|---|---|
| Credit notes | Created in Xero from the job system adjustment, allocated to the original invoice first, then to the oldest open invoice |
| Part payments | Applied as received, never rounded; the remaining balance is the difference |
| Overpayments | Held as an overpayment on the customer and listed; refund or credit within 14 days after approval |
| Rounding | Differences up to 0.05 per invoice written to a rounding account, listed monthly for the accountant |
| Tax codes | One mapping table from job system tax to Xero code, with tax-free lines kept separate |
| Voided invoices | Payments are re-applied or refunded before the void is posted |
| Approval | Refunds and write-offs above 100.00 need the bookkeeper and the owner |
| Evidence | Every adjustment keeps the job number and the reason |
Flow and data mapping
The first table shows what happens to the balance when each event arrives. The second shows how tax is mapped between the two systems.
| Event | In the job system | In Xero | Check |
|---|---|---|---|
| Part payment | Payment on the invoice | Payment applied to the invoice | Balances equal |
| Credit after a payment | Adjustment on the job | Credit note allocated to the invoice | Balances equal after the credit |
| Overpayment | Payment above balance | Overpayment on the customer | Listed and tracked |
| Refund | Refund entry | Refund from the credit or overpayment | Customer balance zero |
| Void after payment | Payment moved or refunded first | Payment re-applied, then void | No orphan payment |
| Write-off of a small balance | Adjustment with reason | Credit note to a write-off account | Under the approval limit |
| Job system tax | Xero tax code | Rate | Note |
|---|---|---|---|
| Standard rated | Tax on income | 10% | Most labour and materials |
| Tax-free | Tax-free income | 0% | Named lines only, such as certain supplies |
| Out of scope | No tax | 0% | Reimbursed costs |
| Standard rated purchase | Tax on expenses | 10% | Supplier bills |
| Tax-free purchase | Tax-free expenses | 0% | Named suppliers only |
Edge cases handled
Agreed in advance with the finance lead and the operations manager, and tested before go-live.
| Situation | How it is handled |
|---|---|
| Two part payments and then a credit note | Credit allocated before the second payment so the final balance cannot go negative |
| Credit larger than the open balance | Open balance cleared, the rest held as a customer credit and listed |
| Payment received for the wrong invoice | Moved by the bookkeeper with a note, not deleted |
| Customer pays the invoice and then asks for a credit | Refund from the credit with the customer’s bank details checked |
| Overpayment of exactly one cent | Written to rounding by rule, not chased |
| Line-level tax differs by one cent | Rounding rule applies and the cent is listed |
| Tax code deleted or changed in Xero | Mapping table fails safe: invoice held, not posted |
| Credit note on a month already closed | Posted in the open month with the original date in the reference |
Worked example
The tables below follow one invoice through every event. They show the shape of the checks, not a client result.
| Event | Amount | Balance after |
|---|---|---|
| Invoice INV-5120: 2,000.00 plus 10% tax | 2,200.00 | 2,200.00 |
| Payment 1 | (1,000.00) | 1,200.00 |
| Credit note: 300.00 plus 10% tax | (330.00) | 870.00 |
| Payment 2 | (900.00) | (30.00) |
| Overpayment of 30.00 held, then refunded after approval | 30.00 | 0.00 |
| Line | Net | Tax at 10%, rounded per line |
|---|---|---|
| Line 1 | 33.33 | 3.33 |
| Line 2 | 33.33 | 3.33 |
| Line 3 | 33.34 | 3.33 |
| Total of lines | 100.00 | 9.99 |
| Tax at invoice level | 100.00 | 10.00 |
| Difference | 0.01 |
| Group | Invoices compared | Equal | On the exceptions list |
|---|---|---|---|
| Paid in full | 412 | 412 | 0 |
| Part paid | 37 | 35 | 2 |
| Credited | 19 | 17 | 2 |
| Overpaid | 6 | 6 | 0 |
| Total | 474 | 470 | 4 |
| Reason | Owner | Due |
|---|---|---|
| Balance differs | Bookkeeper | 3 business days |
| Overpayment over 14 days | Bookkeeper and owner | On the list until closed |
| Rounding over 0.05 | Accountant | Monthly |
Monitoring and alerting
Differences are caught weekly, not at month end, and each one is classified so the same cause can be fixed once.
| Signal | Threshold | Alert goes to | First action |
|---|---|---|---|
| Balance differs | Any invoice | Bookkeeper | Cause found, entry corrected, rule added if new |
| Unallocated credit note | Older than 7 days | Bookkeeper | Allocated or refunded |
| Overpayment age | Older than 14 days | Bookkeeper and owner | Refund approved or credit applied |
| Rounding account | Monthly total above 25.00 | Accountant | Review for a systematic cause |
| Tax code error | Any invoice held for a missing code | Bookkeeper | Mapping fixed, invoice released |
| Sync failure | Any failed push | Manaz Afzal and bookkeeper | Replayed once the cause is fixed |
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.
| ID | Check | Method | PASS when | FAIL when |
|---|---|---|---|---|
| T1 | Part payment | Two payments on a test invoice | Both systems show the same balance | Any difference |
| T2 | Credit after payment | Credit note on a part-paid invoice | Credit allocated; balance correct | Credit unallocated |
| T3 | Credit above balance | Credit larger than the open balance | Balance zero, remainder held and listed | Negative invoice |
| T4 | Overpayment | Payment above balance | Held and on the list; no auto refund | Applied elsewhere |
| T5 | Rounding | Three-line invoice | Difference of 0.01 listed, rule applied | Silent plug |
| T6 | Tax mapping | One invoice with tax-free and taxed lines | Codes correct on each line | Any wrong code |
| T7 | Void after payment | Void a paid test invoice | Payment re-applied first | Orphan payment |
| T8 | Twelve-month backtest | Rules applied to past exceptions | Every exception has a rule and an owner | Any exception with no rule |
Go-live and rollback
The rules are applied to history first on a copy, then to open items with approval, then to new items from a start date.
| Step | Owner | Gate to continue | Rollback trigger |
|---|---|---|---|
| Open exceptions cleaned on a copy | Manaz Afzal | T8 passes | Rules do not cover an exception |
| Cleaned items posted with approval | Bookkeeper | Balances equal after posting | Any item that moves a closed period |
| Rules live for new items | Bookkeeper | T1 to T7 pass | Any balance difference in week one |
| Weekly comparison live | Bookkeeper | Two clean weeks | Three weeks with new causes |
| Rollback | Owner | Rules paused, entries from the new rules reversed from the log | Decision 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.
| Area | Included |
|---|---|
| Systems Audit | Read-only comparison of 12 months of invoice balances between ServiceM8 and Xero, a 45-minute call, written findings and a fixed quote |
| Comparison | 12 months of balances, every difference with its cause |
| Rules sheet | One page per situation, signed by the bookkeeper and accountant |
| Tax mapping | A table from job system tax to Xero codes |
| Clean-up of open items | Credits, part payments and overpayments posted with approval |
| Weekly comparison | A scheduled balance comparison and exceptions list |
| Rounding rule | A rounding account and monthly list |
| Handover | Written SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live |
| Not included | Tax filing and statutory returns. |
| Also outside the scope | Collections and chasing. Changing the chart of accounts. Customer contracts. Software subscriptions (billed to you by the vendors). |
| Milestone | Deliverable | Timing | Share |
|---|---|---|---|
| M1 Audit and rules | Comparison, fixed quote, rules in writing | Week 1 | 25% |
| M2 Clean-up | Open items cleaned on a copy, then posted with approval | Weeks 2 to 3 | 35% |
| M3 Live rules | Rules live for new items, weekly comparison running | Week 4 | 25% |
| M4 Handover | Rounding list, SOPs, handover video, 14 days of fixes | Week 5 | 15% |
Typical scope for this kind of project: US$2,000–3,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 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.