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.

Formula
convergence = matched / (matched + mismatched + missing_in_a + missing_in_b)
0–49%
Poor
50–69%
Low
70–84%
Fair
85–94%
Good
95–100%
Excellent
ℹ️ A low convergence score on the first run is often caused by wrong join keys or join keys with duplicates. Check the Join key stats section first.

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.

ℹ️ The diff file has an expiry time shown in the results (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.
Use 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_lowercase}_{ColumnName}
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.
ℹ️ For string columns, EQ comparison is case-insensitive (both values are lowercased before comparison). So 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 ✓)
The last row (INV-015) appears in the diff with 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.