Hemos cambiado el idioma a Español.View in English
Guías

Importa tu historial

Trae tus clientes y tickets de soporte desde WHMCS, o tu historial desde Crisp, Intercom, Zendesk, Freshdesk, Help Scout o LiveChat, y cambia sin perder nada.

Esta guía está en inglés. Las guías siguen de cerca el producto y cambian a menudo, así que mantenemos una sola versión exacta en lugar de traducciones que se quedan atrás.

IsTyping can copy the history you already have — customers, past conversations or support tickets, canned replies and help articles — out of the tool you use today, so you can switch without losing anything. This page explains what an import does, what each source brings over, and how to run one. It ends with the API details the importers rely on, for whoever maintains them.

What an import does

These rules are the same for every source.

  • Who can run it. Owners and admins, in Settings → Import, signed in to the dashboard. API tokens can never start or see an import.
  • Credentials. The API key or token you enter is used for that run only. IsTyping stores it encrypted while the run is active and deletes it when the run completes, fails or is cancelled. It is never shown again, never returned by the API and never logged. A connection you already saved in IsTyping (the WHMCS integration) can be reused without retyping it; its secret stays on the server.
  • Check first. Check connection tells you, in plain words, whether the credentials work, what the account is called, roughly how much there is, and what is missing (a permission, an IP allow-list entry). Nothing is stored by a check.
  • Dry run. A dry run reads everything, writes nothing, and shows counts and a sample of what it would create.
  • Quiet. Imported history is written quietly: no live notifications to open dashboards (one “refresh” when the run ends), no webhooks, no automations or chatbots, no emails, nothing added to unread counts or “needs reply” queues. Analytics include the imported history after the run.
  • Original times and authors. Messages keep their original timestamps and order. Messages from your team are matched to IsTyping members by email, so invite your team first with the same email addresses. Anyone without a matching member keeps their original name and gets no account.
  • Private stays private. Internal notes come in as private notes: never visible to the customer — not in the widget, not over the socket, not in transcripts or notification emails.
  • Customers are not “verified”. Imported people are contacts and imported conversations belong to imported visitors that are never online and never verified. In IsTyping “verified” means the widget proved who is chatting with a signature at chat time (see the WHMCS addon guide); an address that sat in another system is not that proof.
  • Erased people stay erased. Anyone erased on request in IsTyping is on the suppression list: an import skips their contact and their conversations entirely and counts them as “erased on request”.
  • One at a time, resumable. One import per website runs at a time. You can pause, resume or cancel it. It survives an IsTyping restart and continues where it stopped. When the source keeps rate limiting, the run pauses itself instead of failing; resume it later.
  • Errors don’t stop the run. A record that cannot be read or written is skipped and listed in the error log (view it or download it as CSV); everything else continues.
  • Re-running never duplicates. Every source record is mapped to its IsTyping record. A conversation that someone used in IsTyping since the import only gets new messages appended; its status and assignment are never rewritten.

The importer is part of the plan: when your plan does not include it, past imports stay readable but no new one can start.

Sources at a glance

Source Contacts Conversations Canned replies Help center What you need
WHMCS Clients and sub-contacts Support tickets with replies and internal notes Predefined replies Not available (WHMCS has no API for the knowledgebase) An API credential; this server’s IP on the WHMCS allow-list
Crisp People with an email Chats with messages, notes and files Shortcuts (pasted) Articles of one language A REST API token and the website ID
Intercom Users and leads with an email Conversations with replies, notes and bot messages Macros Articles of one language An access token and your data region
Zendesk End-users with an email Tickets from every channel with public and internal comments Shared macros with a reply text Articles of one language An admin’s OAuth client (or, until April 30, 2027, an API token) and your subdomain
Freshdesk Contacts with an email Tickets with replies and private notes (archived tickets are not available) Canned responses Published solution articles An admin’s API key and your subdomain
Help Scout Customers with an email Email, phone and chat conversations with notes Saved replies of every inbox Published Docs articles (needs the optional Docs API key) An app (App ID and Secret)
LiveChat Customers with an email Archived chats with private messages and files Canned responses Not available (no help center in the LiveChat API) A personal access token and its account ID

Attachments are copied for every source, within the usual size and type limits; a file that cannot be copied leaves a marker in the message. Your team is matched to members here by email; nobody gets an account created. Imported people are never marked “verified”, and an import never unsubscribes a contact who already exists here. Coming from tawk.to or another tool: see “Coming from something else?” below.

WHMCS

Many hosting companies answer customers through WHMCS’s own support tickets and keep their client list there. The WHMCS importer reads both through WHMCS’s official External API, from your own server.

Create an API credential

You need WHMCS 7.2 or later (API credentials). WHMCS 8.x is recommended: attachments need 7.10 or later and matching staff to your team needs 7.7 or later; older versions import everything else.

  1. In WHMCS, open System Settings → API Roles (WHMCS 7: Setup → Staff Management → API Roles) and create a role, for example “IsTyping import”, that allows these actions:
    • GetAdminDetails — checking the connection and the version.
    • GetClients, GetClientsDetails — contacts. GetContacts adds sub-contacts (optional).
    • GetTickets, GetTicket — tickets. GetTicketNotes (optional) is used on versions whose GetTicket does not return notes. GetTicketAttachment (optional) copies attachments.
    • GetSupportDepartments (optional) — department names.
    • GetAdminUsers (optional) — matching staff replies to your team by email.
    • GetTicketPredefinedCats, GetTicketPredefinedReplies — predefined replies.
    • WhmcsDetails, GetConfigurationValue (optional) — the version and your company name, shown by the check.
  2. Open System Settings → API Credentials, generate a credential for an active admin user with that role, and copy the identifier and secret.
  3. WHMCS only answers API calls from allowed IP addresses. Add this server’s IP address under System Settings → General Settings → Security → API IP Access Restriction (WHMCS 7: Setup → General Settings → Security). If you would rather not, set $api_access_key in WHMCS’s configuration.php and enter that key as the API access key in the import form; WHMCS then skips the allow-list for calls that carry it.

Already connected WHMCS? If Settings → Integrations → WHMCS is set up, the import form offers Use the connected WHMCS. It uses that saved credential on the server; nothing is sent back to your browser. Make sure that credential’s API role also allows the actions above.

