--- sidebar_label: 'Custom hardware integrations' sidebar_position: 5 --- # Custom hardware integrations :::note Each diagram below illustrates one possible high-level integration flow, not a fixed specification. For the authoritative reference on each integration, see the the specific integration articles. ::: The message flow between the kiosk frontend, FO, the kiosk integration (cloud and on-device), and the POS depends on which capabilities your kiosk integration provides. This article gives one diagram per scenario, so find the heading that matches your integration rather than reading all of them. ## Scanner integration If your kiosk uses barcode or QR code scanning, refer to the following diagram. Scanning does not depend on, or change, the payment or printing flow. This diagram shows the messages exchanged when the guest scans a barcode or QR code, independent of any payment or printing scenario below. ```mermaid sequenceDiagram participant ui as User Interface participant plugin as Kiosk Integration
Frontend Plugin participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over intdevice : User scans code intdevice->>plugin: Code scan 'abc123' plugin->>ui: Code scan 'abc123' note over ui : UI and associated
systems handle
scanned code ``` See [Scanner service](../frontend-plugins/services/scanner-service.md) for the plugin-side implementation. ## Without external payment terminal integration Use this section if the kiosk does not integrate with a payment terminal — for example, if the guest pays with a mobile wallet, a stored value card, or another payment method that is not connected to the kiosk itself. ### Non-fiscal country #### Without receipt printing option selection This diagram shows a kiosk order placed without any kiosk payment terminal integration, in a non-fiscal country, with no receipt printing option offered to the guest. ```mermaid sequenceDiagram participant ui as User Interface participant pos as POS note over ui : Page is loaded,
which loads plugins.
Plugins register services ui->>pos: Place order alt Successful order placement pos-->>ui: Order Placed note over ui : Order confirmed else Failed order placement pos-->>ui: Failed to Place note over ui : Order placement failed end ``` #### With receipt printing option selection This diagram shows the same non-fiscal, no-payment-terminal scenario, but with the guest offered a receipt printing option after a successful order placement. ```mermaid sequenceDiagram participant ui as User Interface participant pos as POS participant plugin as Kiosk Integration
Frontend Plugin participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services ui->>pos: Place order alt Successful order placement pos-->>ui: Order Placed note over ui : Allow guest to
select receipt option alt User selects to print receipt ui->>plugin: Print receipt plugin->>intdevice: Print receipt note over intdevice : Print receipt else User selects not to print receipt note over ui : Order confirmed without receipt end else Failed order placement pos-->>ui: Failed to Place note over ui : Order placement failed end ``` ### Fiscal country When payment does not go through the kiosk's own payment terminal integration, there is no payment reservation or capture flow to anchor fiscalization to. Instead, Kiosk Integration Cloud listens for the [order.placed_in_pos](../../events/order/placed-in-pos) event from FO and fiscalizes based on that event. #### Without receipt printing option selection This diagram shows a kiosk order placed without any kiosk payment terminal integration, in a fiscal country, with no receipt printing option — Kiosk Integration Cloud fiscalizes directly off the `order.placed_in_pos` event. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant intcloud as Kiosk Integration
Cloud note over ui : Page is loaded,
which loads plugins.
Plugins register services ui->>pos: Place order alt Successful order placement pos-->>ui: Order Placed fo-->>intcloud: order.placed_in_pos event note over intcloud : Fiscalize note over ui : Order confirmed else Failed order placement pos-->>ui: Failed to Place note over ui : Order placement failed end ``` #### With receipt printing option selection This diagram shows the same fiscal, no-payment-terminal scenario, but with a receipt printing option offered to the guest. If a receipt option selection dialog is shown, fiscalization happens in line with that choice — with the print, or with the order cleared message if the guest declines. If neither of those is observed, for example because the dialog times out, Kiosk Integration Cloud must still fiscalize on its own once it has received the `order.placed_in_pos` event, since the fiscal obligation does not depend on whether a receipt was printed. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant plugin as Kiosk Integration
Frontend Plugin participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services ui->>pos: Place order alt Successful order placement pos-->>ui: Order Placed fo-->>intcloud: order.placed_in_pos event note over ui : Allow guest to
select receipt option alt User selects to print receipt ui->>plugin: Print receipt plugin->>intdevice: Print receipt note over intdevice : Fiscalize note over intdevice : Print receipt else User selects not to print receipt ui->>plugin: Order cleared plugin->>intdevice: Order cleared note over intdevice : Fiscalize end note over intcloud : If no order cleared event is
observed from the plugin, or
on timeout, fiscalize anyway
since order.placed_in_pos
was already received else Failed order placement pos-->>ui: Failed to Place note over ui : Order placement failed end ``` ## With external payment terminal integration When a kiosk needs to accept card payment through a payment terminal Future Ordering does not already integrate with, you can connect that terminal by integrating the terminal as an [External Payment Provider](../external-payment-provider/overview.md). Use one of the following sections if the kiosk integrates with a payment terminal via a [External Payment Provider](../external-payment-provider/overview.md). Pick the section matching whether the terminal supports `AUTH` separated from `CAPTURE`, whether the country is a fiscal country, and whether or not the integration also provides receipt printing options as well. ### AUTH separated from CAPTURE #### Non-fiscal country ##### Without receipt printing option selection This diagram shows a payment terminal that supports `AUTH` separated from `CAPTURE`, in a non-fiscal country, with no receipt printing option offered to the guest — the terminal captures and prints the receipt automatically once the order is placed. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>intdevice: Reserve amount note over intdevice : Guide user through
payment process on
terminal intdevice->>intcloud: Payment reserved intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>intdevice: Capture reservation note over intdevice : Capture reservation note over intdevice : Print receipt intdevice->>intcloud: Reservation captured intcloud->>fo: Reservation Captured else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation intcloud->>intdevice: Annul reservation note over intdevice : Annul reservation intdevice->>intcloud: Reservation annulled intcloud->>fo: Reservation annulled end ``` ##### With receipt printing option selection This diagram shows the same AUTH/CAPTURE-separated, non-fiscal scenario, but with the guest offered a receipt printing option after a successful order placement, instead of the receipt being printed automatically. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant plugin as Kiosk Integration
Frontend Plugin participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>intdevice: Reserve amount note over intdevice : Guide user through
payment process on
terminal intdevice->>intcloud: Payment reserved intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>fo: Reservation Captured note over ui : Allow guest to
select receipt option alt User selects to print receipt ui->>plugin: Print receipt plugin->>intdevice: Print receipt note over intdevice : Print receipt else User selects not to print receipt end else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation intcloud->>intdevice: Annul reservation note over intdevice : Annul reservation intdevice->>intcloud: Reservation annulled intcloud->>fo: Reservation annulled end ``` #### Fiscal country ##### Without receipt printing option selection This diagram shows the AUTH/CAPTURE-separated scenario in a fiscal country with no receipt printing option offered to the guest — the terminal captures, prints, and fiscalizes automatically once the order is placed. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>intdevice: Reserve amount note over intdevice : Guide user through
payment process on
terminal intdevice->>intcloud: Payment reserved intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>intdevice: Capture reservation note over intdevice : Capture reservation note over intdevice : Print receipt note over intdevice : Fiscalize intdevice->>intcloud: Reservation captured intcloud->>fo: Reservation Captured else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation intcloud->>intdevice: Annul reservation note over intdevice : Annul reservation intdevice->>intcloud: Reservation annulled intcloud->>fo: Reservation annulled end ``` ##### With receipt printing option selection This diagram shows the AUTH/CAPTURE-separated scenario in a fiscal country with a receipt printing option offered to the guest — fiscalization happens in line with the guest's print or order-cleared choice instead of automatically at capture. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant plugin as Kiosk Integration
Frontend Plugin participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>intdevice: Reserve amount note over intdevice : Guide user through
payment process on
terminal intdevice->>intcloud: Payment reserved intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>fo: Reservation Captured note over ui : Allow guest to
select receipt option alt User selects to print receipt ui->>plugin: Print receipt plugin->>intdevice: Print receipt note over intdevice : Fiscalize note over intdevice : Print receipt else User selects not to print receipt note over intdevice : This also needs to happen
on timeout if capture
has been requested ui->>plugin: Order cleared plugin->>intdevice: Order cleared note over intdevice : Fiscalize end else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation intcloud->>intdevice: Annul reservation note over intdevice : Annul reservation intdevice->>intcloud: Reservation annulled intcloud->>fo: Reservation annulled end ``` ### Single SALE operation (AUTH + CAPTURE together) #### Non-fiscal country ##### Without receipt printing option selection This diagram shows a payment terminal that performs `AUTH` and `CAPTURE` as a single SALE operation, in a non-fiscal country, with no receipt printing option offered to the guest. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>intdevice: Perform Payment note over intdevice : Guide user through
payment process on
terminal intdevice->>intcloud: Payment performed intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>fo: Reservation Captured else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation intcloud->>intdevice: Reverse payment note over intdevice : Reverse payment intdevice->>intcloud: Reservation annulled intcloud->>fo: Reservation annulled end ``` ##### With receipt printing option selection This diagram shows the same single-SALE, non-fiscal scenario, but with the guest offered a receipt printing option after a successful order placement. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant plugin as Kiosk Integration
Frontend Plugin participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>intdevice: Perform Payment note over intdevice : Guide user through
payment process on
terminal intdevice->>intcloud: Payment performed intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>fo: Reservation Captured note over ui : Allow guest to
select receipt option alt User selects to print receipt ui->>plugin: Print receipt plugin->>intdevice: Print receipt note over intdevice : Print receipt else User selects not to print receipt end else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation intcloud->>intdevice: Reverse payment note over intdevice : Reverse payment intdevice->>intcloud: Reservation annulled intcloud->>fo: Reservation annulled end ``` #### Fiscal country Since AUTH and CAPTURE cannot be separated, the terminal must fiscalize and print the receipt as part of the single SALE operation, before FO knows whether the POS will accept the order (POS integrations can build POS-specific functionality to reduce risk of order placement failures, such as pre-loading the order to the POS before starting payment). If the POS later rejects the order, there is no automated way to reverse a fiscal receipt that has already been printed — this is why annulment in this scenario falls back to a manual store-side process. ##### Without receipt printing option selection This diagram shows the single-SALE scenario in a fiscal country with no receipt printing option offered to the guest — fiscalization and printing happen upfront as part of the SALE, before FO knows whether the POS will accept the order (POS integrations can build POS-specific functionality to reduce risk of order placement failures, such as pre-loading the order to the POS before starting payment). ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>fo: Get order info fo-->>intcloud: Order info intcloud->>intdevice: Perform Payment note over intdevice : Guide user through
payment process on
terminal note over intdevice : Fiscalize note over intdevice : Print Receipt intdevice->>intcloud: Payment performed intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>fo: Reservation Captured else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation note over intcloud: Reverse payment and fiscal
or trigger manual process to
handle on store side intcloud->>fo: Reservation annulled end ``` ##### With receipt printing option selection This diagram shows the single-SALE scenario in a fiscal country with a receipt printing option offered to the guest — the terminal fiscalizes upfront during the SALE, then again in line with the guest's later print or order-cleared choice. ```mermaid sequenceDiagram participant ui as User Interface participant fo as FO participant pos as POS participant plugin as Kiosk Integration
Frontend Plugin participant intcloud as Kiosk Integration
Cloud participant intdevice as Kiosk Integration
On-device note over ui : Page is loaded,
which loads plugins.
Plugins register services note over ui : User works with basket note over ui : User moves to payment
method selection note over ui : User selects to
pay with kiosk terminal ui->>fo: Start payment note over fo: Create transaction and
start orchestration fo->>intcloud: Reserve amount
(inc. FO kiosk device id) intcloud->>fo: Get order info fo-->>intcloud: Order info intcloud->>intdevice: Perform Payment note over intdevice : Guide user through
payment process on
terminal note over intdevice : Fiscalize note over intdevice : Print Receipt intdevice->>intcloud: Payment performed intcloud->>fo: Payment reserved fo->>pos: Place order alt Successful order placement pos-->>fo: Order Placed fo->>intcloud: Capture reservation intcloud->>fo: Reservation Captured note over ui : Allow guest to
select receipt option alt User selects to print receipt ui->>plugin: Print receipt plugin->>intdevice: Print receipt note over intdevice : Fiscalize note over intdevice : Print receipt else User selects not to print receipt note over intdevice : This also needs to happen
on timeout if capture
has been requested ui->>plugin: Order cleared plugin->>intdevice: Order cleared note over intdevice : Fiscalize end else Failed order placement pos-->>fo: Failed to Place fo->>intcloud: Annul reservation note over intcloud: Reverse payment and fiscal
or trigger manual process to
handle on store side intcloud->>fo: Reservation annulled end ``` ## See also - [External Payment Provider Integrations](../external-payment-provider/overview.md) - [Frontend Plugins - Receipt service](../frontend-plugins/services/receipt-service.md) - [Frontend Plugins - Scanner service](../frontend-plugins/services/scanner-service.md) - [External Kiosk Monitor](../custom-kiosk-shell/external-kiosk-monitor.md) - [order.placed_in_pos](../../events/order/placed-in-pos)