⚠️ Important Update: Freshchat Classic Apps Must Be Updated for Freshdesk Omni Compatibility

Dear Developers,

Apps built for Freshchat Classic use modules, placeholders, and product events specific to that environment. With Freshdesk Omni, the underlying product architecture has changed, and the same app code cannot run interchangeably across both environments.

If you migrate to Freshdesk Omni, Classic apps may fail to validate, install without rendering, or break at runtime when reading agent, conversation, or group context.

This post outlines what is changing, how to migrate, and a practical checklist based on patterns we used while merging Freshchat and Freshdesk builds into a single Omni-ready app.


What is changing?

Freshchat Classic Freshdesk Omni (Platform 3.0)
"product": { "freshchat": { ... } } "modules": { "chat_conversation": { ... } }
Platform 2.0 / 2.3 Platform 3.0
Classic-only placeholders Omni-compatible module placeholders
loggedInAgent in chat contexts loggedInAgent (chat) + loggedInUser (tickets)

Reference: Platform 3.0 chat_conversation migration guide


What you may see

  • fdk validate fails: "product" is not supported in platform-version 3.0
  • App installs but icon never appears: manifest still targets Classic placeholders
  • Runtime errors in ticket view: app always calls loggedInAgent instead of loggedInUser
  • Group mapping always fails: wrong group ID field for Omni vs standalone Freshchat

Migration checklist

1. Enable Platform 3.0 validation

fdk config set --scope local global_apps.enabled true

Update engines to FDK 10.x and Node 24.x.

2. Replace product.freshchat with modules

Before (Classic):

{
  "platform-version": "2.3",
  "product": {
    "freshchat": {
      "location": {
        "conversation_message_editor": {
          "url": "index.html",
          "icon": "styles/images/icon1.svg"
        }
      }
    }
  }
}

After (Omni):

{
  "platform-version": "3.0",
  "modules": {
    "common": {
      "requests": {
        "listFreshchatGroups": {},
        "listFreshdeskGroups": {},
        "whichAccount": {}
      }
    },
    "chat_conversation": {
      "location": {
        "conversation_message_editor": {
          "url": "index.html",
          "icon": "styles/images/icon.svg"
        }
      }
    },
    "support_ticket": {
      "location": {
        "ticket_top_navigation": {
          "url": "index.html",
          "icon": "styles/images/icon.svg"
        }
      }
    }
  },
  "engines": {
    "node": "24.11.0",
    "fdk": "10.1.2"
  }
}

Include support_ticket only if your app also needs ticket surfaces.

3. Move request templates to modules.common.requests

Template names in manifest.json must match config/requests.json exactly.

4. Detect runtime context (ticket vs conversation)

async function getRuntimeContext(installParams) {
  try {
    const conversationInfo = await client.data.get("conversation");
    const groupId = installParams.isStandalone
      ? conversationInfo.conversation.assigned_group_id || ""
      : conversationInfo.conversation.properties.group || "";
    return {
      mode: "conversation",
      referenceId: conversationInfo.conversation.id,
      groupId,
      actor: await getConversationActor(),
    };
  } catch {
    const ticketInfo = await client.data.get("ticket");
    return {
      mode: "ticket",
      referenceId: ticketInfo.ticket.id,
      groupId: ticketInfo.ticket.group_id || "",
      actor: await getTicketActor(),
    };
  }
}

Use loggedInAgent in conversation context and loggedInUser in ticket context.

5. Fix group mapping for standalone vs Omni

Detect account type at install time (whichAccountbundle_type). Standalone Freshchat uses group.id; Omni/bundled accounts may need group.chat_group_id or properties.group. Paginate group APIs; do not rely on the first page.

6. Update stylesheet for Platform 3.0

Replace product-specific CSS with freshworks.css in all frontend HTML files.

7. Validate and test

fdk validate
fdk run
fdk pack

Test in both ticket and conversation surfaces if your app registers both modules.


Key highlights

  • Classic apps are not automatically compatible with Freshdesk Omni
  • Migration requires Platform 3.0 modules, not product.freshchat
  • Omni apps often need dual-module manifests (chat_conversation + support_ticket)
  • Data methods and group ID fields differ between standalone Freshchat and Omni
  • Marketplace publishers should submit an updated Platform 3.0 build for Omni customers

FAQ

Do I need to rebuild from scratch?
Usually no. Update the manifest, placeholders, request declarations, runtime context handling, and stylesheets. Core business logic often stays the same.

Will my Classic installation keep working?
On Freshchat Classic, existing builds may continue to work. After migrating to Freshdesk Omni, treat Classic-targeted apps as incompatible until updated.

Which module do I use for chat UI in Omni?
Use chat_conversation, for example conversation_message_editor. Do not use product.freshchat in Platform 3.0.

Do I always need support_ticket?
Only if the app must also appear in ticket surfaces. Conversation-only apps can ship with chat_conversation alone.