Check and run

  1. In Settings → Import, choose WHMCS, then either use the connected WHMCS or enter the WHMCS URL (the address of your client area, where includes/api.php lives), the identifier and the secret.
  2. Click Check connection. It shows your company name, the WHMCS version, how many clients, tickets and predefined replies there are, and how many staff match a member here. It also names every problem:
    • “WHMCS rejected the API credential” — wrong identifier or secret, or the admin user is disabled.
    • “WHMCS refused this server’s IP address” — add the address to the API IP allow-list (step 1.3). When WHMCS mentions the address in its answer, the check shows it so you can copy it.
    • “The API role does not allow …” — the named action is missing from the role. The resources that need it are switched off until you allow it and check again.
    • “There is no WHMCS API at …” — the URL is not your WHMCS address.
  3. Choose what to import and set the options:
    • Conversations updated from / to — an optional date range, by the ticket’s last reply.
    • Keep open if active within N days — default 7. Open tickets that have been quiet for longer come in resolved, so old tickets do not flood your open inbox.
    • Time zone of your WHMCS server — WHMCS stores dates without a time zone. Pick the zone your WHMCS server runs in (it defaults to this website’s time zone) so times come in right.
    • Copy attachments — on by default. Files are copied into IsTyping (10 MB per file; executables, HTML and SVG are not copied).
    • Max requests per minute — default 120. Lower it if your WHMCS server gets slow during the import.
  4. Optionally run a dry run, then click Start import.

What comes across from WHMCS

WHMCS IsTyping
Client with a valid email Contact (keyed by email): name, company, phone, country, city, client notes, segments whmcs and client, and custom data whmcs_client_id, whmcs_status (Active, Inactive, Closed), whmcs_client_since, language, currency, group and custom field values (whmcs_custom_<field id>). A contact that already exists only gets its empty fields filled.
Client sub-contact Contact with segments whmcs and contact and whmcs_client_id of its client.
Marketing email consent WHMCS 8 records an opt-in: a client without it comes in unsubscribed from campaigns when the import creates the contact; a contact that already exists here keeps its subscription. WHMCS 7’s opt-out is an explicit unsubscribe and always applies. Someone unsubscribed on either side stays unsubscribed.
Support ticket One email conversation per ticket, with the subject and the original created and last-reply times. Replying to it in IsTyping goes out by email once the email channel is set up. A private note at the top records the ticket number, subject, department, priority and status, so searching the inbox for ABC-123456 or the subject finds it. The visitor data keeps whmcs_ticket, whmcs_ticket_id, whmcs_client_id, whmcs_department, whmcs_priority and whmcs_status.
Customer reply (including the opening message) Message from the customer.
Staff reply Message from your team: from the member whose email matches the WHMCS admin user, otherwise under the staff member’s WHMCS name.
Internal ticket note Private note (never shown to the customer). Files attached to a note are linked inside the note.
Ticket status Closed (or a custom status called Resolved, Completed or Cancelled) → resolved. Any other status is open: pending until staff replied, then unresolved; open tickets quiet for longer than “keep open” days → resolved.
Department The IsTyping inbox department with the same name, if you created one; otherwise a tag with the department name.
Ticket flagged to a staff member Assigned to the matching member.
Customer rating of a staff reply The conversation’s rating (the latest one).
Attachment A file in the conversation. When it cannot be copied — removed in WHMCS, WHMCS older than 7.10, a blocked file type, copying switched off or the permission missing — the message says “📎 name — attachment not imported (why)”.
Predefined reply Shortcut named after the reply (Refund policy → /refund-policy, collisions get a suffix such as hello-2), with its category as the tag. WHMCS merge tags such as [NAME] stay as text; edit those shortcuts afterwards.

Why imported WHMCS clients are not “verified”. WHMCS knows each client’s email, so it is tempting to mark them verified. IsTyping does not: “verified” means that the person chatting right now proved their address, through the signature the WHMCS addon adds when a client is logged in to your client area. An imported contact is a record, not a proven chat session, and an imported ticket’s visitor can never chat. So the WHMCS side panel treats imported conversations like any unverified address and shows its warning before private billing data. WHMCS’s own “email verified” flag is kept as whmcs_email_verified for reference only.

Not imported from WHMCS: knowledgebase articles and announcements (the WHMCS API has no knowledgebase action; recreate the articles in the help center), products, services, invoices and domains (the WHMCS integration shows them live beside the conversation instead), the ticket log, escalation rules, ticket CC addresses, staff accounts, and clients without a valid email address.

How long it takes. About one API request per client, one per ticket and one per attachment, plus one per page of 100 clients, contacts or tickets. At 120 requests per minute, 3,000 clients and 5,000 tickets take about 70 minutes.

Crisp

The Crisp importer reads a Crisp workspace through Crisp’s REST API.

Create a Crisp API token

  • Workspace token (recommended): sign in to Crisp as the workspace owner (only owners can generate tokens), open Settings → Workspace Settings → Advanced configuration → API Token and click Generate token. Copy the identifier and the key right away; Crisp shows them only once. It allows 10,000 requests per day.
  • Plugin token (Crisp Marketplace): create a Private plugin at https://marketplace.crisp.chat, ask a production token with read access to the website:conversation:sessions, website:conversation:messages, website:people:profiles, website:people:data, website:people:subscriptions, website:people:statistics, website:operators, website:helpdesk:locales and website:helpdesk:articles scopes, install the plugin on your website and choose Plugin token in the form. The default quota is 5,000 requests per day.

You also need your Crisp website ID: the UUID in your Crisp dashboard URLs (app.crisp.chat/website/<website ID>/…).

Check and run

In Settings → Import, choose Crisp, paste the identifier, key and website ID and click Check connection: it shows the Crisp website name, how many people there are, how many Crisp operators match a member here, and the help center languages. Then choose the resources, a date range, “keep open” days, the help center language, whether to copy attachments, and the request budget (default 60 per minute), and start.

At 60 requests per minute, 3,000 people and 5,000 conversations take 4–5 hours and about 16,000 requests — more than a day’s quota for a workspace token. When Crisp keeps refusing requests, the run pauses itself; resume it the next day.

