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:
@@ -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"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user