Connect FlutterFlow to Plivo using a FlutterFlow API Call group pointed at a Firebase Cloud Function proxy. Plivo's Auth Token is a full sending credential that can't ship inside a compiled Flutter app, so the Cloud Function holds it and exposes a simple `/send-sms` endpoint. FlutterFlow then POSTs to that endpoint. Plivo is one of the simplest SMS APIs to wire up — single HTTP Basic auth, one base URL, JSON body.
| Fact | Value |
|---|---|
| Tool | Plivo |
| Category | Communication |
| Method | FlutterFlow API Call |
| Difficulty | Intermediate |
| Time required | 30 minutes |
| Last updated | July 2026 |
Sending SMS from FlutterFlow with Plivo — Simple, Cheap, and Secure
Plivo is often described as the Twilio alternative that costs less and asks less of you. Its SMS API is a single POST to `https://api.plivo.com/v1/Account/{AUTH_ID}/Message/` with HTTP Basic authentication (Auth ID as username, Auth Token as password) and a JSON body containing the sender number, recipient number, and message text. There's no separate token exchange, no JWTs to sign, no SDK to install — just a clean REST call. That simplicity makes it ideal for FlutterFlow integrations once you handle the one security concern.
The security concern is the same one that applies to every secret in FlutterFlow: the app compiles to a Flutter binary that runs on the user's device. Any value you put in FlutterFlow's API Call headers or body — including the Plivo Auth Token — ends up inside the compiled app package, where it can be extracted by anyone who downloads and decompiles it. An exposed Auth Token lets an attacker send SMS messages billed to your Plivo account. The solution is a Firebase Cloud Function (or Supabase Edge Function) that stores the Auth Token securely on Google's servers and exposes a thin endpoint that your FlutterFlow app calls.
On pricing, Plivo is pay-as-you-go with no monthly minimum — you pay per message, and rates are generally 30–50% cheaper than Twilio for equivalent sending volumes depending on the destination country. Trial accounts include free credits but can only message verified/whitelisted numbers until you add funds. The Plivo console (console.plivo.com) is where you get your Auth ID and Auth Token, buy phone numbers, and configure webhook URLs for delivery receipts and inbound messages. Numbers and pricing are country-specific — check the Plivo pricing page for your destination country's rates and any alphanumeric sender ID restrictions.
Integration method
FlutterFlow uses its API Calls panel to call a Firebase Cloud Function (or Supabase Edge Function) that holds your Plivo Auth Token and proxies SMS send requests to `api.plivo.com`. The Cloud Function authenticates to Plivo via HTTP Basic auth using your Auth ID and Auth Token, then forwards a JSON SMS request. FlutterFlow never holds the Auth Token — it only calls your own Cloud Function endpoint with the message content and recipient number.
Prerequisites
- A Plivo account at console.plivo.com (free trial with credit included)
- Your Plivo Auth ID and Auth Token from the console dashboard
- A Plivo phone number purchased in the console (required as the sender for most destinations)
- A Firebase project on the Blaze pay-as-you-go plan (required for Cloud Functions to make outbound network requests to Plivo)
- A FlutterFlow project on a paid plan (API Calls require a paid plan)
Step-by-step guide
Get your Plivo credentials and buy a number
Open the Plivo console at console.plivo.com and log in. On the dashboard Overview page, you'll see your **Auth ID** and **Auth Token** displayed at the top. The Auth ID looks like a string of uppercase letters and numbers (e.g., `MAXXXXXXXXXXXXXXXXXX`). The Auth Token is a longer alphanumeric string. Copy both — you'll add them as Firebase environment secrets in the next step. The Auth ID is used in two places in the Plivo API: as the HTTP Basic auth username AND as part of the URL path (`/v1/Account/{AUTH_ID}/Message/`). This is a common confusion point — if you see a 401 or 404 when testing, verify that the Auth ID in the URL path and the username both match your console Auth ID exactly. Next, buy a phone number to use as the sender. In the left sidebar, click Numbers → Buy a Number. Select your country, number type (long code, toll-free, or short code depending on your use case and destination), and click Search. Select a number and click Buy. The number appears in your Numbers list in E.164 format (e.g., `+12025550147`) — copy it. This is the `src` field in your SMS API call. Note: for some countries and use cases (especially in the US), you need to register your number for 10DLC (A2P 10-digit long code) compliance before sending marketing or commercial messages. The Plivo console has a Registration section for this. For international destinations, check Plivo's country-specific documentation for alphanumeric sender ID rules — some countries don't allow long-code numbers as senders.
Pro tip: Save your Auth ID and Auth Token in a password manager immediately — you'll need them when configuring Firebase secrets. Never paste them into FlutterFlow or any client-side configuration.
Expected result: You have the Auth ID and Auth Token copied from the Plivo console, and a purchased phone number in E.164 format ready to use as the SMS sender.
Deploy a Firebase Cloud Function as the Plivo proxy
This step is the security foundation of the integration. The Plivo Auth Token is a full sending credential — if it ships inside your compiled Flutter app, anyone who decompiles it can send SMS messages billed to your account. A Firebase Cloud Function runs server-side and can store secrets safely. In the Firebase console, open your project and go to Functions → Get Started (you need the Blaze plan for outbound HTTP). In your Cloud Functions project directory, create an HTTPS function named `sendSms`. The function receives a POST from your FlutterFlow app with `{to, text}` in the JSON body, validates the inputs, constructs a Plivo API request with your Auth ID and Auth Token (from environment variables), and returns a success/error response. Plivo's SMS endpoint is: `POST https://api.plivo.com/v1/Account/{AUTH_ID}/Message/` with HTTP Basic auth (`Authorization: Basic base64(AUTH_ID:AUTH_TOKEN)`) and a JSON body: `{"src": "your_number", "dst": "recipient_number", "text": "message"}`. Key implementation notes: the `dst` (destination) field must be in E.164 format with a `+` prefix. The `src` field must be your purchased Plivo number. The response body includes `message_uuid` — an array with one UUID string that you can store to track delivery later. HTTP 202 Accepted means the message was queued for sending. Deploy with `firebase deploy --only functions`. After deployment, copy the HTTPS trigger URL from the Functions dashboard — this URL is what FlutterFlow calls and is safe to embed in the app.
1// Firebase Cloud Function: Plivo SMS proxy (Node.js 18+)2const { onRequest } = require('firebase-functions/v2/https');3const { setGlobalOptions } = require('firebase-functions/v2');45setGlobalOptions({ region: 'us-central1' });67// Set secrets:8// firebase functions:secrets:set PLIVO_AUTH_ID PLIVO_AUTH_TOKEN PLIVO_FROM_NUMBER9exports.sendSms = onRequest(10 { secrets: ['PLIVO_AUTH_ID', 'PLIVO_AUTH_TOKEN', 'PLIVO_FROM_NUMBER'] },11 async (req, res) => {12 // CORS for web builds13 res.set('Access-Control-Allow-Origin', '*');14 if (req.method === 'OPTIONS') {15 res.set('Access-Control-Allow-Methods', 'POST');16 res.set('Access-Control-Allow-Headers', 'Content-Type');17 return res.status(204).send('');18 }1920 const { to, text } = req.body;21 if (!to || !text) {22 return res.status(400).json({ error: 'Missing to or text' });23 }2425 const authId = process.env.PLIVO_AUTH_ID;26 const authToken = process.env.PLIVO_AUTH_TOKEN;27 const fromNumber = process.env.PLIVO_FROM_NUMBER;28 const credentials = Buffer.from(`${authId}:${authToken}`).toString('base64');2930 const plivoUrl = `https://api.plivo.com/v1/Account/${authId}/Message/`;3132 try {33 const response = await fetch(plivoUrl, {34 method: 'POST',35 headers: {36 'Authorization': `Basic ${credentials}`,37 'Content-Type': 'application/json',38 },39 body: JSON.stringify({40 src: fromNumber,41 dst: to,42 text: text,43 }),44 });4546 const data = await response.json();4748 if (response.status === 202) {49 return res.status(200).json({50 success: true,51 messageUuid: data.message_uuid?.[0] ?? '',52 });53 } else {54 return res.status(response.status).json({55 success: false,56 error: data.error || 'Plivo API error',57 });58 }59 } catch (err) {60 return res.status(500).json({ error: err.message });61 }62 }63);Pro tip: Store the Plivo from-number as a secret too (PLIVO_FROM_NUMBER) rather than hard-coding it in the function — this makes it easy to change numbers later without redeploying code.
Expected result: Firebase console shows the `sendSms` function as active. Sending a test POST `{"to":"+15551234567","text":"Test"}` to the function URL returns `{"success":true,"messageUuid":"xxx"}` and the SMS arrives on the test phone.
Create the API Call group in FlutterFlow
With the Cloud Function deployed and tested, connect FlutterFlow to it. In the FlutterFlow editor, click API Calls in the left navigation sidebar. Click + Add at the top and select Create API Group. Name it `PlivoProxy`. Set the Base URL to your Firebase Cloud Function's HTTPS trigger URL root — for example `https://us-central1-myproject.cloudfunctions.net`. Do not include `/sendSms` in the base URL yet; that goes in the individual API Call path. With the PlivoProxy group created, click + Add inside the group → Create API Call. Name it `SendSms`. Set the Method to POST. In the Path field enter `/sendSms`. Open the Body tab, set Body Type to JSON, and enter the body template: ```json {"to": "[recipientNumber]", "text": "[messageText]"} ``` Open the Variables tab and add two String variables: `recipientNumber` (no default) and `messageText` (no default). Update the body template to use the variable syntax with double square brackets: `[recipientNumber]` and `[messageText]`. Open the Response & Test tab. In the Test Values section enter a real phone number you own (E.164 format with + prefix) and a short test message. Click Test API Call. If the Cloud Function is running correctly, you should see HTTP 200 with `{"success":true,"messageUuid":"..."}`. Click 'Generate JSON Paths' on the successful response to create `$.success` (Boolean) and `$.messageUuid` (String) shortcut paths. If you ever need to add a second call to the same proxy — for example a `/send-voice` endpoint — you can add another API Call to this same group without redoing the base URL setup. The PlivoProxy group is your general Plivo gateway from FlutterFlow.
1{2 "Group": "PlivoProxy",3 "Base URL": "https://us-central1-YOUR_PROJECT.cloudfunctions.net",4 "Calls": [5 {6 "name": "SendSms",7 "method": "POST",8 "path": "/sendSms",9 "body_type": "JSON",10 "body": {11 "to": "[recipientNumber]",12 "text": "[messageText]"13 },14 "variables": [15 { "name": "recipientNumber", "type": "String" },16 { "name": "messageText", "type": "String" }17 ],18 "json_paths": [19 { "name": "success", "path": "$.success" },20 { "name": "messageUuid", "path": "$.messageUuid" }21 ]22 }23 ]24}Pro tip: Click 'Test API Call' in the FlutterFlow Response & Test tab before building any UI — verifying the connection here saves significant debugging time when wiring up buttons later.
Expected result: The PlivoProxy group shows a green test-pass indicator on the SendSms call. The JSON paths for `success` and `messageUuid` are visible in the Response tab ready to be used in action conditions.
Build the send form and wire up the Action Flow
Create an SMS compose screen in FlutterFlow. Add a new Page named 'SendSms'. Inside, place a Column with two TextField widgets — one for the recipient phone number (App State String: `recipientNumber`, keyboard type: Phone) and one for the message text (App State String: `smsMessage`, max lines: 4). Below the text fields, add a Button labeled 'Send SMS'. Select the Send SMS button, open the Actions panel, and click + Add Action. Choose Backend/Database → API Call. Select the PlivoProxy group and the SendSms API Call. Bind the `recipientNumber` variable to the App State `recipientNumber` and the `messageText` variable to the App State `smsMessage`. Chain a second action after the API Call completes. Add a Conditional Action using the `$.success` JSON path result as the condition: - If true: show a SnackBar ('SMS sent successfully!') and optionally clear the message text field (Set App State `smsMessage` to ''). Optionally navigate back to the previous screen. - If false: show a SnackBar ('Send failed — check the phone number and try again') binding the error message if available. For better user experience, add a loading indicator. Create a Boolean App State variable `isSending` (default: false). At the start of the action flow, add a Set App State action to set `isSending` to true. After the SnackBar action, set it back to false. Wrap the Send button in a Conditional widget that shows a CircularProgressIndicator when `isSending` is true and the button when false. Remind users on the recipient field label that the phone number must include the country code with a + prefix — Plivo requires E.164 format (e.g., +14155552671) and returns an error for numbers formatted otherwise. You can add a prefix icon or hint text on the TextField to communicate this.
Pro tip: Plivo SMS messages have a 160-character limit for standard GSM encoding (shorter for Unicode characters). Add a character count display below the message TextField — use a Text widget bound to the length of the `smsMessage` App State variable.
Expected result: Entering a valid phone number and message, then tapping Send SMS, triggers the Cloud Function, Plivo queues the SMS, and the app shows a 'SMS sent successfully!' SnackBar. The message arrives on the destination phone within seconds.
Set up delivery receipts and inbound SMS webhooks
Plivo calls your webhook URL when a message is delivered (or fails) and when an inbound SMS arrives on your Plivo number. Since FlutterFlow is a client app running on a device, it can't directly receive webhooks — use a Firebase Cloud Function as the webhook receiver, writing updates to Firestore for FlutterFlow to stream. In the Firebase console, create a second Cloud Function named `plivoDlr` (Delivery Receipt). Plivo sends a GET or POST request to your webhook URL with parameters `MessageUUID`, `Status`, `To`, `From`, and `MobileCountryCode`. Your function writes these to a Firestore collection `delivery_receipts` keyed by `MessageUUID`. Return HTTP 200 immediately. Configure the webhook in the Plivo console: go to your phone number → Number Configuration. Set the 'Message URL' to your `plivoDlr` Cloud Function HTTPS URL and the 'Message Method' to POST. For inbound messages, create a third Cloud Function `plivoInbound` that receives the incoming SMS parameters (`From`, `To`, `Text`) and writes them to a Firestore `inbound_messages` collection. In FlutterFlow, after a successful `SendSms` API Call, store the returned `messageUuid` (from the `$.messageUuid` JSON path) in an App State variable. On a confirmation screen, add a Firestore stream query on the `delivery_receipts` collection filtered by `MessageUUID == currentMessageUuid`. When Plivo fires the webhook and the Cloud Function writes to Firestore, the FlutterFlow stream updates the UI in real time, showing 'Delivered' when the status arrives. For a simpler implementation without Firestore streaming, just show the 'SMS Sent' SnackBar immediately after the 202 response from the Cloud Function — delivery receipts are optional for basic use cases.
1// Firebase Cloud Function: Plivo DLR webhook receiver2exports.plivoDlr = onRequest(async (req, res) => {3 // Plivo sends GET or POST with form params4 const params = req.method === 'POST' ? req.body : req.query;5 const { MessageUUID, Status, To, From } = params;67 if (MessageUUID) {8 await admin.firestore()9 .collection('delivery_receipts')10 .doc(MessageUUID)11 .set({12 status: Status,13 to: To,14 from: From,15 updatedAt: admin.firestore.FieldValue.serverTimestamp(),16 });17 }18 res.sendStatus(200); // Plivo expects a quick 20019});Pro tip: Return 200 to Plivo immediately — Plivo retries webhooks that don't respond within 2 seconds. If your Firestore write is slow, use a fire-and-forget pattern (don't await) and return 200 before the write completes.
Expected result: The Plivo console shows the webhook URL saved on your number. Sending a test SMS results in a delivery_receipts Firestore document appearing within seconds with the correct MessageUUID and a 'delivered' status. Your FlutterFlow confirmation screen can stream this status in real time.
Test the full flow and handle common errors
Test from a real FlutterFlow Run Mode session (open a browser tab in Run mode, or use Test Mode APK on a device). Enter a valid E.164 phone number in the recipient field and a short message, then tap Send. Watch the Firebase console Function logs in real time to see the raw request and Plivo API response. For trial accounts, Plivo restricts message delivery to whitelisted numbers only. If the SMS doesn't arrive, check the Plivo console under Messages → Message Logs. The log shows the message status and any error reasons. Common statuses: 'queued', 'sent', 'delivered', 'undelivered'. An 'undelivered' status with a reason of 'Sandbox Mode' means the destination number hasn't been whitelisted on your trial account — go to Plivo → Numbers → Sandbox/Whitelist and add the test number. For web builds of your FlutterFlow app, the browser enforces CORS on the Cloud Function call. The CORS headers in the Cloud Function code above (`Access-Control-Allow-Origin: *`) handle this, but confirm by opening your browser's developer tools Network tab during a web Run mode test — look for the OPTIONS preflight returning 204 and the POST returning 200. Once testing is complete on trial, add funds to your Plivo account and test a delivery to a non-whitelisted number to confirm the full production flow. Monitor the Plivo console Message Logs for your first few production sends to verify delivery rates before scaling up message volume.
Pro tip: If you'd rather skip the Cloud Function proxy setup entirely, RapidDev's team builds FlutterFlow integrations like this every week — free scoping call at rapidevelopers.com/contact.
Expected result: End-to-end: a phone number entered in FlutterFlow triggers the Cloud Function which calls Plivo, the SMS arrives on the test device within seconds, and the Plivo Message Log shows 'delivered'. No Plivo credentials are anywhere in the FlutterFlow project.
Common use cases
On-demand service app that sends SMS booking confirmations
A FlutterFlow home services app sends an SMS confirmation to customers when a booking is accepted. When the FlutterFlow action flow reaches the 'booking confirmed' state, it calls the Cloud Function `/send-sms` endpoint with the customer's number and a confirmation message including the service time and provider name.
Add an SMS confirmation to my FlutterFlow booking app: when a booking status changes to 'Confirmed' in Firestore, trigger our /send-sms Cloud Function with the customer's phone number and a message saying 'Your booking is confirmed for [time]. Reply CANCEL to cancel.'
Copy this prompt to try it in FlutterFlow
Two-factor authentication app using Plivo OTP SMS
A FlutterFlow financial app adds phone-number verification during account creation. A Cloud Function generates a random 6-digit OTP, stores a hash in Firestore with a 10-minute expiry, sends it via Plivo SMS, and exposes a separate verify endpoint. FlutterFlow shows a 6-digit input screen and calls the verify endpoint when the user submits.
Add SMS phone verification to my FlutterFlow app: the user enters their number, we call our /send-otp Cloud Function which sends a Plivo SMS, then we show a 6-digit entry screen and verify the code via /verify-otp before unlocking the account.
Copy this prompt to try it in FlutterFlow
Field operations app that alerts technicians via SMS
A FlutterFlow admin dashboard for field service operations lets dispatchers send job alerts to technicians via SMS when a new job is assigned. The dispatcher selects a technician from a list, types a job summary, and taps 'Alert Technician' — the action flow calls the Plivo proxy Cloud Function with the technician's number.
Build an 'Alert Technician' action in my FlutterFlow dispatch app: selecting a technician from a dropdown and tapping Alert sends an SMS via our Plivo Cloud Function to their registered mobile number with the job address and reference number.
Copy this prompt to try it in FlutterFlow
Troubleshooting
Cloud Function returns 401 or Plivo returns 'Authentication failed'
Cause: The Auth ID or Auth Token stored in the Firebase secret is incorrect, or the Auth ID in the URL path doesn't match the account credentials.
Solution: Go to the Firebase console → Functions → your function → Configuration → Secrets and verify PLIVO_AUTH_ID and PLIVO_AUTH_TOKEN match the values shown in the Plivo console dashboard. Remember that the Auth ID appears in the URL path (`/v1/Account/{AUTH_ID}/Message/`) AND as the HTTP Basic username — both must be the same value. If in doubt, regenerate the Auth Token in the Plivo console and update the Firebase secret.
Plivo returns 404 — resource not found
Cause: The Auth ID in the URL path is missing or mistyped. The URL must contain the exact Auth ID between `/Account/` and `/Message/`.
Solution: Verify the Cloud Function constructs the URL as `https://api.plivo.com/v1/Account/${authId}/Message/` with the Auth ID from the environment variable. Log `authId` in the function to confirm it's being read correctly. A typo or empty environment variable results in a URL like `/v1/Account//Message/` which Plivo returns 404 for.
1console.log('Auth ID:', authId); // Add temporarily to debug2const plivoUrl = `https://api.plivo.com/v1/Account/${authId}/Message/`;3console.log('URL:', plivoUrl);SMS queued but never delivered — Plivo Message Log shows 'undelivered' or 'Sandbox Mode'
Cause: On a trial/free account, Plivo only delivers messages to whitelisted sandbox numbers. Messages to other numbers are accepted (202 response) but silently not delivered.
Solution: In the Plivo console, go to Messaging → Sandbox Numbers and add the destination number you're testing with. Alternatively, add funds to your account to exit sandbox mode and enable full delivery to any valid number. Also check the destination country — some countries have additional requirements (10DLC registration in the US, DLT registration in India).
`XMLHttpRequest error` when calling the Cloud Function from FlutterFlow web build
Cause: Browser CORS enforcement: the Cloud Function doesn't return Access-Control-Allow-Origin headers, so the browser blocks the response.
Solution: Add the CORS headers shown in the Cloud Function code above. Ensure the OPTIONS preflight request is handled and returns 204 with `Access-Control-Allow-Methods: POST` and `Access-Control-Allow-Headers: Content-Type`. Redeploy the function after adding the headers.
1res.set('Access-Control-Allow-Origin', '*');2if (req.method === 'OPTIONS') {3 res.set('Access-Control-Allow-Methods', 'POST');4 res.set('Access-Control-Allow-Headers', 'Content-Type');5 return res.status(204).send('');6}Best practices
- Never place the Plivo Auth Token in a FlutterFlow API Call header, variable, or App Values — it's a full account credential that can be extracted from the compiled Flutter binary and used to send messages billed to your account.
- Store PLIVO_AUTH_ID, PLIVO_AUTH_TOKEN, and PLIVO_FROM_NUMBER as Firebase Secret Manager secrets rather than plain environment variables — Secret Manager provides audit logs, versioning, and prevents accidental exposure in build logs.
- Always use E.164 format for phone numbers (`+` followed by country code and subscriber number) — Plivo rejects numbers without the leading `+` or with country-specific local formatting like `(555) 123-4567`.
- Add a character counter to the SMS message TextField — standard SMS messages are 160 characters (GSM-7 encoding) or 70 characters for Unicode. Messages over the limit are split into multiple segments, each billed separately.
- Add your test phone numbers to the Plivo sandbox whitelist before testing — trial accounts silently accept but don't deliver messages to non-whitelisted numbers, which looks like a silent bug in your Cloud Function.
- Return 200 to Plivo webhook calls immediately — Plivo retries webhooks that time out, which can cause duplicate Firestore writes. Use a fire-and-forget pattern for the Firestore write if processing is slow.
- Check the Plivo console Message Logs for your first few production sends to verify delivery rates and carrier routing before scaling — some country/carrier combinations require additional number configuration or registration.
Alternatives
Vonage offers both a simple SMS API and a JWT-signed Messages API for WhatsApp and Viber — choose Vonage if you need omnichannel messaging beyond SMS, accepting the extra complexity of JWT signing.
Twilio has the broadest global reach, most mature documentation, and largest developer community — choose it if you need maximum reliability and are comfortable with its higher per-message pricing.
Sinch bundles SMS, voice, and email under one SDK with strong carrier relationships in Southeast Asia and Latin America — useful if Plivo's coverage in your target markets is weaker.
Frequently asked questions
Can I call the Plivo API directly from FlutterFlow without a Cloud Function?
Technically yes — you could create an API Call in FlutterFlow that calls `api.plivo.com` directly with the Auth ID and Auth Token in the headers. However, this means the Auth Token ships inside your compiled Flutter app binary, where it can be extracted by anyone who downloads and decompiles your app. Anyone with your token can send SMS messages billed to your Plivo account. Always use the Cloud Function proxy pattern for any secret credential in FlutterFlow.
Why does Plivo return 202 but the SMS never arrives?
HTTP 202 Accepted means Plivo queued the message, not that it was delivered. On trial accounts, messages to non-whitelisted numbers are accepted (returning 202) but silently not sent — add the destination number to your Plivo sandbox whitelist or fund the account to exit sandbox mode. Check the Plivo Message Logs console for the actual delivery status and any carrier-level rejection reasons.
Does Plivo work for sending to international phone numbers?
Yes, Plivo supports over 190 countries, but rules vary significantly by destination. Some countries require local long-code numbers (you can't use a US number to send to India, for example). Some countries require alphanumeric sender IDs, others ban them. India in particular has a complex DLT (Distributed Ledger Technology) registration requirement for business SMS. Check Plivo's country coverage page for your specific destination country's requirements before building.
How do I show incoming SMS replies in my FlutterFlow app?
Configure a Plivo webhook URL on your purchased number pointing to a Firebase Cloud Function. When a user replies to your SMS, Plivo POSTs the message data to your Cloud Function, which writes it to Firestore. In FlutterFlow, set up a Firestore real-time stream query on that collection to automatically update a ListView when new inbound messages arrive. FlutterFlow itself can't receive webhooks — the Cloud Function + Firestore relay is the standard pattern.
How is Plivo cheaper than Twilio?
Plivo operates its own carrier relationships and routes SMS traffic directly rather than through intermediary carriers in many markets, reducing per-message costs. Check current per-message rates on Plivo's pricing page for your destination country — rates are country-specific and change over time. Plivo also has no monthly platform fee, making it especially cost-effective for lower-volume use cases.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation