How to Integrate LinklyEFTPOS Terminals with Odoo POS A Developer’s Guide

Payment processing is the lifeblood of any retail operation. If you’re using Odoo POS, you already know how smooth and flexible it can be—but without integration to modern EFTPOS terminals like Linkly, you’re leaving time and efficiency on the table. In this developer’s guide, we’ll walk through every step needed to integrate Linkly/EFTPOS terminals with Odoo POS, transforming your point-of-sale from good to great.

Introduction

Why integrate EFTPOS with Odoo POS?

Ever tried juggling cash, cards, and vouchers separately? It’s like trying to herd cats. Integrating an EFTPOS terminal streamlines payment handling, reduces human error, and enhances customer trust. Plus, it frees up your staff to focus on selling, not reconciling.

Who is this guide for?

This guide is tailored for Odoo developers, IT managers, and technical consultants who want a hands‑on tutorial. You should be comfortable with Python, Odoo module development, and basic networking concepts.

Understanding the Basics

What is Odoo POS?

Odoo POS is the point‑of‑sale application built into Odoo’s ERP suite. It supports retail, restaurant, and service‑based operations. Its modular design allows custom payment methods, making it the perfect candidate for EFTPOS integration.

What are Linkly/EFTPOS terminals?

Linkly terminals are secure card payment devices supporting chip, PIN, and contactless payments. They communicate via serial or network interfaces and use JSON or proprietary protocols.

Key features of Linkly devices

  • Multi-payment support: Chip, PIN, NFC
  • Multiple communication options: Ethernet, USB, Bluetooth
  • SDKs and documentation: Ready‑to‑use APIs

EFTPOS payment flows

  • Payment initiation in the POS.
  • Transaction request sent to terminal.
  • Terminal processing, customer interaction (PIN/NFC).
  • Approval or decline returned.
  • POS finalizes the order.

Prerequisites and Setup

Development environment requirements

  • Odoo 16 or higher (ensure compatibility).
  • Python 3.9+ installed.
  • PostgreSQL database running.
  • Access to Linkly SDK or protocol documentation from your provider.

Odoo version compatibility

While Odoo 14–18 may work, this guide focuses on Odoo 16+ due to its improved POS architecture and async support.

Hardware requirements for terminals

  • A Linkly EFTPOS terminal (e.g., WisePad 3).
  • USB/Ethernet adapter or Bluetooth dongle depending on connectivity.

Overview of the Integration Workflow

Transaction initiation in Odoo POS

When a cashier clicks Pay, Odoo triggers a payment creation flow. We’ll hook into this event to redirect it to our terminal connector.

Communication with the terminal

Our custom module will open a socket or serial connection, format a JSON request, and send it to the device.

Handling terminal responses

Once the terminal finishes processing, it sends back approval or error codes. We parse these and update Odoo’s payment records.

Configuring Odoo POS

Installing the POS module

  1. Activate developer mode.
  2. Go to AppsUpdate Apps List.
  3. Search for Point of Sale and install.

Enabling payment method settings

Navigate to Point of SaleConfigurationPayment Methods. Add a new payment method called Linkly or EFTPOS.

Defining a new payment acquirer

Under InvoicingPayment Acquirers, create a new acquirer pointing to your terminal connector’s API endpoint. Set credentials and callback URLs.

Building the Linkly/EFTPOS Connector Module

Module skeleton and manifest

Create a new module folder pos_linkly_connector with a __manifest__.py:

python

{

    ‘name’: ‘POS Linkly Connector’,

    ‘version’: ‘1.0’,

    ‘depends’: [‘point_of_sale’],

    ‘data’: [‘views/pos_config.xml’],

    ‘qweb’: [‘static/src/xml/terminal.xml’],

    ‘installable’: True,

}

Defining models and settings

In models/pos_config.py, extend pos.config to include terminal IP, port, and protocol settings.

Creating communication services

