Skip to main content
RapidDev - Software Development Agency
flutterflow-integrationsFlutterFlow API Call

Intercom

Connect FlutterFlow to Intercom by adding a Custom Action wrapping the intercom_flutter pub.dev package to embed the in-app Messenger for live chat and support. The Messenger SDK runs natively on iOS and Android but will not work in FlutterFlow's web Test Mode — test on a real device. Server-side Identity Verification (HMAC hash) is required for security and must be generated in a Firebase Cloud Function or Supabase Edge Function, never in Dart code.

What you'll learn

  • How to add the intercom_flutter package as a Custom Action dependency and initialize the Messenger SDK on login
  • Why Identity Verification HMAC must be generated server-side and how to set it up in a Cloud Function
  • How to register identified users with Intercom so conversations are tied to real user accounts
  • How to display the Messenger chat window from a FlutterFlow button action
  • How to proxy Intercom's REST API for user sync and conversation reads using a Bearer access token
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced20 min read60 minutesMarketingLast updated July 2026RapidDev Engineering Team
TL;DR

Connect FlutterFlow to Intercom by adding a Custom Action wrapping the intercom_flutter pub.dev package to embed the in-app Messenger for live chat and support. The Messenger SDK runs natively on iOS and Android but will not work in FlutterFlow's web Test Mode — test on a real device. Server-side Identity Verification (HMAC hash) is required for security and must be generated in a Firebase Cloud Function or Supabase Edge Function, never in Dart code.

Quick facts about this guide
FactValue
ToolIntercom
CategoryMarketing
MethodFlutterFlow API Call
DifficultyAdvanced
Time required60 minutes
Last updatedJuly 2026

Embedding Intercom Messenger in Your FlutterFlow App

Intercom is the support and engagement layer that most serious apps deploy to handle customer questions, onboarding guidance, and proactive outreach. The Messenger widget — the familiar chat bubble in the bottom corner — provides immediate access to live support agents or automated bot flows, with full conversation history tied to the user's account. For FlutterFlow developers, the highest-value feature is embedding this Messenger natively in iOS and Android apps using the intercom_flutter package from pub.dev.

This integration is rated Advanced for a specific reason: Intercom's Identity Verification feature — which prevents users from impersonating each other in the Messenger — requires generating an HMAC (Hash-based Message Authentication Code) using a secret key that must never be in the Flutter client. This HMAC must be computed server-side in a Cloud Function each time a user logs in. Without Identity Verification, malicious users can open the Messenger as any user ID they choose — a serious security risk that Intercom warns about explicitly in their documentation.

The Messenger Custom Action will not run in FlutterFlow's web Test Mode or preview canvas — native SDK calls require a real iOS or Android build. Plan your testing around device builds. Intercom also has a REST API at `https://api.intercom.io` with a 1,000 requests/minute rate limit for standard workspaces, which you can use to sync users and read conversation data into your app via a Bearer access token proxy.

Integration method

FlutterFlow API Call

Intercom in FlutterFlow has two paths. The primary use case — embedding the Intercom Messenger for in-app live chat — uses a Custom Action wrapping the intercom_flutter pub.dev package, which initializes the SDK and displays the chat window natively on iOS and Android. The secondary path — syncing users and reading conversations via the Intercom REST API — uses FlutterFlow API Calls pointing to a proxy that holds the Bearer access token, since the REST API token is a server secret. Both paths require a Cloud Function to generate the Identity Verification HMAC hash server-side.

Prerequisites

  • An Intercom account (paid plan — Intercom has no meaningful free tier for production apps; check current plan pricing)
  • Your Intercom app ID (found in Settings → General) and access token (Settings → Integrations → Developer Hub → Access Token)
  • Your Intercom Identity Verification secret key (Settings → Security → Identity Verification — enable this before going live)
  • A Firebase project with Cloud Functions or a Supabase project with Edge Functions (for generating the Identity Verification HMAC)
  • A FlutterFlow project built with Supabase Auth or Firebase Auth — you need the logged-in user's email or user ID to register them with Intercom

