How TillPayments Terminal Transactions Work
Source: tillpayments_controller.rb
- The test/live mode toggle is inverted — the code uses
!ap_use_test_mode, so enabling "test mode" in settings actually puts you in live mode and vice versa - Terminal transactions are only supported for objects of type "invoice" or "payment"; other object types will be rejected
- A terminal ID is required to initiate a transaction; the system also checks that no existing intent already exists on the object before creating a new one
- Lost transaction status recovery compares the EFT receipt record against the original object state to determine what happened
- Surcharge handling has two paths: if the surcharge amount is zero, the payment processes directly; if positive, the surcharge is applied to the object first and then synced to accounting
- Refunds are only allowed for credits that are fully processed and have not been partially applied to other invoices
- When processing multiple payment items, the total of all items must equal the total of all payment methods; you cannot overpay any individual invoice in the batch
- Accounting sync is queued as a delayed job with deduplication logic and a 1-minute delay to prevent duplicate sync entries
Support scenarios
- "Terminal is processing in live mode but we have test mode enabled" → The test/live toggle is inverted in the code. If the workshop has "test mode" ticked, they are actually in live mode. Toggle the setting to the opposite of what seems logical.
- "Customer says they paid but the terminal shows no transaction" → Check if there is an existing intent record stuck on the invoice. Only one intent is allowed per object — a previous abandoned attempt may be blocking new transactions.
- "Surcharge isn't showing up in our accounting software" → Surcharge accounting sync uses a delayed job with a 1-minute delay. If the job failed, the surcharge was applied in Workshop but not pushed to accounting. Check the delayed jobs queue.
- "We tried to refund a credit but it won't let us" → Refunds require the credit to be fully processed with no partial applications. If the credit has been partially applied to invoices, it cannot be refunded through the terminal.