Skip to main content
RapidDev - Software Development Agency
retool-integrationsREST API Resource

How to Integrate Retool with Plivo

Connect Retool to Plivo by creating a REST API Resource using Plivo's Auth ID and Auth Token with HTTP Basic authentication. Use Plivo's SMS and Voice API to build communications admin panels that send bulk SMS, manage phone number inventory, view call logs, and monitor messaging campaigns — making Plivo a cost-effective alternative to Twilio for internal communications tooling.

What you'll learn

  • How to configure a Plivo REST API Resource in Retool with Basic authentication using Auth ID and Auth Token
  • How to send SMS messages and manage outbound messaging campaigns from Retool
  • How to query Plivo phone number inventory, call logs, and message history
  • How to build a multi-number messaging dashboard for customer outreach campaigns
  • How to use JavaScript transformers to format Plivo API responses for Retool Tables and Charts
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate16 min read25 minutesCommunicationLast updated April 2026RapidDev Engineering Team
TL;DR

Connect Retool to Plivo by creating a REST API Resource using Plivo's Auth ID and Auth Token with HTTP Basic authentication. Use Plivo's SMS and Voice API to build communications admin panels that send bulk SMS, manage phone number inventory, view call logs, and monitor messaging campaigns — making Plivo a cost-effective alternative to Twilio for internal communications tooling.

Quick facts about this guide
FactValue
ToolPlivo
CategoryCommunication
MethodREST API Resource
DifficultyIntermediate
Time required25 minutes
Last updatedApril 2026

Build a Plivo Communications Admin Panel in Retool

Operations teams using Plivo for SMS and voice communications often need custom dashboards that Plivo's web console doesn't provide: bulk messaging interfaces for outreach campaigns, call log views filtered by team or campaign, phone number inventory management across multiple regions, and delivery report tracking that integrates with internal CRM data. Plivo's REST API makes all of these operations accessible programmatically.

Retool bridges the gap between Plivo's API and your team's needs. You can build a messaging operations center that allows customer success teams to send targeted SMS to specific customer segments, monitoring dashboards that show message delivery rates and failed SMS with error codes, phone number management panels that provision and release numbers across multiple regions, and call log analyzers that filter and export call data for compliance or billing purposes.

Plivo's API uses HTTP Basic authentication with your Auth ID and Auth Token — the same credentials you use to log into the Plivo console. Retool's server-side proxy keeps the Auth Token secure and off the browser, satisfying the security requirements for communications infrastructure tooling. Plivo is particularly cost-effective for high-volume international SMS — often 30-50% cheaper than Twilio for equivalent volume, making it a popular choice for businesses scaling their messaging operations.

Integration method

REST API Resource

Plivo connects to Retool through a REST API Resource using HTTP Basic Authentication with Plivo's Auth ID as the username and Auth Token as the password. The base URL includes your Plivo Auth ID in the path. All requests are proxied server-side through Retool, eliminating CORS issues and keeping your Auth Token off the browser. Authentication is configured once at the resource level and applies to all Plivo queries.

Prerequisites

  • A Plivo account with Auth ID and Auth Token (available in the Plivo console at console.plivo.com → Overview)
  • At least one Plivo phone number for SMS sending (can be provisioned from the Plivo console or via API)
  • A Retool account with permission to create Resources
  • Familiarity with Retool's query editor, Table component, and Form components
  • Phone numbers to send SMS must be properly formatted in E.164 format (e.g., +12025551234)

Step-by-step guide

1

Retrieve Plivo Auth credentials and configure the Resource

Log in to the Plivo console at console.plivo.com. On the Overview page (or Account → API Credentials), find your Auth ID and Auth Token. The Auth ID is a public identifier (begins with a letter-number combination like MA...) while the Auth Token is the secret credential that authenticates API requests. Copy both values. Before creating the Retool resource, store your credentials securely. Navigate to your Retool instance's Settings → Configuration Variables and create two variables: PLIVO_AUTH_ID (not Secret — it's used in URL paths and is less sensitive) and PLIVO_AUTH_TOKEN (mark as Secret — this is the authentication credential). Navigate to the Resources tab in Retool and click Add Resource. Select REST API. Name the resource 'Plivo API'. In the Base URL field, enter https://api.plivo.com. Plivo uses HTTP Basic Authentication where the Auth ID is the username and Auth Token is the password. In the Authentication section, select Basic Auth. Set Username to {{ retoolContext.configVars.PLIVO_AUTH_ID }} and Password to {{ retoolContext.configVars.PLIVO_AUTH_TOKEN }}. Add default headers: Key = Content-Type, Value = application/json. Also add: Key = Accept, Value = application/json. Click Save Changes. Test the resource by creating a quick GET query to /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/ to retrieve your account details — if you receive account information, the authentication is working correctly.