Step-by-step guide

1

Create an Intercom Developer Hub app and collect your credentials

Log in to Intercom and navigate to Settings (bottom-left gear icon). Go to Integrations → Developer Hub → New App. Name the app something like 'FlutterFlow Mobile App'. Once created, you will see several credential types — collect three of them for this integration. First, your App ID: found in Settings → General under 'App ID'. This is a short string like `abc1defg` and is not a secret — it identifies your Intercom workspace in the SDK initialization call and can be embedded in the app. Second, your Access Token: in Developer Hub, click on your app and go to Authentication → Access Token. This is a Bearer secret (a long string starting with `dG9r...`) that grants read/write access to your Intercom data. It must live in your backend proxy — never in a FlutterFlow API Call header or Custom Action Dart code. Third, your Identity Verification Secret Key: navigate to Settings → Security → Identity Verification and enable it. Once enabled, you will see your secret key. This key is used to compute an HMAC hash for each user to prevent impersonation. It is also a server-only secret — never in Dart code. Write down your App ID, Access Token, and Identity Verification Secret in a secure notes file. You will need the App ID in your Flutter Custom Action code, and the other two in your Cloud Function environment variables.

Pro tip: Intercom's Identity Verification is disabled by default but Intercom strongly recommends enabling it for any production app. Without it, any user can impersonate any other user in the Messenger by passing a different user ID. Enable it now, before building the integration.

Expected result: You have your Intercom App ID (not a secret), Access Token (server secret), and Identity Verification Secret (server secret) noted and ready to use in the next steps.

2

Deploy a Cloud Function to generate the Identity Verification HMAC

The Identity Verification HMAC is a cryptographic hash computed from the user's identifier (email or user ID) using your Identity Verification Secret as the signing key. It proves to Intercom that the user was authenticated by your server — not self-reported by the client app. If you skip this step and call Intercom without a valid HMAC, any user can open the Messenger claiming to be any other user. Deploy a Cloud Function (Firebase) or Edge Function (Supabase) that accepts the logged-in user's identifier (email or user ID) and returns the HMAC hash. Store your Identity Verification Secret in the function's environment variables — never in the source code. For Firebase: create a new HTTPS function that receives a POST with `{ user_id: '...' }` or `{ email: '...' }`, computes `HMAC-SHA256(user_identifier, identity_verification_secret)`, and returns `{ user_hash: '...' }`. In FlutterFlow, call this function from a Custom Action during the login flow, store the returned hash in a local state variable, and pass it into the Intercom initialization call. For Supabase: create a Deno Edge Function that does the same computation using the built-in `crypto.subtle.sign()` API. Store the secret in Supabase Secrets (Settings → Edge Functions → Secrets) as `INTERCOM_IDENTITY_SECRET`. This function should be called once per login session, immediately after authentication succeeds, before initializing the Intercom SDK. The returned `user_hash` is not itself a secret — it is specific to this user and changes each time the user logs in with a different session.

index.js
1// Firebase Cloud Function: generate Intercom Identity Verification hash
2const functions = require('firebase-functions');
3const crypto = require('crypto');
4
5exports.intercomUserHash = functions.https.onRequest(async (req, res) => {
6 res.set('Access-Control-Allow-Origin', '*');
7 res.set('Access-Control-Allow-Methods', 'POST');
8 res.set('Access-Control-Allow-Headers', 'Content-Type');
9 if (req.method === 'OPTIONS') { res.status(204).send(''); return; }
10
11 const IDENTITY_SECRET = process.env.INTERCOM_IDENTITY_SECRET;
12 const { user_identifier } = req.body; // email or user ID
13
14 if (!user_identifier) {
15 res.status(400).json({ error: 'user_identifier is required' });
16 return;
17 }
18
19 try {
20 const hash = crypto
21 .createHmac('sha256', IDENTITY_SECRET)
22 .update(user_identifier)
23 .digest('hex');
24
25 res.status(200).json({ user_hash: hash });
26 } catch (err) {
27 res.status(500).json({ error: err.message });
28 }
29});

