Reconciliation Reports

Successful Payments

All successful payments with reconciliation status, both matched against PSP settlements and still awaiting settlement data.

The Successful Payments report is the core of your reconciliation. It contains every successful payment processed through NjiaPay, plus any PSP-only transactions. Each row can be in one of three states:

  • Matched: found in both NjiaPay and the PSP settlement file (exists_in_njia = True, exists_in_psp = True). All columns are populated, including PSP amounts, fees, and break flags.
  • Unmatched (NjiaPay only): exists in NjiaPay but no corresponding PSP settlement record was found yet (exists_in_njia = True, exists_in_psp = False). Only the NjiaPay columns are filled; all PSP columns and break flags are empty.
  • PSP only: exists in the PSP settlement file but NjiaPay has no record of it (exists_in_njia = False, exists_in_psp = True). This means the payment was made outside of NjiaPay, either via a manual payment link created directly in the PSP dashboard, or from historical transactions that predate your NjiaPay integration. Only PSP columns are filled.
Last updated: March 2026

When to Use This Report

  • As your primary reconciliation worksheet. Filter to see matched vs. unmatched at a glance
  • To review processing fees charged by each PSP on matched transactions
  • To calculate your net revenue after fees and currency conversion
  • To identify amount breaks, i.e. discrepancies between what NjiaPay recorded and what the PSP settled
  • To track which successful payments are still awaiting settlement confirmation

Column Reference

The report has three groups of columns: NjiaPay side (what NjiaPay recorded), PSP side (what the PSP settlement file says), and Break flags (discrepancy indicators).

NjiaPay Columns (populated when exists_in_njia = True)

ColumnDescriptionExample
njia_intent_idNjiaPay's unique payment identifier018b2f4a-9c3d-7a1e-b2c4-d5e6f7a8b9c0
njia_merchant_ref_idYour own order/payment reference that you passed when creating the payment intent. This is the most critical column for matching against your internal systems.ACME_ORDER_50004
njia_merchant_idYour merchant identifieracme
njia_currencyCurrency the customer paid inGBP
njia_amount_minor_unitsPayment amount in minor units (e.g. cents). Always an integer.4000
njia_amountPayment amount in major units. See Amounts: Major & Minor Units.40.0
njia_intent_statusAlways Success in this reportSuccess
njia_purchaser_idUnique identifier of the purchaser, if provided when creating the intentpurchaser_abc123
njia_purchaser_emailEmail address of the purchaser, if providedcustomer@example.com
njia_purchaser_phone_numberPhone number of the purchaser, if provided+27612345678
njia_attempt_idNjiaPay's attempt number1687787
njia_attempt_updated_atWhen NjiaPay last updated this transaction2025-11-25 17:15:28
njia_payment_partnerPSP that processed the paymentAdyen
njia_connection_idSpecific PSP connection/accountadyen-global
njia_payment_partner_refPSP's reference ID (used to match against PSP settlement)TQP9RN7HWXXHJMF3

PSP Columns (populated only when matched)

These columns are filled when exists_in_psp = True. When the transaction is unmatched, they are all empty.

ColumnDescriptionExample
psp_typePSP identifier in settlement fileAdyenGlobal
psp_created_timestampWhen the PSP recorded this transaction2025-09-29 23:34:31
psp_merchant_idYour merchant ID on the PSP's sideacme
psp_batch_refSettlement batch reference (links to the specific payout)156 - 2025-09-29 23:34:31+00
psp_transaction_typeTransaction classification on PSP sideSettled
psp_gross_currencyCurrency of the gross (pre-fee) amountGBP
psp_gross_amount_minor_unitsGross amount in minor units (integer)4000
psp_gross_amountGross amount before fees in major units40.0
psp_exchange_rateExchange rate applied by PSP (1.0 = no conversion)1.0
psp_cost_currencyCurrency in which fees were chargedGBP
psp_total_costs_minor_unitsTotal fees in minor units (integer)84
psp_total_costsTotal fees deducted by the PSP in major units0.84
psp_net_currencyCurrency of the net (post-fee) amountGBP
psp_net_amount_minor_unitsNet amount in minor units (integer)3916
psp_net_amountNet amount after fees, i.e. what you actually receive39.16

