# Next Steps β€” from "code complete" to first paying customer > Creator-only. The runnable checklist that takes the operator from > the current state (1,729 tests passing, 6 tools shipped, 0 paying > customers) through launch and into the first 90 days. > **Version**: 1.0 Β· **Adopted**: 2026-05-01 This document is the **single answer** to "what now?". Every line item has an owner, a time estimate, a blocker, a cost, and the external dependency that makes it un-shippable today. Items are ordered by **must-finish-before-the-next-item** β€” work top-down. Cross-references: - Strategy: `PLAN.md` (the 8 strategic moves + the 90-day sequence) - Demo specs: `DEMO-PLAN.md` - Deployment mechanics: `DEPLOYMENT.md` - Post-launch measurement: `POST-LAUNCH.md` - Locked criteria: `DECISIONS.md` Β§1 Status legend: - **🟒** Done β€” the asset exists in this repo - **🟑** Buildable now β€” no external dependency needed - **🟠** External dependency β€” needs an account / signup / payment - **πŸ”΄** Manual / requires user input that can't be automated --- ## Phase 0 Β· What's already done (skip ahead) | βœ“ | Item | Where it lives | |---|------|----------------| | 🟒 | 6 of 9 tools shipped (Dedup, Text, Format, Missing, Column-Map, Pipeline) | `src/core/`, `src/cli_*.py`, `src/gui/pages/` | | 🟒 | Pipeline Runner (the retention multiplier per `PLAN.md` Β§2.6) | `src/core/pipeline.py`, `src/cli_pipeline.py`, `src/gui/pages/9_Pipeline_Runner.py` | | 🟒 | 1,729 passing tests Β· 0 skipped Β· 0 xfailed | `tests/` | | 🟒 | 3 niche demo datasets + pre-tuned pipeline JSONs | `samples/demo/` | | 🟒 | Streamlit demo app + Cloud entry shim | `streamlit_app.py`, `src/gui/app_demo.py` | | 🟒 | 3 niche landing pages + apex chooser + shared CSS | `landing/` | | 🟒 | Landing-page deploy script (URL-substitution + sitemap + 404 + favicon) | `landing/deploy.py` | | 🟒 | Strategic plan + demo plan + post-launch measurement plan + deployment doc | `docs/PLAN.md`, `DEMO-PLAN.md`, `POST-LAUNCH.md`, `DEPLOYMENT.md` | | 🟒 | PyInstaller bundle scaffold (spec + launcher + Streamlit hook + README) | `build/` | | 🟒 | Customer-facing copy single-source-of-truth (landing + demo + email subjects + Gumroad listing) | `marketing/COPY.md` | | 🟒 | 9 niche-community post drafts (3 posts Γ— 3 niches: bookkeeper, revops, shopify-pet) | `marketing/community-posts/` | | 🟒 | 18 email drafts (Gumroad delivery + 5-touch onboarding Γ— 3 niches) | `marketing/emails/` | --- ## Phase 1 Β· Stand the funnel up (target: end of week 1, ~6 hours total work) The bottleneck right now is **distribution, not feature count**. Everything in this phase is about turning code into a URL the user can hit. ### 1.1 β€” 🟠 Push to GitHub (5 min) | | | |---|---| | **What** | `git init` (if not already), commit, push to a private or public GitHub repo. | | **Why** | Cloud deploy services need a Git source. Streamlit Community Cloud auto-deploys on push to `main`. | | **External dependency** | A GitHub account (free). | | **Cost** | $0. | | **Blocked by** | Nothing. | ### 1.2 β€” 🟠 Deploy the demo to Streamlit Community Cloud (15 min) | | | |---|---| | **What** | Follow `DEPLOYMENT.md` Part 1. Result: a public URL like `https://datatools-demo.streamlit.app`. | | **Why** | The landing pages embed this in their iframe. Without it, every "Run pipeline" button on the landing pages 404s. | | **External dependency** | Free Streamlit Community Cloud account, signed in via GitHub. | | **Cost** | $0. | | **Blocked by** | 1.1 (the repo must be on GitHub). | | **Watch out for** | First build takes 2–3 min while Cloud installs deps. Subsequent deploys < 30 s. | ### 1.3 β€” 🟠 Buy the apex domain (5 min, ~$15/year) | | | |---|---| | **What** | Register `datatools.app` (or whichever) at any registrar. Point the nameservers at Cloudflare. | | **Why** | The landing-page canonical URLs and CTA buttons refer to this domain. Pages can deploy to a free `*.pages.dev` URL first if you want to defer this. | | **External dependency** | A registrar account; payment method. | | **Cost** | ~$15/year. Within `BUSINESS.md` Β§9 cost cap. | | **Blocked by** | Nothing β€” can run in parallel with 1.1 / 1.2. | ### 1.4 β€” 🟠 Deploy the landing pages to Cloudflare Pages (15 min) | | | |---|---| | **What** | Follow `DEPLOYMENT.md` Part 2. Run `python3 landing/deploy.py` with the operator's URLs in `deploy.config.json`, then `wrangler pages deploy landing/dist` (or drag-drop). | | **Why** | This is the marketing surface. Three persona URLs go live as soon as it deploys. | | **External dependency** | Free Cloudflare account; Wrangler CLI (optional β€” drag-drop works too). | | **Cost** | $0. | | **Blocked by** | 1.2 (the demo URL goes into `deploy.config.json`); ideally 1.3 for the custom domain. | | **Watch out for** | The `deploy.config.json` file is gitignored β€” your real URLs never get committed. | ### 1.5 β€” 🟠 Open a Gumroad listing (15 min) **β€” stub for now** | | | |---|---| | **What** | Create a Gumroad account, draft a listing with a single screenshot + the landing-page copy, set price to $49. Don't enable purchases yet β€” leave it as a draft. | | **Why** | The CTA buttons on the landing pages link to `gumroad.com/l/datatools?from=`. Until the listing exists, those buttons 404. | | **External dependency** | Free Gumroad account; Stripe-connected payout method (defer to Phase 2). | | **Cost** | $0 to draft, ~10% per sale once live. | | **Blocked by** | Nothing β€” can run in parallel with 1.1–1.4. | | **Watch out for** | The listing URL must be `gumroad.com/l/datatools` to match the landing-page hard-coded CTAs. If you pick a different slug, update `landing/deploy.config.json` β†’ `gumroad_listing` and re-run `deploy.py`. | ### 1.6 β€” 🟑 End-to-end smoke verification (10 min) | | | |---|---| | **What** | Run the four `curl` commands from `DEPLOYMENT.md` Part 4. All four landing pages, all three demo personas, sitemap.xml. | | **Why** | First time something can break is the moment a real user hits it. Ten minutes of `curl` saves a week of "why is conversion zero." | | **External dependency** | None. | | **Cost** | $0. | | **Blocked by** | 1.4 + 1.2. | --- ## Phase 2 Β· Make it sellable (target: end of week 2) ### 2.1 β€” 🟠 Apple Developer Program enrollment (5 min to start, 1–2 weeks lead) | | | |---|---| | **What** | Per `BUSINESS.md` Β§10. Required for code-signing the macOS installer. | | **External dependency** | Apple ID + government-issued ID (individual) or D-U-N-S number (org). | | **Cost** | $99/year. | | **Blocked by** | Nothing β€” start ASAP because of the 1–2 week approval window. The pipeline waits on this; nothing else does. | ### 2.2 β€” 🟒 PyInstaller spec + cross-platform build *(scaffold shipped β€” runs need per-OS hosts)* | | | |---|---| | **What** | `build/datatools.spec` + `build/launcher.py` + `build/hooks/hook-streamlit.py` bundle the Streamlit GUI + all 6 tools + samples into one app. Folder-mode (one-dir) by default; Mac `.dmg`, Windows `.exe`, Linux `.tar.gz`. Per-platform recipe in `build/README.md`. | | **Why** | The buyer's deliverable. Without this, there is nothing to attach to the Gumroad listing. | | **External dependency** | `pip install pyinstaller`. None for Linux/Mac builds. Windows builds need a Windows machine or a CI matrix runner. | | **Cost** | $0 (GitHub Actions matrix runners are free for public repos). | | **Blocked by** | Nothing for the spec; 2.1 for the signed Mac build. | | **Watch out for** | Streamlit's bundle size lands around 300–500 MB per `DECISIONS.md` Β§4c β€” accepted tradeoff. PyInstaller cross-compilation isn't supported β€” Mac builds need a Mac, Windows builds need a Windows host. | | **Where it lives** | `build/datatools.spec`, `build/launcher.py`, `build/hooks/hook-streamlit.py`, `build/README.md` | ### 2.3 β€” 🟑 macOS sign + notarize (30 min once Apple Dev is approved) | | | |---|---| | **What** | Sign the `.dmg`, submit to Apple's notarization service, staple the ticket. | | **Why** | Without it, Gatekeeper hard-blocks the install with no obvious way out (per `BUSINESS.md` Β§10). The buyer gives up. | | **External dependency** | Apple Developer Program (2.1). | | **Cost** | $0 incremental over 2.1. | | **Blocked by** | 2.1 + 2.2. | ### 2.4 β€” 🟒 Refund policy + license + Gumroad listing copy *(drafted in COPY.md)* | | | |---|---| | **What** | A clear refund policy (30-day no-questions) + a software licence text + the Gumroad listing description. | | **Why** | Required by Gumroad's terms; surfaces on the listing page; protects against buyer disputes. | | **External dependency** | None β€” operator authoring. | | **Cost** | $0. | | **Blocked by** | Nothing. | | **Where it lives** | `marketing/COPY.md` Β§ 5 (Gumroad listing β€” full title / tagline / description / bullets / refund text / tags). Refund window is also referenced in COPY.md Β§ 0 so it stays consistent across surfaces. | | **Still to author** | A short licence text (one-time perpetual use, no redistribution) β€” not in COPY.md yet. Recommend Polyform Strict 1.0.0 or a 10-line bespoke text. | ### 2.5 β€” 🟠 Activate the Gumroad listing (15 min) | | | |---|---| | **What** | Upload the cross-platform installers from 2.2/2.3, paste the copy from 2.4, set $49 price, enable purchases, configure Stripe payout. | | **Why** | This is the "buy" button finally working. | | **External dependency** | Gumroad + Stripe account; the installers from 2.2/2.3. | | **Cost** | ~10 % per sale. | | **Blocked by** | 2.2, 2.3, 2.4. | --- ## Phase 3 Β· First-traffic ignition (target: end of week 4) Per `PLAN.md` Β§3 and `BUSINESS.md` Β§7 channel priorities. The strict no-touch constraint of `DECISIONS.md` Β§1 #8 makes channel choice matter β€” these are the only ones that fit. ### 3.1 β€” 🟒 First niche-community post *(9 drafts ready β€” pick one and personalize)* | | | |---|---| | **What** | One value-first post in one niche-relevant community (e.g. r/Bookkeeping, r/revops, r/shopify; IndieHackers; niche Slacks/Discords). Lead with the demo URL, not the buy URL. | | **Why** | Marketplaces alone don't drive discovery. Communities are the only first-touch channel that works under no-touch. | | **External dependency** | Account in the chosen community; understand its self-promotion rules. | | **Cost** | $0. | | **Blocked by** | 1.4 (demo URL must work). | | **Hint** | Pick the niche the operator knows best. Don't post all three drafts in the same community in the same week β€” see `marketing/community-posts/README.md` for cadence guidance. | | **Where it lives** | `marketing/community-posts/{bookkeeper,revops,shopify-pet}/0{1-story,2-tip,3-soft-offer}.md` β€” 3 posts Γ— 3 niches = 9 drafts. | ### 3.2 β€” 🟑 First long-tail SEO blog post (4–6 hours) | | | |---|---| | **What** | One 800–1,500-word post on `datatools.app/blog/` (sub-route of Cloudflare Pages or Substack) targeting one niche keyword from `BUSINESS.md` Β§7. Topic: a real problem you've encountered, the cleanup steps, the demo URL at the end. | | **Why** | Compounding asset β€” `BUSINESS.md` Β§2 says SEO pays in 6–18 months, not week 1. Don't mistake it for an early-stage channel. | | **External dependency** | None. | | **Cost** | $0. | | **Blocked by** | Nothing. | ### 3.3 β€” 🟑 Cloudflare Web Analytics + event counters (45 min) | | | |---|---| | **What** | Enable Cloudflare Web Analytics on the Pages project (one click). Add a tiny inline `