Successful Payments
The Successful Payments report is the core of your reconciliation. It contains every successful payment processed through NjiaPay, each shown with its reconciliation status. A transaction in this report is either:
- 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: 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.
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 (always populated)
| Column | Description | Example |
|---|---|---|
njia_intent_id | NjiaPay's unique payment identifier | 018b2f4a-9c3d-7a1e-... |
njia_reference_id | Your order/payment reference | ACME_ORDER_50004 |
merchant_id | Your merchant identifier | acme |
njia_merchant_id | Same as merchant_id (included for compatibility) | acme |
njia_currency | Currency the customer paid in | GBP |
njia_amount | Payment amount in major units | 40.0 |
njia_intent_status | Always Success in this report | Success |
njia_attempt_id | NjiaPay's attempt number | 1687787 |
njia_attempt_updated_at | When NjiaPay last updated this transaction | 2025-11-25 17:15:28 |
created_ts | Transaction timestamp used for date filtering | 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) | 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 | 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 | 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 | 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? | Always True in this report |
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 is an example mixing both matched and unmatched rows. Matched rows have all columns filled and break flags set to True/False, while unmatched rows have empty PSP columns and empty break flags.
NjiaPay side
| njia_reference_id | njia_currency | njia_amount | njia_payment_partner | njia_connection_id | njia_payment_partner_ref | exists_in_psp |
|---|---|---|---|---|---|---|
| ACME_ORDER_50116 | ZAR | 150.0 | Adyen | adyen-global | SD8G0HSSTU5T76I7 | False |
| ACME_ORDER_54770 | USD | 15.03 | Adyen | adyen-global | UWS5TUOY8WE889I7 | False |
| ACME_ORDER_60325 | GBP | 40.0 | Adyen | adyen-global | URQ0SO8IXYYJKNF4 | True |
| ACME_ORDER_59747 | USD | 22.68 | Adyen | adyen-global | GYHAQ35SI3X54TG4 | True |
| ACME_ORDER_60268 | NGN | 3800.0 | StartButton | stbtn-xxxxx | 9160260dbdb5 | False |
| ACME_ORDER_61179 | NZD | 30.0 | Adyen | adyen-global | XAW3KGOOOIUE0TE4 | True |
| ACME_ORDER_59279 | KES | 500.0 | StartButton | stbtn-xxxxx | 1ged0f4ad7b5 | False |
| ACME_ORDER_60429 | USD | 40.0 | Adyen | adyen-global | X0ITD49QDQTU8DH7 | True |
PSP side (for matched rows only)
| njia_reference_id | psp_type | psp_transaction_type | psp_gross_amount | psp_exchange_rate | psp_total_costs | psp_net_currency | psp_net_amount | break_gross_amount | break_currency |
|---|---|---|---|---|---|---|---|---|---|
| ACME_ORDER_60325 | AdyenGlobal | Settled | 40.0 | 1.0 | 0.84 | GBP | 39.16 | False | False |
| ACME_ORDER_59747 | AdyenGlobal | Settled | 22.68 | 1.0 | 0.76 | USD | 21.92 | False | False |
| ACME_ORDER_61179 | AdyenGlobal | Settled | 30.0 | 0.484 | 0.51 | EUR | 14.0 | False | False |
| ACME_ORDER_60429 | AdyenGlobal | Settled | 40.0 | 1.0 | 1.24 | USD | 38.76 | False | False |
Unmatched rows (ACME_ORDER_50116, 54770, 60268, 59279) have no PSP data. They are awaiting settlement file upload.
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 |
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.