Pay at table

Pay at table allows merchants to make transactions from the EFTPOS terminal instead of the POS, hence allowing them to make purchases away from their desk.


Important to know:


An example of Pay at table is at a restaurant when the waiter comes to your table with an EFTPOS terminal for you to pay your bill. This is convenient because you don't need to go to the POS at the desk to make your payment.

Pay at table is not only used in restaurants; it's used in many cases where the merchant needs to make transactions while walking around their establishment.

Normally, the POS starts transactions using the Spice API, but when Pay at table is enabled, the EFTPOS terminal starts transactions instead.

A flowchart of a normal transaction versus a flowchart of a Pay at table transaction. Normal transaction: POS goes to Spice goes to EFTPOS terminal. Pay at table transaction: EFTPOS terminal goes to Spice goes to POS Table server.

Develop Pay at table

Pay at table is an advanced feature that requires you to develop a database, an API, and a UI.

To understand how it works, let's use the previous example. When the waiter comes to your table, they enter your table number into the EFTPOS terminal. The terminal displays the bill for your table and you can then pay the bill.

The table and bill data are stored in your integration, and it provides an API that Spice uses to get this data and pass it to the terminal. The integration POS also provides a UI for managing tables.

Table database

Pay at table requires your integration to store several fields of data. Here is an example of a database containing these fields, but you may choose to store additional fields or even use a different database structure.

An Entity Relationship diagram of the Table database.
These are the users who have access to making payments from the terminal.
Operator ID A unique string that identifies the operator. This string must only contain numbers since some terminals don’t accept other characters.
These are the restaurant tables, hotel bookings, or another way of representing the customer.
Table ID A unique string that identifies the table; usually numbers are used.
Label A string that can be used to identify the table, e.g. “long table at the back”.
Is locked? When true, the table is ‘locked’, preventing any transactions for the table.
Operator ID The operator who created the table.
Bill ID A foreign key. A table has a single bill.
A bill contains the amount owed and paid by a table.
Bill ID A unique string that identifies the bill.
Total amount The full amount of money that needs to be paid or was paid.
Outstanding amount The amount of money that has not yet been paid.
A payment that has been made to pay a bill.
Bill ID A foreign key. A bill can have zero to many payments.
Amount The amount of money paid.
Payment type This can be either “cash” or “card”.

Table API

Your integration must provide an API with several endpoints that follow our specifications. Spice will call this API to access the table’s data and pay bills. You can find the specifications at the following links.


While a bill is being paid, ensure to 'lock' the table (set Is locked? to true) to prevent other terminals from making payments for the same table. This prevents duplicate payments. After the payment is complete, 'unlock' the table.

Table UI

Your integration must also provide a UI for the merchant to manage their tables, bills, and operators from the POS. The table UI should make it easy to view the open tables and perform actions on them.

Your UI must allow the user to perform the following actions.

Open a table This creates a new table.
Close a table This removes an existing table. It will no longer be returned by the Table API.
Edit bill Change the total amount of a bill.
Lock table
Change a table’s Is locked? value to true to prevent any transactions from being made for the table.
Unlock table
Change a table’s Is locked? value to false to allow transactions to be made for the table.
Create operator
Create a new operator.
Remove operator
Remove an operator.

Use Pay at table

After you have developed the Pay at table feature for your integration, it's time to start using it.

Enable Pay at table mode

In Spice, click the Settings tab > Pay at table > enable the Pay at table option.

The Settings screen with the 'Pay at table' option enabled.

Pair multiple terminals

When Pay at table is enabled, a Back to terminals button will appear at the top of the screen. Click this to go to the Terminals page where you can pair multiple terminals to the POS. Learn more about Multi-pairing

Make a payment from the terminal

You can now use this feature to make transactions from the terminal.

  1. On the POS, open at least one table and create an operator.
  2. On your Gecko Bank terminal, press the Pay at table button.
  3. Enter the Operator ID.
  4. Enter the Table number (the Table ID).
  5. Proceed to make the payment.

Make a payment from the POS

When Pay at table mode (or Multi-terminal mode) is enabled, you can still make transactions from the POS. Learn more


It is required that you develop your integration and get it certified before developing the Pay at table feature. Pay at table must be developed at the end and certified separately. This is because it is an advanced feature so it is easier to test it separately.

Pay at table has its own separate test suite: Spice Pay at table test suite.