Skip to main content
An import (a migration job) moves a store from another platform into yours: upload the platform’s CSV exports or pull with its API token, check every row, dry-run, then start a background run that is idempotent and resumable. Purchase history is saved as imported records, never as sales: it never counts toward revenue, fees, payouts or webhooks. Subscribers are never emailed by the import.
Creating and running an import needs the Volume plan. Below it, every write answers 403 with code: FEATURE_LOCKED and details.requiredPlan: "volume" — API keys and MCP included. Reading an import, its report and its row CSV, and cancelling, always work.

Endpoints

source is gumroad, lemonsqueezy, stan or csv. kind is products, customers, orders (purchase history) or subscribers.

Example: a Gumroad move

Dry run

How the run behaves

  • Order: products, then customers, then purchase history (matched to the products by source id or name), then subscribers.
  • Idempotent: products match on the platform’s product id or the name, customers and subscribers on the email, purchases on the platform’s order id (or a stable hash of the row). Nothing is created twice.
  • Resumable: the run holds a lease and renews it per batch; if it stops, the sweep resumes it within a minute from the first row not yet done. start on a failed or canceled import imports the rest.
  • Existing data wins: a product, customer or subscriber you already have is skipped, never overwritten. A subscriber’s status is never changed.
  • Consent: each imported subscriber carries consent (source such as gumroad_csv or lemonsqueezy_api, the platform’s wording, the opt-in date). Statuses without consent (archived, requires_verification, unknown) are left out; unsubscribed / bounced are imported with that status. Addresses on the bounce / spam complaint list are left out.
  • Files: product files download from public https:// links only (no private addresses, re-checked on every redirect), up to your plan’s upload size, for deliverable file types only. Otherwise the product is marked fileNeeded with the reason in the report.

White-glove imports

Our team can run the import for a Volume creator from the admin dashboard. Those imports show up in GET /migrations with createdBy.type: "admin" and work exactly like yours.

MCP

list_import_platforms, list_import_jobs, create_import_job, get_import_job, add_import_file, update_import_mapping, list_import_rows, connect_import_account, dry_run_import_job, start_import_job, cancel_import_job, get_import_report.