# Migrate to Ondes PRO from another tool, with the API and AI

> Move catalogue, customers and invoices from your old tool via the Ondes PRO API: AI reads the export, dry-runs every write and imports in verified batches.

Updated on 2026-10-21 · The Ondes PRO team · https://ondes.pro/en/integrations/mcp/guides/migrate-to-ondes-pro

Switching business software usually stalls on one thing: getting the data across. This guide shows how to import your **catalogue**, **customers** and **open invoices** into Ondes PRO through the **REST API**, handing the tedious part — reading the export, mapping columns, checking every row — to your **AI assistant connected over MCP**, and only writing for real after a clean **dry run**.

## What can be imported into Ondes PRO, and in what order?

Anything with a writable API v1 resource can be imported: store categories and products (`shop/categories`, `shop/produits`, then `shop/images-produit` for galleries), inventory components (`inventory/composants`), billed customers (`billing/clients`), prospect records (`crm/fiches`), quotes and invoices (`billing/devis`, `billing/lignes-devis`, `billing/factures`). Order matters because objects reference each other: a category before its products, a customer before their quotes, a quote before its invoice.

In Ondes PRO, **an invoice is born from a quote** and **is never deleted** — that is the legal retention requirement. An import mistake on an invoice cannot be undone with one click, which is why the dry run below matters. For invoices already settled, filing the old tool’s PDFs in the Drive is often enough; importing **unpaid** invoices, on the other hand, lets payment reminders go out from Ondes PRO.

## Import your data into Ondes PRO, step by step

Running example: Atelier Lumen is bringing over 412 products, 1,380 customers and 37 invoices awaiting payment.

