# Move from another tool

> Bring everything across from Senja or Testimonial.to with your own API key from that tool. The key is used for one reading and then wiped.

**Move from another tool** brings your testimonials across from Senja or
Testimonial.to, so you can stop paying for the other tool. Open
**Testimonials** in the site's sidebar, then the **Import** tab, then
**Move from another tool** under **Other ways in**.

A move is never limited by your plan. Nothing you move counts toward your
[monthly testimonials](/docs/testimonials/limits), on any plan, and a move
is not the Free plan's
[fetched import](/docs/testimonials/imports#one-fetched-import-a-month-on-free).
Starting one needs the `content.write` permission.

> **Note:** Both moves are built from each tool's own published
> documentation. They have not yet been run against a live account, so
> check the review step before you keep. If something does not come across
> as it should, write to hello@privatusanalytics.com.

## 1. Choose the tool

The page has a card for each tool, with what comes across and what does
not, and a button: **Move from Senja** or **Move from Testimonial.to**.

| | Senja | Testimonial.to |
|---|---|---|
| The words, the rating and the date | Yes | Yes |
| A title | Yes | No |
| The person's name, job title, photo, email address and social link | Yes | Yes |
| The person's company | Yes | No |
| Tags | Yes | Yes |
| Whether it was approved | Yes | What is liked there counts as approved |
| Videos | Yes | Yes |
| The language and the testimonial's own link | Yes | No |
| Where it came from there | Yes, as the source name | No |

Forms, widgets, walls and analytics do not come across from either tool.
You set those up here.

Testimonial.to offers an API key only on its top plans. Without one, export
your testimonials there as a spreadsheet and use
[Import a spreadsheet](/docs/testimonials/import-spreadsheet). The card
links to it.

## 2. Paste your key

| Control | What it does |
|---|---|
| **Your Senja API key** or **Your Testimonial.to API key** | Your own key from the other tool. The field hides what you type |
| **Back** | Returns to the two cards |
| **Read my account** | Stores the key and starts reading |

| Tool | Where the key is |
|---|---|
| Senja | Settings, Integrate, the API tab. One key per project |
| Testimonial.to | The menu on your project card there, API Key. One key per project |

What happens to the key:

- It is stored encrypted.
- It is used only for this import.
- It is wiped as soon as the import has read everything, whether that
  worked or not.

No page and no API response shows it again.

## 3. The reading

The whole account is read in one pass, up to 20,000 testimonials. The page
says **Reading** and refreshes itself. A site reads one move at a time.

If the other tool does not accept the key, the page says "The move could
not be read", gives the reason and says the key has been wiped. **Start
again** takes you back to paste it once more.

When the reading is done, the page of the move shows four numbers.

| Number | Meaning |
|---|---|
| **Found** | Testimonials read from the account |
| **Kept** | The ones you have kept so far |
| **Already here** | The ones that match a testimonial the site already holds, exactly or closely |
| **Videos and audio** | Recordings of what you kept, copied into your media in the background |

Under them is **Review** with the number that waits, or **Open
Testimonials** once nothing waits.

## 4. Review and keep

**Review** opens the
[review step](/docs/testimonials/imports#the-review-step), the same one
every import uses, with one more switch.

| Control | What it does |
|---|---|
| **Keep approval as it was there** | Ticked to begin with. What was approved in the other tool arrives **Approved** and everything else **Pending**, whatever **Add as** says. Untick it to give everything the **Add as** status |

A video that came with no written words is listed as "A video, with no
written words".

After you keep:

- Videos and photos are copied into your
  [media](/docs/testimonials/media) in the background. A photo is copied
  only for a person who has none yet.
- A video of up to 10 minutes comes across, whatever your plan's recording
  length, on the Free plan too.
- A moved testimonial keeps its original date. It does not carry the
  verified mark.
- The move is **Done** once nothing with a tick box is left.

## API and MCP

| Action | MCP tool | Permission |
|---|---|---|
| List the moves of a site | `testimonial_migrations_list` | `analytics.read` |
| Read one move | `testimonial_migrations_get` | `analytics.read` |
| List what waits in its review step | `testimonial_migrations_review` | `analytics.read` |
| Keep items | `testimonial_migrations_keep` | `content.write` |
| Discard items | `testimonial_migrations_discard` | `content.write` |

Starting a move takes the other tool's API key, so it is in the app only,
never over the API or MCP. No response returns the key. Starting a move
while another one of the site is reading responds with `422` and the code
`in_progress`. The inputs and response fields are in the
[API reference](/docs/api) and the [MCP reference](/docs/mcp).

## Good to know

- You can leave while the account is read. Once a site has a move, the
  Import tab shows **Moves from another tool** under the sources, with
  **See the moves**: the list of every move, each leading to its page
  and its review step.
- What you do not keep stays in the review step for 30 days and is then
  deleted.
- You can run a second move later. What the site already holds is marked
  **Already here** and is not stored twice.
- When a move finishes reading, the webhook event
  `testimonial_import.finished` is sent.