Reconciliation & Break Columns

ColumnDescriptionWhat to look for
exists_in_njiaWas this transaction found in NjiaPay?True for NjiaPay transactions, False for PSP-only
exists_in_pspWas this transaction found in PSP settlement?True = matched, False = unmatched
break_gross_amountDo the NjiaPay amount and PSP gross amount disagree?True = investigate. Empty if unmatched.
break_currencyDo the currencies disagree?True = investigate. Empty if unmatched.
break_created_monthWere the transactions recorded in different months?True = month mismatch (common). Empty if unmatched.
Break columns are only meaningful for matched rows. When exists_in_psp = False, all break columns are empty because there is nothing to compare against yet.

Example Data

Below are complete example rows exactly as they appear in the CSV. The table is wide -- scroll right to see all columns.

Matched transaction (Adyen, GBP, no currency conversion)

This row is matched (exists_in_njia = True, exists_in_psp = True). Both sides agree on amount and currency (no breaks). break_created_month = True is normal -- the PSP settlement batch date (September) differs from the NjiaPay transaction date (November) because Adyen settles in batches that may lag behind.

njia_intent_idnjia_merchant_ref_idnjia_merchant_idnjia_currencynjia_amount_minor_unitsnjia_amountnjia_intent_statusnjia_purchaser_idnjia_purchaser_emailnjia_purchaser_phone_numbernjia_attempt_idnjia_attempt_updated_atnjia_payment_partnernjia_connection_idnjia_payment_partner_refpsp_typepsp_created_timestamppsp_merchant_idpsp_batch_refpsp_transaction_typepsp_gross_currencypsp_gross_amount_minor_unitspsp_gross_amountpsp_exchange_ratepsp_cost_currencypsp_total_costs_minor_unitspsp_total_costspsp_net_currencypsp_net_amount_minor_unitspsp_net_amountexists_in_njiaexists_in_pspbreak_gross_amountbreak_currencybreak_created_month
019997d3-c5ca-7ac3-93ad-77dec07adfd8ACME_PAYMENT_10375325acmeGBP400040.0Success(empty)(empty)(empty)16877872025-11-25 18:15:28Adyenadyen-globalTQP9RN7HWXXHJMF3AdyenGlobal2025-09-30 00:34:31acme156 - 2025-09-29 23:34:31+00SettledGBP400040.01.0GBP840.84GBP391639.16TrueTrueFalseFalseTrue

After Adyen's fee of GBP 0.84 (2.1% effective rate), the net payout is GBP 39.16. No currency conversion since both sides are in GBP (psp_exchange_rate = 1.0).

Matched transaction (Adyen, NZD with currency conversion to EUR)

njia_intent_idnjia_merchant_ref_idnjia_merchant_idnjia_currencynjia_amount_minor_unitsnjia_amountnjia_intent_statusnjia_purchaser_idnjia_purchaser_emailnjia_purchaser_phone_numbernjia_attempt_idnjia_attempt_updated_atnjia_payment_partnernjia_connection_idnjia_payment_partner_refpsp_typepsp_created_timestamppsp_merchant_idpsp_batch_refpsp_transaction_typepsp_gross_currencypsp_gross_amount_minor_unitspsp_gross_amountpsp_exchange_ratepsp_cost_currencypsp_total_costs_minor_unitspsp_total_costspsp_net_currencypsp_net_amount_minor_unitspsp_net_amountexists_in_njiaexists_in_pspbreak_gross_amountbreak_currencybreak_created_month
0199f454-6b0e-738e-9e19-cfb7dd3714d2ACME_PAYMENT_10506179acmeNZD300030.0Success(empty)(empty)(empty)17773472025-11-26 18:16:09Adyenadyen-globalWZV2JFNNNHTD9SD3AdyenGlobal2025-10-17 23:42:13acme158 - 2025-10-17 22:42:13+00SettledNZD300030.00.484EUR510.51EUR140014.0TrueTrueFalseFalseTrue

