Automating SA Invoices: Shopify to Xero/Sage
April 4, 2026
If you are running a Shopify store in South Africa, you’ve likely noticed a major legal gap: Shopify’s "Order Confirmation" is not a valid SA Tax Invoice.
SARS (South African Revenue Service) has very specific requirements for what constitutes a legal tax invoice, especially if you are a VAT-registered business. You need the words "Tax Invoice," your VAT number, the customer’s address (if the order is over R500), and a clear breakdown of the 15% VAT.
Many store owners spend their Monday mornings manually typing Shopify order data into Xero or Sage. This is a waste of time and a massive source of human error. Here is the "plumbing" you need to automate your tax-compliant invoicing.
The SARS Invoicing Requirements (A Quick Checklist)
To be legal for orders over R500, your invoice must contain:
- The words "Tax Invoice" in a prominent place.
- Your business name, address, and VAT registration number.
- The customer's name and address.
- An individual serialized invoice number.
- The date of issue.
- A full description of the goods/services.
- The amount of VAT charged (at 15%).
- The total price including VAT.
Option 1: Using a Dedicated Connector (Amaka or Stock2Shop)
If you use Xero, the Amaka app is the gold standard for Shopify integration. It syncs your Shopify orders as individual invoices or as daily summaries.
The Pros:
- It handles the VAT mapping automatically (Mapping Shopify "VAT" to Xero "15% VAT on Income").
- It syncs your Shopify Payments and Payfast payouts, making bank reconciliation a breeze.
The Cons:
- It can be expensive if you have thousands of orders a month.
- Custom mapping (e.g., mapping specific Shopify tags to Xero account codes) can be tricky.
Option 2: The "Custom Webhook" Approach (Dev Choice)
If you have unique requirements—like generating an invoice only when an order is "Fulfilled" rather than just "Paid"—you can build a custom bridge.
We use a Node.js app that listens for Shopify webhooks and uses the Xero-Node SDK to create the invoice.
The Plumbing: Sample Webhook Logic
app.post('/webhooks/order-paid', async (req, res) => { const shopifyOrder = req.body; const invoiceData = { Type: 'ACCREC', // Accounts Receivable Contact: { Name: shopifyOrder.customer.first_name + ' ' + shopifyOrder.customer.last_name }, LineItems: shopifyOrder.line_items.map(item => ({ Description: item.name, Quantity: item.quantity, UnitAmount: item.price, AccountCode: '200', // Sales Revenue TaxType: 'OUTPUT' // 15% VAT })), Date: new Date().toISOString().split('T')[0], Status: 'AUTHORISED' }; await xeroClient.accountingApi.createInvoices(xeroTenantId, { invoices: [invoiceData] }); res.sendStatus(200); });
Handling Multi-Currency (Selling in USD, Reporting in ZAR)
If you sell to international customers in USD, SARS still requires you to report the ZAR value of the transaction based on the exchange rate at the time of the sale.
When automating this, your "plumbing" needs to:
- Fetch the Shopify order (in USD).
- Fetch the current Spot Rate (e.g., from an API like Open Exchange Rates).
- Create the Xero invoice in ZAR, or use Xero’s multi-currency feature to record the USD sale and let Xero handle the FX gain/loss.
Why This Saves 10+ Hours a Week
Manual data entry is a silent killer of e-commerce growth. By automating the Shopify-to-Xero flow:
- Your bookkeeper doesn't have to spend days reconciling transactions.
- Your tax returns (VAT201) are accurate because the VAT was calculated correctly at the source.
- Your customers get a professional, SARS-compliant PDF invoice emailed to them automatically, reducing support tickets.
Final Thoughts
Don't wait until you have 500 orders a month to fix your invoicing. The mess of manual entry only gets harder to clean up the longer you wait. Whether you use a plug-and-play app or a custom-built webhook, getting your Shopify-to-accounting plumbing right is a foundational step for any serious SA brand.
Struggling with your Shopify-Xero sync or VAT mapping? Message me on WhatsApp. I help local e-commerce stores automate their back-office tech.
Frequently asked questions
What makes a Shopify order confirmation not a valid SA Tax Invoice?
Shopify's standard order confirmation lacks several key SARS requirements. It doesn't prominently display "Tax Invoice," often omits the VAT number, and may not break down the 15% VAT clearly. For orders over R500, the customer's full address is also required, which is often missing. These omissions make it non-compliant for VAT-registered businesses.
When building a custom webhook, what's a common trigger for invoice generation?
A common and more reliable trigger for invoice generation in a custom webhook setup is the "Fulfilled" order status. This ensures the invoice is only created once the goods have actually been dispatched. Simply using "Paid" can lead to premature invoices if an order is later cancelled or partially fulfilled, adding unnecessary reconciliation work.
How does multi-currency selling affect SARS compliance for SA businesses?
If you sell in USD to international customers, SARS still requires you to report the transaction's ZAR value. Your automation needs to fetch the spot exchange rate at the time of sale. You can then either create the Xero invoice directly in ZAR or use Xero's multi-currency features to record the USD sale and let Xero manage the foreign exchange gains or losses.
What are the main benefits of automating Shopify invoice syncing to Xero or Sage?
Automating this process saves significant time, eliminating manual data entry that leads to errors. It ensures your VAT returns are accurate from the source, reducing tax compliance headaches. Your bookkeeper spends less time on reconciliation, and customers automatically receive professional, SARS-compliant PDF invoices, cutting down on support queries.