In services/terminal_service.py, implement a Python class to manage socket/serial connections and JSON message exchange.

Establishing Communication Protocols

Serial vs. network protocols

  • Serial (USB/RS232): Direct cable, low latency.
  • Network (Ethernet/TCP): Flexible, multiple devices.

JSON/RPC message structures

Use JSON for clarity:

Sample request payload

json

{

  “transaction”: {

    “amount”: 123.45,

    “currency”: “AUD”,

    “order_id”: “POS/ORD/0001”

  }

}

Sample response handling

json

{

  “status”: “approved”,

  “auth_code”: “A1B2C3”,

  “message”: “Transaction approved”

}

Implementing Payment Flow

Initiating a payment request

In static/src/js/pos_terminal.js, override the PaymentScreen:

javascript

this.rpc({

  model: ‘pos.payment’,

  method: ‘send_to_terminal’,

  args: [paymentInfo],

})

Waiting for terminal approval

Display a loading spinner and listen for a WebSocket or long-polling response.

Finalizing the transaction in Odoo

On approval, call pos_model.finalize_payment(); on decline, show an error popup.

Error Handling and Logging

Common terminal errors

  • Timeouts
  • Connection refused
  • Invalid response format

Retry mechanisms

Implement exponential backoff for retrying failed sends.

Logging best practices

Use Odoo’s logging module to record debug/info/error logs, making sure sensitive data is masked.

Testing the Integration

Simulating transactions

Use a mock server that replicates terminal responses. Helps you test without hardware.

Unit and integration tests

Write tests in tests/test_terminal.py using unittest or pytest, verifying each state transition.

Using mock terminals

Some providers offer software simulators. Leverage these to ensure real-world parity.

Deployment Considerations

Packaging the module

Zip your module and place it in the addons directory or publish to a private Odoo App Store.

Upgrading production servers

  • Backup database.
  • Install module in Maintenance Mode.
  • Test in staging before live rollout.

Rolling back on failures

Keep previous module versions handy and use Odoo’s -u all option cautiously.

Security and Compliance

PCI DSS considerations

Never store raw card data. Use tokenization or let the terminal handle sensitive data entirely.

Secure storage of credentials

Store terminal credentials in Odoo’s ir.config_parameter with sudo() access control.

Data encryption

Use TLS for network communication and ensure end‑to‑end encryption where possible.

Performance Optimization

Reducing latency

Batch communication calls and avoid blocking the main UI thread.

Asynchronous processing

Leverage Odoo’s @job decorator or external message queues (e.g., RabbitMQ) to process transactions.

Resource monitoring

Track CPU/memory usage of your connector service to avoid bottlenecks during peak hours.

Real-World Tips and Tricks

Handling network instability

Implement fallback to USB if Ethernet fails. Inform users gracefully.

Terminal firmware updates

Schedule updates during off‑peak hours and notify staff in advance.

Customer experience improvements

Customize on‑screen prompts, add branding, and pre‑fill order details to speed checkout.

Conclusion

Integrating Linkly/EFTPOS terminals with Odoo POS is like adding a turbocharger to your payment process: faster, more reliable, and ready for any scale. By following this guide—from environment setup and module creation to testing and deployment—you’ll ensure a smooth, secure, and high-performing payment integration. Now go ahead, give your customers the seamless checkout experience they deserve!


Follow me on LinkedIn for more latest updates

Frequently Asked Questions

Integration works best on Odoo 16+ due to async handling but can be back‑ported to versions 14 and 15 with minor tweaks.

 Yes. Configure each terminal as a separate POS configurationand assign unique ports or IPs.

Use your terminal provider’s OTA (Over‑The‑Air) update service or Linkly’s management portal during non‑business hours.

Most EFTPOS providers offer a software simulator. Check Linkly’s developer portal for details.

Implement retry logic or fall back to manual card entry modes. Always log transactions for reconciliation.