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>
236 lines
9.1 KiB
HTML
236 lines
9.1 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<title>DataTools — Local CSV / Excel Cleaning for Bookkeepers and Accountants</title>
|
||
<meta name="description" content="One desktop tool for messy accounting exports. Reconcile bank statements, build clean 1099 vendor lists, and de-duplicate AR aging — all locally. $49 one-time." />
|
||
<link rel="canonical" href="https://datatools.app/" />
|
||
<link rel="stylesheet" href="_shared/styles.css" />
|
||
|
||
<meta property="og:title" content="DataTools — Local CSV / Excel Cleaning for Accounting" />
|
||
<meta property="og:description" content="Reconcile bank exports, prep 1099 vendor lists, clean AR aging — offline. $49 one-time." />
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:url" content="https://datatools.app/" />
|
||
|
||
<style>
|
||
/* Apex-page–only tweaks: persona cards are slightly bigger and use
|
||
per-card accent borders so the visitor visually identifies which
|
||
card matches their work in <2 seconds. */
|
||
.persona-grid {
|
||
display: grid; gap: 24px;
|
||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||
margin-top: 28px;
|
||
}
|
||
.persona-card {
|
||
background: var(--surface);
|
||
border: 1px solid var(--rule);
|
||
border-radius: var(--radius);
|
||
padding: 28px;
|
||
display: flex; flex-direction: column;
|
||
transition: transform 0.08s ease, border-color 0.15s ease, box-shadow 0.2s ease;
|
||
text-decoration: none;
|
||
color: inherit;
|
||
}
|
||
.persona-card:hover {
|
||
transform: translateY(-2px);
|
||
border-color: var(--card-accent, var(--accent));
|
||
box-shadow: var(--shadow);
|
||
text-decoration: none;
|
||
}
|
||
.persona-card.bookkeeper{ --card-accent: #7dd3fc; }
|
||
.persona-card.ap1099 { --card-accent: #fbbf24; }
|
||
.persona-card.ar { --card-accent: #6ee7b7; }
|
||
.persona-card .pill {
|
||
display: inline-block;
|
||
background: rgba(255,255,255,0.04);
|
||
color: var(--card-accent, var(--accent));
|
||
border: 1px solid var(--card-accent, var(--accent));
|
||
padding: 4px 10px; border-radius: 999px;
|
||
font-size: 12px; font-weight: 600;
|
||
letter-spacing: 0.04em;
|
||
margin-bottom: 12px;
|
||
align-self: flex-start;
|
||
}
|
||
.persona-card h3 {
|
||
color: var(--text);
|
||
font-size: 22px;
|
||
margin-bottom: 12px;
|
||
}
|
||
.persona-card p {
|
||
color: var(--text-soft);
|
||
flex: 1;
|
||
margin-bottom: 16px;
|
||
}
|
||
.persona-card .pain {
|
||
font-size: 14px; color: var(--text-mute);
|
||
margin: 8px 0 18px;
|
||
}
|
||
.persona-card .pain li { margin-bottom: 4px; }
|
||
.persona-card .open {
|
||
color: var(--card-accent, var(--accent));
|
||
font-weight: 600;
|
||
font-size: 15px;
|
||
}
|
||
.persona-card .open::after {
|
||
content: " →";
|
||
transition: margin-left 0.15s ease;
|
||
}
|
||
.persona-card:hover .open::after { margin-left: 4px; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<!-- Sticky brand bar (no buy CTA on the apex — visitor hasn't picked a niche yet) -->
|
||
<div class="buybar">
|
||
<div class="buybar-inner">
|
||
<div class="brand"><span class="brand-mark">●</span> DataTools</div>
|
||
<div>
|
||
<span class="price-tag">Pick your workflow ↓</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<section class="hero">
|
||
<div class="container">
|
||
<div class="eyebrow">For bookkeepers · accounts payable · accounts receivable</div>
|
||
<h1>Local CSV / Excel cleaning for accounting.<br /><strong>One tool. Three workflows.</strong></h1>
|
||
<p class="lead">
|
||
DataTools is a desktop app that fixes the export headaches that
|
||
throw off your books — the transaction your bank posted twice,
|
||
the vendor entered three ways at 1099 time, the invoice your aging
|
||
report counted twice. One $49 download. Mac, Windows, and Linux.
|
||
<strong>Your data never leaves your computer.</strong>
|
||
</p>
|
||
|
||
<div class="persona-grid">
|
||
<a class="persona-card bookkeeper" href="bookkeeper/">
|
||
<span class="pill">📒 Bookkeeper</span>
|
||
<h3>Bank reconciliation with an audit trail</h3>
|
||
<p>
|
||
When the Jan and Feb exports overlap, the same payment posts
|
||
twice in two formats. DataTools standardizes every date and
|
||
amount, then dedups on the real transaction so it ties out —
|
||
with a row-level audit log to hand the client.
|
||
</p>
|
||
<ul class="pain">
|
||
<li>· Catch month-overlap re-import duplicates</li>
|
||
<li>· ISO dates, numeric amounts, parens-negatives resolved</li>
|
||
<li>· Hand-off-ready audit trail</li>
|
||
<li>· Sample: 26 rows → 20, six phantom duplicates removed</li>
|
||
</ul>
|
||
<span class="open">Open the bookkeeper demo & pricing</span>
|
||
</a>
|
||
|
||
<a class="persona-card ap1099" href="ap-1099/">
|
||
<span class="pill">🧾 Accounts payable / 1099</span>
|
||
<h3>Clean 1099 vendor list — missing EINs filled in</h3>
|
||
<p>
|
||
The same vendor entered three times, each record holding only
|
||
part of the details. DataTools consolidates each vendor to one
|
||
row and backfills the gaps from the duplicates, so the EINs you
|
||
need at filing time are recovered.
|
||
</p>
|
||
<ul class="pain">
|
||
<li>· Consolidate vendor masters for 1099-NEC</li>
|
||
<li>· Recover EINs scattered across duplicate records</li>
|
||
<li>· Standardize phones, emails, and amounts</li>
|
||
<li>· Sample: 24 records → 8 vendors, 7 EINs recovered</li>
|
||
</ul>
|
||
<span class="open">Open the 1099 / AP demo & pricing</span>
|
||
</a>
|
||
|
||
<a class="persona-card ar" href="ar-aging/">
|
||
<span class="pill">💵 Accounts receivable</span>
|
||
<h3>AR aging without the double-counted invoices</h3>
|
||
<p>
|
||
Double-entered invoices inflate your aging report and your
|
||
follow-ups. DataTools standardizes invoice dates, due dates,
|
||
and amounts, lowercases client emails, then removes the
|
||
duplicate invoice numbers so the aging is accurate.
|
||
</p>
|
||
<ul class="pain">
|
||
<li>· Remove double-entered invoices from the aging</li>
|
||
<li>· ISO dates, numeric amounts, lowercased client emails</li>
|
||
<li>· Backfill a blank status from its twin row</li>
|
||
<li>· Sample: 26 rows → 21, five duplicate invoices removed</li>
|
||
</ul>
|
||
<span class="open">Open the AR demo & pricing</span>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container">
|
||
<div class="eyebrow">What's the same across all three</div>
|
||
<h2>One engine. Same six tools. Same $49.</h2>
|
||
<p>
|
||
The persona pages above are positioning, not different products.
|
||
Whichever you buy, you get the full bundle: Find Duplicates, Clean
|
||
Text, Standardize Formats, Fix Missing Values, Map Columns,
|
||
and Automated Workflows — pre-tuned with a saved pipeline
|
||
that matches your workflow.
|
||
</p>
|
||
<div class="grid">
|
||
<div class="card">
|
||
<span class="icon">🔒</span>
|
||
<h3>Local-first</h3>
|
||
<p>Desktop app. No cloud upload, no SaaS account, no subscription. Verify zero outbound calls in your browser's network tab.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">📋</span>
|
||
<h3>Auditable</h3>
|
||
<p>Every cell change is logged with the original value, the new value, and which rule fired. Hand the audit CSV to your client.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">🌍</span>
|
||
<h3>International</h3>
|
||
<p>50+ country codes, per-row country awareness, EU comma decimals, parens-negative amounts, locale-aware month names.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">⚙️</span>
|
||
<h3>Repeatable</h3>
|
||
<p>Save your cleanup as a JSON pipeline. Re-run on next week's export with one CLI command. Same cleanup, zero re-config.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">📦</span>
|
||
<h3>Cross-platform</h3>
|
||
<p>Mac · Windows · Linux installers. Code-signed for macOS Gatekeeper. Free updates for the v1.x line.</p>
|
||
</div>
|
||
<div class="card">
|
||
<span class="icon">💰</span>
|
||
<h3>$49 one-time</h3>
|
||
<p>No subscription. No per-client license. No row caps. No AI black-box.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section>
|
||
<div class="container" style="text-align: center;">
|
||
<h2>Pick your workflow above to try the live demo.</h2>
|
||
<p class="muted">Or read the docs first — every tool has a CLI, every pipeline is JSON, every change is audited.</p>
|
||
</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> ·
|
||
<a href="ar-aging/">For accounts receivable</a><br />
|
||
<a href="mailto:hello@datatools.app">Email support</a>
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
</body>
|
||
</html>
|