Successful Payments
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.
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)
| Column | Description | Example |
|---|---|---|
njia_intent_id | NjiaPay's unique payment identifier | 018b2f4a-9c3d-7a1e-b2c4-d5e6f7a8b9c0 |
njia_merchant_ref_id | Your 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_id | Your merchant identifier | acme |
njia_currency | Currency the customer paid in | GBP |
njia_amount_minor_units | Payment amount in minor units (e.g. cents). Always an integer. | 4000 |
njia_amount | Payment amount in major units. See Amounts: Major & Minor Units. | 40.0 |
njia_intent_status | Always Success in this report | Success |
njia_purchaser_id | Unique identifier of the purchaser, if provided when creating the intent | purchaser_abc123 |
njia_purchaser_email | Email address of the purchaser, if provided | customer@example.com |
njia_purchaser_phone_number | Phone number of the purchaser, if provided | +27612345678 |
njia_attempt_id | NjiaPay's attempt number | 1687787 |
njia_attempt_updated_at | When NjiaPay last updated this transaction | 2025-11-25 17:15:28 |
njia_payment_partner | PSP that processed the payment | Adyen |
njia_connection_id | Specific PSP connection/account | adyen-global |
njia_payment_partner_ref | PSP'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.
| Column | Description | Example |
|---|---|---|
psp_type | PSP identifier in settlement file | AdyenGlobal |
psp_created_timestamp | When the PSP recorded this transaction | 2025-09-29 23:34:31 |
psp_merchant_id | Your merchant ID on the PSP's side | acme |
psp_batch_ref | Settlement batch reference (links to the specific payout) | 156 - 2025-09-29 23:34:31+00 |
psp_transaction_type | Transaction classification on PSP side | Settled |
psp_gross_currency | Currency of the gross (pre-fee) amount | GBP |
psp_gross_amount_minor_units | Gross amount in minor units (integer) | 4000 |
psp_gross_amount | Gross amount before fees in major units | 40.0 |
psp_exchange_rate | Exchange rate applied by PSP (1.0 = no conversion) | 1.0 |
psp_cost_currency | Currency in which fees were charged | GBP |
psp_total_costs_minor_units | Total fees in minor units (integer) | 84 |
psp_total_costs | Total fees deducted by the PSP in major units | 0.84 |
psp_net_currency | Currency of the net (post-fee) amount | GBP |
psp_net_amount_minor_units | Net amount in minor units (integer) | 3916 |
psp_net_amount | Net amount after fees, i.e. what you actually receive | 39.16 |
Reconciliation & Break Columns
| Column | Description | What to look for |
|---|---|---|
exists_in_njia | Was this transaction found in NjiaPay? | True for NjiaPay transactions, False for PSP-only |
exists_in_psp | Was this transaction found in PSP settlement? | True = matched, False = unmatched |
break_gross_amount | Do the NjiaPay amount and PSP gross amount disagree? | True = investigate. Empty if unmatched. |
break_currency | Do the currencies disagree? | True = investigate. Empty if unmatched. |
break_created_month | Were the transactions recorded in different months? | True = month mismatch (common). Empty if unmatched. |
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_id | njia_merchant_ref_id | njia_merchant_id | njia_currency | njia_amount_minor_units | njia_amount | njia_intent_status | njia_purchaser_id | njia_purchaser_email | njia_purchaser_phone_number | njia_attempt_id | njia_attempt_updated_at | njia_payment_partner | njia_connection_id | njia_payment_partner_ref | psp_type | psp_created_timestamp | psp_merchant_id | psp_batch_ref | psp_transaction_type | psp_gross_currency | psp_gross_amount_minor_units | psp_gross_amount | psp_exchange_rate | psp_cost_currency | psp_total_costs_minor_units | psp_total_costs | psp_net_currency | psp_net_amount_minor_units | psp_net_amount | exists_in_njia | exists_in_psp | break_gross_amount | break_currency | break_created_month |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 019997d3-c5ca-7ac3-93ad-77dec07adfd8 | ACME_PAYMENT_10375325 | acme | GBP | 4000 | 40.0 | Success | (empty) | (empty) | (empty) | 1687787 | 2025-11-25 18:15:28 | Adyen | adyen-global | TQP9RN7HWXXHJMF3 | AdyenGlobal | 2025-09-30 00:34:31 | acme | 156 - 2025-09-29 23:34:31+00 | Settled | GBP | 4000 | 40.0 | 1.0 | GBP | 84 | 0.84 | GBP | 3916 | 39.16 | True | True | False | False | True |
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_id | njia_merchant_ref_id | njia_merchant_id | njia_currency | njia_amount_minor_units | njia_amount | njia_intent_status | njia_purchaser_id | njia_purchaser_email | njia_purchaser_phone_number | njia_attempt_id | njia_attempt_updated_at | njia_payment_partner | njia_connection_id | njia_payment_partner_ref | psp_type | psp_created_timestamp | psp_merchant_id | psp_batch_ref | psp_transaction_type | psp_gross_currency | psp_gross_amount_minor_units | psp_gross_amount | psp_exchange_rate | psp_cost_currency | psp_total_costs_minor_units | psp_total_costs | psp_net_currency | psp_net_amount_minor_units | psp_net_amount | exists_in_njia | exists_in_psp | break_gross_amount | break_currency | break_created_month |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0199f454-6b0e-738e-9e19-cfb7dd3714d2 | ACME_PAYMENT_10506179 | acme | NZD | 3000 | 30.0 | Success | (empty) | (empty) | (empty) | 1777347 | 2025-11-26 18:16:09 | Adyen | adyen-global | WZV2JFNNNHTD9SD3 | AdyenGlobal | 2025-10-17 23:42:13 | acme | 158 - 2025-10-17 22:42:13+00 | Settled | NZD | 3000 | 30.0 | 0.484 | EUR | 51 | 0.51 | EUR | 1400 | 14.0 | True | True | False | False | True |
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_id | njia_merchant_ref_id | njia_merchant_id | njia_currency | njia_amount_minor_units | njia_amount | njia_intent_status | njia_purchaser_id | njia_purchaser_email | njia_purchaser_phone_number | njia_attempt_id | njia_attempt_updated_at | njia_payment_partner | njia_connection_id | njia_payment_partner_ref | psp_type | psp_created_timestamp | psp_merchant_id | psp_batch_ref | psp_transaction_type | psp_gross_currency | psp_gross_amount_minor_units | psp_gross_amount | psp_exchange_rate | psp_cost_currency | psp_total_costs_minor_units | psp_total_costs | psp_net_currency | psp_net_amount_minor_units | psp_net_amount | exists_in_njia | exists_in_psp | break_gross_amount | break_currency | break_created_month |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0198acd4-1183-7d99-99d1-cebfe0fe26f1 | ACME_PAYMENT_10099116 | acme | ZAR | 15000 | 150.0 | Success | (empty) | (empty) | (empty) | 1489232 | 2025-11-24 04:05:45 | Adyen | adyen-global | RC7F9GRRSM4S65H6 | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | True | False | (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_id | njia_merchant_ref_id | njia_merchant_id | njia_currency | njia_amount_minor_units | njia_amount | njia_intent_status | njia_purchaser_id | njia_purchaser_email | njia_purchaser_phone_number | njia_attempt_id | njia_attempt_updated_at | njia_payment_partner | njia_connection_id | njia_payment_partner_ref | psp_type | psp_created_timestamp | psp_merchant_id | psp_batch_ref | psp_transaction_type | psp_gross_currency | psp_gross_amount_minor_units | psp_gross_amount | psp_exchange_rate | psp_cost_currency | psp_total_costs_minor_units | psp_total_costs | psp_net_currency | psp_net_amount_minor_units | psp_net_amount | exists_in_njia | exists_in_psp | break_gross_amount | break_currency | break_created_month |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | (empty) | AdyenGlobal | 2025-10-05 14:22:08 | acme | 157 - 2025-10-05 13:22:08+00 | Settled | USD | 2500 | 25.0 | 1.0 | USD | 62 | 0.62 | USD | 2438 | 24.38 | False | True | (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. Checkbreak_gross_amountandbreak_currencyfor 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:
Truerows are fully reconciled. Both sides agree (check break flags for exceptions)Falserows 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 = NZDandpsp_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:
| Reason | Typical Duration |
|---|---|
| PSP settlement file not yet uploaded | 1–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 retried | Requires manual investigation |
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.