Skip to main content

Bring your sales data in, and take it out, as CSV

Import leads, contacts, companies, and deals from a spreadsheet with explicit duplicate handling, and export any list back out. Your data stays yours.

Your leads live in a spreadsheet today, or in a CRM you are leaving. ERPClaw’s built-in Sales takes them in from CSV, the format everything can produce, and gives them back the same way. No import wizard fees, no export ransom.

Say it the way you would out loud:

“Import the leads from the trade show spreadsheet. If someone is already in the system, skip them.”

Importing: you decide what a duplicate means

Every import makes you say, up front, what happens when a row matches an existing record: skip it, update the existing record with the row, or stop the whole import. There is no silent default, because the wrong guess on that question is how a clean contact list becomes a merge project.

Duplicates are matched the way humans mean it: people by email, companies by web domain, neither caring about capitalisation, the same rules that guard contacts and companies day to day. Deals have no natural duplicate key, so every deal row imports as its own deal, landing in your pipeline at whatever stage the row names.

An import is all or nothing. If a row fails, or you chose “stop on duplicates” and one appears, the entire import rolls back and the system is exactly as it was. Money columns and emails are checked before anything is written, not after.

Exporting: the door out is always open

“Export every qualified lead to a file for the mailing house.”

Exports write a fresh CSV of leads, deals, contacts, or companies, with simple filters for status or lifecycle, and your custom fields included on request. The file opens correctly in Excel, including names with accents.

A fair test of any system is whether an export, imported straight back with skip-duplicates, changes nothing. Here that round trip is a no-op by design.

Common questions

What file format do you take? CSV, one record type per file. Point the import at the file path and state your duplicate rule.

What happens if row 400 of 500 is broken? Nothing is imported. The import runs as one transaction and rolls back entirely, so you fix the row and run it again rather than reconciling a half-import.

How are duplicates detected? People by email, companies by domain, both case-insensitive within your company. Deals always insert, since two deals can legitimately share a name.

Can I import from my old CRM? If it exports CSV, yes. Export each record type from the old system, import them here, and state your duplicate rule per file.

Do my custom fields survive export? Yes, ask for them and they are appended as extra columns.

Is my data locked in? No. Export is a first-class action on every one of these record types, and the underlying database is on your own machine to begin with. Free forever, self-hosted.

Reference: the actions behind this page

You never have to type these. They are what ERPClaw runs when you ask, and they are here for anyone calling the API or MCP surface directly, or reading a log.

import-leads --file leads.csv --on-duplicate skip
import-crm-contacts --file contacts.csv --on-duplicate update
import-crm-companies --file companies.csv --on-duplicate fail
import-opportunities --file deals.csv --on-duplicate skip
export-leads --output qualified-leads.csv --status qualified
export-crm-contacts --output contacts.csv --include-udfs
export-opportunities --output deals.csv
export-crm-companies --output companies.csv

--on-duplicate is required on every import, with skip, update, or fail as the choices. Imports run in a single transaction. Exports overwrite their output file and write UTF-8 with a byte-order mark so spreadsheets open them cleanly.