There is no direct consumer Skype API — programmatic Skype integration in FlutterFlow works through the Microsoft Bot Framework. For simple 'contact us on Skype' buttons, a zero-backend url_launcher Custom Action opening skype: deep links is the quickest path. For bot-driven automated messages, you need an Azure Bot with an OAuth 2.0 token fetched in a Firebase Cloud Function — never in the compiled app.
| Fact | Value |
|---|---|
| Tool | Skype |
| Category | Communication |
| Method | FlutterFlow API Call |
| Difficulty | Intermediate |
| Time required | 45 minutes |
| Last updated | July 2026 |
Connecting FlutterFlow to Skype: Deep Links vs Bot Framework
Microsoft does not expose a consumer Skype API that you can call with a simple API key. All programmatic Skype messaging goes through the Microsoft Bot Framework — you register an Azure Bot, enable the Skype channel in Azure, and communicate via the Bot Framework Connector REST API hosted at smba.trafficmanager.net. This is more infrastructure than most FlutterFlow projects need, so it is worth deciding upfront which use-case actually fits your app.
For the vast majority of FlutterFlow founders, the right answer is the deep-link path: a single url_launcher Custom Action that fires skype:username?chat or skype:username?call. This opens the Skype app already installed on the user's device — no Azure account, no OAuth token, no backend. It works perfectly for 'contact our support team on Skype' or 'jump on a call with this person' buttons.
Important note on Skype's future: Microsoft began retiring consumer Skype in May 2025 and is directing users to Microsoft Teams. Before investing in a Bot Framework integration for consumer Skype, verify that the Skype channel is still available for your use-case and that your target audience has not migrated. For enterprise messaging needs that are certain to remain stable, Microsoft Teams or Webex are safer long-term bets. The Azure Bot Service free tier covers Standard channels including Skype for development and light usage — verify current availability with your Azure account.
Integration method
FlutterFlow connects to Skype through two distinct paths depending on your use-case. The zero-backend path uses a url_launcher Custom Action to fire skype: deep links — no API keys, no backend, just opens the Skype app installed on the user's device. The bot path uses the Microsoft Bot Framework Connector REST API: an Azure Bot with the Skype channel enabled, an OAuth 2.0 token obtained via client credentials, and a Firebase Cloud Function that holds the Azure app secret and proxies all messages. Because FlutterFlow compiles to client-side Dart, any Azure app secret placed in an API Call header ships inside the compiled app — the Cloud Function proxy is mandatory.
Prerequisites
- A FlutterFlow project open in the browser at app.flutterflow.io
- Skype usernames or IDs for the target contacts (for the deep-link path)
- A Microsoft Azure account for the Bot Framework path
- A Firebase project with Cloud Functions enabled (Blaze plan) for the bot path
- Node.js knowledge or a template for the Firebase Cloud Function proxy
Step-by-step guide
Step 1: Add a url_launcher Custom Action for deep links (zero-backend path)
This step covers the zero-backend deep-link path. If your only requirement is a 'contact us on Skype' button, this is the entire integration — you can skip all the Bot Framework steps. In FlutterFlow, click Custom Code in the left navigation panel. Click the + Add button and select Action. Name the action something descriptive like OpenSkypeChat. In the Dependencies field that appears at the top of the code editor, type url_launcher and add it — FlutterFlow will resolve the latest compatible version from pub.dev automatically. Paste the following Dart code into the editor. The action accepts a skypeUsername string argument, constructs the deep link URL, and calls launchUrl. The skype: scheme opens the installed Skype app on both iOS and Android: ```dart import 'package:url_launcher/url_launcher.dart'; Future openSkypeChat(String skypeUsername) async { final uri = Uri.parse('skype:$skypeUsername?chat'); if (await canLaunchUrl(uri)) { await launchUrl(uri); } } ``` For a voice call instead of chat, change ?chat to ?call. Click Save. In the Action Flow Editor for your button widget, click + Add Action, choose Custom Actions, and select OpenSkypeChat. Map the skypeUsername argument to a page variable, widget state, or a hard-coded Skype ID depending on your design. Note: canLaunchUrl requires that the skype URL scheme is declared in your iOS Info.plist and Android AndroidManifest under LSApplicationQueriesSchemes (iOS) and <queries> (Android). In FlutterFlow, go to Settings & Integrations → App Settings → Permissions to declare custom URL schemes if prompted.
1import 'package:url_launcher/url_launcher.dart';23Future openSkypeChat(String skypeUsername) async {4 final uri = Uri.parse('skype:$skypeUsername?chat');5 if (await canLaunchUrl(uri)) {6 await launchUrl(uri);7 }8}910Future openSkypeCall(String skypeUsername) async {11 final uri = Uri.parse('skype:$skypeUsername?call');12 if (await canLaunchUrl(uri)) {13 await launchUrl(uri);14 }15}Pro tip: Test this Custom Action on a real device build or APK — Custom Actions do not run in the FlutterFlow canvas Run Mode preview.
Expected result: A Custom Action named OpenSkypeChat appears in the Custom Code panel. When wired to a button and tested on a physical iOS or Android device, tapping the button opens the Skype app and starts a chat with the specified Skype ID.
Step 2: Register an Azure Bot and enable the Skype channel (bot path)
If your use-case requires sending automated or proactive Skype messages from your app — not just launching the Skype app — you need the Microsoft Bot Framework path. This begins in the Azure portal at portal.azure.com. In Azure, search for Azure Bot and click Create. Choose Create new Microsoft App ID, give the bot a name, select your subscription and resource group, and set the Messaging Endpoint to a placeholder for now (you will update it after deploying your Cloud Function). After the bot resource is created, go to the bot's Configuration blade and copy the Microsoft App ID. Then open App Passwords (or the linked App Registration in Azure Active Directory) and generate a new client secret — copy it immediately, Azure does not show it again. Next, in the bot's Channels blade, find Skype in the list of channels and click Add to enable it. Accept the terms and save. The bot is now registered. At this stage you have an Azure App ID and a client secret — these are the credentials that authenticate your bot to the Bot Framework Connector API. Both are confidential: the client secret belongs in your Firebase Cloud Function, never in a FlutterFlow API Call header, because FlutterFlow compiles to client-side Dart and anything in the app bundle is extractable. Note: as of 2025, Microsoft has been retiring consumer Skype. Verify that the Skype channel is still available in your Azure region and that the channel option appears in your bot's Channels blade before proceeding.
Pro tip: Save both the Microsoft App ID and the client secret to a secure password manager immediately. If you lose the client secret, you must regenerate it in Azure AD, which invalidates the old one.
Expected result: An Azure Bot resource exists with the Skype channel enabled. You hold the Microsoft App ID and client secret securely — not in FlutterFlow.
Step 3: Deploy a Firebase Cloud Function that holds the Azure secret and fetches the AAD token
The Bot Framework Connector API requires a Bearer token obtained from Azure Active Directory. The token endpoint is https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token with scope https://api.botframework.com/.default and grant_type client_credentials. Tokens expire after 3600 seconds and must be refreshed, which is why this logic belongs in a Firebase Cloud Function — not in FlutterFlow. In your Firebase project (which must be on the Blaze plan for Cloud Functions with outbound HTTP), create a Cloud Function. A minimal Node.js index.js file is shown below. The function: 1. Reads the Azure App ID and secret from Firebase environment config (never hard-coded). 2. Calls the AAD token endpoint to obtain a Bearer token (caches it in memory for up to 3500 seconds to avoid re-fetching on every call). 3. Accepts a POST request from FlutterFlow containing { serviceUrl, conversationId, text }. 4. Calls POST {serviceUrl}/v3/conversations/{conversationId}/activities on the Bot Framework Connector with the Bearer token. 5. Returns the response to FlutterFlow. Deploy the function and copy its HTTPS trigger URL — you will use this as the endpoint in the next step's FlutterFlow API Call. Set your Firebase environment config variables before deploying: firebase functions:config:set botframework.app_id="YOUR_APP_ID" botframework.app_secret="YOUR_SECRET"
1const functions = require('firebase-functions');2const axios = require('axios');34let cachedToken = null;5let tokenExpiry = 0;67async function getAADToken(appId, appSecret) {8 if (cachedToken && Date.now() < tokenExpiry) return cachedToken;9 const params = new URLSearchParams({10 grant_type: 'client_credentials',11 client_id: appId,12 client_secret: appSecret,13 scope: 'https://api.botframework.com/.default'14 });15 const res = await axios.post(16 'https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token',17 params.toString(),18 { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }19 );20 cachedToken = res.data.access_token;21 tokenExpiry = Date.now() + (res.data.expires_in - 60) * 1000;22 return cachedToken;23}2425exports.sendSkypeMessage = functions.https.onRequest(async (req, res) => {26 const { serviceUrl, conversationId, text } = req.body;27 const appId = functions.config().botframework.app_id;28 const appSecret = functions.config().botframework.app_secret;29 try {30 const token = await getAADToken(appId, appSecret);31 const activity = { type: 'message', from: { id: appId }, text };32 const url = `${serviceUrl}v3/conversations/${conversationId}/activities`;33 const result = await axios.post(url, activity, {34 headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' }35 });36 res.json({ ok: true, id: result.data.id });37 } catch (err) {38 const status = err.response ? err.response.status : 500;39 res.status(status).json({ ok: false, error: err.message });40 }41});Pro tip: The in-memory token cache (cachedToken / tokenExpiry) resets on cold starts. For high-volume production use, store the cached token in Firestore so it persists across function instances.
Expected result: A Firebase Cloud Function named sendSkypeMessage is deployed and returns an HTTPS trigger URL. Testing it with a sample POST body returns { ok: true } (or a meaningful error from the Bot Framework, not a Firebase error).
Step 4: Add a FlutterFlow API Call to your Cloud Function
Now that the Cloud Function is handling all the Azure credentials and Bot Framework calls, FlutterFlow only needs to call your own function endpoint — no Skype API keys ever enter the app. In FlutterFlow, click API Calls in the left navigation panel. Click + Add and choose Create API Group. Name it SkypeBot and set the Base URL to your Firebase Cloud Function's HTTPS trigger URL (e.g. https://us-central1-your-project.cloudfunctions.net). Inside the SkypeBot group, click Add API Call and name it SendMessage. Set the Method to POST and the Endpoint to /sendSkypeMessage (or whatever your function path is). Under the Headers tab, you do not need an Authorization header here — your function handles its own token; you may optionally add a shared API key header if you've added Firebase App Check or a simple secret header to your function for an extra layer of caller authentication. Under the Variables tab, add three variables: serviceUrl (String), conversationId (String), and text (String). In the Body tab, select JSON and construct the body: ```json { "serviceUrl": "<serviceUrl>", "conversationId": "<conversationId>", "text": "<text>" } ``` Replace each <variable> with the FlutterFlow variable syntax {{ serviceUrl }}, {{ conversationId }}, and {{ text }}. Click the Response & Test tab. Paste a sample success response body ({ "ok": true, "id": "abc123" }) and click Generate JSON Paths. This creates JSON Path bindings you can use to show success or error UI to the user. Save the API Call. In the Action Flow Editor on the button or trigger that should send the Skype message, click + Add Action → Backend/API Calls → SkypeBot → SendMessage, and map your page variables to the three API Call variables.
1{2 "method": "POST",3 "endpoint": "/sendSkypeMessage",4 "headers": {},5 "body": {6 "serviceUrl": "{{ serviceUrl }}",7 "conversationId": "{{ conversationId }}",8 "text": "{{ text }}"9 }10}Pro tip: The serviceUrl and conversationId values come from the Bot Framework Activity object that arrives at your bot's messaging endpoint when a Skype user messages your bot first. Store them in Firestore after the first inbound message so you can use them for proactive replies.
Expected result: A FlutterFlow API Group named SkypeBot contains a SendMessage call. The API Call editor shows the POST body with three variable bindings. The Response & Test tab shows JSON Path bindings for ok and id.
Step 5: Register the Cloud Function as the bot's messaging endpoint and handle incoming messages
Incoming Skype messages hit your Azure Bot's Messaging Endpoint — a public HTTPS URL that Azure sends a Bot Framework Activity JSON payload to. FlutterFlow has no public webhook endpoint, so you must register your Firebase Cloud Function URL as the bot's Messaging Endpoint in Azure. Go back to the Azure portal, open your bot resource, and navigate to Configuration → Messaging Endpoint. Paste your Cloud Function HTTPS trigger URL (the same one you used for outbound messages, or a separate function dedicated to receiving). Click Apply. In your Cloud Function, handle POST requests that arrive from Azure. The request body will be a Bot Framework Activity object containing fields like type (message, conversationUpdate, etc.), from.id, conversation.id, serviceUrl, and text. After verifying the request (optionally using the Bot Framework SDK for Node.js to validate the JWT in the Authorization header), write the relevant fields to Firestore so FlutterFlow can read them. In FlutterFlow, set up a Backend Query on any screen that should display incoming Skype messages — query the Firestore collection where you're writing them, with real-time updates enabled. This way, when a Skype user messages your bot, the Cloud Function writes to Firestore and the FlutterFlow app updates its UI in near-real time. This inbound path is optional if you only need outbound (proactive) messages. If RapidDev's team builds FlutterFlow integrations like this for you regularly, they can handle the Cloud Function wiring and Firestore schema — free scoping call at rapidevelopers.com/contact.
Pro tip: For security, validate the Authorization: Bearer header on inbound Activity requests using the Microsoft Bot Framework SDK (@microsoft/botframework-connector) before trusting the payload.
Expected result: The Azure Bot's Messaging Endpoint field shows your Cloud Function URL. Sending a test message to the Skype bot results in a Firestore document containing the message data, which a FlutterFlow Backend Query can read and display.
Common use cases
Support contact button that opens Skype
A services app that wants to offer Skype as a contact channel adds a 'Chat on Skype' button to the support screen. Tapping it fires a skype:supportteam?chat deep link via a url_launcher Custom Action, opening the Skype app and starting a chat immediately. No API keys, no backend, and no Azure account are required.
Add a 'Contact us on Skype' button to my Support screen. Tapping it should open the Skype app and start a chat with the Skype username 'mycompanysupport'.
Copy this prompt to try it in FlutterFlow
Event app that sends Skype reminders via bot
An event-management app sends proactive Skype reminder messages to registered attendees through an Azure Bot connected to the Skype channel. A Firebase Cloud Function obtains an AAD Bearer token on a schedule and calls the Bot Framework Connector API to deliver the reminder. FlutterFlow triggers the function via an API Call when the organizer taps 'Send reminders'.
Build a screen for event organizers to send a Skype reminder message to all registered attendees. The message should be triggered by a button and dispatched through my Firebase backend bot.
Copy this prompt to try it in FlutterFlow
CRM mobile app that initiates Skype calls
A B2B CRM app built in FlutterFlow shows a contact list pulled from a backend database. Each contact card has a 'Call on Skype' icon. Tapping it fires a url_launcher Custom Action with skype:contactskypeid?call, opening a voice call in the Skype app without any backend integration.
On each contact card in my CRM list, add a phone icon that, when tapped, starts a Skype voice call to that contact's Skype ID using a deep link.
Copy this prompt to try it in FlutterFlow
Troubleshooting
Deep link tap does nothing — the Skype app does not open
Cause: canLaunchUrl returns false when the skype: URL scheme is not declared in the platform manifest, or when Skype is not installed on the device.
Solution: In FlutterFlow's Settings & Integrations → Permissions, add skype to the LSApplicationQueriesSchemes list (iOS) and add a <queries> intent entry for the skype scheme (Android). Also add a fallback — if canLaunchUrl is false, show a 'Skype not installed' message rather than silently failing.
Bot Framework API returns 401 Unauthorized on messages endpoint
Cause: The AAD Bearer token has expired (tokens expire after 3600 seconds) and the Cloud Function did not refresh it, or the token was fetched with the wrong scope.
Solution: Ensure the Cloud Function caches the token with an expiry buffer (e.g. subtract 60 seconds from expires_in). On any 401 response from smba.trafficmanager.net, force-clear the cached token and re-fetch from login.microsoftonline.com/botframework.com/oauth2/v2.0/token with scope https://api.botframework.com/.default before retrying.
1// After receiving 401:2cachedToken = null;3tokenExpiry = 0;4const freshToken = await getAADToken(appId, appSecret);Skype channel does not appear in the Azure Bot's Channels blade
Cause: Microsoft began retiring consumer Skype in 2025. The Skype channel may no longer be available for new bots in some regions.
Solution: Verify current Skype channel availability in your Azure region's documentation and in the Azure Bot Channels blade. If Skype is retired for your use-case, consider Microsoft Teams as a supported alternative — it uses a similar Bot Framework architecture and the channel remains active.
Custom Action (url_launcher) builds fine but crashes on web build
Cause: The url_launcher package behaves differently on web — it cannot open app deep links (skype:) in the browser; it can only open http/https URLs or system-supported schemes.
Solution: On web builds, the skype: scheme will not launch the Skype desktop app from a browser tab — it depends on the OS and browser having Skype registered as a handler. Show a fallback UI on web, such as displaying the Skype username for manual copy, or link to web.skype.com instead.
Best practices
- Never place the Azure App secret or Bot Framework Bearer token in a FlutterFlow API Call header — always proxy through a Firebase Cloud Function
- Cache the AAD Bearer token server-side for up to 3500 seconds; refreshing on every message call wastes latency and risks throttling
- For 'contact us on Skype' buttons, always prefer the url_launcher deep-link path over the Bot Framework path — it requires zero backend and zero Azure account
- Verify Skype channel availability before committing to a Bot Framework integration, given Microsoft's consumer Skype retirement timeline
- Store inbound Bot Framework Activity fields (serviceUrl, conversationId, from.id) in Firestore immediately — you need them to send proactive replies later
- Test url_launcher Custom Actions on a real device build; they do not run in the FlutterFlow canvas Run Mode preview
- Add canLaunchUrl fallback UI ('Skype not installed — here is our Skype ID to add manually') for devices where Skype is not installed
- If you need enterprise-grade messaging that is Microsoft-stack but more stable than consumer Skype, evaluate Microsoft Teams with its Bot Framework SDK — the architecture is identical but the channel has a longer support horizon
Alternatives
Microsoft Teams uses the same Azure Bot Framework architecture but is actively developed and has a stronger enterprise support commitment than consumer Skype.
Telegram's Bot API is simpler to integrate than the Bot Framework — a plain HTTP POST with a bot token — making it a much faster choice for automated in-app messaging.
Discord's REST API and webhook system are well-documented and do not require an Azure account, making it a lower-friction alternative for community or team notifications.
Frequently asked questions
Is there a direct Skype API I can call with an API key from FlutterFlow?
No. Microsoft does not expose a consumer Skype messaging API with a simple API key. All programmatic Skype messaging goes through the Microsoft Bot Framework Connector REST API, which requires registering an Azure Bot, enabling the Skype channel, and obtaining an OAuth 2.0 Bearer token from Azure Active Directory. For simple 'contact us on Skype' functionality, the url_launcher deep-link approach (skype:username?chat) is far easier and requires no API at all.
Will this integration stop working if Microsoft retires Skype?
Potentially yes. Microsoft began retiring consumer Skype in 2025 and is directing users to Microsoft Teams. If the Skype channel becomes unavailable in Azure Bot Channels, the Bot Framework path for Skype will stop working. For long-term stability, consider building your bot integration on Microsoft Teams instead — it uses the same Bot Framework architecture and has a committed support timeline.
Why can't I just store the Azure app secret in FlutterFlow App Values or an API Call header?
FlutterFlow compiles to Flutter/Dart and ships a client-side app to iOS, Android, or the web. Any value stored in App Values, Dart Custom Actions, or API Call headers is embedded in the compiled binary and can be extracted using standard reverse-engineering tools. An exposed Azure app secret gives anyone the ability to send messages as your bot to any Skype user. The Firebase Cloud Function proxy keeps the secret on the server where only your code can access it.
Can FlutterFlow receive incoming Skype messages directly?
No. Incoming Skype messages arrive at your Azure Bot's Messaging Endpoint as HTTP POST requests from Microsoft's servers. FlutterFlow has no public HTTPS endpoint to receive them — it is a compiled client app. You must register a Firebase Cloud Function URL as the Messaging Endpoint in Azure; the function writes inbound messages to Firestore, and FlutterFlow reads them via a real-time Backend Query.
Does the url_launcher deep link work on web builds as well as mobile?
On mobile (iOS and Android), the skype: scheme reliably opens the Skype app if it is installed. On web builds, behavior depends on the user's operating system and browser — the browser may prompt the user to open Skype, or it may silently do nothing. For web builds, it is safer to display the Skype username for manual copy or link to web.skype.com as a fallback.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation