Contents
Yoco is one of the most widely used card payment solutions among South African SMEs: restaurants, retailers, market vendors, tradespeople, and service businesses use it daily. Xero is where many of those same businesses run their accounting. The gap between the two is a daily manual task: someone takes a card payment on Yoco, then separately enters it into Xero.
This guide explains what's technically possible to connect them, what the options look like, and how an automated integration works in practice.
The state of Yoco's Xero integration
Yoco does have a Xero app, delivered through Amaka, a third-party connector, rather than built by Yoco itself. It is listed on the Xero App Store and it will bring your Yoco transactions into Xero.
The catch is where it sits. It's gated to Yoco's Pro plan, at R499 a month as at August 2026. If you are already on that plan for other reasons, use it. If you are not, you are being asked to move up a plan tier to solve a bookkeeping problem, and for a smaller merchant that is often more than the bookkeeping itself costs.
So the real question is not whether Yoco can talk to Xero. It is whether R499 a month is the only way to make it happen. It is not.
Yoco has a developer API and a webhook system. The automation sits between the two: Yoco fires an event when a payment occurs, and a workflow catches that event and creates the corresponding record in Xero. Once it is built, the running cost is the automation itself rather than a plan upgrade.
PayFast does have a native Xero integration, but it only covers invoices paid through a Pay Now link; it doesn't reconcile the settlement deposit or split out fees and VAT, so the custom route still applies there. Zapper now has its own connector too: Crosspost, our own R199 a month sync that posts each trading day's Zapper takings, fees and VAT into Xero and reconciles the clearing account to the cent. If you take payments through more than one gateway, see the PayFast-to-Xero integration guide.
How Yoco's webhook system works
Yoco supports webhooks on its developer platform. When a payment event occurs (a successful card transaction, a refund, a failed charge) Yoco sends an HTTP POST to a URL you configure.
The key payment event is payment.succeeded. The payload includes:
- A unique payment ID
- The amount in cents
- The currency (ZAR for domestic transactions)
- A timestamp
- A status field confirming the payment succeeded
- Metadata if you've attached it at the time of creating the payment request
Yoco's Developer Hub, where webhooks are configured, is available on every Yoco plan, including the free Core plan. There is no upgrade needed just to get webhook access.
What "recorded in Xero" means for Yoco payments
Unlike an online payment gateway where there's usually an invoice in the workflow, Yoco payments typically happen at point of sale: the payment and the transaction happen simultaneously. This affects how you record them in Xero.
The most common approach is to record Yoco transactions as bank account transactions in Xero. In Xero, you set up a Yoco account (as a current asset or bank account), and incoming payments are recorded against it. When Yoco pays out to your actual bank account, you record that as a transfer.
The alternatives:
Option 1: Record each transaction individually
Every Yoco payment creates one Xero transaction. Best for businesses with lower transaction volumes or where individual transaction detail matters (e.g. you want to see each sale separately in Xero for a specific product line).
Option 2: Daily summary entry
At the end of each day (or Yoco settlement period), a single Xero transaction is created for the total day's Yoco receipts. This matches how Yoco actually pays out: in daily settlements, and keeps your Xero accounts aligned with what actually hits your bank. Simpler for high-volume businesses.
Most SMEs with a physical Yoco terminal are better served by Option 2. The daily summary is easier to reconcile against the Yoco payout and keeps Xero from filling up with hundreds of individual small transactions.
Building the integration with n8n
The automation uses n8n as the middleware between Yoco and Xero.
For transaction-by-transaction recording (Option 1)
Trigger: Yoco webhook → n8n Webhook node
Steps:
- Receive the
payment.succeededevent - Extract amount, timestamp, and any metadata from the payload
- Optionally look up or create the Xero contact (if you're recording sales against specific customers)
- Create a bank transaction in Xero against your Yoco bank account
Trigger: Schedule (daily, end of business)
For daily summary recording (Option 2):
- n8n fires on a schedule (e.g. 11pm nightly)
- Call the Yoco API to retrieve all transactions for the day
- Sum the totals
- Create a single Xero bank transaction for the daily total with a reference like "Yoco Sales: 08 May 2026"
Handling refunds
Yoco refunds fire a separate webhook event (refund.succeeded). Your integration should handle these as negative transactions in Xero: either reducing the original entry or creating a separate refund transaction depending on your accounting approach.
Setting up the Yoco bank account in Xero
Before building the automation, set up a dedicated Yoco account in Xero:
- In Xero, go to Accounting → Chart of Accounts → Add Account
- Account type: Bank or Current Asset
- Name: "Yoco" or "Yoco Clearing"
- Currency: ZAR
Record all incoming Yoco payments against this account. When Yoco settles to your business bank account (usually the next business day), record that as a transfer from Yoco to your main bank account in Xero. This keeps your Xero balances accurate and reconcilable against both your Yoco dashboard and your bank statement.
The manual alternative (and why it doesn't scale)
Without automation, the options are:
- Manual entry of each Yoco transaction in Xero
- Downloading Yoco transaction reports as CSV and importing them into Xero manually
The CSV import approach works, and for low-volume businesses it's manageable. Yoco's transaction export includes date, amount, reference, and card type. Xero accepts bank statement imports in OFX or CSV format.
The problem is that it's a manual task someone has to remember to do. If the CSV doesn't get imported for a few days, your Xero books are out of date. At month-end, reconciliation requires matching a batch of transactions rather than a small daily queue. The automation eliminates this entirely: every payment is in Xero by the next morning.
What you'll need
- A Yoco account on any plan (webhook access needs no upgrade), and the Pro plan if you want Yoco's own Xero app instead of a custom build
- A Xero subscription (any paid plan)
- n8n (self-hosted or cloud)
- Xero API credentials (OAuth 2.0 app in the Xero developer portal)
What this solves operationally
Once the integration is running, Yoco disappears as an accounting task. Card payments appear in Xero automatically. Your daily reconciliation queue in Xero includes Yoco transactions without anyone having to move data between systems. Month-end stays clean.
For businesses processing 20+ card transactions a day, the time saving compounds quickly. At 2 minutes per manual entry, 20 daily transactions is 40 minutes of manual work per day: roughly 17 hours a month spent moving data that should move itself.
This is one of the more common starting points for Xero integration work, because the payment data already exists and only the connection is missing.
Yoco's app comes with the R499 plan tier. We build the same reconciliation directly against the API and run it for less. For Zapper we packaged it: Crosspost, R199 a month.
Describe what you're working with and we'll come back with something specific, not a sales call.
Get your free audit →Read next