Understanding reconciliation results
A complete reference for every metric on the results screen and the exact structure of the downloadable diff CSV file.
Convergence score
The convergence score is the single most important metric. It shows what percentage of records matched perfectly across both files, relative to all unique records combined.
Row counters
The four counters cover all rows across both files:
| Field | Meaning |
|---|---|
| matched_rows_count | Rows present in both files with all compared fields equal. No action needed. |
| mismatched_rows_count | Rows present in both files (join key matched) but with differing values in one or more compared columns. |
| missed_rows_count_in_file_a | Rows in File B whose join key was not found in File A at all. |
| missed_rows_count_in_file_b | Rows in File A whose join key was not found in File B at all. |
Numeric column statistics
For columns compared with a numeric condition (EQ, GT, GTE, LT, LTE), Reconcio computes aggregate statistics across matched rows where values differ. Reported separately for integer and float columns.
| Field | Type | Meaning |
|---|---|---|
| column_name | string | Column name (from File A) |
| total_a | float | Sum of all values in File A for this column across matched rows |
| total_b | float | Sum of all values in File B for this column across matched rows |
| difference | float | Absolute difference: total_a − total_b |
| difference_percent | float | Relative difference as percentage of total_a |
| matching_rate | float 0–1 | Share of matched rows where values are exactly equal |
Join key statistics
The quality of a reconciliation depends directly on the join keys. These stats help identify duplicates, nulls, and low-effectiveness keys.
| Field | Type | Meaning |
|---|---|---|
| column_name | string | Join key column name |
| matching_rate | float 0–1 | Share of join key values that appear in both files |
| duplicates_in_a | integer | Duplicate join key values in File A — causes one-to-many matching instead of one-to-one |
| duplicates_in_b | integer | Duplicate join key values in File B |
| nulls_in_a | integer | Null join key values in File A — cannot be matched |
| nulls_in_b | integer | Null join key values in File B |
| effectiveness | float 0–1 | Overall effectiveness score. Values above 0.95 are considered good. Low values are the most common cause of low convergence. |
Column quality & detailed stats
| Field | Type | Meaning |
|---|---|---|
| column_name | string | Column name |
| matching_rate | float 0–1 | Share of matched rows where this column's values satisfy the configured condition |
| nulls_in_a | integer | Null values in File A for this column |
| nulls_in_b | integer | Null values in File B for this column |
| both_null | integer | Rows where both files have null — treated as satisfying the condition |
| mismatch_count | integer | Number of rows where this column's values fail the condition |
| has_issues | boolean | true if matching_rate < 0.95 or significant nulls detected |
Recommendations
Reconcio automatically generates recommendations based on the results. Each has a
type and a details map with context-specific data.
| Type | Meaning |
|---|---|
| low_convergence | Convergence below recommended threshold. Details include current value and threshold. |
| duplicates | Duplicate join key values detected. Details include column name and counts per file. |
| missing_rows | Significant number of rows missing from one file. Details include file name and count. |
| nulls | Null values detected in join keys or compared columns. |
| numeric_discrepancy | A numeric column has significant total discrepancy. Details include column, amount, and percentage. |
Diff file
After a completed reconciliation you can download a diff file — a CSV containing every row that did not fully match. This is the file you send to whoever needs to investigate discrepancies.
The diff file does not include matched rows (rows where all condition checks passed). It contains only rows with at least one problem: a failed condition, or a row missing entirely from one file.
diff_file_expired_at). Download it before expiry or re-run the reconciliation.
System fields — present in every row
Every row in the diff file contains three system fields that summarise the overall status of that record:
| Field | Type | Values | Meaning |
|---|---|---|---|
| all_rule_checks | UInt8 | 1 0 |
1 — all configured conditions passed for this record. 0 — at least one condition failed (values differ). NULL — the record is absent from one of the files. |
| absent_in_file_a | UInt8 | 0 1 |
1 — this record exists in File B but its join key was not found in File A. 0 — the record exists in File A. |
| absent_in_file_b | UInt8 | 0 1 |
1 — this record exists in File A but its join key was not found in File B. 0 — the record exists in File B. |
all_rule_checks = 0 AND absent_in_file_a = 0 AND absent_in_file_b = 0 to filter only mismatched
rows (present in both files but with differing values). Use absent_in_file_a = 1 or
absent_in_file_b = 1 to isolate missing records.
Value fields — original values from each file
For every non-join-key column configured in the mapping, the diff contains two value fields — one from each file. The naming pattern is:
| Field name pattern | Type | Meaning |
|---|---|---|
| file_a_<ColumnName> | Nullable(T) | The raw value from File A for this column.
NULL if the record is absent in File A (absent_in_file_a = 1).
|
| file_b_<ColumnName> | Nullable(T) | The raw value from File B for this column.
NULL if the record is absent in File B (absent_in_file_b = 1).
|
For example, if your mapping includes a column named Amount, the
diff will contain columns file_a_Amount and file_b_Amount. Compare them side by side
to see exactly what differs.
Join key columns appear without a prefix — just the column name as configured in File A. They are always non-null since the join key must exist to create a diff row.
Check fields — per-condition result
For every non-join-key column, the diff also contains a check field named after the condition that was applied. The naming pattern is:
| Condition | Check field name | Type | Meaning |
|---|---|---|---|
| EQ | eq_<ColumnName> |
Nullable(UInt8) | 1 — values are equal (or both NULL). 0 — values differ, or the record is absent from one of the files. |
| GT | gt_<ColumnName> |
Nullable(UInt8) | 1 — file_a value is greater than file_b
value. 0 — condition not satisfied, or the record is absent from one of the files. |
| GTE | gte_<ColumnName> |
Nullable(UInt8) | 1 — file_a value ≥ file_b value (or both
NULL). 0 — condition not satisfied, or the record is absent from one of the files. |
| LT | lt_<ColumnName> |
Nullable(UInt8) | 1 — file_a value is less than file_b
value. 0 — condition not satisfied, or the record is absent from one of the files. |
| LTE | lte_<ColumnName> |
Nullable(UInt8) | 1 — file_a value ≤ file_b value (or both
NULL). 0 — condition not satisfied, or the record is absent from one of the files. |
| IGNORE | No check field generated | — | Columns marked IGNORE are excluded from comparison. No check field is added to the diff. |
ABC and abc are considered
equal.
Complete example
Suppose you configured a reconciliation with:
- Join key:
InvoiceId - EQ condition on:
Amount,Currency - GTE condition on:
Quantity
The diff file will have these columns in this order:
# System fields (always first) all_rule_checks UInt8 — overall pass/fail for this record absent_in_file_a UInt8 — 1 if record missing from File A absent_in_file_b UInt8 — 1 if record missing from File B # Join key column (no prefix, always non-null) InvoiceId String — the join key value # Value fields for Amount (EQ condition) file_a_Amount Nullable(Float) — value from File A file_b_Amount Nullable(Float) — value from File B # Value fields for Currency (EQ condition) file_a_Currency Nullable(String) — value from File A file_b_Currency Nullable(String) — value from File B # Value fields for Quantity (GTE condition) file_a_Quantity Nullable(Int) — value from File A file_b_Quantity Nullable(Int) — value from File B # Check fields (condition result per column) eq_Amount UInt8 — 1=pass, 0=fail or absent eq_Currency UInt8 — 1=pass, 0=fail or absent gte_Quantity UInt8 — 1=pass, 0=fail or absent
Sample data rows:
all_rule_checks,absent_in_file_a,absent_in_file_b,InvoiceId,file_a_Amount,file_b_Amount,file_a_Currency,file_b_Currency,file_a_Quantity,file_b_Quantity,eq_Amount,eq_Currency,gte_Quantity 0,0,0,INV-003,1000.00,1001.50,USD,USD,5,5,0,1,1 ← Amount mismatch 0,0,0,INV-007,500.00,500.00,EUR,GBP,3,3,1,0,1 ← Currency mismatch 0,1,0,INV-089,NULL,750.00,NULL,USD,NULL,2,0,0,0 ← missing in File A 0,0,1,INV-210,450.00,NULL,EUR,NULL,1,NULL,0,0,0 ← missing in File B 1,0,0,INV-015,200.00,200.00,USD,USD,4,3,1,1,1 ← all pass (gte: 4≥3 ✓)
all_rule_checks=1
because it was included in the export — the diff contains all rows from the diff table. Only rows
where all checks pass and no absences exist are considered fully reconciled. You can filter out clean rows
in your analysis tool using
all_rule_checks = 1 AND absent_in_file_a = 0 AND absent_in_file_b = 0.
Reconciliation statuses
| Status | Meaning |
|---|---|
| uploaded | Files received. Analysis not started yet. |
| analyzing | Reading files, detecting column types, generating mapping suggestions. |
| awaiting_user_config | Analysis complete. Waiting for the user to review and confirm the column mapping. |
| reconciling | Reconciliation job is running — matching rows, computing stats. |
| completed | Finished successfully. Results and diff file available. |
| failed | An error occurred. The reconciliation must be restarted. |