Why do I have so many unmatched rows?
Check the parser fields before touching matching rules. A wrongdate_col, amount_col, ref_col, or name_col produces rows that look present but never line up.
Run reconify config check-source --source left_source --file path/to/left-file.csv for headers and a sample, then reconify parse --source left_source --file path/to/left-file.csv --format table to see the normalized rows. See Create a config.
Why is timing_diff so high?
This is almost always date_layout, tz, or a mismatch between which date each source records: one side using a settlement date, the other a transaction date. It’s rarely a real reconciling item. Check the parser config before widening date_window. See Sources and pairs.
Why did a row become amount_diff?
The reference matched and the date was within date_window, but the amount difference exceeded amount_tolerance_minor. Check gross versus net first: a source that includes fees, refunds, or reserves in one amount column and not the other produces a wall of amount_diff rows that have nothing to do with tolerance. See Read the results.
Why is my duplicate_count non-zero?
Reconify groups rows in the same source that share a group_col (or ref_col, when group_col isn’t set) and reports the group for visibility. This runs after matching and never excludes a row: every transaction in a duplicate group still participates in matching independently.
Common causes are repeated export rows, reused references, partial settlements, and refunds sharing an original transaction ID. If the rows are legitimate, such as an invoice paid in three installments, set group_col to a per-row-unique column like payment_id so the shared invoice reference in ref_col doesn’t get flagged. See Matching algorithm.
Every amount is off by 100x.
Checkmultiplier. A source with decimal amounts like 1,234.56 needs multiplier: 100 to land on 123456 minor units. A source that already emits minor units, like Stripe’s amount field, needs multiplier: 1. Setting 100 on an already-minor-units source puts every amount off by a factor of 100 and turns every row into an amount_diff. See Transactions.
My dates are off by a day.
Checktz and date_layout. Go’s reference layout is 2006-01-02, not YYYY-MM-DD: a literal YYYY-MM-DD layout string fails to parse any real date. If the source records local dates with no offset, set tz to the source’s IANA timezone so Reconify doesn’t parse it as UTC. See Create a config.
Which file formats are supported?
CSV, JSON, NDJSON, XLSX, and XLSM. Legacy.xls is not supported: save the workbook as .xlsx or export it as .csv first. For XLSX/XLSM, the first row of the sheet must be headers, not a title or subtitle row, and column lookup is case-insensitive. Set sheet if the data isn’t on the first sheet. See Create a config.
Which side should be left and which right?
The right source is indexed first, so peak memory is set by the right-side index, not the combined file sizes: prefer the smaller file on the right for large runs. Left and right also determine which unmatched bucket a row lands in (unmatched_left versus unmatched_right), so pick the side that matches how you want to read the results. See Sources and pairs.
How do I set a tolerance without hiding real problems?
Start withamount_tolerance_minor: 0 and date_window set to the smallest gap your source systems actually produce. Widen either only once you’ve confirmed a specific, known rounding or settlement delay, never as a way to make a bad column mapping look clean. See Config reference.
Does Reconify do fuzzy matching?
No. The closest thing is token-based name matching (name_mode: tokens), which compares word-token similarity on the name field, and it only runs on rows that reference matching already failed to resolve. It never searches combinations of rows that happen to sum to the same amount. See Matching algorithm.
Can I run very large files?
Yes. Use a streaming output format (ndjson, csv, or json-stream instead of buffered json or table), pick an index backend (auto, disk, or partitioned) sized to the right file, and add --progress for visibility while it runs. See Handle large files.
Can I get audit metadata?
Yes. Add--audit with json, json-stream, or ndjson output, and Reconify attaches run_info: a run ID, timestamp, tool version, SHA-256 and size of each input file, and a snapshot of the applied pair config. Not supported with csv or table. See Read the results.
Can an agent drive this end to end?
Yes.reconify capabilities discovers what a build supports, reconify inspect profiles a file, reconify config infer proposes a mapping, and --agent switches defaults to machine-readable diagnostics and NDJSON output. reconcile --auto goes from two raw files to a result in one command when the inference gates pass. See Run it with an agent.