# Shopify-pet · Day 14 — Two-minute trick: hidden-character cleanup **Subject:** Two-minute trick: hidden-character cleanup **Send:** Day 14 **Goal:** surface the text cleaner — non-obvious, high-value --- Hi {{first_name}}, The tool inside DataTools that buyers find last is the **text cleaner** — and on Shopify customer exports it's usually the one with the most "wait, that was a problem?" moments. What it catches: invisible characters that got into your customer data when customers typed on their phones. The most common offenders: - **Zero-width space** (`U+200B`) inside emails — Klaviyo treats `s​arah@acme.com` (with hidden char) and `sarah@acme.com` (without) as different addresses - **Non-breaking space** (`U+00A0`) inside addresses — Shopify accepts it, Klaviyo accepts it, but USPS address validation fails on it - **BOM marker** (`U+FEFF`) at the start of CSV cells — usually from a customer pasting from Word or a PDF - **Right-to-left mark** (`U+200F`) — rare, but appears in customer names from Hebrew/Arabic locales The 2-minute workflow: 1. After the format standardizer pass, run the text cleaner. 2. It produces an additional sidecar file: `.hidden-chars.csv` — every cell where it found a hidden char, with a "what was hidden where" annotation. 3. Skim it. Most are fine to silently strip (zero-width spaces, BOMs). For rare ones (right-to-left marks in a name), confirm before stripping — sometimes they're load-bearing. 4. Click "Apply cleanup". The text cleaner replaces the hidden chars in the cleaned CSV. The reason this matters: **dedupe runs after text-clean.** Two emails with a hidden char difference look identical in the GUI but get treated as two separate customers — and your dedupe pass won't catch them unless the text cleaner ran first. The pipeline order baked into the GUI is: `analyzer → format → text-clean → dedupe → gate`. Stick to it; per-tool runs out of order are the most common source of "wait, why didn't dedupe catch this?". — Michael {{support_email}}