DataTools / for Accounts Receivable
$49 — one-time, no subscription Get DataTools →
For accounts receivable · controllers · collections · accounting teams

Stop chasing the invoices
your aging report counted twice.

The same invoice number gets posted twice — once as 3/04/2026 for $1,250.00, again as 2026-03-04 for 1250 — so your AR aging report double-counts the receivable and your team chases a balance that was never really open. DataTools standardizes every invoice date, due date, and amount, lowercases client emails, then removes the double-entered invoice numbers — taking a real open-invoices export from 26 rows to 21, five duplicate invoices removed — all on your own machine, with nothing uploaded.

Get DataTools for Accounting — $49 → Try the live demo ↓ One-time payment · cross-platform · runs offline
26→21
rows after dedupe
5
duplicate invoices removed
0
cloud uploads ever
If your last aging report didn't tie out to cash

Five pains DataTools fixes before you run the aging report

💸

Double-entered invoices inflate every aging bucket

The same invoice number posted twice — once in MM/DD/YYYY, once in ISO — lands in two rows and gets counted twice. Your 60-day bucket looks worse than it is, and the receivables total overstates what's actually owed.

What it costs: overstated AR, a balance sheet that won't reconcile, and a controller asking why.

📞

Collections chases invoices that were already paid or never real

When a duplicate invoice number shows as still-open, a collector emails the client about a balance that doesn't exist. The client pushes back, trust erodes, and your team burns a morning untangling it.

What it costs: wasted collections hours + an awkward "please disregard" to the client.

⚖️

Uploading the AR ledger to a cloud cleaner is a compliance headache

Every cloud-based cleaner wants you to upload your full receivables ledger — client names, amounts, contact emails. That's a data-handling review your firm doesn't want to run. DataTools is desktop-only — no upload, no DPA, no review.

What it costs: weeks of review per tool, or just not cleaning the data at all.

🗓️

Mixed date formats make due dates and aging unreliable

Invoice dates arrive as 3/4/26, 2026-03-04, and Mar 4 2026; due dates are just as mixed. Sort by date and the buckets are wrong, so the wrong invoices show up in the wrong aging column.

What it costs: 1–3 hours per close reconciling dates by hand, every period.

📧

Messy client contacts break your remittance reminders

Client names come in mixed casing and emails arrive as Billing@ClientCo.com in one row and billing@clientco.com in another — so the same client looks like two, and reminders go out twice or not at all.

What it costs: duplicate dunning, missed reminders, and a client list that won't group.

Blank invoice statuses hide whether a receivable is really open

When one of the two twin rows has a blank status, you can't tell if the invoice is open, partial, or paid — so it either gets dropped from the aging report or counted at the wrong stage.

What it costs: misclassified receivables and an aging report you can't trust.

Live demo · runs in your browser

Try it on a real-looking open-invoices export

The demo below loads a 26-row open-invoices export with five double-entered invoice numbers — the same invoice posted twice in different date and amount formats (3/04/2026 vs 2026-03-04, $1,250.00 vs 1250), client emails in mixed case, and one blank invoice status. Click Run pipeline and watch the 5-step pipeline (text clean → format → missing → column map → dedup) standardize both date columns to ISO, coerce amounts to numbers, lowercase the emails, and collapse 26 rows to 21 — backfilling the blank status from its twin row so the aging report is accurate.

Demo runs on free hosting. Capped at 100 input rows · output watermarked. The paid product has no caps and runs entirely offline.
Built for the receivables close

Three workflows you do every period

🪢

Dedupe double-entered invoices

Match on invoice number, drop the second posting, and keep one canonical row per invoice — backfilling a blank status, due date, or amount from its twin so nothing accurate is lost when the duplicate goes.

🗓️

Standardize invoice and due dates

Coerce every invoice date and due date to ISO and every amount to a clean number, so the aging buckets sort correctly and the receivables total ties out to the ledger.

📧

Normalize client contacts for remittance

Lowercase client emails and fix name casing so each client groups as one. Send remit-to reminders once, to a clean contact list — not twice because two rows looked like two clients.

If your export comes from QuickBooks, Xero, or a billing system

Standardized dates and amounts. One row per invoice.

Your billing system exports 3/04/2026. The re-post of the same invoice has 2026-03-04. The amount is $1,250.00 in one row and 1250 in the other. DataTools reads each row, normalizes both date columns to ISO, coerces the amount to a number, and then matches on invoice number to keep exactly one canonical row per receivable.

