message.comDevelopers

Migrate from Intercom to message.com

Both platforms ship a chat widget plus an inbox. The migration is mostly a snippet swap and a contact export-import. message.com adds the unified inbox model (chat plus tickets plus calls in one queue), drops per-seat pricing, and includes AI in the base tier.

What stays the same

  • Snippet-style install. Async <script> tag before </body>. Single line of HTML.
  • Identify pattern. Both expose an identify call on a global object. message.com's is Message.identify({ email, userId, ... }).
  • HMAC verification. Both support a server-side user-hash. See Identify logged-in users.
  • Conversation model. Conversations have status, assignment, tags. The dashboard surface is similar.

What is different

  • No per-seat tax. message.com prices on engagement and channels, not per agent. Add the team without paying per head.
  • Unified inbox. Chat, email tickets, and phone calls land in one inbox keyed off the same conversation primitive. Intercom routes those to separate product lines.
  • AI included. Smart Hold, AI Receptionist, agent assist, and KB-grounded replies in the base plan, not as a separate Fin add-on.
  • Phone built in. Carrier-grade SIP runs on our own voice infrastructure, included in the platform. No bolt-on telephony plan to buy.
  • Different API surface. Same conventions (JWT bearer auth, JSON, cursor pagination) but different paths. See REST conventions.

1. Sign up and set up

  1. Sign up at app.message.com/register.
  2. Run through onboarding (90 seconds). Brand colour, site URL, channels.
  3. Copy the snippet from Settings → Chats → Installation.

2. Export Intercom data

From Intercom:

  1. Contacts. Data → People → Export. CSV download. Most Intercom plans allow this.
  2. Conversations. Data → Conversations → Export. JSON or CSV. Large workspaces export by month.
  3. Custom attributes. Definitions live in Settings → Data → People data. Note any non-default attributes you need to recreate.
  4. Tags and saved replies. Export or copy manually; usually faster to recreate the active ones than transform CSV.

Intercom's Articles (help center content) export separately. If you use Intercom Articles, see Knowledge base vs help center for the message.com KB pattern.

3. Import contacts

Two options:

  • CSV. In message.com, go to Settings → Visitors → Import. Upload the contacts CSV.
  • API. For larger workspaces, script the upsert.
import.ts
// Upsert exported Intercom contacts into message.com visitors
import fs from "node:fs";

const contacts = JSON.parse(fs.readFileSync("intercom-contacts.json", "utf8"));

for (const c of contacts) {
  await fetch("https://app.message.com/api/v1/visitors/upsert", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.MESSAGE_API_KEY}`,
      "Content-Type": "application/json",
      "Idempotency-Key": c.id,
    },
    body: JSON.stringify({
      email: c.email,
      name: c.name,
      externalId: `intercom:${c.id}`,
      attributes: c.custom_attributes,
    }),
  });
}

4. Swap the snippet

On every page that loads Intercom:

  1. Remove the Intercom snippet (the (function(){})() block from widget.intercom.io).
  2. Paste the message.com snippet.
HTML
<script>
  (function(d,s,o){
    var j=d.createElement(s);j.async=1;j.src='https://app.message.com/widget.js';
    j.dataset.workspace=o;
    d.head.appendChild(j);
  })(document,'script','YOUR_WORKSPACE_ID');
</script>

5. Re-implement identify

Wherever you currently call Intercom('update', { email, user_id, ... }), switch to Message.identify({ email, userId, ... }). The shape is similar; user_id becomes userId, snake_case attributes become camelCase. See JavaScript API.

6. Set up tickets and phones (optional)

Cutover checklist

  • Test snippet on a staging URL. Confirm launcher loads and identify fires.
  • Send a test chat. Reply from the message.com inbox. Confirm round trip.
  • Test on mobile. Both portrait and landscape.
  • Confirm CSP allowlist updated (app.message.com on script-src, connect-src, wss://app.message.com).
  • Run dual-load (Intercom + message.com snippets simultaneously) for one week. Monitor inbound volume on both.
  • After dual-load shows clean handoff, remove the Intercom snippet from prod.
  • Update email signatures and footer links pointing to old Intercom-hosted help center.
  • Cancel the Intercom subscription. Save 30 days of grace period for any final exports.
  • Archive the Intercom export bundle off-platform for compliance.

Common pitfalls

  • Per-seat sticker shock relief. Easy to forget the message.com pricing model. Add agents freely; the bill stays predictable.
  • Custom attribute naming. Intercom defaults to snake_case; message.com defaults to camelCase. Pick one and convert on import.
  • Saved replies / macros. Not exportable from Intercom. Recreate manually in Settings → Saved replies.
  • Articles / help center. If customers link to Intercom-hosted articles, set up redirects from your old Help Center URL to new KB pages.
  • Webhooks. If you have Intercom webhooks firing into your backend, point them at message.com's outgoing webhook endpoint instead. See Webhooks overview.