feat: Tier B operator scaffolding — bundle, copy SoT, posts, emails

Pick up and finish yesterday's cut-off Tier B pass.

- build/: PyInstaller scaffold (datatools.spec + launcher.py +
  hook-streamlit.py + README) — folder-mode bundle, locked
  127.0.0.1, per-OS recipe
- marketing/COPY.md: single source of truth for every customer-facing
  string — landing H1/sub/CTAs, demo CTAs, email subjects, Gumroad
  listing, banned phrases
- marketing/community-posts/: 9 drafts (3 posts × 3 niches:
  bookkeeper, revops, shopify-pet) — story / tip / soft-offer
- marketing/emails/: 18 drafts (Gumroad delivery + 5-touch
  onboarding × 3 niches), per-niche segmentation guidance
- docs/NEXT-STEPS.md: flip 2.2 / 2.4 / 3.1 / 3.4 to done with
  pointers to the new assets; add Phase 0 inventory rows
- .gitignore: narrow `build/` ignore so PyInstaller spec + launcher
  + hooks get tracked, only generated artifacts (build/build/,
  build/__pycache__/, build/dist/) stay ignored

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-02 14:04:37 +00:00
parent 966af8ef94
commit e1f364f010
36 changed files with 1741 additions and 15 deletions

View File

@@ -0,0 +1,49 @@
# Shopify-pet · Post 1 — Story
**Where to post:** r/shopify, r/ecommerce, Shopify community forums,
pet-business Facebook groups (Pet Industry Distributors Association,
Pet Boss Nation), Klaviyo community Slack.
**Format:** ~400 words. Owner-to-owner tone.
---
## Title
Why my Klaviyo flows were skipping 18% of my customers (and the CSV cleanup that fixed it)
## Body
Background: I run {{your-store-context — e.g., "a 4-year-old pet supplements store doing about $X/month"}}. Last summer I noticed the open rate on my "abandoned cart" Klaviyo flow was lower than usual. Klaviyo's dashboard said the flow was firing fine. Took me a week to figure out the actual problem:
**Klaviyo was silently dropping 18% of my customers because their phone numbers weren't formatted correctly.** Not "wrong" — just not in the format Klaviyo's SMS module accepts. So the SMS part of the flow never sent, and the email-only fallback didn't kick in for half of those.
The root cause was the Shopify customer export. Customers had entered their phones every which way:
- `(415) 555-0143` — works
- `415.555.0143` — Klaviyo: "invalid"
- `4155550143` — Klaviyo: "invalid for this country"
- `+44 20 7946 0958` — works only if the country field is set; for ~30% of my customers it wasn't
- `415-555-0143 ext 12` — Klaviyo: "invalid"
The fix is a one-time CSV cleanup before each Klaviyo sync:
**1. Pull the Shopify customer export.**
Customers > Export > "All customers" > CSV.
**2. Run every phone number through E.164 normalization.**
E.164 is the international format Klaviyo (and basically every other SMS platform) wants: `+14155550143`. Python's `phonenumbers` library does this if you're scripting; spreadsheet add-ons exist but they're painful at >5k rows.
**3. Default the country code per row.**
If the customer's address country is "United States", default the phone country to US. This catches the rows that are missing `+1` but are obviously American.
**4. Drop or quarantine anything still un-parseable.**
Don't import broken rows hoping Klaviyo will figure it out. It won't.
**5. Re-import the cleaned CSV to a Shopify customer segment** (or push directly to Klaviyo via their API).
I eventually wrapped this whole pipeline into a desktop app called DataTools because doing it monthly was tedious. $49, runs locally so customer data stays on my machine, datatools.app/shopify-pet if you're curious. But the 5 steps above are what actually matters — works regardless of tool.
Anyone else seeing low SMS deliverability? I'd bet money it's this.
— {{your-name}}

View File

@@ -0,0 +1,28 @@
# Shopify-pet · Post 2 — Tip
**Where to post:** LinkedIn, Shopify Discord, pet-business Facebook
groups, niche e-comm newsletters' "tip" inboxes.
**Format:** ~150 words.
---
## Title
The hidden character in your Shopify customer export that breaks Klaviyo imports (and how to spot it)
## Body
Open your Shopify customer export. Look at the email column.
Some of your emails have an invisible character in them — usually a zero-width space (`U+200B`) or a non-breaking space (`U+00A0`) — copied in from a customer typing on their phone. Visually identical to a normal email. Klaviyo treats them as different addresses, so:
- Your "duplicate customer" check passes when it shouldn't
- The customer gets emailed twice
- Your unsubscribes don't propagate (the unsub list has the *clean* email; the next campaign send reaches them via the *invisible-char* email)
Spot it: in Excel, paste your email column into a single cell with `=LEN(A2)` next to it. Anything that's longer than the visible character count has a hidden char in it.
If you want to automate the cleanup (plus phone normalization, dedupe, the whole pre-Klaviyo scrub), I built a $49 desktop tool: datatools.app/shopify-pet. Local — your customer list never leaves your computer.
— {{your-name}}

View File

@@ -0,0 +1,35 @@
# Shopify-pet · Post 3 — Soft offer
**Where to post:** IndieHackers, r/shopify monthly self-promo, Shopify
community "apps & tools" forum, pet-business newsletters.
**Format:** ~250 words.
---
## Title
DataTools — a $49 desktop tool that gets your Shopify customer export Klaviyo-import-ready in 30 seconds
## Body
Built this for my own store and figured fellow Shopify owners might want it.
The problem: Shopify's customer CSV export is *almost* Klaviyo-ready, but not quite. Phones in five different formats. Hidden whitespace in addresses. Duplicate-customer rows from the same person ordering twice with slightly different emails. Country fields blank for half your international orders. You either fix it by hand every month or accept that ~15-20% of your list is broken.
**DataTools** is six CSV tools as one pipeline:
- **Format standardizer** — phones to E.164 (Klaviyo-ready), addresses normalized, currencies in your store's locale
- **Dedupe** — fuzzy matching catches "Sarah O'Brien" = "sarah obrien" = "Sarah OBrien" before they become 3 customers in Klaviyo
- **Text cleaner** — strips zero-width spaces, BOMs, weird unicode the customer typed on their phone
- **Gate** — quarantine rows that won't survive the import (missing email, malformed phone) so you know what got dropped and why
- **Analyzer** — runs first, tells you what's wrong before you start fixing
- **Splitter** — chunks oversized exports for tools with row limits
Runs **locally** on Mac/Win/Linux. Customer data never goes to a server — that was the whole point. No subscription. **$49 one-time**, v1.x updates included.
Demo (with synthetic data) and download: datatools.app/shopify-pet
Built by a fellow Shopify store owner. Happy to answer questions in the thread.
— {{your-name}}