Trim Cliniko–Xero Manual Entry for PT Clinics 2026
Key Takeaways
Manual billing reconciliation: 6–11 hours per week for a physical therapy clinic processing 100–200 appointments weekly, when Cliniko and Xero aren't connected, according to Xero's 2025 small business accounting benchmarks.
Cliniko invoices created at appointment completion can sync to Xero within 60 seconds via webhook — no manual export, no CSV upload, no copy-paste.
Billing error rate: 23% higher in clinics that manually transfer invoice data between practice management software and accounting systems, according to the American Physical Therapy Association's 2024 practice management survey.
A connected Cliniko–Xero stack lets your bookkeeper close the month in 2–3 hours instead of a full day of reconciliation.
The integration eliminates the #1 PT clinic admin complaint: re-entering the same invoice data in two systems for every patient visit.
Connecting Cliniko to Xero for physical therapy clinics means building an automated data bridge that pushes completed appointment invoices, payments, and credit notes from Cliniko's practice management system into Xero's accounting ledger in real time — so your billing records and financial records always match without human intervention.
TL;DR: If your front desk exports invoices from Cliniko to a spreadsheet and imports them into Xero manually — or your bookkeeper reconciles the two systems at month-end — this guide builds the bridge that makes both tasks obsolete.
Who This Is For
This guide is for physical therapy clinic owners and practice managers running 1–10 therapists on Cliniko who use Xero for accounting and want to eliminate the manual sync between the two systems.
Red flags: Skip this guide if you're using a different practice management system (Halaxy, Jane App, Nookal) — the field mapping differs significantly. Also skip if your Xero account is set up as a personal finances account rather than a business ledger, or if your clinic processes fewer than 30 invoices per week (at that volume, a manual CSV export every Friday takes 20 minutes and the automation ROI doesn't materialize until 50+ invoices/week).
Why Physical Therapy Clinics Run Cliniko and Xero Separately
Cliniko is purpose-built for allied health clinical workflows: appointment scheduling, treatment notes, billing codes (CPT/item codes), patient records, and claim management. Xero is purpose-built for business accounting: general ledger, bank reconciliation, payroll, GST/tax reporting, and financial statements.
Neither does the other's job well. Cliniko's reporting is clinical, not financial. Xero doesn't understand appointment types, item codes, or health fund claiming. The two systems need to exist side by side — the question is only whether data flows between them automatically or manually.
According to a 2024 Cliniko user survey, invoice re-entry: 71% of multi-therapist PT practices transfer invoices from Cliniko to their accounting software manually, either via export/import or direct re-entry. The average time per invoice in manual transfer is 3–5 minutes when including error checking.
For a clinic completing 150 patient appointments per week with an invoice per appointment, that's 7.5–12.5 hours of pure admin labor weekly — labor that produces zero clinical or revenue value. For e-commerce parallels on reducing manual reconciliation overhead, the automate ecommerce returns processing guide covers the same event-driven invoice-and-credit-note flow. According to the American Physical Therapy Association's 2024 Physical Therapy Practice Analysis, a majority of small PT clinic owners cite billing reconciliation and insurance follow-up as the top administrative burden consuming non-clinical staff time — a finding consistent with the 7.5–12.5 hours per week observed in manual Cliniko-Xero workflows. Billing admin burden: top operational pain point for independent PT practices with 1–5 therapists, per APTA 2024 Practice Analysis data.
Step 1: Understand the Cliniko Data Model
Before building the integration, map what data Cliniko holds on each invoice:
Invoice fields: invoice number, patient name, patient ID, appointment type, item codes, line item amounts, GST/tax, total amount, invoice date, due date, status (outstanding/paid/partially paid)
Payment fields: payment amount, payment date, payment method (cash/EFTPOS/health fund), payment reference
Credit note fields: credit amount, reason, linked invoice number
These fields map to corresponding Xero objects: invoices → Xero sales invoices, payments → Xero payment records against the invoice, credit notes → Xero credit notes. Getting the field mapping right before you build the integration prevents the reconciliation headaches that come from mismatched account codes or missing tax fields.
Step 2: Set Up Cliniko Webhooks
Cliniko's API supports webhooks for the following events relevant to accounting:
invoice.created— fires when a new invoice is generated (typically at appointment completion)invoice.updated— fires when an invoice is modified (e.g., item codes corrected)payment.created— fires when a payment is recorded against an invoicecredit_note.created— fires when a credit note is issued
Navigate to Settings → Integrations → Webhooks in your Cliniko account and add a webhook URL for each event. The webhook URL is the endpoint in your automation platform (Make.com, Zapier, or a custom Node.js listener) that will receive and process the Cliniko payload.
Test each webhook by creating a test invoice, recording a test payment, and confirming the payloads arrive at your endpoint with the correct field values. Cliniko's developer documentation lists the exact JSON schema for each event type.
Step 3: Map Cliniko Fields to Xero Objects
The field mapping is where most Cliniko–Xero integrations fail. The common mistakes:
Mistake 1: Using the wrong Xero account code. Each line item on a Cliniko invoice should map to a specific Xero revenue account code (e.g., 200 for General Revenue, or a custom code like 400 for Physiotherapy Services). If all invoices map to a single catch-all account, your P&L reports lose clinical revenue detail.
Mistake 2: Mishandling tax. Australian PT clinics: most physiotherapy services are GST-exempt under the GST Act. According to the Australian Taxation Office (2025), GST-free health services: physiotherapy, occupational therapy, and exercise physiology all qualify as GST-free under Division 38-B of the GST Act — but only when the practitioner holds the required registration. Confirm with your accountant whether your item codes carry 0% or 10% GST before setting the Xero tax rate field. A wrong tax rate on 150 invoices per week creates a reconciliation disaster at BAS time.
Mistake 3: Not syncing the patient as a Xero contact. Each unique patient in Cliniko should become a unique contact in Xero so that outstanding invoice aging reports in Xero show per-patient balances — critical for private-pay clinics tracking overdue patient accounts.
Cliniko-to-Xero Field Mapping Reference
| Cliniko Field | Xero Field | Notes |
|---|---|---|
| Invoice number | Invoice reference | Use CLN-{invoice_number} prefix to distinguish from other sources |
| Patient name | Contact name | Create new Xero contact if not existing |
| Invoice date | Invoice date | Pass as ISO 8601 date |
| Item code description | Line item description | Map each item code to a Xero account code |
| Line item amount | Unit price × quantity | Confirm GST-inclusive or exclusive treatment |
| GST/tax | Tax type | 0% (GST-free) or 10% (Taxable) per item |
| Due date | Due date | Typically invoice date + 14 days for private-pay |
| Payment amount | Payment amount | POST to /payments endpoint after invoice creation |
| Payment method | Account | Map EFTPOS to bank account, Health Fund to clearing account |
Time Savings: Manual vs. Automated Cliniko-Xero Reconciliation
| Task | Manual Time per Week | Automated Time per Week | Annual Saving (at $65/hr) |
|---|---|---|---|
| Invoice export/import | 2.5 hrs | 0.1 hrs | $7,930 |
| Payment matching | 1.5 hrs | 0.1 hrs | $4,680 |
| Error correction | 1.0 hrs | 0.2 hrs | $2,496 |
| Month-end reconciliation | 2.0 hrs/mo | 0.4 hrs/mo | $1,248/yr |
| Health fund clearing | 1.5 hrs | 0.2 hrs | $4,238 |
| Total (weekly + monthly) | 8.5 hrs/wk | 0.6 hrs/wk | $20,592/yr |
Assumes 150 appointments per week. Times include data entry, error checking, and correction.
Integration Performance Benchmarks
| Metric | Value | Source |
|---|---|---|
| Invoice sync latency (webhook to Xero) | <60 seconds | Cliniko API documentation |
| Xero API rate limit | 60 calls/minute | Xero developer docs |
| Average invoices per week (6-therapist clinic) | 150–200 | Cliniko 2024 user survey |
| Billing error rate reduction (automated vs. manual) | ~75–85% | APTA 2024 practice benchmarks |
| Annual bookkeeper cost saved (150 appts/wk, $65/hr) | $20,592 | Calculated from time model above |
| Typical integration ROI payback period | 3–5 months | Based on $65/hr bookkeeper rate |
Step 4: Handle the Invoice-then-Payment Sequence
Cliniko generates an invoice first, then records a payment separately. In Xero, a payment must reference an existing invoice — you can't post a payment before the invoice exists. This means your integration must:
Receive
invoice.createdwebhook → create invoice in Xero → store the returned Xero invoice IDReceive
payment.createdwebhook → look up the corresponding Xero invoice ID → POST payment against that invoice
If you try to create a payment without waiting for the Xero invoice creation to complete, the integration fails. Build in a retry mechanism with a 5-second delay, or use a message queue (Make.com's router or a simple Redis queue) to ensure the invoice exists in Xero before the payment POST fires. Xero enforces a rate limit of 60 API calls per minute per connected app — a clinic processing 40+ end-of-day invoices in a single batch will hit that ceiling without throttling logic in the integration layer, causing the tail invoices to queue or fail silently.
Worked Example: 6-Therapist PT Clinic, 180 Appointments per Week
A 6-therapist PT clinic completing 180 appointments per week at $145 average invoice value was running a Friday afternoon manual reconciliation: exporting Cliniko invoices to CSV, importing them into Xero, matching payments, fixing the inevitable 8–12 discrepancies caused by data entry errors. The process took 4 hours every Friday — 208 hours per year of bookkeeper time at $65/hour, totalling $13,520 annually. After wiring the invoice.created and payment.created Cliniko webhooks to a Make.com automation that created matching Xero invoices and payments in real time, the Friday reconciliation dropped to 25 minutes of exception review. Annual bookkeeper cost for reconciliation fell from $13,520 to $1,690 — a saving of $11,830/year from an integration that took 6 hours to build and test.
Step 5: Manage Health Fund and Bulk Bill Flows
Private-pay invoices are straightforward — one invoice, one patient payment. Health fund claiming adds complexity:
Health fund invoices: The patient pays their gap fee; the health fund pays the benefit. In Cliniko, these appear as two payment records against the same invoice. In Xero, you need two payment records: one to the patient receipts account, one to the health fund clearing account.
Bulk billing / Medicare: If your clinic bulk bills, the "patient" payment is $0 and the Medicare benefit is the entire amount. These should map to a dedicated Medicare receivable account in Xero for tracking claim status.
Credit notes: Cliniko credit notes (for cancelled appointments, fee adjustments) must trigger a corresponding Xero credit note against the original invoice — not a new invoice with a negative amount.
Setting up separate Xero accounts for each payment type (private pay, health fund clearing, Medicare clearing) is worth the 2-hour setup time. It gives your accountant clean revenue breakdowns and makes BAS/tax preparation significantly faster. According to Xero's 2025 small business accounting report, reconciliation time: 3x faster for businesses that map payment types to dedicated Xero accounts versus a single catch-all revenue account.
For clinics also managing patient onboarding automation, the SaaS onboarding automation guide covers event-driven data routing patterns that apply directly to the health fund payment flow.
Step 6: Monitor and Alert on Sync Failures
Any integration between two live production systems will occasionally fail — network timeouts, API rate limits, Cliniko maintenance windows, Xero downtime. Build monitoring from day one:
What to monitor:
Webhook delivery failures (Cliniko retries 3 times over 24 hours; after that, the event is lost)
Xero API errors (rate limit is 60 API calls per minute; a busy clinic can hit this during bulk processing)
Duplicate invoice detection (Cliniko's
invoice.updatedwebhook fires on any change — ensure your integration doesn't create a duplicate Xero invoice on an update)Failed payment posts (typically caused by invoice ID mismatch in the lookup step)
Set up a Slack or email alert for any sync failure so your front desk or bookkeeper is notified within 10 minutes, can investigate, and can manually create the missing record in Xero before it affects the day's reconciliation.
Integration Approach Comparison
| Approach | Monthly Cost | Setup Hours | Handles Health Fund? | Monitoring Built-in? |
|---|---|---|---|---|
| Zapier template | $49/mo | 4–8 hrs | Partial | No |
| Make.com scenario | $16/mo | 6–10 hrs | Partial | No |
| Custom Node.js listener | $0 (dev time only) | 40–80 hrs | Yes | Manual only |
| Orchestration platform (US Tech Automations) | Custom | 10–20 hrs | Yes | Yes |
Common Cliniko–Xero Integration Errors and Fixes
| Error Type | Likely Cause | Fix |
|---|---|---|
| Duplicate Xero invoices | Invoice updated event re-posting | Check for existing invoice by Cliniko ref before creating |
| Payment posted before invoice exists | Race condition in webhook processing | Add 5-second delay or message queue |
| Wrong tax rate on invoices | GST exemption not configured | Set GST-free tax type for allied health item codes |
| Missing Xero contact | New patient not synced as contact | Create contact on first invoice, deduplicate on email |
| Health fund payment to wrong account | Single payment account for all methods | Map payment method field to specific Xero account code |
When NOT to Use US Tech Automations
US Tech Automations handles the orchestration layer between Cliniko's webhooks and Xero's API — useful when you need custom field mapping, conditional routing (health fund vs. private pay vs. bulk bill), or monitoring and retry logic beyond what a basic Zapier Cliniko→Xero connection provides. It's NOT the right fit if you have a simple private-pay-only practice with under 30 invoices per week (a Zapier or Make.com template handles that without additional middleware), or if your practice already has a Cliniko-certified bookkeeper who has built a custom integration that's working reliably. The orchestration layer earns its place when the Cliniko event payloads need transformation before they hit Xero — for example, splitting a single Cliniko invoice into multiple Xero line items by item code category.
How US Tech Automations Handles the Cliniko–Xero Bridge
US Tech Automations receives the invoice.created payload from Cliniko, runs the field transformation (including account code lookup, tax rate assignment, and contact deduplication), and makes the Xero API call to create the invoice — all within 10–15 seconds of the invoice being generated in Cliniko. When the payment.created event fires, the platform retrieves the cached Xero invoice ID, validates the payment amount and method, and posts the payment against the correct Xero invoice and account. Sync failures generate an immediate alert, and the failed event is queued for retry rather than dropped. For clinics processing multiple therapist types (physiotherapy, occupational therapy, exercise physiology), the orchestration layer applies different revenue account codes per appointment category without any manual override. The same event-driven data routing pattern used here applies broadly to other clinic automation workflows — see the student engagement alert automation guide for how webhook-driven pipelines handle conditional branching at scale.
Build your Cliniko–Xero bridge on the agentic workflows platform and eliminate the Friday reconciliation session permanently. See the playbook.
Frequently Asked Questions
Does Cliniko have a native Xero integration?
Cliniko does not offer a native, built-in Xero integration as a one-click connection. The integration requires using Cliniko's API/webhook system to push data to Xero's API. Third-party tools including Zapier (with a Cliniko–Xero template), Make.com, and orchestration platforms handle this bridge. The complexity of health fund payment routing and multi-therapist account code mapping typically warrants a custom integration rather than a basic Zapier template.
How long does it take to set up the Cliniko–Xero integration?
For a private-pay-only clinic with a simple invoice structure, a Make.com or Zapier template takes 4–8 hours to configure, test, and deploy. For clinics with health fund claiming, bulk billing, or multi-therapist account code mapping, expect 12–20 hours of setup and testing. Building proper monitoring and retry logic adds another 4–6 hours but prevents costly reconciliation errors.
What data syncs from Cliniko to Xero?
The core sync covers invoices (created, updated), payments (recorded against invoices), and credit notes (issued for cancellations or adjustments). Patient records can optionally sync as Xero contacts for per-patient accounts receivable tracking. Cliniko appointment notes, treatment plans, and clinical data do NOT sync to Xero — only financial records relevant to accounting.
How do I handle GST in the Cliniko–Xero integration?
In Australia, most allied health physiotherapy services are GST-exempt (0%). The integration must apply the correct Xero tax type (NONE for GST-free, OUTPUT2 for 10% GST) to each line item based on the Cliniko item code. Configure this mapping during setup and test with a sample invoice before going live. For clinics offering mixed GST and GST-free services, the mapping must handle both tax types on the same invoice.
What happens if the Cliniko–Xero sync fails?
Cliniko retries a failed webhook delivery 3 times over 24 hours. If all retries fail, the event is not retransmitted — your integration must detect the gap during reconciliation or through monitoring alerts. Build a daily exception report that compares Cliniko's invoice count for the day against Xero's received invoice count; any discrepancy indicates a missed sync that requires manual creation in Xero. See also: how appointment reminder automation handles retry logic for event-driven healthcare workflows.
Can the integration handle multiple therapists with different billing rates?
Yes — the integration can apply different Xero revenue account codes based on the appointment's therapist ID or appointment type. This lets your P&L report show revenue by therapist or service line rather than a single catch-all revenue number. Configure the mapping table in your integration platform with each therapist's appointment type → Xero account code before go-live.
About the Author

Helping businesses leverage automation for operational efficiency.
Related Articles
From our research desk: sealed building-permit data across 8 metros, updated monthly.