POS Revenue push
A Guide to building apps for pushing revenue data from POS systems π°
POS systems can build full revenue push apps to sync sales and revenue data from a POS software into the Booking Experts PMS. This way, the PMS contains all revenue data in one place for all accounting and bookkeeping activities for a park. This means that organisations can sync POS revenue into BEX and use one of our accounting integrations to push journal entries into the accounting software. Following this guide, you will be able to create an integration with Booking Experts which can sync sales and revenue data from POS systems into our PMS.
Note: For a full revenue sync to work, the organisation should have the POS module enabled in the PMS
Permissions
Typically, the following access scopes will be required for a revenue sync with a POS system:
administration|read
register|read
register|write
ledger_account|read
receipt|read
receipt|write
payment_method|read
payment|write
vat_code|read
vat_tariff|read
Setup
Establishing a connection between BEX and POS system
Once the user installs the app, the app's connection with Booking Experts is established. The next step is to connect the POS system with Booking Experts. To do this, users must also authorise and connect with their POS platform. This can be achieved by creating a command with theΒ subscription
Β context model, which may redirect users to the POS systemβs authorisation flow.
Configuration
After successfully connecting BEX and the POS system, users can configure various settings in the app to properly setup the sync. Typically, the following mappings and configurations are required:
- POS locations: Generally, POS systems have locations which map to administrations in BEX. This mapping needs to be setup in the app. Once an administration is successfully mapped with a location on the POS, the app should create a new register for that administration using the POST
v3/administrations/:id/registers
endpoint. Some other sync preferences might include:- A start and end date for the sync
- Number of days' delay before a day's synced (to allow for corrections or closure delays in the POS system)
- POS Products: The products in the POS system must be mapped to ledger accounts in BEX in the app. In BEX, creating a receipt involves adding receipt items with each item representing a product with a quantity and unit price (including VAT). The ledger account connected to the product is used to calculate the total VAT amount for the receipt item. If your POS system supports tipping, we suggest mapping a ledger account specifically for tips.
- Payment methods: The payment methods in the POS system must be mapped to the payment methods in BEX. This way all payments retrieved from the POS system will be correctly synced in BEX and journalised accordingly.
General steps
-
Create a new register for each mapped administration using the POST
v3/administrations/:id/registers
endpoint. This will create a new "API managed" register object in BEX, which is not visible in the PMS UI in the registers section and will only be used to create receipts via the app. A sample payload to create a new receipt is as follows:{ "data": { "type": "register", "attributes": { "name": "Register name" } } }
-
POS sales can be pushed into the PMS by creating receipts under the newly created register. This can be done using the POST
v3/administrations/:id/registers/:register_id/receipts
endpoint. While creating a receipt, it should have the corresponding receipt items and payments (the ledger account and payment method ids correspond to the BEX ids):{ "data": { "type": "receipt", "relationships": { "receipt_items": { "data": [ { "type": "receipt_item", "meta": { "temp_id": "item#1", "method": "create" } }, { "type": "receipt_item", "meta": { "temp_id": "item#2", "method": "create" } } ] }, "payments": { "data": [ { "type": "payment", "meta": { "temp_id": "payment#1", "method": "create" } }, { "type": "payment", "meta": { "temp_id": "payment#2", "method": "create" } } ] } } }, "included": [ { "type": "receipt_item", "attributes": { "name": "Croissant", "quantity": 2.0, "price": { "currency": "EUR", "value": "6.99" }, "vat_rate": 12.0 }, "relationships": { "ledger_account": { "data": { "id": "34", "type": "ledger_account" } } }, "meta": { "temp_id": "item#1" } }, { "type": "receipt_item", "attributes": { "name": "Orange juice", "quantity": 2.0, "price": { "currency": "EUR", "value": "5.99" }, "vat_rate": 8.0 }, "relationships": { "ledger_account": { "data": { "id": "35", "type": "ledger_account" } } }, "meta": { "temp_id": "item#2" } }, { "type": "payment", "attributes": { "paid_at": "2025-07-24", "amount": { "currency": "EUR", "value": "13.98" } }, "meta": { "temp_id": "payment#1" }, "relationships": { "payment_method": { "data": { "id": "13", "type": "payment_method" } } } }, { "type": "payment", "attributes": { "paid_at": "2025-07-24", "amount": { "currency": "EUR", "value": "11.98" } }, "meta": { "temp_id": "payment#2" }, "relationships": { "payment_method": { "data": { "id": "1", "type": "payment_method" } } } } ] }
- Receipt items: The total price and VAT amounts will be calculated during creation by checking the receipt items' unit price and quantity. These amounts will be verified with the amounts passed in the attributes. If there's a mismatch, an error will be returned.
{ "type": "receipt_item", "attributes": { "name": "Croissant", "quantity": 2.0, "price": { "currency": "EUR", "value": "6.99" }, "vat_rate": 12.0 }, "relationships": { "ledger_account": { "data": { "id": "34", "type": "ledger_account" } } }, "meta": { "temp_id": "temp#1" } }
- Payments: Payments for the receipts should be created, with the payment method and amount specified in the request per order's payments. If the total payment amount does not match the total amount of receipt items, an error will be returned.
{ "type": "payment", "attributes": { "paid_at": "2025-07-24", "amount": { "currency": "EUR", "value": "13.98" } }, "meta": { "temp_id": "temp#1" }, "relationships": { "payment_method": { "data": { "id": "13", "type": "payment_method" } } } }
- Receipt items: The total price and VAT amounts will be calculated during creation by checking the receipt items' unit price and quantity. These amounts will be verified with the amounts passed in the attributes. If there's a mismatch, an error will be returned.
Updated 2 days ago