The customer paid NZD 30.0 but Adyen converted it to EUR for settlement. The exchange rate 0.484 means: (30.0 * 0.484) - 0.51 = 14.01, rounded to 14.0. The psp_net_currency is EUR (not NZD), which is the currency that actually lands in the merchant's bank account.

Unmatched transaction (NjiaPay only, awaiting PSP settlement)

njia_intent_idnjia_merchant_ref_idnjia_merchant_idnjia_currencynjia_amount_minor_unitsnjia_amountnjia_intent_statusnjia_purchaser_idnjia_purchaser_emailnjia_purchaser_phone_numbernjia_attempt_idnjia_attempt_updated_atnjia_payment_partnernjia_connection_idnjia_payment_partner_refpsp_typepsp_created_timestamppsp_merchant_idpsp_batch_refpsp_transaction_typepsp_gross_currencypsp_gross_amount_minor_unitspsp_gross_amountpsp_exchange_ratepsp_cost_currencypsp_total_costs_minor_unitspsp_total_costspsp_net_currencypsp_net_amount_minor_unitspsp_net_amountexists_in_njiaexists_in_pspbreak_gross_amountbreak_currencybreak_created_month
0198acd4-1183-7d99-99d1-cebfe0fe26f1ACME_PAYMENT_10099116acmeZAR15000150.0Success(empty)(empty)(empty)14892322025-11-24 04:05:45Adyenadyen-globalRC7F9GRRSM4S65H6(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)TrueFalse(empty)(empty)(empty)

All PSP columns are empty because no matching PSP settlement record was found. Either the settlement file hasn't been uploaded yet, or the PSP doesn't have settlement integration.

PSP-only transaction (exists_in_njia = False)

njia_intent_idnjia_merchant_ref_idnjia_merchant_idnjia_currencynjia_amount_minor_unitsnjia_amountnjia_intent_statusnjia_purchaser_idnjia_purchaser_emailnjia_purchaser_phone_numbernjia_attempt_idnjia_attempt_updated_atnjia_payment_partnernjia_connection_idnjia_payment_partner_refpsp_typepsp_created_timestamppsp_merchant_idpsp_batch_refpsp_transaction_typepsp_gross_currencypsp_gross_amount_minor_unitspsp_gross_amountpsp_exchange_ratepsp_cost_currencypsp_total_costs_minor_unitspsp_total_costspsp_net_currencypsp_net_amount_minor_unitspsp_net_amountexists_in_njiaexists_in_pspbreak_gross_amountbreak_currencybreak_created_month
(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)(empty)AdyenGlobal2025-10-05 14:22:08acme157 - 2025-10-05 13:22:08+00SettledUSD250025.01.0USD620.62USD243824.38FalseTrue(empty)(empty)(empty)

All NjiaPay columns are empty. This transaction was processed directly through the PSP (e.g. a manual payment link created in the Adyen dashboard), or it predates the merchant's NjiaPay integration.

Key observations

  • Unmatched rows (exists_in_psp = False): NjiaPay recorded the transaction but no PSP settlement was found. StartButton and Precium rows are always unmatched because those PSPs don't have settlement integration yet. Adyen/PayPal rows are usually waiting for the settlement file upload.
  • Matched rows (both True): Fully reconciled. Check break_gross_amount and break_currency for discrepancies.
  • PSP-only rows (exists_in_njia = False): The PSP settlement has a transaction that NjiaPay doesn't know about. This means it was made outside NjiaPay (manual payment link, or pre-NjiaPay history).

How to Read This Report

Quickly Separate Matched from Unmatched

In your spreadsheet, filter or sort by the exists_in_psp column:

  • True rows are fully reconciled. Both sides agree (check break flags for exceptions)
  • False rows are still awaiting PSP settlement confirmation

