Connect Bubble to Twilio using the API Connector with Basic Auth — your Account SID as the username and Auth Token as the password, both marked Private. POST form-data (not JSON) to Twilio's Messages.json endpoint to send SMS or WhatsApp from any Bubble workflow. For inbound SMS, enable Bubble's Workflow API and set the Bubble endpoint as the webhook on your Twilio phone number — but note that inbound webhooks send form-encoded data, not JSON.
| Fact | Value |
|---|---|
| Tool | Twilio |
| Category | Communication |
| Method | Bubble API Connector |
| Difficulty | Intermediate |
| Time required | 1–2 hours |
| Last updated | July 2026 |
The two things that trip up every Twilio integration in Bubble
Twilio is one of the most-searched integrations on this site (16,920 impressions) and already ranks at position 5.8 — developers and founders actively look for this guide. The two gotchas that catch people most often:
**1. Basic Auth username is the Account SID — not your email, not 'api', not 'apikey.'** If you set up Mailgun before Twilio, you may instinctively type 'api' as the Twilio username. Wrong. Twilio's Basic Auth username is the Account SID itself — the string that starts with `AC` and looks like `ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`.
**2. The body type must be form-data, not JSON.** Twilio's Messages endpoint (`/Messages.json`) accepts `application/x-www-form-urlencoded` form data. If Bubble's API Connector body type is set to JSON, Twilio returns a 400 error with no helpful message. Switch the body type to 'Form data' in the call settings.
Get these two right and the integration works on the first try. Get them wrong and you spend hours debugging what looks like an authentication or permissions problem.
Integration method
Bubble API Connector with Basic Auth — Account SID as username, Auth Token as password, both Private — calling Twilio's Messages.json endpoint with form-data body (not JSON).
Prerequisites
- A Twilio account at console.twilio.com (free trial available — note that trial accounts can only send to verified phone numbers)
- A Twilio phone number with SMS capability purchased or assigned to your account
- The API Connector plugin installed in your Bubble app (Plugins tab → Add plugins → API Connector by Bubble)
- For inbound SMS handling: a Bubble paid plan (Starter or above) for Backend Workflows
Step-by-step guide
Get your Twilio credentials from the Twilio Console
Log into console.twilio.com. On the dashboard home page you will see three values you need: 1. **Account SID** — starts with `AC`, looks like `ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`. This is your Basic Auth username. 2. **Auth Token** — a 32-character string shown masked by default. Click the eye icon to reveal it. This is your Basic Auth password. Treat it like a root password — if compromised, rotate it immediately from the console. 3. **Twilio Phone Number** — go to 'Phone Numbers' → 'Manage' → 'Active Numbers' and copy your SMS-enabled number in E.164 format (e.g., +15551234567). This is your `From` number. If you do not have a Twilio phone number yet, click 'Phone Numbers' → 'Buy a Number.' Filter by SMS capability and select a local number in your region. Numbers typically cost about $1.15/month for a US long-code. Also note whether you are on a trial account or a paid account. Trial accounts can only send SMS to verified phone numbers (numbers you manually verify in the Twilio Console under 'Verified Caller IDs'). For production, upgrade to a paid account.
1// Twilio credentials location in console.twilio.com:2// Account SID: Console home page → Account SID (starts with AC)3// Auth Token: Console home page → Auth Token (click eye icon to reveal)4// Phone Number: Phone Numbers → Manage → Active Numbers56// E.164 format examples:7// US: +155512345678// UK: +4479111234569// India: +919876543210Pro tip: Your Auth Token is the most sensitive credential in Twilio. Anyone with your Account SID + Auth Token can send SMS from your account and rack up charges. Never put the Auth Token in client-side Bubble actions or page state variables — it must stay in the Private API Connector header.
Expected result: You have your Account SID, Auth Token, and Twilio phone number in E.164 format ready to configure in Bubble.
Configure the Twilio API Connector in Bubble
In your Bubble editor, click 'Plugins' → 'API Connector.' Click 'Add another API' and name it 'Twilio.' Click 'Add another call' and name it 'Send SMS.' Set the method to POST. For the URL, use this format: `https://api.twilio.com/2010-04-01/Accounts/{{AccountSID}}/Messages.json` Replace `{{AccountSID}}` with your actual Account SID — for example: `https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Messages.json` Now set up authentication. Click the authentication dropdown (default 'None') and select 'Basic auth.' In the Username field, enter your Account SID (ACxxxxxxxx). In the Password field, enter your Auth Token. Check 'Private' on both fields — this keeps your credentials from appearing in any browser-side network request. CRITICAL: Set the body type to 'Form data' (not 'JSON body'). Twilio's Messages endpoint requires `application/x-www-form-urlencoded` encoding. If you use JSON body, Twilio returns a 400 error. In the form-data body fields, add three parameters: - `To` — the recipient phone number (dynamic, E.164 format) - `From` — your Twilio phone number (can be static — your Twilio number) - `Body` — the message text (dynamic) Click 'Initialize call.' Enter a real phone number you can verify receiving an SMS on (use a number verified in your Twilio console if on trial), your Twilio number as From, and 'Hello from Bubble test' as Body. Click 'Initialize.' If successful, you receive an SMS and see a JSON response with a `sid` field.
1// API Connector: Twilio → Send SMS2// Method: POST3// URL: https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/Messages.json4//5// Authentication: Basic Auth6// Username: ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Account SID — mark Private7// Password: [your Auth Token] // mark Private8//9// Body type: Form data (NOT JSON)10// Form fields:11// To: <dynamic_recipient_phone_E164>12// From: +15551234567 (your Twilio number, can be static)13// Body: <dynamic_message_text>Pro tip: If the Initialize call returns a 401 Unauthorized error, check: (1) the Username is the Account SID (AC...), NOT your email or 'api'; (2) the Password is the Auth Token exactly as shown in the console (no extra spaces); (3) the URL contains the correct Account SID in the path.
Expected result: The Initialize call returns a JSON response with `{"sid": "SMxxxxxxxx", "status": "queued", "to": "+1...", "from": "+1..."}` and you receive a test SMS on your phone.
Format phone numbers to E.164 before sending
Twilio requires all phone numbers in E.164 format: a plus sign followed by the country code and subscriber number, with no spaces, dashes, or parentheses. Examples: +15551234567 (US), +447911123456 (UK), +919876543210 (India). Users typing phone numbers into Bubble forms rarely enter E.164 format. They type numbers like '(555) 123-4567' or '555-123-4567' or just '5551234567' without the country code. You must normalize these before passing to Twilio. In Bubble, add a Phone data type field to your User data type (type: text). When users enter their number in a form, add a workflow step that reformats it. Bubble's built-in text operators can help: - Use 'Find and replace' to strip non-numeric characters - Use 'Truncated from' and 'Extract with Regex' for more complex transformations - Prepend the country code (+1 for US) if your app is US-only For international apps, use a Bubble plugin like 'intl-tel-input' or add a country code dropdown alongside the phone number field so users select their country and the app prepends the correct international prefix. Store the E.164-formatted number in your User record's phone field and always use this stored value when calling Twilio — never re-format at the point of sending.
1// Bubble workflow: Format phone number to E.164 (US example)2// Trigger: Input_Phone loses focus or form is submitted3// Action: Make changes to User → phone_e1644// Value: "+1" + Input_Phone's value:find and replace("(", ""):find and replace(")", ""):find and replace("-", ""):find and replace(" ", "")5//6// For international: collect country_code from a dropdown (text: "+44", "+91", etc.)7// Then: country_code_dropdown's value + Input_Phone's value (digits only)89// E.164 validation check:10// Valid: starts with +, length between 8-15 characters, all digits after +11// Use Bubble's 'matches regex' condition: ^\+[1-9]\d{7,14}$Pro tip: Twilio charges per message segment. A single SMS segment is 160 characters. Messages over 160 characters are split into multiple segments and billed separately. Use Bubble's character count operator to warn users when their message exceeds 160 characters, or enforce a limit to control costs.
Expected result: Your Bubble app stores phone numbers in E.164 format in the User data type. The Twilio Send SMS workflow action always receives a properly formatted phone number starting with + and the country code.
Add a Bubble workflow that sends SMS on trigger
Now wire the Twilio API Connector call to a real Bubble workflow event. The pattern is straightforward: any Bubble event (button click, form submission, new record creation, scheduled time) triggers an action that calls the Twilio API Connector. For secure server-side execution, wrap the Twilio action in a Backend Workflow (Bubble paid plan required). This keeps the Account SID and Auth Token completely server-side — they never appear in browser network requests even with the Private checkbox. Call the Backend Workflow from a client-side trigger using 'Schedule API Workflow' at 'Current date/time.' For a simple notification pattern (e.g., order shipped): 1. Trigger: When an Order record's status changes to 'Shipped' 2. Backend Workflow action: Plugins → Twilio → Send SMS - To: Order's customer's phone_e164 field - From: your Twilio number (static) - Body: 'Your order #' + Order's order_number + ' has shipped! Track it here: ' + Order's tracking_url For OTP / verification codes: 1. User clicks 'Send OTP' button 2. Workflow: Generate a random 6-digit number → Store as User's otp_code, set otp_expires_at = Current date/time + 10 minutes 3. Backend Workflow: Send SMS with Body = 'Your verification code is: ' + User's otp_code 4. Next page: user enters code → validate against User's otp_code and otp_expires_at > Current date/time For WhatsApp: use the same workflow and call but prefix both `To` and `From` numbers with `whatsapp:` — e.g., `whatsapp:+15551234567`. You must use a Twilio number that is WhatsApp-enabled (available via Twilio's WhatsApp sandbox or a WhatsApp Business sender).
1// Backend Workflow: Send Order Shipped SMS2// Trigger: When Order's status = 'Shipped' (from workflow editor)3// Action: Plugins → Twilio → Send SMS4// To: Order's Customer's phone_e1645// From: +15551234567 (your Twilio number)6// Body: "Your order #" + Order's order_number + " has shipped! Expected delivery: " + Order's estimated_delivery formatted as "MMM D"78// OTP Workflow:9// Step 1: Set User's otp_code = Random number between 100000 and 99999910// Step 2: Set User's otp_expires_at = Current date/time + 600 seconds11// Step 3: Backend Workflow → Send SMS12// To: Current User's phone_e16413// From: +1555123456714// Body: "Your code is: " + Current User's otp_code + ". Expires in 10 minutes."1516// WhatsApp variant:17// To: "whatsapp:" + Customer's phone_e16418// From: "whatsapp:+15551234567" (WhatsApp-enabled Twilio number)Pro tip: Twilio trial accounts can only send SMS to verified phone numbers. If you are testing with a trial account and your test SMS is not arriving, go to console.twilio.com → Verify Caller IDs and add the recipient number. For production, upgrade to a paid Twilio account to remove this restriction.
Expected result: Triggering the workflow sends a real SMS to the specified number. Twilio Console → Monitor → Logs shows the message with status 'delivered.' The Bubble Logs tab shows the API Connector action completed with a 200-201 response.
Enable inbound SMS via Bubble Backend Workflow webhook
To receive SMS replies from users, configure Twilio to forward incoming messages to your Bubble app as a webhook. This requires a Bubble paid plan for Backend Workflows. In Bubble, go to Settings → API → check 'This app exposes a Workflow API.' Copy your app's Workflow API base URL. In the Backend Workflows section, create a new workflow named `twilio_inbound`. Click 'Detect data' and Bubble will listen for the next incoming request to auto-detect the schema. In Twilio Console, go to Phone Numbers → Manage → Active Numbers → click your number. Under 'Messaging,' find 'A Message Comes In' and change the dropdown from 'TwiML Bin' to 'Webhook.' Paste your Bubble workflow URL: `https://appname.bubbleapps.io/api/1.1/wf/twilio_inbound` Twilio sends a test request or you can send an SMS to your Twilio number from your phone. Bubble detects the schema — you will see fields including: `Body` (message text), `From` (sender's E.164 number), `To` (your Twilio number), `MessageSid`, `AccountSid`, `NumSegments`. In the Backend Workflow, add actions to process the inbound message: 1. Search for a Contact record where phone_e164 = Step 1's From field 2. Create a new SMS_Inbound record with: message_text = Step 1's Body, sender_phone = Step 1's From, linked_contact = result of step 1 (if found) 3. Add a 'Return data from API' action returning `{"status": "received"}` — this sends a 200 response to Twilio IMPORTANT: You must return HTTP 200 to Twilio within a few seconds or Twilio retries the webhook up to 3 times. Adding a 'Return data from API' action in the workflow ensures the 200 is sent. If you want Twilio to auto-reply with a TwiML response, return XML instead: `<?xml version="1.0"?><Response><Message>Thanks, we got your message!</Message></Response>`. RapidDev has implemented inbound Twilio flows across numerous Bubble apps — if your use case involves complex routing logic, book a free scoping call at rapidevelopers.com/contact.
1// Bubble Backend Workflow URL for Twilio inbound:2https://appname.bubbleapps.io/api/1.1/wf/twilio_inbound34// Twilio sends this POST body (form-encoded, NOT JSON):5// Body=Hello+there&From=%2B15559876543&To=%2B15551234567&MessageSid=SMxxxxxx&6// AccountSid=ACxxxxxx&NumSegments=1&NumMedia=0&SmsStatus=received78// Detected fields in Bubble Backend Workflow:9// Body → text (the message content)10// From → text (sender E.164 number, e.g. +15559876543)11// To → text (your Twilio number)12// MessageSid → text (unique message ID for deduplication)13// NumSegments → number1415// Return 200 with empty TwiML to acknowledge without replying:16// Return data: {"xml": "<?xml version='1.0'?><Response/>"}17// OR return data to auto-reply:18// {"xml": "<?xml version='1.0'?><Response><Message>Got it!</Message></Response>"}Pro tip: Twilio's inbound webhook sends `application/x-www-form-urlencoded` data — NOT JSON. In Bubble's Backend Workflow, each form field (Body, From, To, etc.) is detected as a separate text parameter. Do not try to detect it as a single JSON object. Use Bubble's 'Detect data' button and then send an actual SMS to your Twilio number to trigger the detection.
Expected result: Sending an SMS to your Twilio number creates a new SMS_Inbound record in Bubble's database within seconds. The Backend Workflow run log shows the correct Body and From values from the incoming message. Twilio Console → Monitor shows the webhook was delivered with a 200 response.
Add privacy rules and monitor WU usage
Before launching your Twilio integration to real users, apply privacy rules and set up monitoring. Privacy rules: Go to Bubble's Data tab → Privacy. Add rules for any data type that stores phone numbers or SMS content. At minimum: - User data type: only the Current User can see their own phone_e164 and otp_code fields — other users should not be able to read each other's phone numbers - SMS_Inbound data type (if you created one): only admin users or server-side workflows should read inbound messages — regular users should not access other users' SMS content Set the rule to 'When Everyone else → no access to these fields' for sensitive fields, and enable 'Ignore privacy rules when using workflows' for your Backend Workflows that need to read the data. WU monitoring: Each Twilio SMS send is one API Connector call action — one WU. Inbound webhooks that trigger Backend Workflows consume additional WUs for each workflow step. For apps sending hundreds of SMS per day, this is light WU usage. Monitor in Bubble's Logs tab → WU usage chart to establish a baseline. Cost monitoring: Set up Twilio usage alerts in Twilio Console → Monitor → Alerts. Configure an email alert when daily SMS spend exceeds a threshold you set. This protects against bugs that trigger mass SMS sends (e.g., a recursive workflow that fires thousands of times).
1// Bubble Privacy Rules — User data type:2// Rule: "When This User is not the Current User"3// → uncheck: phone_e164, otp_code, otp_expires_at4//5// SMS_Inbound data type:6// Rule: "When Current User is not an Admin"7// → no access to any field8//9// Enable: "Ignore privacy rules when using workflows"10// (in Privacy tab settings — allows Backend Workflows to read restricted fields)1112// Twilio spend alert setup:13// console.twilio.com → Monitor → Alerts → Create Alert14// Alert type: Usage (Daily)15// Threshold: $[your limit]16// Notification: emailPro tip: Always add Twilio's Account SID to the URL path of the Messages.json endpoint (not just in the Auth username). The URL format is: `https://api.twilio.com/2010-04-01/Accounts/{AccountSID}/Messages.json`. Some tutorials show a generic `/Accounts/` path — without the SID in the URL, Twilio returns a 404.
Expected result: Privacy rules prevent regular users from reading each other's phone numbers and SMS content. Twilio usage alerts are configured to notify you of unexpected spend. Your Bubble app's WU usage for the Twilio integration is visible in the Logs tab.
Common use cases
SMS verification codes for two-factor authentication
Send one-time passcodes to users' mobile numbers when they log in or perform sensitive actions. Generate a random 6-digit code in Bubble, store it with an expiry timestamp, and trigger the Twilio SMS workflow to deliver it. Verify the code on the next page before allowing access.
When a user logs in, generate a 6-digit random number, store it in the User record as otp_code with an expiry of Current date/time + 10 minutes, then call the Twilio API Connector action to SMS the code to the User's phone_number field.
Copy this prompt to try it in Bubble
Order status and shipping notifications via WhatsApp
Send customers WhatsApp messages when their order ships, arrives, or has a delivery exception. Twilio's WhatsApp support uses the same Messages API with a 'whatsapp:' prefix on the recipient and sender numbers — no separate integration needed.
When an Order record's status field changes to 'Shipped', trigger a Backend Workflow that sends a WhatsApp message via Twilio to the Order's customer_phone field with the tracking number and estimated delivery date.
Copy this prompt to try it in Bubble
Inbound SMS to Bubble CRM — receive and store customer replies
Allow customers to reply to your SMS messages and have their responses automatically logged in Bubble. Enable the Workflow API, set the Bubble endpoint in Twilio, and process incoming message bodies, sender numbers, and timestamps directly into your CRM data type.
When a Twilio webhook POST arrives at the Bubble endpoint, create a new SMS_Reply record with the Body field as message_content, the From field as sender_phone, and set the reply's linked_contact by matching sender_phone to a Contact record.
Copy this prompt to try it in Bubble
Troubleshooting
API Connector returns 401 Unauthorized when sending SMS
Cause: The most common causes: (1) the Basic Auth username is set to something other than the Account SID — developers who set up Mailgun first often type 'api' as the username by habit, but Twilio requires the Account SID (ACxxxx); (2) the Auth Token has extra whitespace from copy-pasting; (3) the Account SID in the URL path does not match the Account SID in the auth credentials.
Solution: In Bubble's API Connector → Twilio → Send SMS → authentication settings: verify the Username is exactly your Account SID (starts with AC, 34 characters long). Verify the Password is exactly your Auth Token from the Twilio Console (32 characters). Re-copy both from console.twilio.com with careful attention to trailing spaces. Also verify the URL contains the same Account SID in the path: `https://api.twilio.com/2010-04-01/Accounts/ACxxxxxx/Messages.json`.
API Connector returns 400 Bad Request when sending SMS
Cause: The most common cause is the body type is set to 'JSON body' instead of 'Form data.' Twilio's Messages endpoint only accepts `application/x-www-form-urlencoded` encoding. A JSON body triggers a 400 error.
Solution: In the Twilio Send SMS call settings in Bubble's API Connector, find the 'Body type' or 'Data type' dropdown and change it from 'JSON body' to 'Form data.' Re-initialize the call after making this change. Your To, From, and Body parameters should appear as form fields, not in a JSON object.
SMS sends successfully but messages only arrive on my own phone — fails for other recipients
Cause: Your Twilio account is on a trial plan. Trial accounts can only send SMS to verified phone numbers listed in your 'Verified Caller IDs' in the Twilio Console.
Solution: For testing: go to console.twilio.com → Phone Numbers → Verified Caller IDs → Add a Verified Caller ID. Enter the recipient number and complete the verification call/SMS Twilio sends. For production: upgrade your Twilio account to a paid account to remove the verified-number restriction.
Inbound SMS webhook is not triggering the Bubble Backend Workflow
Cause: Common causes: (1) Bubble's Workflow API is not enabled (Settings → API); (2) the workflow URL in Twilio's webhook settings has a typo; (3) the Backend Workflow is in draft state and not active; (4) Twilio may be appending `/initialize` to the URL during configuration — this initialization URL is different from the production endpoint.
Solution: In Bubble Settings → API, confirm 'This app exposes a Workflow API' is checked. Copy the exact workflow URL from Bubble's Backend Workflows section and paste it into Twilio's webhook settings — do not type it manually. Confirm the workflow is saved (not in draft). For the Twilio webhook, use the production URL format: `https://appname.bubbleapps.io/api/1.1/wf/twilio_inbound` — not the `/initialize` variant Bubble uses during 'Detect data' setup.
Best practices
- Mark both the Account SID (username) and Auth Token (password) as Private in Bubble's API Connector Basic Auth settings. Without Private, these credentials appear in browser network requests and can be read from DevTools by any user.
- Always store phone numbers in E.164 format (+country_code + number) in your Bubble database. Normalize user-entered numbers at the point of form submission, not at the point of API call — this prevents format errors from reaching Twilio.
- Run Twilio SMS actions from Backend Workflows rather than client-side Bubble actions. This ensures credentials stay server-side and the SMS is sent even if the user closes their browser before the client-side action completes.
- Set up Twilio usage alerts in the console to protect against accidental mass-send bugs. A workflow loop that fires unexpectedly can generate thousands of SMS and significant charges before you notice.
- Use Twilio's MessageSid field (returned in the API response) to deduplicate and track SMS records in your Bubble database. Store MessageSid in an SMS_Log data type to build an audit trail of sent messages.
- Apply Bubble privacy rules to any data type storing phone numbers or SMS content. Phone numbers are PII — restrict access to admin users and server-side workflows only.
- For inbound SMS handling, always return HTTP 200 to Twilio within a few seconds. Add a 'Return data from API' action at the start of your Backend Workflow (returning `{"status": "ok"}`) before the longer processing steps to prevent Twilio from retrying the webhook.
Alternatives
Mailgun delivers messages via email, not SMS or WhatsApp. Both integrations use Basic Auth in Bubble's API Connector with form-data body, but Mailgun's username is the literal string 'api' while Twilio's username is the Account SID. Choose Mailgun for email delivery; use Twilio when you need to reach users via phone-channel communications.
SendGrid is an email API that uses a Bearer API key (not Basic Auth) and JSON body. If your communication need is transactional email rather than SMS, SendGrid is simpler to configure in Bubble and provides stronger email delivery analytics. Use Twilio for SMS and WhatsApp; SendGrid for email.
Slack delivers messages to team members in a workspace via Incoming Webhooks or Bot tokens. Twilio delivers SMS and WhatsApp to external users via their phone numbers. If you need to notify your own team, Slack is simpler and free; if you need to reach customers or users outside your Slack workspace via their mobile phones, Twilio is the correct choice.
Frequently asked questions
What is the difference between Twilio's Account SID and API Keys?
Twilio has two types of credentials: the master Account SID + Auth Token (shown on your Console home page) and API Keys (created separately in the Console under Accounts → API keys). The master credentials give full account access. API Keys can be scoped and rotated without changing the master Auth Token. For Bubble integrations, either can work — the API Connector Basic Auth username becomes the API Key SID and the password becomes the API Key Secret. Many developers use master credentials for simplicity; API Keys are safer for production as they can be revoked without rotating your master token.
Can Twilio send WhatsApp messages from the same Bubble integration?
Yes. Use the same Messages.json endpoint and the same API Connector call. Prefix both the `To` and `From` phone numbers with `whatsapp:` — for example, `whatsapp:+15551234567`. The `From` number must be a Twilio number approved for WhatsApp (use Twilio's WhatsApp sandbox for testing or register a WhatsApp Business sender for production). The body parameter accepts the same text content.
How much does Twilio charge per SMS?
Twilio's pricing for US SMS is approximately $0.0079 per message segment, where one segment is 160 characters. Messages over 160 characters split into multiple segments and are billed per segment. Phone numbers cost approximately $1.15/month for a US long-code. WhatsApp messages start at approximately $0.005 per message. Check Twilio's pricing page for current rates in your region — pricing varies by country and number type.
My inbound Twilio webhook is receiving form-encoded data but I can not parse it in Bubble. What do I do?
Twilio sends `application/x-www-form-urlencoded` data (form-encoded), not JSON. In Bubble's Backend Workflow, use the 'Detect data' button and then send a real SMS to your Twilio number while Bubble is listening. Bubble will auto-detect each form field (Body, From, To, MessageSid, etc.) as a separate named parameter. Do not try to parse the entire POST body as a single JSON string — detect each field individually.
Does Twilio work on Bubble's Free plan?
The basic SMS send workflow works on Bubble Free as a client-side action. However, this exposes your Account SID and Auth Token in browser DevTools even with Private checked (client-side actions still make API calls from the browser). For any production use, you need a Bubble paid plan to run the Twilio call from a Backend Workflow (truly server-side). Inbound SMS handling also requires Backend Workflows and therefore a paid plan.
Why does Twilio return a 400 error even though my credentials look correct?
A 400 error from Twilio almost always means the request body is formatted incorrectly — not an authentication problem. Check that Bubble's API Connector body type is set to 'Form data' (not JSON body). Also verify that the `To` number is in E.164 format starting with + and country code, the `From` number is a valid Twilio number in your account, and the `Body` field is not empty. Twilio's error response body usually contains a descriptive message — check Bubble's Logs tab → Workflow logs to read the full response.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation