Store and Forward
The Store and Forward (SAF) function captures payment data during instances when the network connection is not consistent. Payment Terminal Application recognizes these instances automatically and provides a buffer to store transaction data, allowing transactions to continue. When the network connection is stable, Payment Terminal Application submits the SAF queue of transaction data to our payment host to determine approval status.
To enable and configure SAF, refer to Store and Forward parameters.
Process flows
During the transaction process, if enabled, store and forward allows for the offline approval of transactions.
Payment Terminal Application communicates stored SAF transactions to our payment host at the next available opportunity, typically before the next transaction attempt.
The following diagram illustrates how a transaction processes as SAF.

The following diagram illustrates how SAF records are uploaded to our payment host.

Candidate transactions
If a transaction meets the following conditions for SAF approval, Payment Terminal Application places the transaction in the SAF queue with a state of Eligible.
- Credit card sale or refund transaction (that is, debit transactions are not candidates for SAF)
- Host communication fails or Payment Terminal Application does not receive a host response
- Cardholder authentication method other than online or offline PIN
- Transaction falls within the following filtering parameters:
- Maximum transaction amount
- Maximum SAF queue total transaction amount
- Maximum SAF queue number of transactions
Transaction states
- Eligible: Transaction approved in SAF and queued to send to the payment host for approval. The transaction state can change to processed, declined, or failed.
- Processed: Transaction sent to the payment host and approved. These transactions are included in the terminal batch for accounting purposes.
- Declined: Transaction sent to the payment host and declined. To retry a declined transaction, use the API and change the transaction state to Eligible.
- Failed: Transaction sent to the payment host, but failed at the payment host or timed out (no response).
Additional rules
The following additional rules apply while in SAF mode.
- Payment Terminal Application only approves void requests for sale and refund transactions in the SAF queue in the state of eligible (in other words, the transaction has not been approved by the payment host). When voided, the SAF sale or refund is deleted from the SAF batch. All other Void transactions are declined with ‘communications error’.
- Approval codes are generated locally based on a random number. Payment Terminal Application checks offline approval codes against all approval codes in the current batch (SAF and non-SAF) to ensure uniqueness. The transaction record holds both the SAF approval code and the approval code from the transaction response. Use the local SAF approval code for the receipt, while reports list both approval codes.
- Transactions that are not approved in SAF are declined with the ‘communications error’ message.
Query the SAF queue
To perform a SAF query on the current batch, use the GetTransactions operation with a value of ALL_SAF
in the type
field. GetTransactions
retrieves the SAF queue of sales and refunds regardless of the transaction state: Eligible, Processed, Declined, or Failed.
Example
Here is an example of the GetTransactions
operation to query the SAF queue.
{
"operation": "GetTransactions",
"type": "ALL_SAF"
}
{
"operation": "GetTransactions",
"result": "0",
"records": [
{
"reference": "510403104321",
"dateTime": "2017-04-03 13:59:59",
"account": "123456****1234",
"cardBrand": "VISA",
"entryMode": "Swiped",
"requestedAmount": "1234",
"subTotalAmount": "1234",
"totalAmount": "1234",
"transactionId": "123456",
"batchNumber": "001",
"batchJulianDay": "123",
"result": "00",
"approval": "approved"
},
{
"reference": "510406674345",
"dateTime": "2017-04-05 15:00:00",
"account": "123456****4321",
"cardBrand": "VISA",
"entryMode": "Swiped",
"requestedAmount": "1234",
"subTotalAmount": "1000",
"totalAmount": "1010",
"transactionId": "654321",
"batchNumber": "001",
"batchJulianDay": "123",
"result": "00",
"approval": "approved"
}
]
}