Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsCustom Action (Dart)

Intercom Messenger

To add Intercom Messenger live chat to a FlutterFlow app, use a Custom Action built on the official `intercom_flutter` pub.dev package. Three Dart actions handle initialization, user identification, and opening the chat widget. The SDK renders a native overlay on iOS and Android — it does not work in FlutterFlow's web preview, so you must test with a real device build.

What you'll learn

  • How to add the `intercom_flutter` pub.dev package as a FlutterFlow dependency
  • How to write three Custom Actions: init, user login, and displayMessenger
  • How to call the init action at app launch using the Action Flow Editor
  • How to trigger the Messenger from a support button or FAB
  • Why native SDK Custom Actions require a real build and how to test them
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate14 min read45 minutesMarketingLast updated July 2026RapidDev Engineering Team
TL;DR

To add Intercom Messenger live chat to a FlutterFlow app, use a Custom Action built on the official `intercom_flutter` pub.dev package. Three Dart actions handle initialization, user identification, and opening the chat widget. The SDK renders a native overlay on iOS and Android — it does not work in FlutterFlow's web preview, so you must test with a real device build.

Quick facts about this guide
FactValue
ToolIntercom Messenger
CategoryMarketing
MethodCustom Action (Dart)
DifficultyIntermediate
Time required45 minutes
Last updatedJuly 2026

Adding Intercom Live Chat to Your FlutterFlow App

Intercom Messenger is different from Intercom's REST API for contacts and conversations. The Messenger is the live chat widget — the floating button that pops open a full-screen support panel where users can message your team in real time. Getting this widget into a FlutterFlow app does not involve API Calls or JSON Path: it requires the `intercom_flutter` package, which wraps Intercom's native iOS and Android SDKs in Dart code that FlutterFlow can call through Custom Actions.

The three-action pattern is straightforward: you initialize the SDK once at app launch with your Intercom App ID and platform-specific API keys (iOS SDK key and Android API key), you call a user-identification action after the user logs in so Intercom knows who is chatting, and then you call `displayMessenger()` whenever the user taps a Help or Support button. The Messenger appears as a native overlay on top of your app — your FlutterFlow UI does not need to host any chat UI widgets. Intercom handles message delivery, operator assignment, and the full conversation thread.

One important caveat: because `intercom_flutter` is a native SDK, it does not render inside FlutterFlow's browser-based Run mode or web preview. When you tap the action in preview, nothing will happen. You must download your project and build it for iOS or Android (or use FlutterFlow's Test Mode on a connected device) to see the Messenger appear. Plan your testing workflow accordingly before starting. Pricing for Intercom includes the Messenger in its seat-based plans — verify current plan details on intercom.com, as Messenger access depends on your workspace tier.

Integration method

Custom Action (Dart)

Intercom Messenger is an embedded native SDK, not a REST API — you want the live chat overlay to appear inside your Flutter app, not a data feed. The integration uses the `intercom_flutter` package from pub.dev, added as a Custom Code dependency in FlutterFlow. Three Custom Actions wrap the SDK: one initializes it at app launch, one identifies the logged-in user so conversations are attributed correctly, and one calls `displayMessenger()` to open the chat panel when a user taps a support button. Because this is a native SDK, it compiles into iOS and Android binaries and requires a real device or APK to test.

Prerequisites

  • An Intercom workspace on a plan that includes Messenger (verify current plan requirements at intercom.com)
  • Your Intercom App ID (from Intercom Settings → Installation → Mobile)
  • iOS SDK key and Android API key from the same Installation page in Intercom Settings
  • A FlutterFlow project on a plan that supports Custom Code and Custom Actions
  • Access to a physical iOS or Android device (or Xcode Simulator / Android emulator) for testing — the Messenger will not appear in FlutterFlow's web preview

Step-by-step guide

1

Collect your Intercom credentials and add the pub.dev dependency

