demo: reconstruct sales demos for an accounting audience

Replaces the Shopify / RevOps / Bookkeeper demo trio with three accounting
personas that share one buyer, each entering through a workflow where a
messy export costs money — all running the same saved 4-step pipeline:

- bank_reconciliation.csv (Bookkeeper): 26 -> 20 rows, 6 double-posted
  transactions caught after date+amount standardization.
- vendor_1099.csv (AP / 1099): 24 records -> 8 vendors, 7 missing EINs
  recovered via dedup merge — the 1099-complete story.
- ar_open_invoices.csv (AR): 26 -> 21 rows, 5 double-entered invoices
  removed, blank status backfilled from the twin row.

Every number is validated against the live engine and pinned by
tests/test_demo_pipelines.py (read path mirrors app_demo._load_demo:
dtype=str, keep_default_na=False). Rewires src/gui/app_demo.py PERSONAS
(keys bookkeeper / ap-1099 / ar-aging, accounting H1/sub/CTA) and rewrites
docs/DEMO-PLAN.md sections 3/4/7 with the validated outcomes.

(Repo hygiene forced by a partial-clone gap: finalizes the already-deleted,
unreferenced samples/messy_text.csv whose blob was unrecoverable.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-22 18:52:39 +00:00
parent 38616d69e2
commit 6df726e69e
16 changed files with 404 additions and 441 deletions

View File

@@ -9,10 +9,10 @@ side-by-side, and converts the visitor to a Gumroad purchase.
Launch:
streamlit run src/gui/app_demo.py
URL routing:
https://demo.datatools.app/?p=shopify-pet (Shopify operator)
https://demo.datatools.app/?p=bookkeeper (Bookkeeper)
https://demo.datatools.app/?p=revops (RevOps agency)
URL routing (all three personas serve one audience: accounting):
https://demo.datatools.app/?p=bookkeeper (Bookkeeper — bank reconciliation)
https://demo.datatools.app/?p=ap-1099 (Accounts payable — 1099 vendor prep)
https://demo.datatools.app/?p=ar-aging (Accounts receivable — open invoices)
Free / paid boundary (per docs/DEMO-PLAN.md §6):
- input rows capped at ``DEMO_ROW_CAP``
@@ -64,59 +64,66 @@ GUMROAD_BASE: str = "https://gumroad.com/l/datatools"
DEMO_DIR = _project_root / "samples" / "demo"
# All three personas serve one audience — accounting — entering through the
# three workflows where messy exports cost real money: bank reconciliation,
# 1099 / AP vendor prep, and AR aging. Each H1/sub names the exact pain and
# the validated demo outcome (see docs/DEMO-PLAN.md §4 for the numbers).
PERSONAS: dict[str, dict[str, Any]] = {
"shopify-pet": {
"label": "Shopify pet operator",
"icon": "🛍️",
"h1": "Klaviyo-import-ready customer lists. **In 30 seconds. Locally.**",
"sub": (
"Your Shopify customer export has duplicates Excel can't catch, "
"international phones Excel can't parse, and disguised nulls "
"(`N/A`, `(blank)`, `?`) that break Klaviyo's import. "
"DataTools fixes all of it in one pass — and your data never "
"leaves your computer."
),
"data_file": "shopify_pet_customers.csv",
"pipeline_file": "shopify_pet_pipeline.json",
"cta": "Get DataTools for Shopify — $49 →",
"landing": "https://datatools.app/shopify/",
},
"bookkeeper": {
"label": "Bookkeeper / freelance accountant",
"label": "Bookkeeper — bank reconciliation",
"icon": "📒",
"h1": "Reconcile messy bank exports. **Hand your client an audit trail.**",
"h1": "Catch the transactions your bank export posted twice. **Locally.**",
"sub": (
"The Jan and Feb exports overlap; the same transaction posts twice. "
"Vendor names are *Amazon* / *amazon.com* / *AMAZON.COM*4F2X9* in "
"three rows. DataTools dedups on Date + Amount + fuzzy Vendor, "
"produces ISO dates and numeric amounts, and gives you a row-level "
"audit log to hand the client."
"When the Jan and Feb exports overlap, the same payment lands "
"twice — once as `01/15/2025 +$3,450.00`, once as "
"`2025-01-15 3450.00`. DataTools standardizes every date and "
"amount, then dedups on the *real* transaction so your "
"reconciliation ties out. In this sample: **26 rows → 20, six "
"phantom duplicates removed** — and your data never leaves your "
"computer."
),
"data_file": "bookkeeper_bank_reconcile.csv",
"pipeline_file": "bookkeeper_bank_pipeline.json",
"data_file": "bank_reconciliation.csv",
"pipeline_file": "bank_reconciliation_pipeline.json",
"cta": "Get DataTools for Bookkeepers — $49 →",
"landing": "https://datatools.app/bookkeeper/",
},
"revops": {
"label": "Marketing / RevOps agency",
"icon": "🪢",
"h1": "Dedupe lead lists across HubSpot, LinkedIn, and manual scrapes — **locally.**",
"ap-1099": {
"label": "Accounts payable — 1099 prep",
"icon": "🧾",
"h1": "Build a clean 1099 vendor list — **with the missing EINs filled in.**",
"sub": (
"The same prospect shows up in HubSpot as `alice@acme.com`, in "
"LinkedIn as `Alice.Johnson@acme.com`, and in your VA's manual "
"scrape as `alice@acme.com` again. Country is `USA` / `US` / "
"`United States`. DataTools fuzzy-matches across sources, "
"normalizes phones for 50+ countries, and merges survivors "
"with their most-complete fields — without uploading anything."
"The same vendor was entered three times across the year — one "
"record has the EIN, another the address, a third the phone. "
"DataTools consolidates each vendor to one row and *backfills the "
"gaps from the duplicates*. In this sample: **24 messy records → "
"8 complete vendors, with 7 missing EINs recovered** from the "
"duplicate rows. No upload, no VLOOKUP gymnastics."
),
"data_file": "agency_combined_leads.csv",
"pipeline_file": "agency_leads_pipeline.json",
"cta": "Get DataTools for RevOps — $49 →",
"landing": "https://datatools.app/revops/",
"data_file": "vendor_1099.csv",
"pipeline_file": "vendor_1099_pipeline.json",
"cta": "Get DataTools for Accounting — $49 →",
"landing": "https://datatools.app/accounting/",
},
"ar-aging": {
"label": "Accounts receivable — open invoices",
"icon": "💵",
"h1": "Stop chasing the invoices your aging report counted twice. **Locally.**",
"sub": (
"Double-entered invoices inflate your AR aging and your "
"follow-ups. DataTools standardizes invoice dates, due dates, and "
"amounts, lowercases client emails, then removes the duplicate "
"invoice numbers — backfilling any blank status from the twin row. "
"In this sample: **26 rows → 21, five phantom invoices off the "
"books** in one pass."
),
"data_file": "ar_open_invoices.csv",
"pipeline_file": "ar_open_invoices_pipeline.json",
"cta": "Get DataTools for Accounting — $49 →",
"landing": "https://datatools.app/accounting/",
},
}
DEFAULT_PERSONA = "shopify-pet"
DEFAULT_PERSONA = "bookkeeper"
# ---------------------------------------------------------------------------