Pro tip: Plivo's API URL paths include your Auth ID in the path (e.g., /v1/Account/{auth_id}/Message/). You'll need to include the Auth ID as a path component in every query, not just as an authentication credential. Reference it using {{ retoolContext.configVars.PLIVO_AUTH_ID }} in query paths.

Expected result: The Plivo API REST resource is saved with Basic authentication configured. A test query to /v1/Account/{auth_id}/ returns your Plivo account details including account balance and API rate limits.

2

Build the message sending query

Create the primary SMS sending query. In your Retool app, open the Code panel and click + to add a query. Name it sendSMS, select the Plivo API resource, set Method to POST, and set the path to /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/Message/. Set the request body type to JSON and enter the message parameters: Add the following UI components to build the message composition form: a TextInput named textInput_fromNumber (select from your Plivo phone numbers), a TextInput named textInput_toNumber for the recipient's E.164-formatted number, a TextArea named textArea_messageText for the SMS body (add a character counter to warn when approaching the 160-character single SMS limit), and a Button named btnSendSMS that triggers sendSMS. For sender number selection, create a query named getPhoneNumbers with Method GET and path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/Number/. Bind a Dropdown component to this query's results to let users select which Plivo number to send from. Add a confirmation Modal that appears before sending: show the from number, to number, and message preview in the modal body, with Confirm Send and Cancel buttons. Only trigger sendSMS after the user confirms. On sendSMS success, show a notification with the returned message_uuid for tracking, and log the send to an internal database if needed.

sms_body.json
1// JSON body for Plivo SMS send request
2// Used in sendSMS query body
3{
4 "src": "{{ textInput_fromNumber.value }}",
5 "dst": "{{ textInput_toNumber.value.replace(/\\s/g, '') }}",
6 "text": "{{ textArea_messageText.value }}",
7 "type": "sms",
8 "url": "",
9 "method": "POST"
10}

Pro tip: Plivo's dst (destination) parameter accepts multiple numbers separated by '<' for bulk sending — for example '14155551234<14155556789'. For campaign sends with 100+ recipients, use a Retool Workflow with a Loop block that iterates over recipient rows from your database and sends individually, adding a delay between iterations to avoid rate limit errors.

Expected result: The SMS send form successfully submits to Plivo and returns a message_uuid and api_id in the response. The confirmation modal prevents accidental sends. After successful submission, a notification shows the message tracking UUID.

3

Query message logs and delivery status

Create queries to retrieve message history and delivery status. Create getMessageLogs with Method GET and path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/Message/. Add URL parameters for filtering: Key = offset, Value = {{ (pagination.pageNumber - 1) * 20 || 0 }}, Key = limit, Value = 20, Key = message_direction, Value = {{ select_direction.value || 'outbound' }}, Key = message_state, Value = {{ select_status.value || '' }}. For date filtering, add: Key = message_time__gte, Value = {{ new Date(dateRange.start).toISOString().split('T')[0] }} and Key = message_time__lte, Value = {{ new Date(dateRange.end).toISOString().split('T')[0] }}. Create a JavaScript transformer to format the message log response. Key fields in each Plivo message object include: message_uuid, from_number, to_number, message_time, message_state (delivered, failed, sent, queued), message_direction, total_amount (cost), units, error_code. Bind a Retool Table to the transformer output. Add a status filter dropdown with options: All, delivered, failed, sent, queued — bound to select_status. Add a date range picker for time filtering. For message detail view, create getMessageDetail with Method GET and path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/Message/{{ table_messages.selectedRow.message_uuid }}/. Trigger this when a table row is selected to show the complete message details in a side panel.