What comes across from Crisp

Crisp IsTyping
People profile with an email Contact: name, phone, company, avatar, segments, custom data, notepad → notes, unsubscribed.
Conversation One conversation per Crisp session, with device, browser, locale, IP and geo, and crisp_session_id in the visitor data. Status, assignment, blocked state and times are kept; email-origin conversations become email conversations.
Text, file, animation, audio Messages and files.
Note Private note.
Picker, field, carousel A readable text version; bot messages appear as “Automated”.
Unknown message types A private note placeholder — never dropped silently, never shown to visitors.
Shortcuts Shortcuts. Crisp’s public API documents no shortcuts route, so paste them in the form, one per line as bang,text,tag (quotes for commas, \n for a line break).
Help center (one language) Categories and articles, drafts and hidden articles as drafts, images copied.

Not imported from Crisp: browsing history and live visitors, campaigns, chatbot scenarios and triggers, Crisp analytics, people without an email, other help center languages, and edit history.

On your first real Crisp run, start with a dry run and compare the counts with Crisp; then open a long conversation and check the order and times of its messages, that a note is marked Private note, and that files open.

Help Scout

The Help Scout importer reads a Help Scout account through its official Inbox API 2.0, and — with a second, optional credential — the Docs API for help articles.

Create an app (and, for articles, find the Docs API key)

  1. In Help Scout, click your avatar → Your Profile → My apps → Create My App. The redirection URL can be any placeholder address: the import uses the client credentials flow, which needs no redirect. Copy the App ID and App Secret.
  2. Create the app as an Administrator or the Account Owner. A Help Scout app acts as the user who created it, so it sees only the inboxes and customers that user can see. That user also needs the Access API permission (Manage → Users → the user → Permissions → Other Features), and the plan must include API access.
  3. Only for help articles: open Your Profile → Security and Access and copy the Docs API key. It is a separate credential (and needs the “Docs” permission and the Standard, Plus or Pro plan). Without it, the import works for everything else and help articles are simply not offered.

Check and run

  1. In Settings → Import, choose Help Scout, enter the App ID and App Secret (and the Docs API key if you want articles) and click Check connection. It shows the inbox names (Help Scout does not expose a company name through the Inbox API; the Docs site’s company name is used when the Docs key is given), how many customers, conversations, inboxes, saved replies and published articles there are, and how many Help Scout users match a member here. It also names every problem:
    • “Help Scout rejected the App ID or App Secret” — check both under My apps.
    • “Help Scout refused API access” — the app’s user lacks the Access API permission, or the plan has no API access.
    • “The user who created the app may not read this part of Help Scout” — a permission is missing (the message names it). The resource that needs it is switched off until you fix it and check again.
    • “Help Scout rejected the Docs API key” — help articles are switched off for this run; everything else still imports.
    • No Docs API key — help articles are not offered (“Help articles need the Docs API key…”).
  2. Choose what to import and set the options: a date range (by the conversation’s last update), Keep open if active within N days (default 7: quieter open conversations come in resolved), Copy attachments (on; 10 MB per file, executables, HTML and SVG are not copied) and Max requests per minute (default 120; Help Scout’s real limit depends on your plan and is shared with everything else using your account’s API — the importer slows down by itself on a 429).
  3. Optionally run a dry run, then click Start import. To run again later (Run again (only new data)), enter the credentials again, with the same App ID.

What comes across from Help Scout

Help Scout IsTyping
Customer with a valid email Contact: name, company (organization), phone, job title, location, background → notes, the first website, customer properties (helpscout_prop_<slug>), segment helpscout, helpscout_customer_id. A customer with several emails becomes one contact with the first address; the others are kept as helpscout_other_emails, never as extra contacts. A contact that already exists only gets its empty fields filled.
Marketing consent Help Scout records none. A customer who is new here comes in unsubscribed from campaigns (a support relationship is not an opt-in); a contact that already exists, or was imported before, is left exactly as it is.
Conversation One conversation per Help Scout conversation, with subject, original created and last-message times, the inbox as the IsTyping department of the same name when you created one (otherwise a tag), the Help Scout tags, and the assignee when a member has that email. A private note at the top records the number, subject, inbox, status, type and tags, so searching the inbox for #4001 or the subject finds it. The visitor data keeps helpscout_conversation, helpscout_conversation_id, helpscout_customer_id, helpscout_inbox, helpscout_status and helpscout_type.
Type Email and phone conversations become email conversations (a reply goes out by email once the email channel is set up; a phone call is shown as “📞 Phone call”). Chat (Beacon) conversations stay chats.
Customer message Message from the customer.
Team reply Message from your team: from the member whose email matches the Help Scout user, otherwise under the user’s Help Scout name (no account is created).
Note Private note (never visible to the customer). Files attached to a note are linked inside the note.
Status closed → resolved. pending (waiting for the customer) → unresolved. active → pending until a team member replied, then unresolved. Conversations quiet for longer than “keep open” days → resolved.
Customer rating The conversation’s rating: great 5 stars, okay 3, not good 1 (with the comment).
Attachment A file in the conversation. When it cannot be copied — flagged by Help Scout’s virus scan, larger than 10 MB, a blocked file type, copying switched off — the message says “📎 name — attachment not imported (why)”.
Saved reply Shortcut named after the reply (Refund policy → /refund-policy, collisions get a suffix such as hello-2), the inbox as its tag. The same reply kept in several inboxes is imported once. Help Scout variables such as {%customer.firstName%} stay as text; edit those shortcuts afterwards.
Docs article (published) Help center article, images copied. One public collection: its categories become the categories; several: “Collection › Category”. An article with unpublished changes comes in as its published version.

Decisions you may want to know about.

  • Line items skipped. Help Scout’s status / assignment / inbox-change lines (and workflow runs) are not imported as timeline events: the end result is on the conversation, and the line’s text is written from the API caller’s point of view (“You assigned this conversation to …”). The count is shown as “skipped messages”.
  • Spam, deleted and draft conversations are skipped and counted in the run’s note; so are unsent message drafts and hidden threads.
  • Forwarded conversations. The thread that carries the forwarded content is kept as a private note; the pointer thread on the original is skipped.
  • Unknown thread types (Help Scout adds some over time) are kept as a private note, never dropped and never shown to the customer.
  • Private Docs collections are never imported, so private content cannot become public by accident; articles that are not published are skipped.
  • Not “verified”. As with every source, imported customers are records, not proven chat sessions.