Log into your Intercom workspace and navigate to Settings → Installation. Choose Mobile and select your platform (iOS or Android). You will find three credentials you need: App ID (the same for both platforms), iOS API Key (labeled 'iOS SDK Key'), and Android API Key. Copy all three to a safe place. The iOS and Android API keys are client SDK keys designed to be embedded in mobile apps — they are not secret API keys in the same sense as a backend token, but you should still keep them in your Custom Action parameters rather than hardcoding them as plain strings scattered through your code. Next, open your FlutterFlow project and navigate to the left sidebar. Click Custom Code, then look for the Dependencies section (or go to Settings → App Settings → Pub Dependencies depending on your FlutterFlow version). Click + Add Dependency and type `intercom_flutter`. Enter the latest stable version number — check pub.dev/packages/intercom_flutter for the current version (for example, `4.2.1`). Click Save. FlutterFlow will register this dependency; it will be included in the pubspec.yaml when the project is compiled. You do not need to run `flutter pub get` manually — FlutterFlow handles that during the build process.

pubspec.yaml
1// pubspec.yaml dependency (FlutterFlow adds this for you)
2dependencies:
3 intercom_flutter: ^4.2.1 // check pub.dev for the latest stable version

Pro tip: Check the `intercom_flutter` pub.dev page for the minimum Flutter and Dart SDK versions it requires, and confirm your FlutterFlow project's Flutter version is compatible before adding the dependency.

Expected result: The `intercom_flutter` dependency appears in your FlutterFlow Custom Code dependencies list. No errors appear in the FlutterFlow dependency panel.

2

Create the initIntercom Custom Action

In the FlutterFlow left nav, click Custom Code → + Add → Action. Name it `initIntercom`. In the code editor, write the Dart function that initializes the Intercom SDK. The function calls `Intercom.instance.initialize()` with three parameters: `appId`, `iosApiKey`, and `androidApiKey`. These should be defined as Action Arguments (function parameters) in FlutterFlow's argument panel so you can pass them from your page without hardcoding values in the Dart file. In the Arguments tab of the Custom Action editor, add three String arguments: `appId`, `iosApiKey`, and `androidApiKey`. Then write the implementation. This action must run before any other Intercom call — call it once at the very start of your app. The best place is on the splash screen or the very first page's On Page Load action, as the final step (or a parallel action) after any other initialization. If your app uses Supabase Auth or Firebase Auth, initialize Intercom after authentication is ready so the SDK starts in an identified or anonymous state correctly. After pasting the code, click Save. FlutterFlow will validate the Dart syntax — fix any red underlines before proceeding.

init_intercom.dart
1// Custom Action: initIntercom
2import 'package:intercom_flutter/intercom_flutter.dart';
3import 'package:flutter/foundation.dart' show defaultTargetPlatform, TargetPlatform;
4
5Future<void> initIntercom(
6 String appId,
7 String iosApiKey,
8 String androidApiKey,
9) async {
10 await Intercom.instance.initialize(
11 appId,
12 iosApiKey: iosApiKey,
13 androidApiKey: androidApiKey,
14 );
15}

Pro tip: You can store your App ID and API keys as App Constants in FlutterFlow's App Settings → App Constants, then pass them as the argument values when you wire this action in the Action Flow Editor — cleaner than typing them on every page.

Expected result: The `initIntercom` Custom Action saves without Dart errors and appears in your Custom Code list. The three string arguments (appId, iosApiKey, androidApiKey) show in the Arguments panel.

3

Create the loginIntercomUser Custom Action