transformer.js
1// JavaScript transformer — format Plivo message logs
2const objects = data?.objects || [];
3
4return objects.map(msg => {
5 const cost = parseFloat(msg.total_amount || 0);
6 const msgTime = msg.message_time ? new Date(msg.message_time) : null;
7
8 return {
9 uuid: msg.message_uuid,
10 from_number: msg.from_number || msg.src,
11 to_number: msg.to_number || msg.dst,
12 direction: msg.message_direction,
13 status: msg.message_state,
14 status_badge: msg.message_state === 'delivered' ? '✓ Delivered'
15 : msg.message_state === 'failed' ? '✗ Failed'
16 : msg.message_state === 'sent' ? '→ Sent'
17 : '⏳ ' + (msg.message_state || 'Unknown'),
18 message_preview: msg.message_length > 20
19 ? msg.message_length + ' chars'
20 : 'Short message',
21 units: msg.units || 1,
22 cost: cost > 0 ? `$${cost.toFixed(5)}` : '$0',
23 error_code: msg.error_code || '',
24 sent_time: msgTime
25 ? msgTime.toLocaleString('en-US', {
26 month: 'short', day: 'numeric',
27 hour: 'numeric', minute: '2-digit'
28 })
29 : 'N/A'
30 };
31});

Pro tip: Plivo message logs use Django-style query parameter filtering (message_time__gte for 'greater than or equal'). For precise date filtering, use ISO date strings in YYYY-MM-DD format. The message_state filter accepts values: delivered, failed, sent, queued, expired — use these exact lowercase values in your status filter dropdown options.

Expected result: The message logs table shows recent SMS history with from/to numbers, delivery status with visual indicators, cost, and send timestamps. Date range and status filters update the table results correctly. Selecting a message row shows its full details in the side panel.

4

Build phone number inventory and management panel

Create queries to manage your Plivo phone number inventory. Create getPhoneNumbers with Method GET and path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/Number/. Add URL parameters: Key = limit, Value = 100, Key = offset, Value = {{ (pagination.pageNumber - 1) * 100 || 0 }}. The numbers endpoint returns objects with number, number_type (local, tollfree, mobile, national), country, monthly_rental_rate, and application (the app/trunk assigned to the number). Create a JavaScript transformer to format the numbers list, calculating monthly cost totals and grouping numbers by country for summary stats. Add Stat components showing: total numbers owned, total monthly cost, and breakdown by country or type. For searching available numbers to provision, create searchAvailableNumbers with Method GET and path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/PhoneNumber/. Add URL parameters: Key = country_iso, Value = {{ select_country.value }}, Key = type, Value = {{ select_numberType.value || 'local' }}, Key = pattern, Value = {{ textInput_numberPattern.value || '' }}. Add a provisioning action: create buyNumber with Method POST and path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/PhoneNumber/{{ table_availableNumbers.selectedRow.number }}/. This provisions the selected available number to your Plivo account. For RapidDev-style comprehensive communications infrastructure tools that combine Plivo's multi-number management with CRM routing logic and message routing rules, Retool's multi-resource architecture allows connecting Plivo API with your customer database in the same app.

transformer.js
1// JavaScript transformer — format phone number inventory
2const objects = data?.objects || [];
3
4// Calculate totals
5const totalMonthlyCost = objects.reduce((sum, num) => {
6 return sum + parseFloat(num.monthly_rental_rate || 0);
7}, 0);
8
9// Group by country
10const byCountry = {};
11objects.forEach(num => {
12 const country = num.country || 'Unknown';
13 if (!byCountry[country]) byCountry[country] = { count: 0, cost: 0 };
14 byCountry[country].count++;
15 byCountry[country].cost += parseFloat(num.monthly_rental_rate || 0);
16});
17
18const numberList = objects.map(num => ({
19 number: num.number,
20 type: num.number_type || 'local',
21 country: num.country || 'N/A',
22 monthly_cost: `$${parseFloat(num.monthly_rental_rate || 0).toFixed(2)}/mo`,
23 monthly_cost_num: parseFloat(num.monthly_rental_rate || 0),
24 sms_enabled: num.sms_enabled ? '✓' : '✗',
25 voice_enabled: num.voice_enabled ? '✓' : '✗',
26 mms_enabled: num.mms_enabled ? '✓' : '✗',
27 application: num.application || 'Unassigned',
28 added_on: num.added_on
29 ? new Date(num.added_on).toLocaleDateString()
30 : 'N/A'
31}));
32
33return {
34 numbers: numberList,
35 total_count: objects.length,
36 total_monthly_cost: `$${totalMonthlyCost.toFixed(2)}/mo`,
37 by_country: byCountry
38};

