Envie
Guides

Import from Swym or Swish

Move an existing wishlist install to Envie without losing shopper data — dry-run first, idempotent, with a full report of anything skipped.

This page migrates wishlists from Swym, Swish, or any CSV into Envie.

The short version

Export from your current app, then in the Shopify admin: Envie → Import & export → Import, pick the file, keep Dry run checked, review the counts, run it for real. Most migrations end here — the rest of this page is the detail and the API route.

Supported sources

sourceAccepts
swymSwym's CSV export
swishSwish's CSV export
csvThe generic format below

Generic CSV format — header row required, one saved item per row:

customer_id,anonymous_id,product_id,variant_id,handle,added_at
6301397778619,,8123456789012,,soft-hoodie,2026-05-01T10:00:00Z
,,8123456789012,44012345678901,soft-hoodie,2026-05-02T09:30:00Z

The rules (what gets imported, what gets skipped)

  • Every row must resolve to a customer — by customer id when the export has one, otherwise by email lookup against your store. Rows that resolve to nobody are skipped and reported, never imported: an orphaned anonymous list would belong to a browser that no longer exists — a wishlist no shopper could ever open.
  • Idempotent. Run the same file twice; the second run inserts nothing. imported counts rows actually inserted, so a re-run reporting 0 is a success, not a failure.
  • Existing items win. A row matching a product the shopper already saved never overwrites its addedAt.
  • Bad timestamps are kept, bad ids are not. An unparseable added_at defaults to now (the item is the data, the timestamp is metadata). An unparseable product id skips the row and reports the line number — guessing would be worse.
  • File cap: 50 MB.

Via the API

Two steps: get an upload target, then start the job. The file goes from your machine straight to storage — it never passes through the API itself.

# 1. Get a presigned upload target
curl -X POST https://api.getenvie.com/v1/imports/upload \
  -H "Authorization: Bearer env_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"filename": "swym-export.csv", "contentType": "text/csv"}'
# → { "uploadUrl": "https://…", "fileUrl": "https://…" }

# 2. Upload the file (straight to storage, 15-minute window)
curl -X PUT "$UPLOAD_URL" -H "Content-Type: text/csv" --data-binary @swym-export.csv

# 3. Dry-run
curl -X POST https://api.getenvie.com/v1/imports \
  -H "Authorization: Bearer env_sk_your_key" \
  -H "Content-Type: application/json" \
  -d '{"source": "swym", "fileUrl": "'"$FILE_URL"'", "dryRun": true}'
# → 202 { "jobId": "…" }

# 4. Poll the job
curl https://api.getenvie.com/v1/imports/{jobId} \
  -H "Authorization: Bearer env_sk_your_key"

The finished job reports totals (imported, skipped) and a downloadable resultUrl — a JSON report with the first issues and their line numbers. Dry-run gives you the same report without writing anything; when the numbers look right, repeat step 3 with "dryRun": false.

Getting the export files

  • Swym: Wishlist Plus admin → export wishlist data (or ask their support for a full CSV export).
  • Swish: app admin → export. Header naming varies by app version; the importer maps the variants it knows and reports any column it can't place, in the dry-run report, before anything is written.

And in the other direction

Your data leaves as easily as it arrives: Import & export → Export, or POST /v1/exports {"format": "csv"} — the export uses the same generic CSV columns, so an Envie export re-imports cleanly. A signed download link is valid for 24 hours. No ticket, no waiting period, nothing withheld.

Common mistakes

  • Skipping the dry run. It's the same job with writes turned off, and it's the only place you'll see "half these rows have no matching customer" before they're skipped for real.
  • Reading skipped > 0 as failure. Deleted customers, guest-only rows, malformed lines — every migration has some. The report says exactly what and why; the question is whether the numbers match your expectations.
  • Re-exporting from the old app after the import. Two exports weeks apart drift. Import the final export, verify, then uninstall the old app.

On this page