For the complete documentation index, see llms.txt. This page is also available as Markdown.

POS Payment Methods

Provide a payment method the cash register can use, fulfilled by your app.

A POS payment method is what the cashier presses at the register. Most are handled by the ERP itself — cash goes straight into the till. But a payment method can also be handed to an app: the ERP places a payment order, something external fulfils it, and the receipt only closes once the result comes back.

That "something external" is a payment consumer. The VARIO local-link is one — it drives card terminals in the shop. An app can be another.

Read App Backends first.

This page describes the platform mechanism. The reference implementation of a consumer today is the local-link (card terminals over the local network). If you are building an app-side consumer, expect to work directly against the REST resources described here.

The five pieces

Entity
What it is

Payment backend

Who is responsible: SELF (the ERP) or APP (you)

Payment method

The button on the register — CASH or CARD, pointing at a backend

Payment consumer

The worker that fulfils orders, with a heartbeat

Payment rule

Routes an order to a consumer, based on method, operation, register or sales channel

Payment order

One unit of work, identified by an externalPaymentId

Registering the backend

There is no framework migration helper here — create the backend through the API, with the same identifying fields as every other app backend:

{
  "label": "My Terminal App",
  "type": "APP",
  "appId": "<your-app-identifier>",
  "placePayment": true,
  "canCancel": true,
  "canRefund": true
}

placePayment is the switch that matters. It is only meaningful for type: "APP":

With SELF, the payment is booked directly in the register. With APP and placePayment, an order is placed for an external consumer to fulfil.

canCancel and canRefund advertise what you support. They are not cosmetic — see the warnings below.

The runtime flow

Note what triggers this: the POS adds a document line, not a call to a payment API. The order is a side effect. If no order appears, the POS simply continues — that is the SELF path.

Picking up work

Either be pushed to (the local-link subscribes over a WebSocket) or ask for the next order:

No request body, and it returns at most one order. Send a heartbeat so the ERP can show whether you are alive:

Process one order at a time. A terminal that is already busy rejects a second request, and parallel chains send payments to an occupied device.

Reporting the result

That is the entire write-back surface — status and errorMessage, as query parameters. There is no field for an authorisation code, card reference, receipt number or the actual amount. If you need any of that later (for example a terminal reference required to reverse the payment), you must store it yourself, keyed by externalPaymentId. The local-link keeps its own store for exactly this reason.

The ERP updates the receipt itself once the status is SUCCESSFUL; the POS reloads the document afterwards.

Operations

paymentOperation

Meaning

Extra

PAYMENT

Normal payment

CANCEL

Reverse a specific earlier payment

cancelledExternalPaymentId is set

REFUND

Pay money back with no original payment to reverse

CANCEL needs the original transaction, so you must be able to find your own record of it. REFUND stands alone.

What to watch out for

Your errorMessage is shown to the cashier verbatim. Write messages a shop assistant can act on, and remember it travels as a URL query parameter.

Partial payments are normal. Each split is a separate line and a separate order. The receipt closes when it balances, so expect several cycles per sale.

Cash-journal behaviour is set on the method, not the backend. Whether a method is counted and carried in the cash book, and how it is skimmed at closing, is configured on the payment method regardless of who fulfils it.

Last updated

Was this helpful?