Pro tip: Plivo numbers are billed monthly. Before releasing a number, note that once released, the number may be reassigned to another customer and you may not be able to reclaim it. Add a warning in the release confirmation modal: 'Releasing this number is permanent. Any existing DID routing for this number will stop immediately.'

Expected result: The phone number inventory table shows all owned Plivo numbers with their monthly cost, capabilities (SMS/Voice/MMS), country, and assigned application. Stat components show total number count and monthly spend. The available numbers search and provisioning flow works end-to-end.

5

Build call log analysis and voice monitoring queries

Create queries for voice call monitoring and analysis. Create getCallLogs with Method GET and path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/Call/. Add URL parameters: Key = offset, Value = 0, Key = limit, Value = 50, Key = call_direction, Value = {{ select_callDirection.value || '' }}, Key = call_time__gte, Value = {{ dateRange.start.toISOString().split('T')[0] }}. Plivo's call records include call_uuid, from_number, to_number, call_duration, call_direction (inbound/outbound), end_call_source, bill_duration (billed seconds), total_amount, and hangup_cause_code. Create a transformer to format call logs with calculated cost per minute, duration in human-readable format (MM:SS), and hangup cause descriptions. Add a summary analytics section: create a JavaScript query that aggregates the call log data to calculate total call minutes, total call cost, average call duration, and call completion rate (successful vs. no-answer/busy). Bind Stat components to the aggregate data. Add a Chart component showing call volume by hour-of-day as a bar chart to identify peak calling periods — useful for capacity planning and staffing optimization. For outbound call campaigns, add a dialing dashboard section with a form to initiate outbound calls through Plivo's API: create initiateCall with Method POST, path /v1/Account/{{ retoolContext.configVars.PLIVO_AUTH_ID }}/Call/, body including from, to, and answer_url parameters pointing to your call flow XML.

transformer.js
1// JavaScript transformer — format Plivo call logs
2const objects = data?.objects || [];
3
4return objects.map(call => {
5 const durationSec = parseInt(call.call_duration || call.duration || 0);
6 const billSec = parseInt(call.bill_duration || 0);
7 const cost = parseFloat(call.total_amount || 0);
8
9 const formatDuration = (seconds) => {
10 const m = Math.floor(seconds / 60);
11 const s = seconds % 60;
12 return `${m}:${s.toString().padStart(2, '0')}`;
13 };
14
15 const hangupCodes = {
16 '16': 'Normal Clearing',
17 '17': 'User Busy',
18 '18': 'No Answer',
19 '19': 'No Answer (timeout)',
20 '21': 'Call Rejected',
21 '486': 'Busy Here'
22 };
23
24 return {
25 uuid: call.call_uuid,
26 direction: call.call_direction || 'outbound',
27 from_number: call.from_number,
28 to_number: call.to_number,
29 duration: formatDuration(durationSec),
30 billed_duration: formatDuration(billSec),
31 cost: cost > 0 ? `$${cost.toFixed(5)}` : 'Free',
32 cost_per_min: billSec > 0
33 ? `$${((cost / billSec) * 60).toFixed(4)}/min`
34 : 'N/A',
35 status: call.hangup_cause_code === '16' ? 'Completed' : 'Incomplete',
36 hangup_cause: hangupCodes[call.hangup_cause_code] || call.hangup_cause || 'Unknown',
37 call_time: call.call_time
38 ? new Date(call.call_time).toLocaleString()
39 : 'N/A'
40 };
41});

Pro tip: Plivo's hangup_cause_code field uses SIP response codes (16 = Normal Clearing/completed, 17 = Busy, 18 = No Answer). Map these codes to human-readable descriptions in your transformer using a lookup object. The most useful metric for call operations is the completion rate — the percentage of calls with hangup_cause_code '16' vs. all other codes.