1. **Export from the old tool** — Get one CSV file per object type: products, customers, open invoices with their lines. Keep the original identifiers in a column: they become your idempotency keys and your mapping table.
2. **Connect your assistant to your workspace** — Connect Claude Code, Cursor or another MCP client to your workspace’s server through OAuth (see [compatible clients](https://ondes.pro/en/integrations/mcp/clients)). For an unattended script, create a dedicated key with `shop:write` and `billing:write` instead, and revoke it once the migration is done.

```bash
claude mcp add --transport http ondes https://your-workspace.ondes.pro/mcp/
```
3. **Have the column mapping drafted** — Hand the export to the assistant. It reads each resource sheet with `ondes_ressource` — required fields, types, accepted values — and drafts a mapping: “Label” to `name`, “Net price” to `price`, “Ref.” to `sku`. Review it: this is the one moment a human really has to decide.
4. **Dry-run a sample** — Ask the assistant to validate a dozen rows with `simuler: true`: the server checks each body and answers as it would for a real creation, without saving anything. Bad formats (prices with a currency symbol, VAT written “20 %”, country names spelled out) surface here, field by field.
5. **Import in batches of 100** — `POST /api/v1/<resource>/lot/` writes up to 100 objects in one transaction: if a single row is rejected, the whole batch rolls back and the response points to the row and the reason. Add an `Idempotency-Key` derived from the batch’s original identifiers, so re-running after a dropped connection creates no duplicates.
6. **Bring billing over last** — Create quotes and their lines first (a quote’s `numero` is optional: left empty, it takes the company’s sequence), then one invoice per quote. Dry-run each invoice before the real write: once created, it can no longer be deleted.
7. **Check the result** — Compare totals: number of products, number of customers, amount of open invoices. The `?search=` filter on `shop/produits` (name or SKU) and `billing/clients` (name or email) quickly finds a missing row. The assistant can produce this reconciliation report itself.

## The assistant reads the export and dry-runs before writing

_Example conversation · demo data (Atelier Lumen)_

> **You** : Here is `products-export.csv` (412 rows). Import it into the store, but show me what breaks first.
>
> 🔧 `ondes_ressource` `shop/produits` sheet: `name` and `price` required, `price` is a decimal, `compare_at_price` and `sku` optional.
>
> 🔧 `ondes_appeler` `POST shop/produits` with `simuler: true` on 10 rows — 8 valid, 2 rejected: invalid `price` (“245,00 €”).
>
> **Assistant** : The mapping holds, with one catch: the “Net price” column includes the euro sign and a decimal comma. I will convert it to `245.00`. The 14 rows without a SKU (including the black Tripod lamp) will be created without a reference. Shall I import in five batches of 100 and one of 12, each with an idempotency key taken from the original identifier?
>
> **You** : Yes, for real.
>
> 🔧 `ondes_appeler` `POST shop/produits/lot/` × 5 then × 1 — real mode stated, 412 products created, no row rejected.
>
> **Assistant** : 412 products created. Categories and images next, or customers?

## A customer batch body

Each operation carries its method and its data; an `id` is only required to update or delete an existing object.

```bash
curl -X POST https://your-workspace.ondes.pro/api/v1/billing/clients/lot/ \
  -H "Authorization: ApiKey opk_…" \
  -H "Idempotency-Key: customer-import-batch-001" \
  -H "Content-Type: application/json" \
  -d '{
    "operations": [
      {"methode": "POST", "donnees": {"nom": "Brasserie La Canopée", "email": "accounts@lacanopee.com", "ville": "Nantes"}},
      {"methode": "POST", "donnees": {"nom": "Galerie Ressac", "societe": "Ressac SAS", "siret": "…", "ville": "Biarritz"}}
    ]
  }'
```

A hundred operations per batch at most. One rejection, and nothing is written.

## Classic data-migration traps

- **Duplicate customers**: the same customer entered twice in the old tool. De-duplicate on email or company registration number before importing; the assistant can do it on the CSV.
- **Gross amounts mistaken for net**: Ondes PRO prices and lines are entered excluding VAT, with a VAT rate per line. Check on two or three invoices that the recomputed totals match.
- **Images**: they are uploaded separately, as multipart, to `shop/images-produit` once products exist. A batch does not carry files.
- **Companies**: if your workspace holds subsidiaries, each object belongs to the company of the call. Import company by company, without mixing files.
- **The forgotten key**: revoke the migration key at the end. An OAuth connection is cut by name from the MCP tab.

> **An imported invoice cannot be deleted** — Invoicing has no test twin: writes are real from the first request, and an issued invoice can only be offset by issuing a **credit note** with a mandatory reason. So dry-run every invoice with `simuler: true`, and start with quotes: a draft quote can be corrected freely.

## What if I don’t have a developer?

Without a developer, the same path works from Claude Desktop or claude.ai: you drop the export into the conversation, the assistant connected to your workspace drafts the mapping, dry-runs, then imports once you agree. Every real write is labelled as such in its response.

For large volumes or a multi-company migration, onboarding support is available as an add-on (see [pricing](https://ondes.pro/en/pricing)). And if you would rather see the product with realistic data first, [the demo](https://ondes.pro/en/demo) stays open for 72 hours.

## Going further

- [Online store](https://ondes.pro/en/integrations/mcp/modules/online-store) — Orders, catalogue, promo codes and shipments handled by your assistant, in test mode by default.
- [Invoicing](https://ondes.pro/en/integrations/mcp/modules/invoicing) — Quotes, invoices, reminders and credit notes prepared by your assistant, within invoicing rules.
- [Inventory management](https://ondes.pro/en/integrations/mcp/modules/inventory) — Stock levels, deliveries, bills of materials and production orders read and prepared by your assistant.
- [CRM](https://ondes.pro/en/integrations/mcp/modules/crm) — Customer records, follow-up notes, pipeline and reminders kept up to date by your assistant.

## Frequently asked questions

### Can I import a product catalogue through the API?

Yes. Categories go through `shop/categories`, products through `shop/produits` (name and price required, SKU optional) and galleries through `shop/images-produit`. The `lot/` endpoint writes up to 100 of them per transaction.

### Can I bring over invoices from my old software?

Yes, but an Ondes PRO invoice is born from a quote and is never deleted. You create the customer, the quote and its lines, then the invoice, dry-running first. Many businesses only import unpaid invoices and archive the rest as PDFs.

### How do I avoid creating the same data twice if the import stops halfway?

Send an `Idempotency-Key` derived from the original identifiers on every write or batch. Replayed with the same body, the call returns the response it already got without creating anything again.

### Does the AI write straight into my data?

Only when you ask it to. It starts by reading the resource sheets and dry-running writes with `simuler: true`, which saves nothing. Every response states whether the write was a dry run, a test-mode attempt or real.

### What happens if one row in a batch is invalid?

The whole batch is rolled back, nothing is written, and the response says which operation failed and why. You fix the row and re-run the batch under a new idempotency key: a changed body under the same key would get a 409.

### Do I need a specific plan to migrate through the API?

No. The REST API, the batch endpoint and the MCP server are included in every Ondes PRO plan. For a large migration, onboarding support is available as an add-on.
