(case study) 01
Shopify Migration QA Platform
Will Shopify accept this file? I designed and built an internal tool that answers before anything touches a client store.
- Scale
- 70k+ customers, 200k+ SKUs
The problem
Migration specialists move merchants' customers and products into Shopify from CSV exports. Shopify rejects rows for reasons that aren't obvious from the file: a variant that duplicates another, a blank option value, an email Shopify won't accept.
Checking a file by hand took about four hours per customer migration. Even more for products.
What I built
A web app with two sections, customers and products, sharing one server, one client and one PostgreSQL database.
- UploadDrop in the CSV. Customer files get a column-mapping step; product files are already in Shopify's format.
- Pre-checkRules flag what Shopify will reject, judged on the exact rows the import will send.
- Test importImport into one or more test stores in parallel through Shopify's bulk API.
- ReportEvery rejection traced to its source row and grouped by field and error code, with an Excel export.
Engineering decisions
- Only report what Shopify would reject. Each pre-check rule is checked against a real test-store result. A rule that fires on data Shopify accepts is noise, so it doesn't ship.
- Judge what gets sent, not the raw file. The import transforms the data (merging duplicates, tagging, moving notes). The rules run on that transformed data, so the pre-check and the import always agree.
- Built for big files. Uploads stream to disk instead of loading into memory, and imports use Shopify's bulk operations, so 200k+ SKU catalogs work without a bigger server.
- Merchant data is treated as sensitive. Raw CSVs are deleted once processed, and a sweep removes anything a crash leaves behind.
- Tested and shipped through CI. Unit and integration tests (Vitest) run on every pull request in GitHub Actions.
Results
4h → 1hQA and prep time per migration (75% less)
200k+SKUs per file, 70k+ customer records