Skip to main content
Import large contact lists from a CSV without waiting on the page. Uploads process in the background, columns map to your contact fields automatically, and Import History shows a live breakdown of what was created, updated, skipped, and failed. Available in the dashboard and through the API, SDK, CLI, and MCP server.
  • Import large lists from a CSV file, processed in the background
  • Automatic column mapping to your contact fields
  • Live status with created, updated, skipped, and failed counts
  • Choose to update or skip contacts that already exist
  • Suggested segments as soon as an import finishes

Import from the dashboard

In Contacts, choose Add Contact then Bulk Import and upload your CSV. Migma matches each column to a contact field, with only Email required, and you confirm before it runs. The import processes in the background, so you can leave the page. Watch it finish in Import History with counts for imported, updated, and failed contacts and a summary of any rows that could not be added.

Suggested segments after an import

When an import finishes, Migma suggests segments built from the contacts you just added, so a fresh list becomes a targeted audience in one step. Choose a suggestion to open the segment builder prefilled and ready to save.

Import programmatically

Create and track imports from the API, SDK, CLI, and MCP server. Upload the CSV, then poll the import for its status and counts.
Node.js SDK
import { readFileSync } from 'node:fs';
import Migma from 'migma';

const migma = new Migma('YOUR_API_KEY');

// Upload the CSV, processed in the background.
const { data: job } = await migma.contacts.imports.create({
  file: readFileSync('./contacts.csv'),
  projectId: 'PROJECT_ID',
  columnMap: { email: 'Email', firstName: 'First Name' },
  onConflict: 'upsert',
});

// Poll until it finishes.
const { data: status } = await migma.contacts.imports.get(job!.id);
A finished import reports counts you can reconcile against your file:
{
  "object": "contact_import",
  "id": "IMPORT_ID",
  "status": "completed",
  "counts": { "total": 1200, "created": 1150, "updated": 40, "skipped": 8, "failed": 2 }
}

Update or skip existing contacts

Set onConflict to upsert, the default, to update contacts whose email already exists, which makes a re-import a safe way to refresh your list. Set it to skip to leave existing contacts untouched and only add new ones. Manage contacts · API reference · SDK · CLI · MCP