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}}