The challenge

Xero handles invoicing, bank reconciliation, and reporting brilliantly. But ask any growing business using Xero about sales order management and you'll hear the same story: spreadsheets. Customer purchase orders tracked in Excel. Manual cross-referencing to figure out what's been invoiced. No visibility on partial invoicing. And a painful, error-prone process to create invoices from order data.

For businesses processing dozens or hundreds of orders, this gap costs real money — in missed invoices, reconciliation errors, and hours of administrative work.

What we built

Xero Sales Orders is a dedicated order management platform that slots seamlessly into an existing Xero workflow:

Order lifecycle management. Sales orders move through a clear workflow — Draft, Open, Partially Invoiced, Fully Invoiced, Closed. Each order tracks customer details, purchase order references, line items with quantities, prices, discounts, and tax rates. The system automatically calculates outstanding balances as invoices are raised.

Bi-directional Xero integration. The platform connects to Xero via OAuth 2.0 with automatic token refresh. Teams can browse Xero contacts, items, tax rates, and chart of accounts directly from the order interface. Invoices created in the platform are pushed to Xero in real-time. And Xero webhooks keep the system in sync when invoices are updated or paid.

Bulk invoice import. For businesses with existing Xero invoices, a dry-run import tool lets teams pull in invoices grouped by reference or PO number, preview the results, and create sales orders in bulk. This handles the migration from spreadsheet-based tracking without manual data entry.

Line-item invoicing. The system tracks invoicing at the individual line-item level, not just the order total. Teams can generate partial invoices for specific items or quantities, and the order status updates automatically. No more guessing about what's been billed and what hasn't.

Architecture

Two backend services — one for sales order operations and Xero integration, one for multi-tenant management — communicate through AppSync GraphQL APIs. The Xero integration handles OAuth flows, scheduled token refreshes, webhook processing, and API calls through a dedicated module. The Next.js frontend provides a clean interface for order management, Xero connection settings, and import tools.

The result

Businesses that were losing hours to spreadsheet reconciliation now have real-time visibility across their entire order book. Invoice generation from order data takes seconds instead of manual copy-and-paste. Partial invoicing is tracked automatically. And because everything syncs with Xero, the accounting team sees the same picture as the sales team — no more end-of-month surprises about what's been invoiced and what hasn't.