The month-end reconciliation nightmare
Every finance team knows the drill. Month-end arrives and you're staring at two datasets: the general ledger and bank statements. You need to match thousands of transactions, find discrepancies, and produce a clean reconciliation report.
In spreadsheets, this means lookup chains, manual sorting, colour-coding mismatches, and hoping nobody accidentally breaks a formula. It takes hours. Sometimes days.
In real life, this is often the controller, finance manager, or audit senior trying to explain why two populations do not line up while the close clock is already running.
In DataLAB, it takes a small SnapQL statement:
RECONCILE gl_balances TO bank_statements
ON account_id = account_id
COMPARE amount
TOLERANCE 0.01;That tells DataLAB to match records on the specified key, compare the amount columns, and classify the output into reconciled, matched, discrepancies, and unmatched records.
How it works
The RECONCILE command performs the comparison and produces output datasets you can query further:
- Matched - amounts are within tolerance
- Discrepancies - records exist on both sides but differ beyond tolerance
- Unmatched source rows - records exist in the GL but not in the bank data
- Unmatched target rows - records exist in the bank data but not in the GL
You can immediately query the result set:
That matters when a reviewer wants to move straight from the reconciliation result into investigation rather than handing the output back to another person for manual slicing.
SELECT *
FROM discrepancies;
SELECT SUM(ABS(amount)) AS total_discrepancy
FROM discrepancies;Extending the workflow
Because reconciliation stays inside the same query surface, you can combine it with standard SQL analysis before or after the comparison:
SELECT account_id, COUNT(*) AS unmatched_rows
FROM unmatched_gl_balances
GROUP BY account_id
ORDER BY unmatched_rows DESC;That means finance teams can move from matching to investigation without exporting data into another tool.
Automating the process with pipelines
The real power comes from turning the monthly close into a repeatable pipeline:
PIPELINE monthly_close(@period DEFAULT '2026-03'):
LOAD "general_ledger.csv" AS gl WITH detect_types=true
LOAD "bank_statements.csv" AS bank WITH detect_types=true
WITH gl_period AS
SELECT *
FROM gl
WHERE period = @period
WITH bank_period AS
SELECT *
FROM bank
WHERE period = @period
VALIDATE gl_period WHERE amount IS NOT NULL
VALIDATE bank_period WHERE amount IS NOT NULL
RECONCILE gl_period TO bank_period
ON account_id = account_id
COMPARE amount
TOLERANCE 0.01
EXPORT discrepancies TO BROWSER AS recon_discrepancies
END PIPELINEThis is the kind of flow a finance team can rerun every month, or an audit team can apply engagement by engagement, without rewriting the logic from scratch every time.
When you want to run it, call the saved pipeline:
CALL monthly_close('2026-03');Same process, same logic, same output structure every time.
The audit trail advantage
Because the workflow lives inside DataLAB, the team can retain the reconciliation logic as a durable, reviewable asset instead of a chain of spreadsheet steps. Auditors and reviewers can inspect the command sequence, the source datasets, and the output datasets without reverse-engineering a workbook.
Why this matters
Teams using DataLAB for reconciliation are not just moving faster. They are replacing fragile spreadsheet logic with a repeatable workflow that can be reviewed, rerun, and improved over time.
Get started
If your team is still reconciling in spreadsheets, you're spending time on work that should be measured in minutes, not days. Request a demo and we'll show you how DataLAB can support your specific reconciliation workflow.