Pro tip: Call the HMAC function once at login and store the result in a FlutterFlow Page State variable or in a local persistent store. Do not call it on every screen load — the hash does not change within a login session for the same user.

Expected result: Your HMAC Cloud Function is deployed and returns a `user_hash` string when called with a `user_identifier`. Test it from Postman: `POST /intercomUserHash` with body `{ "user_identifier": "test@example.com" }` should return a 64-character hex string.

3

Create a Custom Action to initialize the Intercom SDK and register the user

With the HMAC function deployed, you can now build the FlutterFlow Custom Action that initializes Intercom and registers the current user's identity. This is the step that links the Messenger conversations to real user accounts in your Intercom dashboard. In FlutterFlow, click Custom Code in the left navigation. Click + Add → Action. Name it 'InitializeIntercom'. In the Dependencies field, add `intercom_flutter` — FlutterFlow will resolve the latest compatible version from pub.dev automatically. Set the return type to void (this action has no return value). Add three parameters to the action: `appId` (String — your Intercom App ID), `userId` (String — the logged-in user's identifier, either email or your system's user ID), and `userHash` (String — the HMAC value returned by your Cloud Function in Step 2). In the Dart code area, write the initialization and user registration calls. The action must: call `await Intercom.instance.initialize(appId, iosBundleId: 'com.your.bundle', androidPackageName: 'com.your.package')` then call `await Intercom.instance.loginIdentifiedUser(userId: userId, userHash: userHash)`. If your identifier is an email, use `loginIdentifiedUser(email: email, userHash: userHash)` instead. IMPORTANT: this Custom Action will NOT run in FlutterFlow's web preview canvas or Run Mode on the browser. Native SDK calls only work in actual device builds. In FlutterFlow, go to Settings → Run & Test and either use a real device connected via Run or generate an APK (Android) or TestFlight build (iOS) to test. Do not spend time trying to debug why it 'does not work' in the browser preview — it is expected behavior. Call this Custom Action in the Action Flow immediately after your login action succeeds (after the Supabase or Firebase Auth sign-in action completes), passing the user's ID/email and the HMAC hash you fetched in the previous step.

custom_action.dart
1// FlutterFlow Custom Action: initialize Intercom and register user
2// Dependencies: intercom_flutter
3import 'package:intercom_flutter/intercom_flutter.dart';
4
5Future initializeIntercom(
6 String appId,
7 String userId,
8 String userHash,
9) async {
10 // Initialize the Intercom SDK with your app credentials
11 await Intercom.instance.initialize(
12 appId,
13 iosApiKey: 'ios_sdk_key_from_intercom', // from Intercom Settings → Install
14 androidApiKey: 'android_sdk_key_from_intercom', // from Intercom Settings → Install
15 );
16
17 // Register the identified user with Identity Verification
18 // Use loginIdentifiedUser(email: email, ...) if you identify by email instead
19 await Intercom.instance.loginIdentifiedUser(
20 userId: userId,
21 userHash: userHash,
22 );
23
24 // Optionally set user attributes
25 await Intercom.instance.updateUser(
26 IntercomStatusCallback(
27 onSuccess: () => print('Intercom user updated'),
28 onFailure: (error) => print('Intercom update error: $error'),
29 ),
30 );
31}

Pro tip: The iOS API key and Android API key are different from the Access Token — they are per-platform SDK keys found in Intercom under Settings → Installation → iOS/Android. They are not secrets (they end up in the app bundle by design), unlike the Access Token.

Expected result: The InitializeIntercom Custom Action appears in FlutterFlow's Action Flow Editor under 'Custom Actions'. When called in a login flow and tested on a real device, the user appears in your Intercom dashboard under Contacts with their identifier and HMAC verified.

4

Add a Display Messenger action and wire it to a help button