Expected result: The call log table shows recent calls with duration, cost, direction, and hangup cause descriptions. The peak calling hours chart shows hourly call volume. Summary stats display total call minutes, total spend, and call completion rate for the selected date range.

Common use cases

Build a bulk SMS outreach campaign sender

Create a Retool app where the customer success team can upload or select a list of phone numbers from a database, compose an SMS message with variable substitution (e.g., {first_name}), preview the message, and send to all selected recipients using Plivo's bulk messaging endpoint. Show real-time delivery status updates as messages are dispatched.

Retool Prompt

Build an SMS campaign sender with a recipient Table loaded from a PostgreSQL database with a checkbox column for selection, a message composition textarea that supports {first_name} and {account_id} variables, a preview panel showing how the message renders for a selected recipient, and a Send Campaign button that posts to Plivo's bulk message endpoint for all checked rows, with a progress tracker.

Copy this prompt to try it in Retool

Message delivery monitoring and error tracking dashboard

Build a Retool monitoring dashboard that fetches Plivo message logs for the past 24 hours, shows delivery status breakdown (delivered, failed, undelivered, queued), displays error codes for failed messages with descriptions, and surfaces phone numbers with repeated delivery failures that may indicate DND or carrier blocks.

Retool Prompt

Create a message monitoring dashboard with Stat components showing delivered/failed/queued counts, a Table of recent messages with timestamp, to-number, from-number, status, and error_code columns, a bar chart showing delivery success rate by hour, and a drill-down panel showing all failed messages for a selected error code with the ability to retry sending.

Copy this prompt to try it in Retool

Phone number inventory and cost management panel

Build a Plivo number management dashboard that lists all owned phone numbers with their monthly cost, region, capabilities (SMS/Voice/MMS), and current assignment status. Add actions to search for available numbers in specific area codes, provision new numbers, and release unused numbers to reduce monthly costs. Show monthly spend trending.

Retool Prompt

Build a phone number inventory panel with a Table showing all Plivo numbers with their number, type, monthly_rental_rate, capabilities, and assigned_application columns, grouped by country. Add a 'Search Available Numbers' section with country/region filters that queries the Plivo available numbers endpoint, plus Provision and Release buttons for number lifecycle management.

Copy this prompt to try it in Retool

Troubleshooting

401 Authentication Failed error on all Plivo API requests

Cause: The Auth ID or Auth Token in the Retool resource Basic Auth configuration is incorrect, or the credentials have been regenerated in the Plivo console since the resource was configured.

Solution: Log in to the Plivo console at console.plivo.com → Overview to verify your current Auth ID and Auth Token. If your Auth Token was recently regenerated (using the refresh button in the Plivo console), update the PLIVO_AUTH_TOKEN configuration variable in Retool with the new token value. Verify the Auth ID is entered as the Username and Auth Token as the Password in the resource's Basic Auth settings — not the other way around.

SMS send returns 400 error with 'Invalid from number' or 'src format error'

Cause: The sender number (src) is not in E.164 format, is not owned by your Plivo account, or the number is not enabled for SMS sending.

Solution: Verify the from number format — Plivo requires E.164 format (e.g., +14155551234 with country code and no spaces). Check that the number exists in your Plivo number inventory (query /v1/Account/{auth_id}/Number/ to see all owned numbers) and confirm it has sms_enabled: true. For toll-free numbers, confirm they're approved for outbound SMS in your target country.

typescript
1// Ensure E.164 format in the src field
2// Clean the number before sending:
3{{ textInput_fromNumber.value.replace(/[^+0-9]/g, '') }}

Messages show status 'sent' but recipients report not receiving SMS

Cause: Plivo's 'sent' status means the message was accepted by the carrier network, not confirmed delivered to the handset. Delivery confirmation depends on carrier DLR (Delivery Receipt) support, which varies by country and carrier.

Solution: Set up a Plivo message delivery webhook to receive DLR updates. In the Plivo console, configure a message URL on your account or application to receive delivery callbacks. Create a Retool Workflow with a Webhook trigger to receive these callbacks and update message status in your database. For critical messages, query the specific message status using /v1/Account/{auth_id}/Message/{message_uuid}/ which shows the most current carrier status.