Not imported from Help Scout: customers without an email, workflows, saved reply folders, reports, Beacon settings, user accounts (invite your team first — they are matched by email), snoozes, custom fields, unpublished Docs articles, article revisions and view counts.

How long it takes. 1 request per page of 50 customers, 1 per page of 25 conversations, at least 1 per conversation for its threads (25 per page) and 1 per attachment, plus 1 per saved reply and 1 per Docs article. At 120 requests per minute, 5,000 conversations with 1,000 attachments take about an hour.

Run it twice. Run again (only new data) asks Help Scout only for customers and conversations modified since the last completed import (modifiedSince, a day of slack), and reads a conversation’s threads again only when its status, update times, assignee, tags, thread count, subject or inbox changed. Saved replies and articles are refreshed every time; attachments already copied are not fetched again.

LiveChat

The LiveChat importer reads a LiveChat account (LiveChat is now part of the Text platform; its documentation lives at text.com, the product keeps its name here) through LiveChat’s Agent Chat, Configuration and Customer Data Platform APIs, from your own server.

Create a personal access token

  1. In LiveChat, open Settings → API access → Personal access tokens and choose + New token. An administrator account is needed for the chat scopes. A token is tied to the account that created it.
  2. Tick these scopes (LiveChat cannot add scopes to a token later, so create a new token if one is missing):
    • chats--all:ro — the archived chats (required). chats--access:ro also works, but only sees chats of the groups of the account that made the token.
    • customers:ro — the customer list for contacts (required for contacts).
    • canned_responses--all:ro (or canned_responses--groups:ro) — canned responses for shortcuts (optional).
    • agents--all:ro — matching agents to your members by email (optional).
    • agents-bot--all:ro — recognising bots (optional).
    • groups--all:ro — group names (optional).
    • accounts--my:ro — the organization name the check shows (optional).
  3. Create the token and copy the account ID and the token — LiveChat shows them once. Enter the token itself, not the Base64 value.

LiveChat counts every API request against your plan: 10,000 a month on Essential, 20,000 on Growth (more can be bought). The importer reads 100 chats or customers per request, so 3,000 customers and 5,000 chats take roughly 30 requests for the customers, 50 to 100 for the chat pages, and one more for each chat that has several conversations (see below). Files are downloaded from LiveChat’s file host, not through the API. When LiveChat keeps refusing requests, the run pauses itself; resume it later.

Check and run

In Settings → Import, choose LiveChat, enter the account ID and the token and click Check connection. It shows the organization name (when accounts--my:ro is allowed and there is one organization), roughly how many archived chats, customers with an email and canned responses there are, and how many agents match a member here. It names every problem:

  • “LiveChat rejected the account ID or token” — wrong account ID or token.
  • “The token lacks the scope …” — the named scope is missing: the resource that needs it is switched off until you create a new token with it. A missing optional scope (agents, bots, groups) only becomes a warning.
  • “LiveChat says this account is served from another data region” — the importer follows the region LiveChat names; the message only appears when that does not work either.
  • “Could not reach LiveChat” — a network problem on this server.

Then choose what to import, an optional date range (by the date a conversation of a chat started), whether to copy files (10 MB each; executables, HTML and SVG are not copied) and the request budget (default 60 per minute), and start. A dry run reads everything and writes nothing.

What comes across from LiveChat

LiveChat IsTyping
Customer with an email Contact: name (a placeholder like “Customer 4821” is not a name), phone, avatar, city and country of the latest visit, customer fields and session fields as custom data, segments livechat (and vip for LiveChat’s VIP level), livechat_customer_id, chat and visit counts. A customer merged from several identities (same email) is one contact. A contact that already exists only gets its empty fields filled.
Marketing consent LiveChat records none for email, and a chat is not an opt-in: a customer who is new here comes in unsubscribed from campaigns; a contact that already exists, or was imported before, is left exactly as it is.
Archived chat One chat conversation per LiveChat chat — all of its conversations (threads) in order, with the original times. Where a new conversation starts in the same chat, the timeline shows “A new conversation started in this chat”. A private note at the top records the chat id, the number of conversations and the group. Archived chats are finished, so every conversation comes in resolved (LiveChat’s archive has no open state).
Customer message Message from the customer.
Agent message Message from your team: from the member whose email matches the agent, otherwise under the agent’s LiveChat name (no account is created). The member who wrote the last visible message becomes the assignee.
Bot, AI Agent, welcome message An automated message (shown with the “Automated” marker). A bot is an agent that list_bots names, or — when that scope is missing — an agent without an email address.
Private message (visible to agents only) Private note (never visible to the customer). A private file is linked inside the note.
Pre-chat and post-chat form answers Private notes (“Pre-chat form”, “Post-chat form” with each question and answer), because a form can hold anything the customer typed. A Subject field also becomes the conversation’s subject.
Rich message A readable text version (title, subtitle and the buttons, ☑ for the one the customer chose).
File A file in the conversation, copied into IsTyping. When it cannot be copied (blocked type, larger than 10 MB, copying off, download failed) the message shows “📎 name: link” instead.
System messages Agent joined / left, chat transferred, reassigned and banned appear as timeline events; ratings, transcripts and archiving notices are left out (the rating is kept as the rating).
Other events Empty forms, custom events, system events (tickets, summaries, store events) and deleted messages are skipped and counted; an unknown future event type is kept as a private note.
Tags The thread tags of every conversation, as IsTyping tags (up to 10).
Group The IsTyping inbox department with the same name, if you created one; otherwise a tag with the group name. “All groups” has no department.
Rating LiveChat’s thumbs: up is 5 stars, down is 1 star, with the comment. The latest rated conversation wins.
Visitor data Email, name, phone, avatar, IP, browser, operating system and location of the chat, livechat_chat_id, livechat_customer_id, livechat_threads, livechat_group, the page the chat started on (start_url), the referrer, the customer’s session fields and the chat’s custom variables. The visitor is never “verified”.
Canned response Shortcut. LiveChat triggers a canned response by its tags (its “Shortcuts” field), so the first tag becomes the shortcut name (Refund policy → /refund-policy, collisions get a suffix such as hello-2); without tags the first words of the text do. The tag of the shortcut is the response’s group (when it has one) or its second tag. Private canned responses (those of one agent) are not imported.

