Reconciliation

Description

After StraitsX/Card receives the clearing file from VISA, will trigger webhook notifications for the reconciliation result. Including reconciliation_success and reconciliation_manual_adjustment webhook.

After the live transactions got approved, will be combined into a clearing record to specify the success transaction from VISA perspective. The flow for notifying the reconciliation process is as follow:

  1. The merchants submit the capture requests to the card network.
  2. The card network combine all requests and sends a clearing record to StraitsX.
  3. For transactions that have matched amounts between the transaction clearing file and the live transaction, we'll send the transaction list you via reconciliation_success webhook.
  4. For the transactions that have discrepancies between the Base 2 clearing file and the Base 1 live transaction records, StraitsX will validate each transaction.
  5. For each transaction with discrepancy, after it got verified we'll send you recommended action via reconciliation_manual_adjustment webhook
  6. You may need to adjust (either deduct or refund) based on the action recommended.

More detail

StraitsX system performing comparison between Base 2 clearing file and Base 1 live transaction by comparing these fields:

  • visa_transaction_id
  • auth_code
  • acquirer_amount
  • card_number (PAN)
  • acquirer_currency
  • account_amount
  • account_currency
  • transaction_type

There are multiple possible outcomes for these operation:

Matched transaction

If all those fields are matched, StraitsX will mark the transaction as matched and will send the transaction information as part of reconciliation_success webhook

Unmatched transaction

If there are discrepancy in acquirer_amount and account_amount fields, StraitsX will mark the transaction as unmatched and will send follow up reconciliation_manual_adjustment webhook which will run automatically from the StraitsX system. Here is the possible scenarios example of this webhook:

partial refund due to acquirer amount difference

  • User purchase $5 SGD transaction in base 1.
  • Card network send reconciliation transaction in $4.5 SGD in base 2.
  • Transaction will marked as unmatched and StraitsX system send information as such:
    • recommended_action = refund
    • amount = 0.5
    • reason = BASE_2_ADJUSTMENT

partial_deduction due to acquirer amount difference

  • User purchase $5 SGD transaction in base 1.
  • Card network send reconciliation transaction in $5.5 SGD in base 2.
  • Transaction will marked as unmatched and StraitsX system send information as such:
    • recommended_action = deduction
    • account_amount = 0.5
    • reason = BASE_2_ADJUSTMENT

partial refund / deduction due to equal acquirer amount, but different currency rate

  • Card base currency is USD
  • User purchase Rp 5.000 IDR transaction in base 1 or equivalent to $0.31 USD in 30th of May 2025.
  • Card network send reconciliation transaction in Rp 5.000 IDR in base 2 or equivalent to $0.32 USD in 2nd of June 2025.
  • Transaction will marked as unmatched and StraitsX system send information as such:
    • recommended_action = deduction
    • amount = 0.1
    • reason = FX_RATES_ADJUSTMENT

Not found transaction

For this specific case, there are no fields matched after perform comparison. On this case, StraitsX will send the full amount following the amount in reconciliation transaction in reconciliation_manual_adjustment webhook.

Multiple clearing (split shipment)

A single authorization can be cleared by the acquirer across more than one Base 2 clearing record. This is common for split shipments and partial fulfilment, where the merchant delivers in stages and submits one clearing record per stage.

All clearing records for the same authorization share the same auth_code and transaction_id (Visa Transaction Identifier). Two fields tell you where each record sits within the set:

FieldMeaning
multiple_clearing_sequence_numberPosition of this clearing record within the set.
multiple_clearing_sequence_countTotal number of clearing records expected for this authorization.

Both fields return "0" when the transaction is not part of a multiple clearing set.

Identifying a partial vs the final clearing record

A record is the final clearing record of the set when multiple_clearing_sequence_number equals multiple_clearing_sequence_count. Any record where the sequence number is lower than the count is a partial clearing — more records are expected for the same authorization.

For reconciliation_success, each clearing record arrives as an entry in the transactions[] array. Group records by auth_code + transaction_id rather than assuming one webhook per authorization. For reconciliation_manual_adjustment, each clearing record is delivered as its own webhook.

Complete sequence

Both records below share auth_code 8HV9R1 and transaction_id 586226691309098. The second record is the final one because the sequence number equals the count.

{
  "amount": "55.42",
  "currency": "USD",
  "transaction_id": "586226691309098",
  "auth_code": "8HV9R1",
  "multiple_clearing_sequence_number": "1",
  "multiple_clearing_sequence_count": "2"
}
{
  "amount": "27.71",
  "currency": "USD",
  "transaction_id": "586226691309098",
  "auth_code": "8HV9R1",
  "multiple_clearing_sequence_number": "2",
  "multiple_clearing_sequence_count": "2"
}

Worked example

An authorization of 100 is cleared across two records (multiple_clearing_sequence_count = 2). Both records share the same auth_code and transaction_id; the sequence number increases with each record, and the second is the final one because it equals the count.

seqcountamountThis record
1220Partial — more records expected
2280Final — sequence number equals count

amount is the value cleared by each individual record, not a running total. Summing the amount of the records you receive gives the total cleared amount (20 + 80 = 100), which matches the original authorization.


Did this page help you?