After initialization, Intercom needs to know who the current user is so conversations in your Intercom inbox are attributed to real contacts rather than anonymous sessions. Create a second Custom Action named `loginIntercomUser`. Add three String arguments: `userId`, `userEmail`, and optionally `userName`. In the Dart code, call `Intercom.instance.loginIdentifiedUser()` with `userId` and optionally update the user's details with `Intercom.instance.updateUser()`. This action should be called right after the user successfully logs in to your app — place it in the Action Flow Editor on your Login page's On Login Success event, after your auth action (Supabase Login, Firebase Sign In, etc.) completes. If a user logs out, you should also call `Intercom.instance.logout()` — create a third small action `logoutIntercomUser` that does exactly that. Pass the user's real ID and email from your auth system (Supabase user ID, Firebase UID) so Intercom correctly links conversations to contacts in your workspace. Custom attributes (like plan type or onboarding step) can be passed via `Intercom.instance.updateUser(userAttributes: Attributes(customAttributes: {'plan': 'pro'}))` inside this same action if needed.

login_intercom_user.dart
1// Custom Action: loginIntercomUser
2import 'package:intercom_flutter/intercom_flutter.dart';
3
4Future<void> loginIntercomUser(
5 String userId,
6 String userEmail,
7 String userName,
8) async {
9 await Intercom.instance.loginIdentifiedUser(
10 userId: userId,
11 );
12 await Intercom.instance.updateUser(
13 email: userEmail,
14 name: userName,
15 );
16}
17
18// Companion action: logoutIntercomUser
19Future<void> logoutIntercomUser() async {
20 await Intercom.instance.logout();
21}

Pro tip: Call `loginIntercomUser` after every successful login — even if the user was previously identified. Intercom handles session continuity internally; calling it again with the same user ID is safe and ensures the user is always identified when they open the Messenger.

Expected result: The `loginIntercomUser` Custom Action saves successfully. In your Action Flow Editor, you can select it from the Custom Actions list and see three input fields for userId, userEmail, and userName.

4

Create the showMessenger action and wire it to a support button

The third and final Custom Action is the simplest: `showMessenger`. It calls `Intercom.instance.displayMessenger()`, which opens the Intercom chat overlay. Create the Custom Action with no arguments and paste the one-liner implementation. Once saved, go to the page or widget where you want the support button to live. A common pattern is a floating action button (FAB) on the home screen or a 'Get help' TextButton in an app drawer. Click on the button widget, open its Actions panel on the right side of FlutterFlow, click + Add Action, and select Custom Action → showMessenger. That is the entire configuration — one action, no parameters. To also close the Messenger programmatically (for example, if your app needs to redirect away), you can create a fourth action `hideMessenger` that calls `Intercom.instance.hideMessenger()`. You can optionally add an unread message badge to your support button by reading `Intercom.instance.unreadConversationCount()` in a Custom Function and binding the result to a badge widget on the button — this gives users a visual cue that your support team has replied.

show_messenger.dart
1// Custom Action: showMessenger
2import 'package:intercom_flutter/intercom_flutter.dart';
3
4Future<void> showMessenger() async {
5 await Intercom.instance.displayMessenger();
6}
7
8// Optional: Custom Function to get unread count
9import 'package:intercom_flutter/intercom_flutter.dart';
10
11Future<int> getIntercomUnreadCount() async {
12 return await Intercom.instance.unreadConversationCount();
13}

Pro tip: Place the support FAB outside your main page scaffold's body by using FlutterFlow's 'Floating Action Button' property at the scaffold level — this way the button persists across tab navigation without re-triggering the action.

Expected result: The showMessenger Custom Action is wired to your button. In the Action Flow Editor, the button's on-tap actions list shows showMessenger as a single action with no arguments required.

5

Test on a real device build (not web preview)

Custom Actions using native SDKs like `intercom_flutter` do not run inside FlutterFlow's browser-based Run mode or the in-browser Preview panel. When you click the support button in web preview, nothing will happen and you will not see an error — the action simply silences itself when the native bridge is unavailable. To test the real Messenger, you have two options: use FlutterFlow's Test Mode on a connected physical device (Settings → Test Mode → select your connected device), or download the project source code and build it locally with Xcode or Android Studio. If you are using FlutterFlow's Test Mode, connect your phone via USB, enable developer mode and USB debugging, and select the device in FlutterFlow. Tap your support button in the app running on the device — you should see the Intercom Messenger slide up as a native overlay. For iOS builds, verify that the Info.plist includes usage descriptions for camera and photo library if you plan to allow file sharing in chat (Intercom's Messenger can share attachments). For Android, confirm the minSdkVersion in your FlutterFlow project's Android settings is compatible with the `intercom_flutter` package requirements (check the package's README on pub.dev). If you receive a MissingPluginException, rebuild the app from scratch — sometimes Hot Reload does not register new native plugins; a full rebuild is required.