Not imported from LiveChat: help articles (LiveChat has no help center in its API), tickets, campaigns, greetings, chatbot and AI Agent set-up, reports, e-commerce orders and carts, customers without an email, private canned responses, chats still active in LiveChat (the archive only has finished ones), and history your LiveChat plan does not let the API read (the check cannot see this; the run notes how many conversations LiveChat hid).

On your first real run, start with a dry run and compare the counts with LiveChat; then open a chat that had two conversations and check the order and times, that private messages and form answers are marked Private note, and that files open.

Run it again (only new data). Conversations that started since the last completed import (minus a day of margin) are fetched, and a chat that gained a new conversation gets only its new messages. Customers are filtered by their last activity. A full run refreshes everything, including tags, ratings and customers changed since.

Freshdesk

The Freshdesk importer reads a Freshdesk helpdesk through Freshdesk’s official REST API (v2): contacts, tickets with every reply and private note, canned responses and knowledge base articles. The API details, the limits it works within and what is unverified are in the Freshdesk importer reference.

Get your API key

  1. Sign in to Freshdesk as an admin and click your profile picture → Profile settings.
  2. Copy Your API Key (below the password section). Freshdesk uses it as the user name of the API request, so nothing else is needed. Canned responses and the agent list are admin-only in Freshdesk: with an agent’s key those parts are skipped and the check says so.
  3. Note your helpdesk’s subdomain: the acme of acme.freshdesk.com. Custom domains do not work with Freshdesk’s API, and only the subdomain is accepted — never another address.

Official docs: https://developers.freshdesk.com/api/#authentication.

Check and run

  1. In Settings → Import, choose Freshdesk, enter the subdomain and the API key and click Check connection. It shows the helpdesk’s name and plan, roughly how many tickets, contacts, canned responses and knowledge base categories there are, how many agents match a member here, and names every problem:
    • “Freshdesk rejected the API key” — wrong or copied incompletely; take it from Profile settings again.
    • “There is no Freshdesk helpdesk at …” — the subdomain is wrong.
    • “Freshdesk refuses API access …” — the account is suspended, its trial has expired, or the agent is locked out or over the agent limit. Sign in to Freshdesk to see which.
    • “Freshdesk says API access is not available …” — the plan or portal settings do not include the API.
    • “The API key’s agent cannot read …” — that agent lacks the right (usually admin); the resources that need it are switched off until you use an admin’s key and check again.
    • “Freshdesk is rate limiting …” — wait a minute and check again.
  2. Choose what to import and set the options:
    • Conversations updated from / to — an optional date range, by the ticket’s last activity.
    • Keep open if active within N days — default 7. Open tickets that have been quiet for longer come in resolved, so old tickets do not flood your open inbox.
    • Copy attachments — on by default (10 MB per file; executables, HTML and SVG are not copied).
    • Max requests per minute — default 40. Freshdesk limits the whole account (a trial allows 50 a minute; Growth 100, Pro 400, Enterprise 700; some plans are quoted at 3,000 or 5,000 an hour). The import needs about two requests per ticket, so at 40 a minute 5,000 tickets take about 4 hours; raise it only as far as your plan allows. When Freshdesk answers “too many requests” the import waits as long as Freshdesk says and slows down; if it keeps refusing, the run pauses itself and you resume it later.
  3. Optionally run a dry run, then click Start import.

What comes across from Freshdesk

Freshdesk IsTyping
Contact with an email Contact (keyed by email): name, phone (or mobile), company, job title, address, notes (the contact’s description), tags as segments (plus freshdesk), and custom data freshdesk_contact_id, freshdesk_active, language, time zone and custom fields (freshdesk_cf_<field>). A contact that already exists only gets its empty fields filled. Blocked and deleted contacts and contacts without an email are not imported.
Marketing consent Freshdesk records none, and writing to a helpdesk is not an opt-in: a contact the import creates comes in unsubscribed from campaigns; a contact that already exists here keeps its subscription.
Ticket One email conversation per ticket, with the subject and the original created and last-activity times. Replying to it in IsTyping goes out by email once the email channel is set up. A private note at the top records the ticket number, subject, group, priority, status, type and source, so searching the inbox for #12345 or the subject finds it. The visitor data keeps freshdesk_ticket, freshdesk_requester_id, freshdesk_group, freshdesk_priority, freshdesk_status, freshdesk_type and freshdesk_source.
Ticket description and customer replies Messages from the customer. A ticket an agent opened for the customer (outbound email) starts with the agent’s message.
Agent reply (and public note) Message from your team: from the member whose email matches the Freshdesk agent, otherwise under the agent’s Freshdesk name (no account is created).
Private note Private note (never visible to the customer). Files attached to a note are linked inside the note.
Status Resolved and Closed, and custom statuses named like them → resolved. Any other status (Open, Pending, Waiting on Customer, Waiting on Third Party, custom ones) is open: pending until an agent replied, then unresolved; open tickets quiet for longer than “keep open” days → resolved.
Group The IsTyping inbox department with the same name, if you created one; otherwise a tag with the group name.
Tags Tags of the conversation (up to 8 per ticket).
Responder Assigned to the matching member (an agent without a matching member leaves it unassigned).
Satisfaction rating The conversation’s rating (the newest one): “extremely happy” and “very happy” 5 stars, “happy” 4, neutral 3, “unhappy” 2, “very unhappy” and “extremely unhappy” 1, with the comment. Needs the survey feature; skipped otherwise.
Attachment A file in the conversation, fetched right after the ticket is read (Freshdesk’s download links expire). When it cannot be copied — an expired or refused link, a blocked file type, more than 10 MB, copying switched off — the message says “📎 name — attachment not imported (why)”.
Canned response Shortcut named after the response (Refund policy → /refund-policy, collisions get a suffix such as hello-2), with its folder as the tag. Personal folders are left out. Freshdesk placeholders in double curly braces such as ticket.requester.first_name stay as text; edit those shortcuts afterwards.
Solution article Help center article (images copied), only published articles in folders visible to everyone. Category › Folder (› Sub-folder) becomes one category, e.g. “Getting started › Setup”. Drafts and articles in folders for logged-in users, agents or selected companies are skipped and counted. Only the helpdesk’s main language.

