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:
49
marketing/community-posts/shopify-pet/01-story.md
Normal file
49
marketing/community-posts/shopify-pet/01-story.md
Normal 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}}
|
||||
Reference in New Issue
Block a user