In this article
- Decide what each platform owns
- Carry one reference from checkout to settlement
- Build the integration step by step
- 1. Confirm the Odoo plan and test environment
- 2. Configure signed WooCommerce webhooks
- 3. Map products, orders and stock deliberately
- 4. Validate the Payfast ITN before payment allocation
- 5. Reconcile Payfast settlements in Odoo
- Configure VAT records for SARS requirements
- Operate the controls after go-live
- Frequently Asked Questions
- Does WooCommerce paid status prove that Payfast settled the payment?
- Can every Odoo subscription connect through an external API?
- What VAT rate should a South African online store configure in 2026?
- What should we test before moving from Payfast Sandbox to live payments?
A customer completes checkout, Payfast accepts the payment, and the warehouse is waiting for a pick list. If WooCommerce, Payfast and Odoo each hold a different version of that sale, the finance team inherits the reconciliation problem at month-end.
An Odoo Payfast WooCommerce integration gives a South African online store one controlled route from order creation to validated payment allocation, stock movement and VAT-ready invoicing. As of October 2026, we design this through Odoo integration services with the order reference, payment controls and reconciliation process agreed before a connector goes live.
The important judgement call is straightforward. Do not use a WooCommerce paid status or a customer’s return to the browser as final accounting proof. Use Payfast’s validated server-to-server Instant Transaction Notification, known as an ITN, because the browser session can end before validation is complete and WooCommerce statuses can be changed manually.
Decide what each platform owns
A controlled implementation starts by assigning responsibility to each system.
| Platform | Primary responsibility | Control that matters | | WooCommerce | Customer-facing catalogue, checkout and order capture | Signed webhook delivery to the integration endpoint | | Payfast | Payment processing and payment confirmation | Validated ITN matched to the original order reference | | Odoo | Sales order, invoice, stock, payment journal and financial record | Auditable payment allocation and settlement reconciliation | We normally recommend this sequence:
1. WooCommerce creates or updates an order.
2. A secure integration endpoint validates the WooCommerce webhook and creates or updates the approved Odoo records.
3. Payfast sends an ITN to the integration endpoint after payment processing.
4. The endpoint validates the ITN, matches `m_payment_id` to the original order reference, and records the payment against the correct Odoo invoice.
5. Finance reconciles Payfast settlement entries through the Odoo Bank payment journal.
Carry one reference from checkout to settlement
Use the WooCommerce order ID as the starting transaction reference. Pass it to Payfast as `m_payment_id`, then retain it on the Odoo sales order and invoice metadata. This gives operations and finance one practical search value across all three systems.
Do not use an email address as the transaction key. Customers change email addresses, family members share addresses, and one returning customer can place several orders on the same day.
Take an illustrative Cape Town homeware retailer with 12 staff and monthly online sales of R850,000. It processes 700 WooCommerce orders each month, while the store and payment gateway create records independently. If 2% of orders need manual investigation, the finance team must resolve about 14 exceptions before it can close the payment journal.
With a stable order ID carried into `m_payment_id`, the team searches one reference instead of comparing names, amounts and timestamps. The retailer would still investigate genuine exceptions, but it would not spend time deciding which R1,250 payment belongs to which R1,250 invoice. We would set this reference standard before mapping a single field.
Build the integration step by step
1. Confirm the Odoo plan and test environment
Confirm the Odoo edition, hosting arrangement and subscription plan before approving direct synchronisation. Odoo 19 external API access is available only on Custom plans, not One App Free or Standard. A technically sound integration design cannot overcome a plan that does not expose the required API access.
Confirm that the Odoo payment configuration includes the required third-party credentials and a Bank payment journal. These elements matter because payment allocation and bank reconciliation need an approved accounting destination.
Use a duplicate or dedicated test database before touching production. Odoo recommends this because testing against live data can cause invoice-numbering issues, which can create audit questions for the finance team.
2. Configure signed WooCommerce webhooks
Configure WooCommerce webhooks under WooCommerce > Settings > Advanced > Webhooks. Use the relevant order events to send original orders and approved order updates to the integration endpoint.
Set a secret and verify the HMAC-SHA256 signature on every delivery. The endpoint should reject an unverified request because an unsigned payload must not be able to create a sales order, customer or stock movement in Odoo.
WooCommerce disables a webhook after more than five consecutive failed deliveries. Monitor delivery logs and alert an accountable owner before the fifth failure stops the order feed. The step teams often skip is retaining the incoming payload reference, processing result and HTTP response code. Without those records, diagnosing an exception after the fact becomes slow and speculative.
Do not create a new Odoo customer for every incoming order. First search using an approved customer matching rule, then update only the fields the business has agreed may change. Email can assist with a customer match, but the WooCommerce order ID remains the transaction key.
3. Map products, orders and stock deliberately
The integration can create or update Odoo customers, sales orders, invoices and stock records from a WooCommerce event. The exact document sequence depends on the fulfilment policy, but payment posting should never happen merely because a sales order exists.
Map product SKUs before go-live. A WooCommerce variation without an equivalent Odoo product or stock rule creates an operational exception even where the payment integration works correctly.
If the catalogue has fewer than 50 SKUs and changes rarely, a controlled manual mapping table may be sufficient. If the catalogue contains thousands of variations, automate SKU validation and send unmapped products to an exception queue. Do not allow an integration to silently treat a near-match as the same product.
Consider an illustrative Johannesburg electronics seller with 2,400 active product variations and monthly online turnover of R3.2 million. It imports orders but permits WooCommerce descriptions to create new Odoo products where an SKU does not match. After a seasonal promotion, it has 86 duplicate or incorrectly named product records, distorting stock reporting and making returns harder to process.
A controlled SKU map and exception queue require more implementation effort, but they stop finance and warehouse staff from repairing master data after every campaign. We would assign an owner to every catalogue exception before launch.
4. Validate the Payfast ITN before payment allocation
Payfast must send its server-to-server ITN to the integration endpoint. Validate the notification, match its amount and `m_payment_id` to the expected transaction, and only then mark an Odoo invoice paid or update the WooCommerce order status.
Start in the Payfast Sandbox. Test a successful payment, an interrupted payment, a duplicate notification, and a notification that does not match an expected amount or reference. Replace Sandbox credentials and URLs with live credentials only after those cases reconcile correctly.
The ITN handler must be idempotent. In practical terms, if Payfast retries the same valid notification because it did not receive an HTTP 200 response, the endpoint must recognise that the payment was already applied and must not allocate it twice.
Keep the original notification, validation result, Payfast reference, Odoo invoice number and processing timestamp in an audit log. A finance manager or auditor needs evidence of how the system reached a paid status, not only a green indicator on a dashboard.
5. Reconcile Payfast settlements in Odoo
A successful payment confirmation does not replace bank reconciliation. Payfast settlement amounts can differ from gross customer receipts because payment-provider fees and settlement timing affect the amount received in the bank account.
Use the Odoo payment journal to match settlement entries to the expected customer payments and fees under the business’s accounting policy. Do not post one net settlement against an arbitrary invoice batch without retaining the gross payment trail. That shortcut can make the bank balance appear correct while leaving customer balances and revenue records unclear.
Configure VAT records for SARS requirements
Tax configuration needs its own workstream. SARS states that the South African standard VAT rate is 15%. Do not configure the proposed 15.5% rate from 1 May 2025 or the proposed 16% rate from 1 April 2026. Both proposed increases were reversed.
As of 1 April 2026, compulsory VAT registration applies when taxable supplies exceed R2.3 million in any consecutive 12 months. It also applies where taxable supplies are likely to exceed that amount under a written contract. The business must apply within 21 business days, using SARS eFiling and RAV01. Voluntary registration may be available in specified circumstances, generally above R120,000, but it is not automatic at that amount.
If the store is not VAT registered, do not add VAT to invoices merely because competitors do. If it is registered, configure product tax mapping, delivery treatment and credit-note rules to match the vendor’s actual tax treatment.
A full tax invoice is required for a supply above R5,000 and must generally be issued within 21 days. It needs supplier details and VAT number, recipient details where applicable, a serial number, date, description, quantity or volume, value, VAT and total consideration. A WooCommerce order email may help a customer confirm a purchase, but it does not automatically meet the requirements of an Odoo tax invoice.
VAT vendors file VAT201. Where both the return and payment are made through SARS eFiling, they are due by the last business day of the following month. If the return is eFiled but payment is made outside eFiling, payment remains due by the 25th. Late VAT payment carries a 10% penalty plus interest.
Run a month-end test before launch. Select 10 completed orders, including a refund and a delivery charge, then trace every amount from WooCommerce through Payfast into the Odoo invoice, payment journal and VAT report. The report should explain each difference, not merely produce a plausible total.
Operate the controls after go-live
Integration reliability depends on operating controls as much as code. Assign named owners for failed WooCommerce webhooks, unmatched Payfast ITNs, product mapping exceptions, refunds and monthly reconciliation.
Route any payment that differs from the invoice by more than R1.00 to an exception queue rather than allocating it automatically. The right tolerance depends on rounding rules and currency configuration, but an unexplained difference should never be ignored.
Review these items each day during the first two weeks after go-live:
● WooCommerce webhook failures and retries.
● WooCommerce orders with no Odoo sales order.
● Valid Payfast ITNs with no matching invoice.
● Odoo invoices marked paid without a validated Payfast reference.
● Stock movements that failed because the SKU map found no product.
After the first two weeks, move to a weekly operational review and monthly finance reconciliation. Keep formal change control for WooCommerce plugins, Odoo upgrades, tax-rate changes and new payment methods. A small plugin update can alter a payload field on which a custom endpoint depends.
Frequently Asked Questions
Does WooCommerce paid status prove that Payfast settled the payment?
No. Use a validated Payfast server-to-server ITN and the matching `m_payment_id` before marking the Odoo invoice paid. A browser return and WooCommerce status can support customer communication, but they are not the accounting control.
Can every Odoo subscription connect through an external API?
No. Odoo 19 external API access is available only on Custom plans. Confirm the plan, edition and hosting model before approving the integration architecture.
What VAT rate should a South African online store configure in 2026?
The standard VAT rate is 15%. The proposed 15.5% and 16% increases were reversed. Confirm whether the business is VAT registered before applying VAT to transactions.
What should we test before moving from Payfast Sandbox to live payments?
Test successful payments, duplicate ITNs, interrupted checkout flows, unmatched references, refunds and settlement reconciliation. Confirm that Odoo creates the expected invoice and that invoices contain the required tax information where applicable.
A controlled Odoo Payfast WooCommerce integration gives finance, warehouse and customer-service teams the same transaction record. Request a Consultation to assess your Odoo integration services, payment controls and VAT-ready workflow.