Once Intercom is initialized and the user is registered, displaying the Messenger is a single SDK call. Create a second Custom Action to open the chat window when the user taps a help or support button. In FlutterFlow, click Custom Code → + Add → Action. Name it 'OpenIntercomMessenger'. Add the same `intercom_flutter` dependency (FlutterFlow will reuse the already-added package). The Dart code is minimal: `await Intercom.instance.displayMessenger();`. Set the return type to void. Now wire this action to a widget in your app. Navigate to any screen where you want the help button — the home screen, a navigation bar, a floating action button, or a specific support screen. Add an icon button or FAB widget. In the widget's Actions panel, click + Add Action → Custom Action → OpenIntercomMessenger. You can also open specific parts of the Intercom interface with other SDK calls: `Intercom.instance.displayHelpCenter()` opens the Help Center article browser, `Intercom.instance.displayMessageComposer(message)` opens the composer pre-filled with a message, and `Intercom.instance.displayConversationsList()` shows all past conversations. Create separate Custom Actions for each of these if your UX requires it. To close the Messenger programmatically (for example, after a certain flow completes), call `Intercom.instance.hideMessenger()` in another Custom Action. This is useful if you want to return the user to a specific screen after they resolve a support conversation. Note: push notification support for Messenger chat replies requires additional native configuration — you must add push notification handling in the iOS AppDelegate and Android Manifest, and register the device token with Intercom via `Intercom.instance.sendTokenToIntercom(token)`. This additional setup is what makes this integration Advanced-rated.

custom_action.dart
1// FlutterFlow Custom Action: open Intercom Messenger
2// Dependencies: intercom_flutter (already added in previous action)
3import 'package:intercom_flutter/intercom_flutter.dart';
4
5Future openIntercomMessenger() async {
6 await Intercom.instance.displayMessenger();
7}
8
9// Alternative: open the Help Center instead
10Future openIntercomHelpCenter() async {
11 await Intercom.instance.displayHelpCenter();
12}
13
14// Alternative: open with a pre-filled message
15Future openIntercomWithMessage(String message) async {
16 await Intercom.instance.displayMessageComposer(message);
17}

Pro tip: Place the Intercom help button consistently across all screens — floating action buttons or persistent navigation bar icons work best. Users should not have to hunt for support when they need it.

Expected result: When the help button is tapped on a real iOS or Android device, the Intercom Messenger opens as a native overlay. The user's conversation history is visible, and a new conversation can be started. In FlutterFlow's browser preview, nothing happens — this is expected.

5

Set up the Intercom REST API proxy for user and conversation sync

Beyond the Messenger SDK, you may want to sync user data from your app to Intercom (updating custom attributes, logging events) or read conversation data back into your app. Both require the Intercom REST API at `https://api.intercom.io`, accessed via a Bearer access token proxy — because the token is a server secret. Deploy a proxy function (or add routes to the HMAC function from Step 2) that accepts requests from FlutterFlow and forwards them to Intercom with the Bearer token injected. Common operations include: creating or updating contacts (`POST /contacts` or `PATCH /contacts/{id}`), logging custom events for user activity (`POST /events`), and reading conversations for an in-app history screen (`GET /conversations`). In FlutterFlow, create an API Group named 'Intercom REST' pointing to your proxy base URL. Create API Calls for each operation you need: 'Update Contact', 'Log Event', 'Get Conversations'. In the Variables tab, define the relevant fields (user email, event name, conversation ID). Set the Request Body to JSON matching your proxy's expected format. For reading conversations into a FlutterFlow screen, create a 'KlaviyoConversation' Data Type (rename to 'IntercomConversation') with fields: `id` (String), `created_at` (Integer), `subject` (String), `state` (String). In the API Call's Response & Test tab, paste a sample conversation list response from Intercom's API docs and generate JSON Paths. Map `$.conversations[*].id`, `$.conversations[*].created_at`, `$.conversations[*].subject`, and `$.conversations[*].state` to the Data Type fields. If you are building this for the first time and finding the native config (push notifications, HMAC setup, platform keys) overwhelming, RapidDev's team handles FlutterFlow + Intercom integrations including the full native setup, and offers a free scoping call at rapidevelopers.com/contact.

index.js
1// Firebase Cloud Function: Intercom REST API proxy
2// Add alongside the HMAC function
3const fetch = require('node-fetch');
4
5exports.intercomProxy = functions.https.onRequest(async (req, res) => {
6 res.set('Access-Control-Allow-Origin', '*');
7 res.set('Access-Control-Allow-Methods', 'GET, POST, PATCH');
8 res.set('Access-Control-Allow-Headers', 'Content-Type');
9 if (req.method === 'OPTIONS') { res.status(204).send(''); return; }
10
11 const INTERCOM_TOKEN = process.env.INTERCOM_ACCESS_TOKEN;
12 const { endpoint, method = 'GET', body } = req.body;
13
14 if (!endpoint) { res.status(400).json({ error: 'endpoint required' }); return; }
15
16 try {
17 const intercomRes = await fetch(`https://api.intercom.io${endpoint}`, {
18 method,
19 headers: {
20 'Authorization': `Bearer ${INTERCOM_TOKEN}`,
21 'Accept': 'application/json',
22 'Content-Type': 'application/json',
23 'Intercom-Version': '2.10',
24 },
25 body: body ? JSON.stringify(body) : undefined,
26 });
27 const data = await intercomRes.json();
28 res.status(intercomRes.status).json(data);
29 } catch (err) {
30 res.status(500).json({ error: err.message });
31 }
32});

Pro tip: Include the `Intercom-Version` header in your proxy calls with the API version you are targeting (e.g., `2.10`). Without it, Intercom may serve different response shapes across API versions, which can break your JSON Path mappings in FlutterFlow.

Expected result: Your Intercom proxy function is deployed and accessible. When tested from Postman with `{ "endpoint": "/me", "method": "GET" }`, it returns your Intercom workspace information, confirming the Bearer token is being injected correctly.

6

Configure push notifications for Messenger chat replies

Without push notifications, users will miss responses from support agents when they leave the Messenger view. Push notification setup for Intercom requires native configuration in both iOS and Android, making this the most complex step of the integration. For iOS, you need to enable Push Notifications in your Apple Developer account's app identifier, generate an APNs key or certificate, and upload it to Intercom (Settings → Integrations → Apple Push Certificate). In FlutterFlow, go to Settings → App Settings → Push Notifications and enable the iOS push notification capability. In your FlutterFlow login flow, after Intercom initializes, add a Custom Action that retrieves the device push token and registers it with Intercom: `await Intercom.instance.sendTokenToIntercom(token)` where `token` is the FCM or APNs token. For Android, Intercom integrates with Firebase Cloud Messaging (FCM). In Intercom Settings → Integrations → Google Firebase, add your FCM Server Key. In your FlutterFlow Firebase setup, ensure push notifications are enabled. Add a Custom Action that registers the FCM token with Intercom after login. For handling notification taps (opening the Messenger when a user taps an Intercom notification from the notification tray), you need additional native code in the iOS AppDelegate.swift and Android MainActivity to intercept the notification payload and call `Intercom.instance.handlePush(message)`. This typically requires FlutterFlow's Custom Files feature to modify the native entry points — a step that requires comfort with native iOS/Android project structure. Given the complexity of push notification setup, test the Messenger SDK and Identity Verification in Steps 1-4 first and confirm those work on device before attempting push notification configuration. The Messenger is fully functional for in-app conversations without push notifications — users who have the app open will see replies in real time via the SDK's WebSocket connection.

custom_action.dart
1// FlutterFlow Custom Action: register push token with Intercom
2// Call this after initializeIntercom() in your login flow
3// Dependencies: intercom_flutter, firebase_messaging (if using FCM)
4import 'package:intercom_flutter/intercom_flutter.dart';
5import 'package:firebase_messaging/firebase_messaging.dart';
6
7Future registerIntercomPushToken() async {
8 try {
9 // Get FCM token (for Android and iOS FCM path)
10 final fcmToken = await FirebaseMessaging.instance.getToken();
11 if (fcmToken != null) {
12 await Intercom.instance.sendTokenToIntercom(fcmToken);
13 print('Intercom push token registered: $fcmToken');
14 }
15 } catch (e) {
16 // Non-fatal — app still works without push notifications
17 print('Could not register Intercom push token: $e');
18 }
19}