Why imported contacts are not “verified”. Freshdesk’s own active flag means the contact confirmed their address in Freshdesk. IsTyping’s “verified” means the person chatting right now proved their address with a signature at chat time, so an imported contact is a record, not a proven chat session; freshdesk_active is kept for reference only.

Not imported from Freshdesk:

  • Archived tickets. Freshdesk archives closed tickets that have been inactive for 120 days (on plans where archiving is on) and its API has no way to list them, so they cannot be imported. The check warns about it. If you need that history, export it from Freshdesk and import the contacts as a CSV.
  • Spam and deleted tickets, translations of articles, automations, SLAs, time entries, forums, agent accounts and contacts without an email address.

How long it takes. About two API requests per ticket (the ticket and its conversations) plus one per 100 contacts, one per page of 100 tickets and one per attachment. At the default 40 requests a minute 3,000 contacts and 5,000 tickets take about 4 hours.

Zendesk

The Zendesk importer reads a Zendesk account through Zendesk’s official REST API: end-users, every ticket with its public replies and internal notes, shared macros and the Help Center (Guide). Tickets from every channel — email, web form, API, chat and messaging (WhatsApp, the web widget …) — come in as email-like conversations: a chat or messaging ticket’s transcript is its comments, so it reads in order, and a reply from IsTyping goes out by email once the email channel is set up (or not at all for a customer without an address).

Create an OAuth client (or, until April 30, 2027, an API token)

