Reorients the whole sales surface to accounting so it matches the rebuilt demos. Replaces the Shopify and RevOps persona pages with accounts-payable (1099) and accounts-receivable pages, refreshes the bookkeeper page, and rewires the hub + deploy tooling: - landing/bookkeeper/ — refreshed to the validated bank-rec demo (26 -> 20, six phantom duplicates), iframe ?p=bookkeeper. - landing/ap-1099/ — NEW (replaces shopify-pet/): 1099 vendor prep, "24 records -> 8 vendors, 7 missing EINs recovered", iframe ?p=ap-1099, amber accent. - landing/ar-aging/ — NEW (replaces revops/): AR open invoices, "26 -> 21, five double-entered invoices removed", iframe ?p=ar-aging, green accent. - landing/index.html — hub rewritten with the three accounting cards. - deploy.py / deploy.config.example.json / README.md / _shared/styles.css — persona list, sitemap defaults, 404 links, cross-links, docs updated. All demo iframes now point at the renamed app_demo personas; deploy.py builds the dist bundle cleanly (verified) and the Gumroad ?from= tags match. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
359 lines
20 KiB
HTML
359 lines
20 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<title>DataTools for Accounts Receivable — Kill Duplicate Invoices Inflating Your AR Aging Report · $49</title>
|
||
<meta name="description" content="One tool to clean your open-invoices export: standardize invoice dates, due dates, and amounts, lowercase client emails, then remove double-entered invoice numbers so your AR aging report is accurate. 26 rows → 21, five duplicate invoices removed. Fully offline. $49 one-time." />
|
||
<meta name="keywords" content="accounts receivable aging, duplicate invoices, AR cleanup, open invoices export, invoice dedupe, aging report accuracy, receivables csv tool" />
|
||
<link rel="canonical" href="https://datatools.app/ar-aging/" />
|
||
<link rel="stylesheet" href="../_shared/styles.css" />
|
||
|
||
<!-- Persona accent: Accounts Receivable → receivables green -->
|
||
<style>
|
||
:root {
|
||
--accent: #059669;
|
||
--accent-ink: #03241a;
|
||
}
|
||
</style>
|
||
|
||
<meta property="og:title" content="DataTools for Accounts Receivable — Kill Duplicate Invoices Inflating Your AR Aging Report" />
|
||
<meta property="og:description" content="Standardize invoice dates, due dates, and amounts, lowercase client emails, then dedupe double-entered invoices — one tool, no upload. $49 one-time." />
|
||
<meta property="og:type" content="product" />
|
||
<meta property="og:url" content="https://datatools.app/ar-aging/" />
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "SoftwareApplication",
|
||
"name": "DataTools for Accounts Receivable",
|
||
"operatingSystem": "Windows, macOS, Linux",
|
||
"applicationCategory": "BusinessApplication",
|
||
"offers": {
|
||
"@type": "Offer",
|
||
"price": "49",
|
||
"priceCurrency": "USD"
|
||
},
|
||
"description": "Clean and dedupe your open-invoices export so the AR aging report is accurate. Standardize invoice dates, due dates, and amounts, lowercase client emails, then remove double-entered invoice numbers — backfilling a blank status from its twin row. Six-tool data-cleaning bundle for accounts receivable and accounting teams.",
|
||
"softwareVersion": "1.0"
|
||
}
|
||
</script>
|
||
</head>
|
||
<body>
|
||
|
||
<div class="buybar">
|
||
<div class="buybar-inner">
|
||
<div class="brand"><span class="brand-mark">●</span> DataTools <span class="muted">/ for Accounts Receivable</span></div>
|
||
<div>
|
||
<span class="price-tag">$49 — one-time, no subscription</span>
|
||
<a class="btn" href="https://gumroad.com/l/datatools?from=ar-aging" rel="noopener">Get DataTools →</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<section class="hero">
|
||
<div class="container">
|
||
<div class="eyebrow">For accounts receivable · controllers · collections · accounting teams</div>
|
||
<h1>Stop chasing the invoices<br /><strong>your aging report counted twice.</strong></h1>
|
||
<p class="lead">
|
||
The same invoice number gets posted twice — once as
|
||
<code>3/04/2026</code> for <code>$1,250.00</code>, again as
|
||
<code>2026-03-04</code> for <code>1250</code> — 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 <strong>26 rows to 21, five duplicate invoices
|
||
removed</strong> — all on your own machine, with nothing uploaded.
|
||
</p>
|
||
<div class="cta-row">
|
||
<a class="btn btn-large" href="https://gumroad.com/l/datatools?from=ar-aging" rel="noopener">Get DataTools for Accounting — $49 →</a>
|
||
<a class="btn btn-ghost btn-large" href="#demo">Try the live demo ↓</a>
|
||
<span class="price-note">One-time payment · cross-platform · runs offline</span>
|
||
</div>
|
||
<div class="stats">
|
||
<div class="stat"><div class="num">26→21</div><div class="label">rows after dedupe</div></div>
|
||
<div class="stat"><div class="num">5</div><div class="label">duplicate invoices removed</div></div>
|
||
<div class="stat"><div class="num">0</div><div class="label">cloud uploads ever</div></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- ============= Pain points ============= -->
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">If your last aging report didn't tie out to cash</div>
|
||
<h2>Five pains DataTools fixes before you run the aging report</h2>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<span class="icon">💸</span>
|
||
<h3>Double-entered invoices inflate every aging bucket</h3>
|
||
<p>The same invoice number posted twice — once in <code>MM/DD/YYYY</code>, 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.</p>
|
||
<p class="muted"><strong>What it costs:</strong> overstated AR, a balance sheet that won't reconcile, and a controller asking why.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">📞</span>
|
||
<h3>Collections chases invoices that were already paid or never real</h3>
|
||
<p>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.</p>
|
||
<p class="muted"><strong>What it costs:</strong> wasted collections hours + an awkward "please disregard" to the client.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">⚖️</span>
|
||
<h3>Uploading the AR ledger to a cloud cleaner is a compliance headache</h3>
|
||
<p>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.</p>
|
||
<p class="muted"><strong>What it costs:</strong> weeks of review per tool, or just not cleaning the data at all.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">🗓️</span>
|
||
<h3>Mixed date formats make due dates and aging unreliable</h3>
|
||
<p>Invoice dates arrive as <code>3/4/26</code>, <code>2026-03-04</code>, and <code>Mar 4 2026</code>; 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.</p>
|
||
<p class="muted"><strong>What it costs:</strong> 1–3 hours per close reconciling dates by hand, every period.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">📧</span>
|
||
<h3>Messy client contacts break your remittance reminders</h3>
|
||
<p>Client names come in mixed casing and emails arrive as <code>Billing@ClientCo.com</code> in one row and <code>billing@clientco.com</code> in another — so the same client looks like two, and reminders go out twice or not at all.</p>
|
||
<p class="muted"><strong>What it costs:</strong> duplicate dunning, missed reminders, and a client list that won't group.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">❓</span>
|
||
<h3>Blank invoice statuses hide whether a receivable is really open</h3>
|
||
<p>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.</p>
|
||
<p class="muted"><strong>What it costs:</strong> misclassified receivables and an aging report you can't trust.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="demo">
|
||
<div class="container">
|
||
<div class="eyebrow">Live demo · runs in your browser</div>
|
||
<h2>Try it on a real-looking open-invoices export</h2>
|
||
<p>
|
||
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 (<code>3/04/2026</code> vs
|
||
<code>2026-03-04</code>, <code>$1,250.00</code> vs <code>1250</code>),
|
||
client emails in mixed case, and one blank invoice status. Click
|
||
<strong>Run pipeline</strong> 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.
|
||
</p>
|
||
<div class="demo-frame">
|
||
<iframe
|
||
src="https://demo.datatools.app/?p=ar-aging"
|
||
loading="lazy"
|
||
title="DataTools live demo — Accounts Receivable"
|
||
sandbox="allow-scripts allow-same-origin allow-downloads allow-forms"></iframe>
|
||
<div class="demo-caption">
|
||
Demo runs on free hosting. Capped at 100 input rows · output
|
||
watermarked. The paid product has no caps and runs entirely offline.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">Built for the receivables close</div>
|
||
<h2>Three workflows you do every period</h2>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<span class="icon">🪢</span>
|
||
<h3>Dedupe double-entered invoices</h3>
|
||
<p>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.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">🗓️</span>
|
||
<h3>Standardize invoice and due dates</h3>
|
||
<p>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.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">📧</span>
|
||
<h3>Normalize client contacts for remittance</h3>
|
||
<p>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.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">If your export comes from QuickBooks, Xero, or a billing system</div>
|
||
<h2>Standardized dates and amounts. One row per invoice.</h2>
|
||
<p>
|
||
Your billing system exports <code>3/04/2026</code>. The re-post of
|
||
the same invoice has <code>2026-03-04</code>. The amount is
|
||
<code>$1,250.00</code> in one row and <code>1250</code> 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.
|
||
</p>
|
||
<ul class="bullets">
|
||
<li><strong>Invoice date + due date</strong> both standardized to ISO, so every aging bucket sorts and totals correctly.</li>
|
||
<li><strong>Amounts coerced to numbers</strong>: <code>$1,250.00</code> and <code>1250</code> resolve to the same value — no false mismatch between twin rows.</li>
|
||
<li><strong>Client emails lowercased</strong> so the same client groups as one for remittance reminders.</li>
|
||
<li><strong>Status backfill on dedupe</strong>: when a twin row has a blank invoice status, the survivor inherits it — so no open receivable goes missing from the report.</li>
|
||
</ul>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">For anyone who reports on receivables</div>
|
||
<h2>Every duplicate invoice you don't catch overstates your AR.</h2>
|
||
<p>
|
||
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.
|
||
</p>
|
||
<div class="callout">
|
||
<strong>Real numbers from the demo:</strong> 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.
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">The thing every cloud cleaner can't say</div>
|
||
<h2>Your clients' receivables never leave your computer.</h2>
|
||
<p>
|
||
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.
|
||
</p>
|
||
<div class="terminal"><span class="prompt">$</span> 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:
|
||
<span class="ok">✓</span> text_clean (40 ms) {cells_changed: 31}
|
||
<span class="ok">✓</span> format_standardize (120 ms) {dates_to_iso: 41, amounts_to_number: 26, emails_lowercased: 18}
|
||
<span class="ok">✓</span> missing (30 ms) {sentinels_standardized: 4, status_backfilled: 1}
|
||
<span class="ok">✓</span> column_map (20 ms) {columns_renamed: 2}
|
||
<span class="ok">✓</span> dedup (60 ms) {duplicate_invoices_removed: 5, merged: 5}
|
||
|
||
Initial rows: 26 → Final rows: 21
|
||
Unparseable dates/amounts: 0
|
||
Total elapsed: 0.3 s
|
||
<span class="prompt">$</span> # 5 double-entered invoices gone. aging report ties out. for $49.</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">In the bundle</div>
|
||
<h2>Six tools. One pipeline. One $49 download.</h2>
|
||
<div class="grid">
|
||
<div class="card"><h3>1 · Find Duplicates</h3><p>Match on invoice number; keep one canonical row per receivable and backfill blanks from the twin.</p></div>
|
||
<div class="card"><h3>2 · Clean Text</h3><p>Smart quotes from copy-paste, NBSP from spreadsheet exports, BOM from Excel.</p></div>
|
||
<div class="card"><h3>3 · Standardize Formats</h3><p>Invoice and due dates to ISO, amounts to clean numbers, client emails lowercased.</p></div>
|
||
<div class="card"><h3>4 · Fix Missing Values</h3><p>Detect <code>TBD</code>, <code>(unknown)</code>, <code>—</code> and backfill blank invoice statuses on dedupe.</p></div>
|
||
<div class="card"><h3>5 · Map Columns</h3><p>Project to your aging-report schema, coerce amount to a number, reorder fields for import.</p></div>
|
||
<div class="card"><h3>6 · Automated Workflows</h3><p>Save the cleanup as JSON. Drop next period's open-invoices export on it. Same dedupe, automated.</p></div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">Pricing — pay once, own it</div>
|
||
<h2>$49. No subscription. No per-close fee.</h2>
|
||
<div class="pricing">
|
||
<div class="card featured">
|
||
<div class="row"><div class="price">$49</div><div class="price-suffix">one-time</div></div>
|
||
<h3>DataTools for Accounts Receivable</h3>
|
||
<ul>
|
||
<li>All 6 tools, full pipeline</li>
|
||
<li>Mac · Windows · Linux installers</li>
|
||
<li>Code-signed (no Gatekeeper warnings)</li>
|
||
<li>Free updates for the v1.x line</li>
|
||
<li>Bonus: open-invoices dedupe pipeline preset</li>
|
||
<li><strong>Use on any number of clients</strong> — no seat limits</li>
|
||
</ul>
|
||
<a class="btn btn-large" href="https://gumroad.com/l/datatools?from=ar-aging" rel="noopener">Buy on Gumroad →</a>
|
||
</div>
|
||
<div class="card">
|
||
<div class="row"><div class="price">$149</div><div class="price-suffix">one-time</div></div>
|
||
<h3>Full DataTools Suite</h3>
|
||
<p class="muted">Available when 3+ bundles ship. Includes everything in the Accounts Receivable pack plus the Bookkeeper and Accounts Payable / 1099 bundles. Save $48.</p>
|
||
<a class="btn btn-ghost btn-large" href="#" aria-disabled="true">Coming when ready</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<h2>Questions</h2>
|
||
|
||
<details class="faq">
|
||
<summary>Does this replace my accounting system's deduplication?</summary>
|
||
<p>No — it cleans the export <em>before</em> 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.</p>
|
||
</details>
|
||
|
||
<details class="faq">
|
||
<summary>How does it know two rows are the same invoice?</summary>
|
||
<p>It matches on invoice number after the date and amount formats are standardized away. So a posting dated <code>3/04/2026</code> for <code>$1,250.00</code> and its twin dated <code>2026-03-04</code> for <code>1250</code> are recognized as one invoice — and only one canonical row survives.</p>
|
||
</details>
|
||
|
||
<details class="faq">
|
||
<summary>What happens to a blank invoice status when the duplicate is removed?</summary>
|
||
<p>It's backfilled. If one twin row has a blank status and the other says <code>open</code>, the surviving row inherits <code>open</code> — so no real receivable drops off the aging report just because the duplicate carried the better data.</p>
|
||
</details>
|
||
|
||
<details class="faq">
|
||
<summary>Can I use it on multiple clients without paying again?</summary>
|
||
<p>Yes. The licence is per-operator, not per-client. Run it on every client's open-invoices export for the same $49.</p>
|
||
</details>
|
||
|
||
<details class="faq">
|
||
<summary>What's the audit trail look like?</summary>
|
||
<p>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.</p>
|
||
</details>
|
||
|
||
<details class="faq">
|
||
<summary>What's your refund policy?</summary>
|
||
<p>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.</p>
|
||
</details>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container" style="text-align: center;">
|
||
<h2>Stop counting the same receivable twice.</h2>
|
||
<p class="lead" style="margin: 0 auto 28px;">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.</p>
|
||
<a class="btn btn-large" href="https://gumroad.com/l/datatools?from=ar-aging" rel="noopener">Get DataTools for Accounting — $49 →</a>
|
||
</div>
|
||
</section>
|
||
|
||
<footer>
|
||
<div class="container">
|
||
<div>
|
||
<p><strong>DataTools</strong> — local data-cleaning for bookkeepers, accounts payable, and accounts receivable teams.</p>
|
||
<p class="muted">© 2026 · Built solo · Shipped from a small office.</p>
|
||
</div>
|
||
<div>
|
||
<p>
|
||
<a href="../bookkeeper/">For bookkeepers</a> ·
|
||
<a href="../ap-1099/">For accounts payable / 1099</a><br />
|
||
<a href="https://gumroad.com/l/datatools?from=ar-aging">Buy on Gumroad</a> ·
|
||
<a href="mailto:hello@datatools.app">Email support</a>
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
</body>
|
||
</html>
|