Help centre | Article

Xero accounting integration

Sync your invoices, expenses, contacts, and payments with Xero automatically.

Pro pricing

What does the Xero integration do?

The Xero integration connects your Sessional account to your Xero organisation, keeping your accounting records in sync without manual data entry. When connected, Sessional can:

  • Sync contacts: organisations you work with are created as Xero contacts, so your invoices are linked to the correct customer record
  • Sync invoices: when you create or send an invoice in Sessional, it is automatically pushed to Xero as a sales invoice with the correct line items, dates, and amounts
  • Sync expenses: logged expenses are pushed to Xero as bills (accounts payable), categorised under your chosen account codes. Bills work with Xero’s bank reconciliation so there are no duplicates with bank feed imports
  • Detect payments: when an invoice is marked as paid in Xero (manually or via bank reconciliation), Sessional picks up the payment through a webhook and marks the invoice as paid on your dashboard

Note

The Xero integration is available on the Pro plan. Go to Dashboard > Integrations to connect.

Setting up

Setup takes about two minutes:

  1. Connect to Xero: click “Connect to Xero” on the Integrations page. You will be redirected to Xero to sign in and authorise Sessional.
  2. Select your organisation: if you have multiple Xero organisations, choose which one to sync with. If you only have one, it is selected automatically.
  3. Map your account codes: map each Sessional category (sales income, fuel, training, insurance, etc.) to an account in your Xero chart of accounts. This ensures invoices and expenses are posted to the correct accounts for your specific setup.

Tip

Ask your accountant which Xero account codes to use for each category. The mapping step shows all active accounts from your Xero chart of accounts, so you can match them to your accountant’s preferred structure.

Sessional stores encrypted OAuth2 tokens. Access tokens are refreshed automatically, so your connection stays active without re-authorisation.

How syncing works

Sync runs when you press Sync on the Integrations page. Nothing is pushed automatically, so press it after you have made changes you want in Xero. A run pushes:

  • Invoices: issued, acknowledged and overdue invoices are pushed, along with the contact if it does not already exist. The Xero invoice number mirrors your Sessional invoice number. Up to 200 invoices a run.
  • Expenses: each expense is pushed to Xero as a Bill (ACCPAY invoice) under the mapped account code, so it works alongside your bank feed without creating duplicates. Up to 200 expenses a run.

Voiding an invoice in Sessional does not change it in Xero; void it in Xero as well. Deleting an expense in Sessional does not change the Bill in Xero either, so void that by hand too.

Each synced record stores a reference to its Xero counterpart. This prevents duplicates if you trigger the same action twice.

Tip

If a sync fails, the Integrations page shows the error. Fix the cause and press Sync now again. Nothing is retried on its own.

Account code mapping

During setup, you map each Sessional category to a Xero account code from your own chart of accounts:

  • Sales (income): the revenue account for invoice line items (typically a “Sales” or “Professional Income” account)
  • Expense categories: fuel, mileage, equipment, training, insurance, subscriptions, professional fees, and other. Each maps to an expense account in your chart of accounts

You choose the accounts, so the integration works with any Xero chart of accounts, whether you use the default UK template or a custom structure set up by your accountant. Expense categories that are not mapped are skipped during sync.

Payment detection via webhooks

Payment notifications arrive on a signed Xero webhook. When a payment is applied to one of your synced invoices in Xero: whether through bank reconciliation, manual entry, or a bank feed: Xero sends a notification to Sessional.

Sessional then:

  1. Verifies the webhook signature using HMAC to ensure it is genuine
  2. Looks up the corresponding Sessional invoice
  3. Marks the invoice as paid, recording the payment date and a note that the payment was detected via Xero

This means you do not need to manually update invoice statuses in Sessional when payments come through your bank account and are reconciled in Xero.

Important

Payment detection relies on Xero webhooks being delivered successfully. If Xero experiences an outage or the webhook is delayed, there may be a short lag before the payment appears in Sessional. You can always mark an invoice as paid manually if needed.

What happens when you disconnect

You can disconnect Xero at any time from the Integrations page. When you disconnect:

  • No further data is synced between Sessional and Xero
  • The OAuth grant is revoked and your stored tokens are deleted, so no further data moves either way and payment notifications stop
  • Invoices and expenses already synced to Xero remain in your Xero account: nothing is deleted
  • Invoices already marked as paid in Sessional keep their paid status
  • The stored OAuth2 tokens are securely deleted from Sessional

If you reconnect later, Sessional will re-establish the link. Previously synced records are recognised by their Xero reference, so they will not be duplicated.

What gets synced and what does not

To keep things clear, here is a summary of what is and is not included in the sync:

  • Synced to Xero: contacts (organisations), sales invoices, invoice line items, expense transactions, invoice voids
  • Synced back from Xero: payment status only (via webhooks when a payment is applied to a synced invoice)
  • Not synced: bookings, availability, documents, profile data, mileage logs (mileage is synced as an expense amount, not as individual journey records)

The integration is focused on accounting data. Operational data such as bookings and documents stays within Sessional.

Troubleshooting

If something is not syncing as expected:

  • Check your connection status: go to Integrations and confirm the status shows “Connected”. If it shows “Disconnected” or “Error”, try reconnecting.
  • Check your Xero subscription: the integration requires an active Xero subscription. If your Xero account is expired or locked, syncing will fail.
  • Review the sync log: each synced item shows its Xero reference on the invoice or expense detail page. If the reference is missing, the sync did not complete.
  • Re-authorise if prompted: in rare cases, Xero may revoke the connection. If Sessional prompts you to re-authorise, click through the OAuth flow again.

Frequently asked questions

Do I need a Xero subscription to use the Sessional integration?

Yes. You need an active Xero subscription with at least one organisation. Sessional connects to a single Xero organisation per account.

Will existing invoices be synced to Xero when I first connect?

Only new invoices created or sent after connecting are synced automatically. If you need to push historical invoices to Xero, re-send them from the invoices page and they will be synced at that point.

What if I edit an invoice in Xero directly?

Changes made directly in Xero are not synced back to Sessional. The integration is designed to push data from Sessional to Xero, with payment status being the only information that flows back via webhooks.

Is my Xero data secure with the Sessional integration?

Sessional stores only an encrypted OAuth2 refresh token. Access tokens are short-lived (30 minutes) and refreshed on demand. Your Xero login credentials are never seen or stored by Sessional. The connection can be revoked at any time from either Sessional or Xero’s connected apps settings.

Related topics