For anyone who reports on receivables

Every duplicate invoice you don't catch overstates your AR.

Your aging report is only as good as the export under it. Every double-entered invoice number is a receivable counted twice — it inflates the aging buckets, overstates the total owed, and sends collections after balances that aren't really open. DataTools catches them once, before the report runs, by matching on invoice number with the date and amount noise already standardized away.

Real numbers from the demo: a 26-row open-invoices export collapses to 21 — that's five double-entered invoices the mixed date and amount formats were hiding, both date columns now ISO, amounts numeric, emails lowercased, 0 unparseable, and a blank status backfilled from its twin row. The aging report finally ties out.
The thing every cloud cleaner can't say

Your clients' receivables never leave your computer.

Cloud cleaning tools require you to upload your AR ledger — client names, invoice amounts, remit-to contacts. That ledger is sensitive client financial data, and once it's on someone else's server, your firm owns a data-handling problem you didn't need. DataTools is a desktop app. There is no upload step.

$ python -m src.cli_pipeline ar_open_invoices.csv --pipeline ar_open_invoices_pipeline.json --apply Reading ar_open_invoices.csv... 26 rows, 9 columns Executing pipeline: text_clean (40 ms) {cells_changed: 31} format_standardize (120 ms) {dates_to_iso: 41, amounts_to_number: 26, emails_lowercased: 18} missing (30 ms) {sentinels_standardized: 4, status_backfilled: 1} column_map (20 ms) {columns_renamed: 2} dedup (60 ms) {duplicate_invoices_removed: 5, merged: 5} Initial rows: 26 → Final rows: 21 Unparseable dates/amounts: 0 Total elapsed: 0.3 s $ # 5 double-entered invoices gone. aging report ties out. for $49.
In the bundle

Six tools. One pipeline. One $49 download.

1 · Find Duplicates

Match on invoice number; keep one canonical row per receivable and backfill blanks from the twin.

2 · Clean Text

Smart quotes from copy-paste, NBSP from spreadsheet exports, BOM from Excel.

3 · Standardize Formats

Invoice and due dates to ISO, amounts to clean numbers, client emails lowercased.

4 · Fix Missing Values

Detect TBD, (unknown), and backfill blank invoice statuses on dedupe.

5 · Map Columns

Project to your aging-report schema, coerce amount to a number, reorder fields for import.

6 · Automated Workflows

Save the cleanup as JSON. Drop next period's open-invoices export on it. Same dedupe, automated.

Pricing — pay once, own it

$49. No subscription. No per-close fee.

$149
one-time

Full DataTools Suite

Available when 3+ bundles ship. Includes everything in the Accounts Receivable pack plus the Bookkeeper and Accounts Payable / 1099 bundles. Save $48.

Coming when ready

Questions

Does this replace my accounting system's deduplication?

No — it cleans the export before you run the aging report or import it back. Most billing systems will happily hold two postings of the same invoice number; DataTools catches the double-entered invoice so it never inflates a single aging bucket.

How does it know two rows are the same invoice?

It matches on invoice number after the date and amount formats are standardized away. So a posting dated 3/04/2026 for $1,250.00 and its twin dated 2026-03-04 for 1250 are recognized as one invoice — and only one canonical row survives.

What happens to a blank invoice status when the duplicate is removed?

It's backfilled. If one twin row has a blank status and the other says open, the surviving row inherits open — so no real receivable drops off the aging report just because the duplicate carried the better data.

Can I use it on multiple clients without paying again?

Yes. The licence is per-operator, not per-client. Run it on every client's open-invoices export for the same $49.

What's the audit trail look like?

A row-by-row CSV: every modified cell with its original value, new value, and which rule fired — every date coerced to ISO, every amount normalized, every duplicate invoice removed. A separate JSON file describes the pipeline that produced it, so the cleanup reproduces deterministically and your client can verify it on their machine.

What's your refund policy?

Try the live demo above on the sample open-invoices export before you buy. If DataTools doesn't fit your workflow within 14 days, email for a refund — no questions asked.

Stop counting the same receivable twice.

One $49 download. Standardizes invoice dates, due dates, and amounts, lowercases client emails, removes the double-entered invoices your aging report was counting twice, and saves a pipeline you can re-run on next period's open-invoices export.

Get DataTools for Accounting — $49 →