You need a Zendesk admin: Zendesk’s incremental exports — the only way to list every ticket including archived ones, and every end-user — are for admins only. With an agent, macros and the Help Center still import; the check says what is missing.

  • OAuth client (recommended). In Zendesk, open Admin Center → Apps and integrations → APIs → OAuth clients and add a client: any name, client kind Confidential, no redirect URL needed. If you limit its allowed scopes, allow read. Save and copy the Identifier and the Secret (shown once). The import asks Zendesk for a read-only token with these (and asks again when it expires); it acts as the admin who created the client. Guide: https://developer.zendesk.com/documentation/authentication/oauth-migration/.
  • Email and API token. Zendesk is removing API tokens: tokens unused for 30 days are deleted since July 28, 2026 and all API tokens stop working on April 30, 2027 (https://support.zendesk.com/hc/en-us/articles/4408889192858). Until then, turn on API token access and add a token under Admin Center → Apps and integrations → APIs, and enter it with the email of the admin it acts as.

Also note your subdomain: the acme of acme.zendesk.com. Only that one word is accepted (a pasted address is reduced to it); requests only ever go to https://<subdomain>.zendesk.com.

Check and run

  1. In Settings → Import, choose Zendesk, enter the subdomain, pick OAuth client or API token, fill in its two fields and click Check connection. It shows the account’s name, who you are signed in as, roughly how many tickets, end-users, organizations, shared macros and agents there are, how many agents match a member here, and the Help Center languages with their article counts. It names every problem:
    • “Zendesk rejected the OAuth client” — wrong identifier or secret. “… must be Confidential” — the client’s kind. “… not allowed the “read” scope” — loosen its allowed scopes.
    • “Zendesk rejected the email and API token” — wrong email or token, or API token access is off in Admin Center.
    • “There is no Zendesk account at …” — the subdomain is wrong.
    • “… is an agent, not an admin” — tickets and end-users are switched off until you use an admin’s credentials; “… belong to an end user” — not an agent at all.
    • “… has no Help Center this user can read” — Help Center is not enabled; leave help articles out.
  2. Choose what to import and set the options:
    • Conversations updated from / to — an optional date range, by the ticket’s last update (the export starts at the “from” date).
    • Keep open if active within N days — default 7. Open tickets that have been quiet for longer come in resolved.
    • Help center language — e.g. en or en-us; empty = the Help Center’s default language.
    • Copy attachments — on by default (10 MB per file; executables, HTML and SVG are not copied).
    • Max requests per minute — default 100. Zendesk limits the whole account: 200 a minute on Team, 400 on Growth and Professional, 700 on Enterprise, 2,500 with the High Volume add-on — and 10 a minute for the ticket export (20 for the user export). Leave room for your other integrations. When Zendesk answers “429 too many requests” the import waits as long as Zendesk’s Retry-After says and slows down; if it keeps refusing, the run pauses itself and you resume it later.
  3. Optionally run a dry run, then click Start import.

What comes across from Zendesk

Zendesk IsTyping
End-user with an email Contact (keyed by email): name, phone, organization → company, notes and details → notes, photo, tags as segments (plus zendesk), and custom data zendesk_user_id, zendesk_organization_id, zendesk_external_id, time zone, locale, zendesk_suspended and user fields (zendesk_<field key>). A contact that already exists only gets its empty fields filled. Agents and admins (your team), deleted users and end-users without an email are not contacts.
Marketing consent Zendesk records none, and writing to a support desk is not an opt-in: a contact the import creates comes in unsubscribed from campaigns; a contact that already exists here keeps its subscription — the same rule as for WHMCS clients without an opt-in.
Ticket One email conversation per ticket, with the subject and the original created and last-update times. A private note at the top records the ticket number, subject, group, priority, status, type, channel and tags, so searching the inbox for #1234 or the subject finds it. The visitor data keeps zendesk_ticket, zendesk_requester_id, zendesk_status, zendesk_priority, zendesk_type, zendesk_group, zendesk_channel (email, web, chat, native_messaging, …) and zendesk_organization.
Public comment by the requester or another end-user Message from the customer. A comment by someone else on the customer side (a CC) starts with their name.
Public comment by an agent Message from your team: from the member whose email matches the Zendesk agent, otherwise under the agent’s Zendesk name (no account is created).
Internal comment Private note (never visible to the customer). Files attached to it are linked inside the note.
Status solved and closed → resolved. new and open: pending until an agent replied publicly, then unresolved. pending (waiting on the customer) and on-hold → unresolved. Open tickets quiet for longer than “keep open” days → resolved. With custom ticket statuses, their category decides.
Group The IsTyping inbox department with the same name, if you created one; otherwise a tag with the group name.
Tags Tags of the conversation (up to 9 per ticket).
Assignee Assigned to the matching member (an agent without a matching member leaves it unassigned).
Satisfaction rating The conversation’s rating: “good” 5 stars, “bad” 1 star, with the comment (offered but unanswered = no rating).
Attachment A file in the conversation. When it cannot be copied — deleted in Zendesk, flagged as malware by Zendesk, a refused download (accounts that require sign-in to open attachments), a blocked file type, more than 10 MB, copying switched off — the message says “📎 name — attachment not imported (why)”.
Shared macro with a reply text Shortcut named after the macro (Billing::Refund policy → /refund-policy with the tag Billing; collisions get a suffix such as greeting-2). Only the macro’s reply text (its “comment” action) comes across; its other actions (status, assignee, tags …) have no shortcut equivalent. Macros without a reply text, personal macros and inactive macros are skipped and the skipped ones counted. Zendesk placeholders in double curly braces such as ticket.requester.first_name stay as text; edit those shortcuts afterwards.
Help Center article (one language) Help center article, images copied. Category › Section (› Sub-section) becomes one category, e.g. “Getting started › Accounts”. Drafts stay drafts; articles visible only to signed-in users or some user segments in Zendesk come in as drafts (so nothing private becomes public here) and are counted — publish them when ready. Other languages are listed, not imported.

Why imported contacts are not “verified”. Zendesk’s own verified flag (the end-user confirmed their address in Zendesk) is kept as zendesk_email_verified for reference only. IsTyping’s “verified” means the person chatting right now proved their address with a signature at chat time; an imported contact is a record, not a proven chat session.

Not imported from Zendesk: agent accounts, groups’ memberships, triggers, automations, views, SLAs, ticket forms and custom ticket fields’ values, side conversations, ticket audits and the event log, call recordings, deleted tickets, personal macros, other Help Center languages, community posts, and end-users without an email address (their tickets still come in, without an address).

Run it again. “Only new” starts Zendesk’s export a day before the last completed import, so only tickets and end-users changed since then are listed at all; a listed ticket whose status, last update, subject, assignee, group, tags, priority, type and rating are unchanged is not read again. A full run walks everything and still duplicates nothing.

How long it takes. One request per ticket for its comments (one more per 100 comments), one per 1,000 tickets or end-users of the exports, one per 100 unknown users or organizations, plus one per attachment download. At 100 requests a minute 5,000 tickets take about an hour; on very large accounts the ticket export’s own limit (10 a minute, 1,000 tickets each) is not the bottleneck.

Intercom

The Intercom importer reads an Intercom workspace through Intercom’s REST API, version 2.18 (the newest stable version when the importer was built, and the first one that can page through every message of a long conversation).

Create an access token

  1. Sign in to Intercom as an admin who can see every conversation. A token only sees the conversations its teammate can see (Intercom applies the teammate’s inbox access on top of the app’s permissions), so a token of a teammate with limited access imports only part of your history.
  2. In Intercom’s Developer Hub, create an app for your own workspace, open Configure → Authentication and copy the Access Token (https://developers.intercom.com/docs/build-an-integration/learn-more/authentication).
  3. Make sure the app has these permissions (https://developers.intercom.com/docs/build-an-integration/learn-more/authentication/oauth-scopes):
    • Read admins — checking the connection (workspace name, region) and matching teammates to your team.
    • Read and list users and companies — contacts, their tags, notes and companies.
    • Read conversations — conversations and macros.
    • Read and List articles — Help Center collections and articles.
    • Read tags (optional) — tag names; “Read and list users and companies” covers them too.
  4. Note where your workspace is hosted: United States, Europe or Australia. Each has its own API address (api.intercom.io, api.eu.intercom.io, api.au.intercom.io).

Check and run

  1. In Settings → Import, choose Intercom, pick the workspace region and paste the access token.
  2. Click Check connection. It shows the workspace name and id, how many users and leads, conversations and Help Center articles there are, how many teammates match a member here, and the Help Center languages. It also names every problem:
    • “Intercom rejected the access token” — the token is wrong, was regenerated, or its app or workspace is suspended. Copy it again.
    • “This access token belongs to … an Intercom workspace hosted in …” or “This workspace is hosted in …, but … is selected” — choose the region the check names.
    • “The access token’s app is missing the … permission” — add the named permission to the app. The resources that need it are switched off until you do and check again.
    • “… not available on your Intercom plan” — Intercom refuses that part of the API for your plan.
    • “Intercom does not accept API version 2.18” — Intercom refused the version the importer is built for; contact support.
  3. Choose what to import and set the options: an optional date range (by the conversation’s last update), keep open if active within N days (default 7), the Help Center language, whether to copy attachments, and the request budget (default 300 per minute).
  4. Optionally run a dry run, then click Start import.

What comes across from Intercom

Intercom IsTyping
User or lead with a valid email Contact (keyed by email): name, phone, avatar, company (the first one), Intercom notes → notes, segments intercom, user or lead and every tag, custom attributes as custom data (objects as text), and intercom_contact_id, intercom_role, intercom_external_id, country, region, city, language, intercom_signed_up_at, UTM source / campaign and referrer. Intercom’s “email verified” is kept as intercom_email_verified for reference only: imported people are never verified here. A contact that already exists only gets its empty fields filled.
Email consent Unsubscribed from emails, a spam complaint, or an opt-out of any subscription type → unsubscribed from campaigns here. Intercom records no explicit opt-in, so everyone else is left as they are. A hard bounce is kept as intercom_hard_bounced.
Conversation One conversation per Intercom conversation, with its original created and last-update times, the title (or email subject) as the subject, and intercom_conversation_id, intercom_contact_id, intercom_state, intercom_priority, intercom_channel and the page it started on in the visitor data. Email conversations become email conversations; Messenger and every other channel (SMS, WhatsApp, social) become chats.
Opening message and customer replies Messages from the customer, with their files.
Teammate reply Message from your team: from the member whose email matches the Intercom teammate, otherwise under the teammate’s Intercom name (no account is created).
Bot and Fin replies, automated outbound messages, quick-reply buttons Automated messages (shown as “Automated” to your team, under your team name to the customer); the buttons as a readable list.
Note Private note (never shown to the customer). Files attached to a note are copied and linked inside the note.
Assignment, close, reopen, snooze Timeline events (“Assigned to … in Intercom”, “Closed in Intercom”, …). A text on such a part (for example a message written when closing) comes in as a private note, never as a customer message.
Part types the importer does not know A private note placeholder — never dropped silently, never shown to the customer. Redacted parts are skipped.
State closed → resolved. open and snoozed → pending until a teammate replied, then unresolved; open conversations quiet for longer than “keep open” days → resolved. The snooze is kept as intercom_state.
Assignee and team Assigned to the member whose email matches the Intercom teammate. The team becomes the IsTyping inbox department with the same name, if you created one; otherwise a tag.
Conversation tags, rating Tags (created when missing); the rating (1–5 stars with the remark).
Attachment and inline image A file in the conversation. When it cannot be copied — larger than 10 MB, a blocked file type, the download failed — the message says “📎 name — attachment not imported (why)”; with copying switched off it keeps Intercom’s link (Intercom’s links are signed and may stop working).
Macro Shortcut named after the macro (Order Status Update → /order-status-update, collisions get a suffix such as -2). Intercom placeholders in double curly braces such as user.name stay as text; edit those shortcuts afterwards.
Help Center collection Category; a nested collection is named “Parent › Child”.
Help Center article (one language) Article (published or draft), its Markdown body (or the HTML converted), images copied. With a language chosen, articles without a translation into it are skipped and counted. Several Help Centers are imported together.

Not imported from Intercom: tickets (and back-office tickets, ticket states and attributes), side conversations, outbound messages that nobody answered, series, workflows and bots, reports, events, segments and company records (only the company name on the contact), conversation attributes, other Help Center languages, teammate accounts, and people without a valid email address.

Run again (only new data). Users and leads updated since the last completed import, and conversations updated since then, are read again (both searches filter on Intercom’s update time, with a day of margin). A conversation whose state, update time, assignee, team, tags and rating are unchanged is not fetched again. A full run (not “only new”) refreshes every contact and every changed conversation.

How long it takes. One request per page of 150 contacts or conversations, one per conversation (plus one per 500 messages), up to three per contact with notes, companies or more than 10 tags, and one per attachment. At 300 requests per minute, 3,000 contacts and 5,000 conversations take about 30–50 minutes.

Run it twice: early, then right before you switch

Run the import once early and check the result while you keep using your old tool. Right before you switch over, open Past imports and click Run again (only new data). Enter the credentials again (they are never kept) or use the connected WHMCS.

  • WHMCS: tickets whose status, last reply, subject, department, priority or flag changed are fetched again and get their new replies and notes; unchanged tickets are not fetched. Clients that were already imported are skipped. A full run (not “only new”) refreshes everything, including changed clients and notes added to otherwise unchanged tickets.
  • Crisp: conversations updated since the last completed import are fetched; people are filtered by their creation date, so a changed profile is only updated by a full run.
  • Freshdesk: tickets active since the last completed import (a day earlier) are listed; of those only tickets whose status, responder, group, subject or last activity changed are fetched again and get their new replies and notes. Contacts updated since then are updated. A full run (not “only new”) refreshes everything.

Coming from something else?

  • Any tool that exports a spreadsheet: import its contacts as a CSV file in Contacts → Import (with a dry run and column mapping). Conversation history needs an importer for that tool.

Coming from tawk.to

What you can bring over from tawk.to today is your contacts. Your chat history and tickets cannot be imported, and Settings → Import has no tawk.to source.

Contacts (CSV).

  1. In tawk.to, open your property’s Contacts → People and click Export at the top right. tawk.to emails you a link to a CSV file with the property’s contacts.
  2. In IsTyping, open Contacts → Import and upload the file. Check the column mapping before you run it. The usual contact columns are recognised: email (also “Primary Email”), first and last name, phone (also “Primary Phone”), organization (→ company) and tags (→ segments). Any other column (city, country, job title and so on) becomes custom data, or choose Don’t import for it. tawk.to does not publish the export’s columns, so look at the file. It may not contain every field you see on a contact in tawk.to.
  3. Set Add segment to every imported contact to, say, tawk, so you can find these contacts later. Then run a dry run and start.

Contacts without an email address are skipped, and imported contacts are never “verified”. The export has no marketing-consent column, so new contacts count as subscribed to campaigns. If they never agreed to marketing email, add an Unsubscribed column set to yes before you upload. A file can only ever unsubscribe someone, never re-subscribe them.

Why chat history and tickets can’t come across. An importer reads your old tool’s data through its published API, the same way the WHMCS and Crisp importers do. tawk.to doesn’t publish one for this:

  • tawk.to’s REST API is “available by request”. You fill in a request form, and approved accounts receive the documentation privately. There is no public reference for listing past chats, tickets, contacts, shortcuts or knowledge-base articles, so an importer can’t be built and tested against it.
  • In the dashboard, admins can export chats from the Inbox, up to 50 at a time, and tickets. Each export arrives as an emailed link to a ZIP of JSON files (ticket links stay valid for 30 days). tawk.to doesn’t document what’s inside those files, and IsTyping can’t read them.
  • tawk.to’s webhooks only send new events (a chat starting or ending, its transcript, a new ticket). They can’t send history.

Keep your tawk.to exports as an archive. To have past conversations at hand in IsTyping, start using it for new conversations alongside tawk.to for a while before you switch.

Shortcuts and knowledge base. tawk.to documents no export for either. Recreate your shortcuts in Settings → Shortcuts and your articles in the help center.

tawk.to’s own pages say all of this (read on 2026-11-10): REST API https://help.tawk.to/article/rest-api, exporting chats https://help.tawk.to/article/exporting-messages, exporting tickets https://help.tawk.to/article/exporting-tickets, exporting contacts https://help.tawk.to/article/exporting-contacts, webhooks https://developer.tawk.to/webhooks/.