Pro tip: If you get a 'MissingPluginException' when calling any Intercom method, do a full clean rebuild of your app — native plugins cannot be hot-reloaded. In FlutterFlow Test Mode, tap the red stop button and restart the test session entirely.

Expected result: On a real iOS or Android device, tapping the support button causes the Intercom Messenger to slide up as a native overlay. The Intercom workspace receives the conversation attributed to the logged-in user.

Common use cases

SaaS app with in-app customer support chat

A B2B SaaS startup builds their FlutterFlow mobile companion app with an embedded Intercom Messenger so users can message support without leaving the app. After a user logs in with Supabase Auth, the app calls the identify action so every conversation in the Intercom workspace shows the user's name, email, and plan.

FlutterFlow Prompt

Add a floating support button (FAB) to the bottom-right corner of the home screen. When tapped, it opens the Intercom Messenger overlay so users can chat with the support team.

Copy this prompt to try it in FlutterFlow

E-commerce app with order-based support conversations

An e-commerce Flutter app shows a 'Need help?' button on the order detail screen. Tapping it opens Intercom Messenger, pre-identified with the user's email and a custom attribute for the order number — so the support agent immediately sees context about which order the customer is asking about.

FlutterFlow Prompt

On the order detail page, add a Help button. When tapped, identify the user in Intercom with their email and an order_number custom attribute, then open the Messenger.

Copy this prompt to try it in FlutterFlow

Onboarding flow with contextual live chat

A fintech app's multi-step onboarding wizard includes a persistent 'Chat with us' link in the bottom bar. If a user gets stuck during KYC document upload, tapping the link opens Intercom Messenger. The identify action passes the current onboarding step as a custom attribute so support agents see exactly where the user dropped off.

FlutterFlow Prompt

During the onboarding flow, show a 'Get help' text button at the bottom of each step. Tapping it should open Intercom Messenger with the current step name passed as a custom user attribute.

Copy this prompt to try it in FlutterFlow

Troubleshooting

Tapping the support button in FlutterFlow web preview does nothing

Cause: The `intercom_flutter` package is a native SDK that uses platform channels — these do not exist in the browser environment that FlutterFlow's preview uses.

Solution: This is expected behavior. Test on a real iOS or Android device using FlutterFlow Test Mode or a local build. There is no workaround for the preview environment — native SDKs simply cannot run there.

MissingPluginException: No implementation found for method 'initialize' on channel 'com.intercom.intercom_flutter'

Cause: The native plugin was added after the app was last built, and a Hot Reload/Restart did not register the new platform channel.

Solution: Stop the running app completely and perform a full rebuild. In FlutterFlow Test Mode, end the test session and start a new one. If building locally with Xcode or Android Studio, run a clean build (`flutter clean` then rebuild). Hot reloads cannot register new native plugins.

Intercom shows 'Anonymous' user instead of the logged-in user's name and email

Cause: The `loginIntercomUser` action was not called after login, or it was called before `initIntercom` completed.

Solution: Ensure your Action Flow sequence is: (1) initIntercom on app start, then (2) loginIntercomUser immediately after successful authentication. Check your Login page's action list and confirm loginIntercomUser appears after the Supabase/Firebase sign-in action. Also verify you are passing the correct userId — it must be a stable, non-changing string unique to the user (Supabase UID or Firebase UID works well).

Build fails on iOS with 'ld: framework not found IntercomSDK' or similar linker error

