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.