The ledger is right and it cannot tell you anything

Service businesses billing through Xero — installers, agencies, consultancies, trades — who know their revenue exactly and cannot tell you which jobs made it or what those jobs cost to deliver.

  • Import Xero contacts and invoices as linked tables
  • Link invoices to the jobs, sites and contracts that produced them
  • An automation can raise a Xero invoice when work is signed off
  • Ask what a customer is worth against what they cost to serve
  • The connection keeps a refresh token, so it stays alive rather than dying in an hour
  • Xero remains the ledger — nothing here is an accounting system
Start free 30 days free · no credit card
WHAT IT DOES

Exactly what connecting Xero gives you

Brings data in

Pull Xero into RowFold tables you own — filter them, report on them, link them to everything else in the workspace.

And it stays current: importing again updates the same tables, adding new records and updating changed ones, so links from your other tables hold. Keep in sync does that for you hourly or daily.

Writes back

Automation steps that act on Xero when something happens in RowFold:

  • Create a Xero invoice Raises a single-line draft sales invoice against an existing Xero contact. Returns the new invoice's number, which the step can save onto the record or pass to the next step.

What it doesn't do: It has no say in what a booking page offers. An import only reads: nothing is written back to Xero, a record deleted there stays here, and a sync runs hourly at most rather than the moment something changes. Anything else you have read about Xero and RowFold, this page is the authority: it is generated from the connector's own code.

HOW TO DO IT

The jobs people connect Xero for

I want to see which jobs actually made money

This is two imports and one relation. The relation between an invoice and the job it came from is the whole thing, because it is the one join neither Xero nor your job sheet can make on its own.

  1. Connect Xero under Manage workspace, then Integrations You pick which organisation to authorise during sign-in. If you keep several organisations in Xero, connect the one whose numbers you want and check you chose it, because the picker moves quickly.
  2. Import Contacts before Invoices Contacts are the records invoices hang off. Importing them first means the invoices have something to link to rather than arriving with a customer name in a text column.
  3. Link invoices to your jobs table A relation from the job to the invoice it produced. Without it you have a copy of the ledger; with it you have the question Xero cannot answer.
  4. Add whatever the job actually cost Hours, materials, subcontractor spend. These rarely exist in Xero at the line level you need, which is roughly why the profitability question has never been answerable.
  5. Build the report on the job table rather than the invoice table The job is the thing with both sides on it. Grouping invoices by customer tells you revenue again, which you already had.

You'll know it worked: Total the imported invoices for one month and compare against the same period in Xero. If they differ, check whether drafts and voided invoices were included — those are the usual cause of a small stubborn gap.

I want the invoice raised when the work is signed off

The point is not to replace Xero's invoicing but to stop the retyping, and the important part is the guard that stops a second invoice being raised for the same job.

  1. Make sure the job record holds the customer and the total The step needs a Xero contact to bill and an amount. A job with neither will fail, which is better than one that invoices a blank.
  2. Trigger on sign-off rather than on completion Whatever state in your process means nobody is going to add another line. Invoicing at the first completed flag produces credit notes.
  3. Add a condition that refuses an already-invoiced job Check the invoice number field is empty. Nothing on the Xero side refuses a second invoice for the same work, and a duplicate reaching a customer is expensive to unwind.
  4. Save the invoice number onto the job Under Save the result to, choose a Text field such as Invoice number. The step stores the number Xero gives the new draft, which closes the guard in step 3 and lets anybody looking at the job see it was billed without opening Xero.

You'll know it worked: Run it once against a test job in a sandbox organisation and check the invoice appears as a draft for the right contact. Then re-run the same job and confirm nothing happens — that second run is the test that matters.

WHAT IT FIXES

The three things that actually go wrong

Xero knows what was invoiced and nothing about what it took. Which jobs ran over, which clients absorb the most unbilled time, whether a contract is worth renewing: none of that is a ledger question, so mostly nobody asks it.

Import contacts and invoices, link them to the jobs, and both halves sit together. Profitability becomes a report rather than an annual spreadsheet.

Raising the invoice is a separate ritual from finishing the work. Somebody reads the job sheet, opens Xero, retypes the lines, and does it days later or not at all.

An automation raises the invoice from the record that already knows the amounts, at the moment the work is marked done.

Tracking categories are the usual answer and they are one flat dimension. Anything needing two, such as client and site, or project and engineer, does not fit. It probably ends up in the invoice reference and is never queried again.

Model the dimensions as real tables and relations. A job belongs to a site and a client and a contract at once, without any of them competing for a single field.

One automation worth building

When a job is signed off…

  1. Check the job has a customer and a total and has not been invoiced
  2. Create a Xero invoice for that customer and amount
  3. Put the invoice number back on the job so nobody raises a second
QUESTIONS

Before you start

Is this an accounting system?

No, and it should not be treated as one. Xero remains the ledger, the thing your accountant reconciles and the record for filing. What this adds is the half a ledger structurally cannot hold: what the invoice was for, what the job cost, which site it happened on, and whether the contract is worth renewing. Do not run your books here.

Does it keep up with Xero automatically?

It can, on a schedule. Importing again updates the same table, matched on Xero's own IDs, and Keep in sync does that hourly or daily, which suits questions about months rather than minutes. A figure in a report here can still trail the ledger by up to a sync, and the import never writes to Xero, so anything going to an accountant should be taken from Xero, which stays the book of record.

What happens to invoices in a foreign currency?

They arrive with the amounts as Xero holds them. Where a business bills in more than one currency it is worth deciding early what a report should show, because totalling mixed currencies produces a number that looks authoritative and means nothing. Keeping a currency field and grouping by it is far safer than a single grand total.

Will my connection keep working?

Yes. Xero access tokens are short-lived by design, so the connection also keeps a refresh token and renews itself. That detail matters because an integration built without one appears to work perfectly and then dies about an hour later, which looks like an outage rather than a missing permission. Yours will not do that.

Can it create contacts as well as invoices?

The automation step raises invoices, and it bills a contact that already exists in Xero. In practice that is the right way round: a contact created automatically from partial information is the thing that produces duplicate customers in a ledger, which is far more annoying to clean up than adding a customer once by hand before their first invoice.

Describe yours and watch it build

There is no template to wait for. Type a sentence about what you run and RowFold assembles the tables, links, views and dashboard around it — then you change whatever does not fit.

Start free Free for 30 days. Then $29/month per editor, with unlimited free read-only viewers.