Files
datatools-dev/landing/ar-aging/index.html
Michael e7ec79b9b5 demo: retarget landing pages to the accounting audience
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>
2026-06-22 18:59:50 +00:00

359 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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> 13 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>