# Move to Rinhelp from the old help desk

You are moving your teammate's help desk from the old help desk to Rinhelp. Do the steps in order. Before each step, say what it will do; after it, report what it did.

First read the old help desk's page, which holds its limits and traps: `https://rinhelp.com/migrate/<id>.md`, where the id is its name in lowercase with hyphens, such as `help-scout`, `zoho-desk` or `microsoft-365`. If no page answers, find the old help desk on https://rinhelp.com/migrate.

## Rules for the whole move

- Only an Owner can import. If `account_whoami` doesn't say `owner`, stop and ask your teammate to connect an Owner's AI agent.
- Never call `conversation_reply` while importing: it emails the customer. Past conversations come in only through `conversation_import`, which emails nobody, never runs Rin and never counts toward a plan.
- Every import call takes the same `source`: the old help desk's name in lowercase with no spaces, such as `zendesk` or `helpscout`. Articles and conversations are keyed by `source` and their ID in the old help desk, and saved replies by name, so sending a batch again is safe. After an error or a timeout, send the same batch again.
- Rinhelp runs 60 actions a minute for your agent. When an action says to try again shortly, wait a minute and send it again.
- Read the old help desk through its API with a token your teammate makes there. Keep the token in an environment variable on their machine, and never pass it to a Rinhelp action.
- If you can write files, keep a progress file of the old IDs each step finished, so you can resume where you stopped.

## 1. Inventory and time estimate

Count, in the old help desk: help center articles and sections in the default language, saved replies (also called macros, templates or canned responses), conversations, files, teammates, the support email address, and the websites that show its chat widget.

Rinhelp takes 25 articles, 50 saved replies or 50 conversations a call, so 1,500 articles or 3,000 conversations a minute. the old help desk's own API limit is usually slower: estimate the time from the requests the old help desk needs and its requests a minute, plus the time to download the files.

Moving every past conversation with its files needs a coding agent with a shell, such as Claude Code, Codex or Cursor. In a chat app, do steps 2, 3, 4 and 6, and tell your teammate to run steps 5 and 7 in a coding agent.

Show your teammate the counts and the estimate, and ask before you start.

## 2. Help Center

Send articles to `article_import`, 25 a call, in the old help desk's order, section by section, in its default language only.

- Each top-level category or collection becomes a section: put its name in `section`. Fold deeper levels into their top-level section.
- Turn each article's HTML into Markdown for `body`. Keep images as Markdown images with their full address: Rinhelp copies them. Report any `imagesNotCopied`.
- Set `url` to the article's old public address, so old links lead to the new article once the old help center's domain points to Rinhelp (step 6).
- Set `published` to false for drafts, and keep `createdAt` and `updatedAt`.

Then `help_center_show` and give your teammate the new help center's address.

## 3. Saved replies

List every saved reply in the old help desk, shared and personal.

- Skip the ones with no reply text, which only run actions.
- Drop actions, attachments and subjects: a Rinhelp saved reply is a name and plain text.
- Turn the HTML body into plain text. Write each link as its bare address, and each image as a link to it.
- Replace each placeholder with Rinhelp's. Turn its fallback, such as Help Scout's `,fallback=there`, Front's `| 'there'` or Intercom's `|fallback:"there"`, into `| default: "there"`:

  | Rinhelp | Help Scout | Front | Intercom (`body_text`) | Gorgias | Zendesk |
  | --- | --- | --- | --- | --- | --- |
  | `{{customer.first_name}}` | `{%customer.firstName%}` | `{{recipient.first_name}}` | `{{user.first_name}}` | `{{ticket.customer.firstname}}` | `{{ticket.requester.first_name}}` |
  | `{{customer.name}}` | `{%customer.fullName%}` | `{{recipient.name}}` | `{{user.name}}` | `{{ticket.customer.name}}` | `{{ticket.requester.name}}` |
  | `{{customer.email}}` | `{%customer.email%}` | `{{recipient.email}}` | `{{user.email}}` | `{{ticket.customer.email}}` | `{{ticket.requester.email}}` |
  | `{{teammate.first_name}}` | `{%user.firstName%}` | `{{user.first_name}}` | `{{message.author.first_name}}` | `{{current_user.firstname}}` | `{{current_user.first_name}}`, `{{ticket.assignee.first_name}}` |
  | `{{teammate.name}}` | `{%user.fullName%}` | `{{user.name}}` | `{{message.author.name}}` | `{{current_user.name}}` | `{{current_user.name}}`, `{{ticket.assignee.name}}` |

  `user` means the customer in Intercom but the teammate in Help Scout and Front. Intercom's teammate keys and Gorgias's `{{ticket.customer.name}}` come from their email template docs: check one imported reply. For another help desk, match by meaning. Turn every other placeholder into a bracket a teammate will fill in, such as `[order number]`.
- Fold folders and categories into the name, such as "Billing / Refunds" for Zendesk's "Billing::Refunds".
- List the personal ones for your teammate, and import them as shared only if they agree.

Send them to `saved_reply_import`, 50 a call. A name the workspace already has is skipped.

Report how many came in; for each one, what was dropped and which placeholders became brackets; how many were skipped, as personal, as action-only or as a name already taken; and that folders became name prefixes.

## 4. Website

Ask your teammate for their website, and add it with `source_add` so Rin learns from it.

## 5. Past conversations

Go from the oldest conversation to the newest, 50 conversations a `conversation_import` call. For each one:

- `contact`: the customer's email and name. Contacts are matched by email.
- `status`: `closed` once solved, closed or archived, else `open`, pending, on hold and snoozed included. Don't send spam or trash. Keep `subject`, `tags`, and `priority` as `urgent` or `normal`.
- Each message: `role` `contact` for the customer, `member` for a teammate or the old help desk's AI, with `authorName` their name; `note: true` for an internal note; `createdAt`; and `body` in Markdown, turned from HTML.

Files never pass through you:

- Call `attachment_upload_link`. Its link works for 60 minutes: get a new one before `expiresAt`.
- Stream each file from the old help desk into it with one shell command, such as `set -o pipefail; curl -sfH "Authorization: Bearer $TOKEN" "$src" | curl -sfT - --url-query "name=$name" -H "Content-Type: $type" "$link"`. It answers `{"id": "..."}`: list the ids in that message's `attachments`. `--url-query` needs curl 7.87 or newer; with an older curl, URL-encode the name into `?name=` yourself. If the command fails, don't use its id: fix the cause and try the file again.
- Take inline images out of the body and upload them as attachments too. When a message was only images, make its body their file names.
- A file over 50 MB can't come: skip it and note its conversation, name and size for the report.

Upload a batch's files, then import the batch. Report progress every few batches, and at the end the conversations, messages and files that came in, and the files that were too big.

## 6. Switch-over

Ask your teammate before each change: these move where customers reach them.

- **Teammates:** `team_list`, then `team_invite` each teammate who still works there. Each gets an email.
- **Email:** `email_show`, then `email_set_address`, or `email_domain_set` and `email_domain_verify` for their own domain. Then your teammate forwards the old help desk's support address to the workspace's address. `email_test` checks it.
- **Chat widget:** `widget_update` with their websites, then `widget_show` for the snippet that replaces the old help desk's chat on their website.
- **Old help center links:** if the old help desk's help center had its own domain, `help_center_domain_add` it and give your teammate the records to set.

## 7. Catch-up

Once email and chat come to Rinhelp, run step 5 again for the conversations updated in the old help desk since step 5 began. Only new messages are added, so upload files only for messages newer than your last import. Then tell your teammate the move is done, with everything that was skipped or dropped.