Cause: The `intercom_flutter` package version requires a specific iOS deployment target or a CocoaPods update, and the Xcode project has not been properly configured.

Solution: Check the `intercom_flutter` pub.dev README for the minimum iOS deployment target (usually iOS 13 or 14). In FlutterFlow's iOS settings (Settings → iOS App Settings), ensure the deployment target matches. If building locally, run `pod install` in the ios/ directory after adding the dependency, then rebuild. If using FlutterFlow's export, the generated project should handle this automatically on first build.

Best practices

  • Call `initIntercom` on app start before any other Intercom method — treat it like initializing your analytics or auth library, not something to lazy-load per screen.
  • Always call `loginIntercomUser` with a stable user ID (Supabase UID or Firebase UID) immediately after authentication — this links every conversation to the correct contact in your Intercom workspace.
  • Call `logoutIntercomUser` when the user signs out to clear the session — otherwise a different user on the same device will see the previous user's conversation history.
  • Keep the Messenger trigger on a clearly labeled button ('Get help', 'Support', or a chat-bubble icon) in a consistent location — a FAB in the bottom-right is the most discoverable placement.
  • Pass custom attributes (plan tier, current screen, onboarding step) in `updateUser` so support agents see context before they respond — this dramatically improves first response quality.
  • Test the full flow on both iOS and Android devices before shipping — platform-specific SDK behaviors can differ, and the `intercom_flutter` package may have platform-specific minimum version requirements.
  • Do not rely on the unread message count badge from a polling timer — use `Intercom.instance.unreadConversationCount()` only on app foreground events to avoid unnecessary SDK calls.
  • Keep the Intercom App ID and platform API keys in FlutterFlow's App Constants rather than typing them inline in action parameters — this makes it easy to switch between staging and production Intercom workspaces.

Alternatives

Frequently asked questions

Does this integration work for Flutter web, not just iOS and Android?

The `intercom_flutter` package has limited web support and its behavior depends on the specific package version. FlutterFlow's web build uses the browser renderer, and native SDK features often degrade or break in web contexts. For reliable Messenger support across platforms, use Intercom's JavaScript integration for your web app separately — the Custom Action approach is best for native iOS and Android apps.

Is the Intercom App ID or iOS/Android API key a secret that needs to be hidden?

These are client SDK keys — they are designed to be embedded in mobile apps and are not equivalent to server-side secret API keys. However, someone with your App ID could theoretically create fake Intercom sessions. Best practice is to keep them in App Constants rather than committing them as plain strings in shared code, and to enable identity verification in Intercom (which requires a separate HMAC hash generated server-side) if your app serves sensitive data.

Can I use Intercom's Articles (knowledge base) widget instead of live chat?

Yes. The `intercom_flutter` package exposes `Intercom.instance.displayHelpCenter()` to open the Articles / Help Center overlay, and `Intercom.instance.displayArticle(articleId)` to open a specific article. You can create a separate Custom Action for each of these and wire them to help-icon buttons on any screen in your app.

How do I handle Intercom push notifications for new messages?

Intercom can deliver push notifications when a support agent replies to a conversation. On iOS, this requires configuring push notification certificates in your Intercom workspace and adding push notification permissions to your FlutterFlow app (Settings → Permissions → Push Notifications). On Android, you need to pass the Firebase Cloud Messaging (FCM) token to Intercom using `Intercom.instance.sendTokenToIntercom(token)` in your Custom Action. If you need a managed setup for this, RapidDev builds FlutterFlow integrations including push notification flows — book a free scoping call at rapidevelopers.com/contact.

What happens to existing Intercom conversations when the user logs out and back in?

When you call `logoutIntercomUser`, Intercom clears the session on the device. When the user logs in again and you call `loginIntercomUser` with the same userId, Intercom restores their conversation history — the conversations are stored in the Intercom workspace by user ID, not on the device. Anonymous conversations started before login are not automatically merged with the identified user's history.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire FlutterFlow integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.