Pro tip: Wrap push token registration in a try-catch and treat failures as non-fatal. The Messenger still works for in-app conversations without push; failing silently here prevents crashes for users who deny notification permissions.

Expected result: On a real device, users receive push notifications when a support agent replies to their Messenger conversation while the app is in the background. Tapping the notification opens the Intercom Messenger directly to the relevant conversation thread.

Common use cases

SaaS app with in-app live chat for user onboarding support

A FlutterFlow SaaS app initializes the Intercom Messenger on login, letting users tap a help button on any screen to open a live chat with the support team. Conversations are tied to the user's account so agents see full context — which plan they're on, when they signed up, and what actions they've taken. New users get a proactive bot message on their first login with onboarding tips.

FlutterFlow Prompt

Add an in-app help button to the main navigation bar that opens the Intercom Messenger when tapped. Show a bot welcome message to users in their first 7 days. After the user resolves a conversation, close the Messenger and return them to their current screen.

Copy this prompt to try it in FlutterFlow

E-commerce app that shows past support conversations to customers

A FlutterFlow shopping app uses the Intercom REST API (via a proxy) to display a user's past support conversations in an in-app 'Help History' screen. Users can see conversation summaries and status without opening the full Messenger. The app also uses the Intercom API to create contacts automatically when users register, so support agents already have the customer profile before any conversation starts.

FlutterFlow Prompt

Build a Help History screen that shows a list of the user's past Intercom conversations with their subject, status (open/closed), and last message preview. Tapping a conversation opens the full Messenger view on that specific thread.

Copy this prompt to try it in FlutterFlow

Subscription app that uses Intercom product tours for feature discovery

A FlutterFlow subscription app triggers Intercom Product Tours at key moments — after the user completes setup, when they first use a premium feature, or after upgrading their plan. The tours are created entirely in Intercom's dashboard by the product team and trigger automatically based on the user events and attributes that the FlutterFlow app sends to Intercom via the SDK.

FlutterFlow Prompt

After a user completes their profile setup, trigger an Intercom Product Tour that highlights the three main features of the app. After the tour completes, log a custom event in Intercom so the product team can track completion rates.

Copy this prompt to try it in FlutterFlow

Troubleshooting

The Intercom Messenger Custom Action does nothing in FlutterFlow's web Test Mode

Cause: The intercom_flutter package is a native SDK that runs only on iOS and Android. It does not execute in FlutterFlow's web-based preview canvas or Run Mode in a browser — native platform code cannot run in the browser environment.

Solution: Test the Intercom integration on a real iOS or Android device. In FlutterFlow, use Run Mode → Select a real connected device or generate an APK build (Android) / TestFlight build (iOS). Do not spend time debugging in the browser preview — any native SDK Custom Action will silently do nothing in web mode by design.

Intercom conversations show 'Unverified' or users appear without their name/email

Cause: Identity Verification is either not enabled or the `userHash` passed to `loginIdentifiedUser()` was computed incorrectly. Intercom marks users as 'Unverified' when the HMAC does not match, which can happen if the user identifier used to compute the hash does not exactly match the identifier passed to `loginIdentifiedUser()`.

Solution: Confirm that the string passed as `user_identifier` to your HMAC Cloud Function is byte-for-byte identical to the string passed as `userId` (or `email`) in the `loginIdentifiedUser()` call. Trimming whitespace, casing differences, and Unicode normalization can all cause mismatches. Log both values in your Cloud Function and Custom Action during testing to verify they match.

REST API calls via the proxy return 401 Unauthorized

Cause: The Intercom access token is either expired, incorrect, or not being injected into the Authorization header by the proxy. Alternatively, the proxy is calling an Intercom API endpoint with an older API version that has different authentication requirements.

Solution: Go to Intercom Settings → Integrations → Developer Hub → your app → Authentication and verify the Access Token is still active. In your proxy function code, confirm the header is `Authorization: Bearer YOUR_TOKEN` (with `Bearer`, not `Intercom-Api-Key`). Also add the `Intercom-Version` header to pin to a specific API version. Test the proxy directly from Postman before debugging from FlutterFlow.