Why does group mapping work in Classic but fail in Omni?
Omni exposes different group identifiers. Detect account type during installation and map IDs accordingly.

Do I need FDK 10.x and Node 24.x?
Strongly recommended for new Platform 3.0 work. See the FDK 10.0.0 announcement.

I published a marketplace app for Freshchat Classic; what now?
Submit an updated Platform 3.0 build with the correct Omni modules and call out Omni compatibility in release notes.

Where can I get help?
Reply here with your manifest.json (redact secrets), the placeholder you expect, any console or validation errors, and fdk validate output.


Next steps

  1. Audit manifests for product.freshchat or Platform 2.x structure
  2. Migrate to platform-version: "3.0" with correct modules
  3. Add runtime context detection if serving both tickets and conversations
  4. Run fdk validate and test in Omni before go-live
  5. Redeploy or republish the updated build

Docs: chat_conversation migration guide · Platform 3.0 what’s new · Announcements

We’re eager to hear your feedback, especially migration pain points, unclear docs, or placeholders that need better guidance.

Regards,
Team Freshworks Developers

Hi @Himanshu_Sharma,

Couple of questions:

1)How do we deal with this in the server side modules to track events like onConversationUpdate.
2) How do we make specific Freshchat API calls to things like add a message to the thread as you need a token to make Freshchat API calls and its not provided in Freshdesk Omni.
3) What if the Freshchat Classic app has already been updated to FDK v3. Will it work.

Thanks

Rob

Hi @RobAtOpinyin, - great questions. Short answers below.

1) Server-side events like onConversationUpdate

In Platform 3.0, chat serverless events belong under modules.chat_conversation, not product.freshchat. Common lifecycle events (onAppInstall, and so on) go under modules.common.

{
  "platform-version": "3.0",
  "modules": {
    "common": {
      "events": {
        "onAppInstall": { "handler": "onAppInstallCallback" }
      }
    },
    "chat_conversation": {
      "events": {
        "onConversationUpdate": { "handler": "onConversationUpdateCallback" }
      }
    }
  }
}

The handler logic in server.js stays largely the same, you mainly move where events are declared.

Important: chat_conversation events are not the same as Freshdesk support_ticket conversation events. In Omni, ticket email threads and live chat are different surfaces with different payloads. If your app listens to chat events, register them on chat_conversation.

Supported chat events in P3: onConversationCreate, onConversationUpdate, onMessageCreate, onAgentActivityCreate.
Docs: chat_conversation product events · onConversationCreate / onConversationUpdate

If you relied on Classic-only events such as onUserCreate / onUserUpdate, check whether they still exist for your use cas, you may need an API-based alternative.


2) Freshchat API calls (for example, add a message) without a runtime token

Correct - Omni does not inject a Freshchat API token into the app runtime. You still call the Freshchat APIs, but authentication must be app-managed:

  1. An admin generates a token under Admin Settings → APIs for Chat (guide)
  2. Store it as a secure iparam during installation
  3. Call the API from serverless via a request template (recommended) or $request.invokeTemplate

Example - post a message:

POST /v2/conversations/{conversation_id}/messages
Authorization: Bearer <secure_iparam_token>

In the event handler, read conversation_id from the event payload and invoke your template. For host resolution in P3 serverless, use payload.currentHost.endpoint_urls rather than assuming a Classic Freshchat domain.

Reference pattern: BYOC / serverless messaging and Freshchat API.


3) If the app is already on “FDK v3” / Platform 3.0 - will it work?

Not automatically. Platform 3.0 alone is not enough.

Scenario Omni-ready?
platform-version: "3.0" + modules.chat_conversation + Omni-compatible placeholders Likely yes — still test payloads and group IDs
platform-version: "3.0" but manifest still uses product.freshchat No
Classic-only events, data methods, or API assumptions unchanged Maybe not — needs review

Quick check: if your manifest still has "product": { "freshchat": ... }, it is not Omni-ready even on FDK 10.x. It must use modules.chat_conversation (and support_ticket too if you need ticket surfaces).


If helpful, share your current manifest.json event block (redact secrets), and we can call out exactly what to move.

Hi @Himanshu_Sharma ,

Thanks for the heads-up!

We have a few questions:

  1. We have to migrate only if we want the application to work on omni?

  2. Is there a deadline or timeline for completing this migration?

  3. Are there any existing skills or can Freddy assist us with the migration process?

Thanks!

Thanks @Himanshu_Sharma.

We have a Freshdesk Omni set up and I can’t find the APIs for chat in the admin settings. The guide link you provided shows screenshots for Freshchat Classic. In the Freshdesk Omni version we have, chats appears as tickets in the Freshdesk UI. There is no UI like Freshchat classic

We are trying to run a custom APP to be able to show the real time status of the agents on a FreshDesk Omni. We are stuck as it shows only for FreshChat/FreshDesk Classic and FreshSales Classic. Let us know how we would be able to move forward with this and whether the API parameters for Agent Status remain the same. Thanks!