Shopify to Xero Automated Invoice & Payment Sync (Make.com)

Eliminate manual bookkeeping by automatically syncing Shopify orders to Xero invoices with real-time tax and inventory reconciliation.

Tools: ShopifyXero

Platform: Make.com

Short Answer

A fully automated Make.com scenario that creates a Xero contact, generates a detailed sales invoice for every Shopify order, and records the payment against the correct ledger, ensuring 100% financial accuracy.

The Problem

E-commerce businesses often face data discrepancies and 'reconciliation nightmares' when manually entering Shopify sales into Xero. This leads to inaccurate VAT/GST reporting, duplicate contact entries, and delayed financial visibility.

The Outcome

A fully automated Make.com scenario that creates a Xero contact, generates a detailed sales invoice for every Shopify order, and records the payment against the correct ledger, ensuring 100% financial accuracy.

Step-by-Step Guide

1. **Establish Connections**: In Make.com, create a new scenario. Add the **Shopify** module and follow the OAuth prompts to connect your store. Add the **Xero** module and authorize access to your specific Organization. 2. **Configure Shopify Trigger**: Choose the **Watch Orders** module. Set the 'Status' to 'any' and 'Financial Status' to 'paid'. This ensures only finalized sales trigger the flow. 3. **Search for Existing Customer**: Add the **Xero: Search for Contacts** module. Map the Shopify `Customer: Email` field to the Xero 'Email' search filter. This prevents duplicate contact creation. 4. **Implement Logic via Router**: Add a **Router**. On path A, set a filter: `Contact ID` (from Search) 'Does not exist'. Add the **Xero: Create a Contact** module. On path B, set a filter: `Contact ID` 'Exists'. 5. **Format Line Items**: Use the **Map** function inside the **Xero: Create an Invoice** module. Loop through the `Line Items[]` array from Shopify. Map `SKU` to `ItemCode` and `Price` to `UnitAmount`. 6. **Handle Taxes**: Use a `switch()` function in the Tax mapping field to convert Shopify tax titles (e.g., 'VAT') into Xero's specific Tax Type codes (e.g., 'OUTPUT2'). 7. **Draft vs Auth Status**: In the 'Create Invoice' settings, set 'Status' to `AUTHORISED` if you want immediate reconciliation, or `DRAFT` for manual review. 8. **Record Payment**: Add the **Xero: Create a Payment** module. Use the `Invoice ID` from the previous step. Map the Shopify `Gateway` field to your Xero Bank Account ID (using a lookup table or hardcoded ID). 9. **Add Error Handling**: Right-click the Xero Invoice module and select **Add error handler (Break)**. This ensures that if an invoice fails (e.g., SKU doesn't exist), the scenario pauses and stores the data for manual retry rather than losing it.

Data Mapping

| Shopify Field | Xero Field | Transformation / Function | | :--- | :--- | :--- | | `Customer: Email` | `Contact: EmailAddress` | Required: Direct Map | | `Order: Name` | `Invoice: InvoiceNumber` | Required: Direct Map | | `Line Items[]` | `Invoice: LineItems` | Use Make's Map function for arrays | | `Created At` | `Invoice: Date` | `formatDate(created_at; YYYY-MM-DD)` | | `Total Tax` | `TaxAmount` | `parseNumber(total_tax)` | | `Gateway` | `AccountCode` | Use `substitute()` to map 'shopify_payments' to Xero Account ID |

Gotchas & Failure Modes

* **API Rate Limits**: Xero has a limit of 60 requests per minute. If processing high volume, enable 'Max number of cycles' in Make settings to throttle execution. * **The SKU Trap**: Xero requires an exact match for Item Codes. Ensure your Shopify SKUs perfectly match Xero 'Item Codes' or the module will return a 404 error. * **Tax Rounding**: Shopify and Xero calculate tax differently (line-level vs. document-level). Use the 'TaxAmount' override field in Make to force Xero to match Shopify's total exactly. * **Multi-Currency**: If selling in multiple currencies, ensure your Xero plan supports 'Multi-Currency' or the invoice creation will fail for foreign orders.

Verification Checklist

- [ ] Run the Shopify 'Watch Orders' module once to fetch a real 'Paid' order bundle. - [ ] Check 'Execution History' to see if the Router correctly identified an existing vs. new customer. - [ ] Verify in the Xero Sandbox that the Invoice 'Total' (including tax) matches the Shopify 'Total' to the cent. - [ ] Confirm the Payment module has successfully moved the Invoice status from 'Awaiting Payment' to 'Paid'. - [ ] Ensure the 'Error Handler' successfully captures a failure (e.g., by temporarily changing a SKU in Shopify to one that doesn't exist in Xero).

Ready to Automate?

Build this automation with Make.com in minutes.