Intercom rate limit errors — 429 Too Many Requests from the proxy

Cause: The Intercom REST API has a rate limit of 1,000 requests per minute for standard workspaces. If many users load a screen that calls the proxy simultaneously, or if the proxy loops through multiple Intercom API calls per request, this limit can be reached quickly.

Solution: Cache frequently-read data (like conversation lists) in Firestore or Supabase rather than calling Intercom on every screen open. For conversation sync, consider caching the list with a TTL of 5 minutes — most conversation data does not change in real time and does not need to be live. Add error handling in your proxy that passes the 429 status through to FlutterFlow so the app can show a 'Please try again in a moment' message rather than a generic error.

Best practices

  • Always enable Intercom Identity Verification before going live — without it, any user can impersonate any other user in the Messenger by providing a different user ID.
  • Generate the Identity Verification HMAC server-side in a Cloud Function or Edge Function, never in Dart code — the signing secret must stay off the client.
  • Test all Intercom Custom Actions on a real iOS or Android device, not in FlutterFlow's browser Test Mode — native SDK calls silently fail in web preview.
  • Call `loginIdentifiedUser()` with the exact same identifier string you used to compute the HMAC — even a leading/trailing space difference will cause an Unverified user error.
  • Wrap push token registration in a try-catch and treat it as non-fatal — the Messenger works for in-app conversations without push, and failing silently prevents crashes for users who deny notification permissions.
  • Cache Intercom conversation lists in your own database rather than calling the REST API on every screen open — the 1,000 req/min limit is shared across all your app users.
  • Create separate Custom Actions for each Messenger interaction (`displayMessenger`, `displayHelpCenter`, `displayConversationsList`) rather than one monolithic action with parameters — makes the Action Flow Editor clearer and easier to maintain.
  • Include the `Intercom-Version` header in your REST API proxy to pin to a specific API version — without it, Intercom may return different response shapes as they update their default API version.

Alternatives

Frequently asked questions

Why does the Intercom Messenger not open in FlutterFlow's web preview?

The intercom_flutter package is a native Flutter SDK that runs only on iOS and Android devices. FlutterFlow's web preview canvas and browser Run Mode cannot execute native platform code. You must test the Messenger on a real device using FlutterFlow's Run Mode connected to a device, or via an APK/TestFlight build. This is expected behavior and not a bug in your code.

Is Identity Verification mandatory for Intercom in a FlutterFlow app?

Intercom does not technically enforce it — the SDK will work without it. However, without Identity Verification, any user can impersonate any other user in the Messenger by providing a different user ID in the initialization call. For any app with real users and private conversations, this is a serious security gap. Enable Identity Verification before going to production, even if it adds implementation complexity.

Can FlutterFlow use the Intercom Messenger on web (not just mobile)?

The intercom_flutter pub.dev package is designed for mobile (iOS and Android) and may not support FlutterFlow's web build targets. For web, Intercom typically uses a JavaScript snippet embedded in the web app. Since FlutterFlow compiles to Flutter for web rather than standard HTML/JavaScript, embedding the web Messenger is non-trivial. For most use cases, focus on the native mobile Messenger and consider using Intercom's email follow-up for web users.

What happens if a user denies notification permissions and misses a Messenger reply?

The Messenger still works perfectly for in-app conversations when the user has the app open — replies appear in real time via the SDK's WebSocket connection. If the user has the app closed and misses a reply, they will see the unread conversation badge when they next open the app. Email follow-up is also configured in Intercom for users who do not respond to in-app messages — Intercom will automatically send an email notification to the user's registered email address after a configurable delay.

Does Intercom have a free plan for testing?

Intercom does not have a meaningful free plan for production use — it is a paid product with per-seat pricing for support agents. They offer a trial period for new accounts. Check Intercom's current pricing page for the latest plan options and pricing, as they change periodically. For testing purposes, you can use a trial account or a development workspace.

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.