API rate limit errors (429) when sending bulk messages

Cause: Plivo enforces rate limits on message sending: the default limit is approximately 1 message per second for standard accounts, with higher limits available on enterprise plans.

Solution: For bulk messaging, use Retool Workflows instead of in-app queries. Create a Workflow with a Loop block that processes recipients from your database in batches and includes a 1-second delay between messages using the JavaScript setTimeout pattern or a Wait block. For high-volume campaigns (1000+ messages), contact Plivo to increase your throughput limits before running the campaign.

Best practices

  • Store Plivo Auth ID and Auth Token as configuration variables in Retool — mark the Auth Token as Secret to restrict visibility to resource configurations only.
  • Include your Plivo Auth ID as a path parameter in every query (e.g., /v1/Account/{auth_id}/Message/) rather than hardcoding it — reference it from a configuration variable to make account switching or testing with different accounts easier.
  • Format all destination phone numbers in E.164 format (+countrycode + number) in your transformers before sending — add input validation that strips spaces, dashes, and parentheses and prepends the country code based on a country selector.
  • Add a 160-character SMS character counter to the message composition textarea — messages over 160 characters are split into multiple segments (units) by carriers, each billed separately by Plivo.
  • Use Retool Workflows for bulk messaging campaigns instead of in-app query triggers — Workflows support throttled loops with configurable delays between messages, preventing rate limit errors on large recipient lists.
  • Log every sent message to an internal database table (message_uuid, recipient, content_hash, sent_by, sent_at) immediately after the Plivo API returns a UUID — this creates an audit trail for compliance and helps correlate delivery reports with sends.
  • Implement opt-out management: track STOP keywords in inbound messages and maintain a suppression list in your database. Filter this list before every outbound campaign to avoid sending to opted-out numbers, which can result in carrier blocks and regulatory fines.
  • Monitor Plivo account balance via the /v1/Account/{auth_id}/ endpoint and set up a Retool Workflow alert (via Slack or email) when balance drops below a threshold — Plivo accounts with insufficient balance silently fail to send messages.

Alternatives

Frequently asked questions

Does Plivo have a native connector in Retool?

No, Plivo does not have a native connector in Retool. Twilio (a similar communications platform) has a native Retool connector, but Plivo requires configuration as a REST API Resource using HTTP Basic authentication. The setup takes about 25 minutes and gives you full access to Plivo's SMS, voice, and phone number management APIs.

How does Plivo compare to Twilio for Retool integrations?

Twilio has a native Retool connector with pre-built action dropdowns (Send SMS, Make Call) that simplify setup, while Plivo requires manual REST API configuration. The trade-off is cost: Plivo typically charges 30-50% less per SMS than Twilio for equivalent volume, especially for international destinations. For teams building high-volume messaging operations where cost is a priority, Plivo's REST API integration in Retool is a practical choice.

Can I receive inbound SMS messages in Retool using Plivo?

Yes — configure a Plivo message URL on your inbound number that points to a Retool Workflow webhook trigger URL. When an SMS arrives at your Plivo number, Plivo sends a POST request to the Retool Workflow. The Workflow can then process the message (log it to a database, trigger a notification, run business logic) and respond with Plivo XML if needed. This creates a complete inbound messaging handler without external server infrastructure.

What are Plivo's message delivery statuses, and what do they mean?

Plivo message statuses progress through: queued (accepted by Plivo), sent (submitted to carrier), delivered (confirmed received by handset via DLR), failed (rejected before reaching carrier), and undelivered (carrier accepted but not delivered to handset). The 'delivered' status requires carrier DLR support, which is available in most major markets (US, UK, EU) but may not be returned by all carriers in emerging markets.

How do I handle SMS opt-outs and compliance in my Plivo Retool dashboard?

Plivo handles some carrier-level STOP keyword processing automatically, but compliance responsibility lies with your application. Build an inbound message handler in a Retool Workflow that detects STOP, UNSUBSCRIBE, and QUIT keywords in incoming messages, adds the sender number to a suppression table in your database, and sends a confirmation reply. Before any outbound campaign query executes, filter recipients against this suppression table using a LEFT JOIN that excludes opted-out numbers.

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 Retool 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.