Skip to main content

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. 

Diagram that shows how a transaction can be processed as SAF.

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

Diagram that shows how SAF records are uploaded to host for in-store payments.

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). 
Note

A failed transaction automatically generates a corresponding reversal. When reconnected (or the connection is stable), Payment Terminal Application must successfully process all pending reversals with our payment host before processing the SAF queue.

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.

Json
{
    "operation": "GetTransactions",
    "type": "ALL_SAF"
}
Json
{
    "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"
        }
    ]
}