A quick summary formula:

Matched count:    =COUNTIF(report[exists_in_psp], "True")
Unmatched count:  =COUNTIF(report[exists_in_psp], "False")
Match rate:       =COUNTIF(report[exists_in_psp], "True") / COUNTA(report[exists_in_psp])

Understanding the Fee Breakdown (Matched Rows Only)

For each matched transaction, you can calculate the effective fee rate:

Fee Rate = psp_total_costs / psp_gross_amount * 100

For example, a transaction with psp_gross_amount = 40.0 GBP and psp_total_costs = 0.84 GBP has an effective fee rate of 2.1%.

Understanding Currency Conversions

When the PSP converts currencies (e.g. NZD to EUR for settlement), you will see:

  • njia_currency = NZD and psp_gross_currency = NZD (original currency matches)
  • psp_exchange_rate = 0.484 (the NZD-to-EUR rate applied)
  • psp_net_currency = EUR (the settlement currency after conversion)
  • psp_net_amount = 14.0 (what lands in your EUR account)

The formula is: psp_net_amount = (psp_gross_amount * psp_exchange_rate) - psp_total_costs

Understanding Break Flags (Matched Rows Only)

Break flags only appear on matched rows. break_created_month = True is normal and expected. It means the NjiaPay transaction was recorded in a different month than the PSP settlement batch. PSPs typically settle in batches that may lag behind the actual transaction date by days or weeks.

When to investigate:

  • break_gross_amount = True: the PSP settled a different amount than NjiaPay recorded. Check for partial refunds, chargebacks, or currency rounding.
  • break_currency = True: the currencies don't match. This can happen with certain PSP configurations.

Why Are Some Successful Payments Unmatched?

Common reasons a successful payment may not yet have a PSP settlement match:

ReasonTypical Duration
PSP settlement file not yet uploaded1–3 business days
Transaction processed through a PSP without settlement integration (e.g. StartButton, Precium)Until integration is completed
PSP reference format changed or transaction was retriedRequires manual investigation
If you see a large number of unmatched transactions for a specific PSP, check with your NjiaPay account manager whether the latest settlement files have been uploaded.

Why Does a Row Have exists_in_njia = False?

A row with exists_in_njia = False means the PSP settlement file contains a transaction that NjiaPay has no record of. Common causes:

  • Manual payment links created directly in the PSP dashboard (e.g. Adyen, Paystack, or PayPal payment links). Someone on your team may have created a one-off payment link in the PSP's own UI, bypassing NjiaPay.
  • Historical transactions from before you started using NjiaPay. If the uploaded PSP settlement file covers a period that predates your NjiaPay integration, those older transactions will appear here.
  • PSP reference mismatch (rare): the PSP recorded a different reference than expected, preventing the match.

These rows will only have PSP columns filled. The NjiaPay columns (njia_merchant_ref_id, njia_currency, njia_amount, etc.) will all be empty.

Review these transactions to determine whether they are expected. If they are not, contact your PSP to investigate.

Tips for Working with This Report

Calculate Net Revenue by Currency (Matched Only)

=SUMIFS(report[psp_net_amount], report[psp_net_currency], "USD", report[exists_in_psp], "True")

Calculate Unmatched Exposure by Currency

=SUMIFS(report[njia_amount], report[njia_currency], "USD", report[exists_in_psp], "False")

Calculate Total Fees by PSP

=SUMIFS(report[psp_total_costs], report[psp_type], "AdyenGlobal", report[psp_cost_currency], "USD")

Find Transactions with Amount Breaks

Filter to exists_in_psp = True AND break_gross_amount = True to see all discrepancies at a glance.

NjiaPay Transactions

The master list of all successful payments. Use to cross-check totals.

Refunds, Chargebacks & Pending

Non-success transactions: refunds, chargebacks, and incomplete payments

Fees & Settlements

Batch-level settlement payouts and PSP fees