Skip to content

Importing

Bring testimonials you already have — from a spreadsheet, or from another tool.

Collection → Imports → New import. Upload a CSV, check the preview, and run it.

How it runs

Imports are a background job. Once you confirm, the run returns immediately with a job you can poll, in the dashboard or through the API with read:jobs.

Rows land as pending, like everything else. An import is not a way to publish in bulk — the queue is still the queue.

Column mapping

You map your columns rather than renaming them to match us. Text, name, email, title, company, rating and date are all mappable, and anything you do not map is left empty.

Coming from another tool

If your file is an export from a tool we recognise — Senja, Testimonial.to or Google Forms — we detect it and pre-fill the mapping for you. Detection only ever pre-fills: you still see the mapping and the preview, and you confirm. If we do not recognise the file, the columns are guessed by name and you map anything we missed — the import works either way.

A few source-specific notes:

  • Ratings in words. A Google Forms answer like 5 - Excellent, or a plain Excellent, is read as a 5. Values we cannot read are left blank, not guessed.
  • Timestamps. A Timestamp column with a time (for example 08/26/2026 14:05:00) is kept as the item's date, in your team's timezone.
  • What we keep, and what we don't. We keep the text, name, role, company, rating, date and the source URL as provenance. Avatars, video files and tags from Senja or Testimonial.to are not imported in this version.

See the step-by-step guides: Moving from Senja, Moving from Testimonial.to, Moving from Google Forms.

Preview before you import

After you upload, you land on a preview before anything is imported. It shows which source we detected, a few sample rows exactly as they will be imported, and the counts that matter: how many rows will import, how many are skipped for having no text, how many ratings and dates could be read, and how many rows match something you already imported.

The sample rows are the important part. A mapping can be perfectly valid and still wrong — point the "text" column at the customer's job title and every row imports cleanly, with no error, and nothing warns you. One glance at the sample tells you. If the text column is not the testimonial, go back and fix it.

Re-uploading is safe

Import the same file twice — because you were not sure the first one worked, or because you added a few rows — and the rows that already imported are skipped, not duplicated. You are not charged twice. The preview tells you up front how many rows will be skipped as already-imported.

We match on the source's own item id when the export carries one; otherwise on the testimonial text plus the contact's email and name.

Row errors do not stop the batch

A malformed row is reported as an error against that row; the rest of the file still imports. You get a count and a list, so you can fix twelve rows instead of re-uploading nine hundred.

Undeliverable addresses are dropped, not rejected

If a row's email address has no working mail exchanger, the address is dropped and the testimonial is kept. Losing a real testimonial over a stale address would be the wrong trade — but keeping the address would put your sending reputation at risk the next time you email that list.

Provenance

Imported items are marked as imported, with the batch they came from and the source they came from. That is worth having: six months later, "where did this testimonial come from?" has an answer, which matters if somebody asks you to prove you had permission to publish it.

Importing by API or MCP

You can import without the dashboard. The MCP tool import_testimonials sends up to 100 already- structured testimonials in one call; it creates the same kind of import batch, with the same per-row de-duplication, and returns the batch with its counts. Under the hood it calls POST …/imports/testimonials/. Items still land as pending — nothing an import creates is auto-published.

Limits

Up to 2,000 rows and 5 MB per file. Split a larger export and import it in parts — re-uploading is safe, so overlap between the parts is skipped, not duplicated.