Files
Michael e1f364f010 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>
2026-05-02 14:04:37 +00:00

2.5 KiB

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