Voice chat in Bubble requires integrating a WebRTC-based service like Daily.co, Agora, or Twilio because Bubble does not have native audio calling. You embed the voice client in an HTML element or use a Bubble plugin, generate room tokens via the API Connector, and manage call states through workflows. This tutorial covers service setup, embedding, call management, and handling permissions.
Overview: Voice Chat in Bubble
This tutorial shows you how to add real-time voice calling to your Bubble app. Since Bubble has no built-in audio calling, you will integrate a third-party WebRTC service. The guide covers choosing a service, embedding the voice client, managing call creation and joining via workflows, and handling browser microphone permissions.
Prerequisites
- A Bubble app with user authentication
- An account with a WebRTC service (Daily.co, Agora, or Twilio)
- API Connector plugin installed
- Basic understanding of HTML elements in Bubble
Step-by-step guide
Choose and configure a WebRTC voice service
Choose and configure a WebRTC voice service
Choose a voice service based on your needs. Daily.co is the easiest to integrate with Bubble — it provides an embeddable iframe that handles all WebRTC complexity. Agora offers more customization but requires more JavaScript. Twilio is enterprise-grade but most complex. Sign up for Daily.co, create an account, and get your API key from the dashboard. Store the API key in your Bubble app's API Connector as a private parameter.
Pro tip: Daily.co offers 10,000 free participant minutes per month, making it ideal for MVP and early-stage apps.
Expected result: You have a WebRTC service account configured with an API key stored securely in Bubble.
Create rooms via the API Connector
Create rooms via the API Connector
In the API Connector, set up a call to Daily.co's room creation endpoint. Configure a POST call to https://api.daily.co/v1/rooms with your API key in the Authorization header (Bearer token). The request body should include room properties like name, privacy (public or private), and expiry time. Set this call as an 'Action' type so you can trigger it from workflows. Initialize the call with sample data.
1{2 "name": "room-{{unique_id}}",3 "privacy": "private",4 "properties": {5 "exp": 1711699200,6 "max_participants": 10,7 "enable_chat": false8 }9}Expected result: An API Connector action creates voice chat rooms on demand and returns the room URL.
Embed the voice client in an HTML element
Embed the voice client in an HTML element
On your call page, add an HTML element sized to the area where you want the voice controls. For Daily.co, embed their prebuilt UI iframe. Use Bubble's 'Insert dynamic data' to pass the room URL into the iframe src. The prebuilt UI includes mute/unmute, leave call, and participant list. Style the HTML element to match your app's design with CSS inside the element.
1<iframe2 id="voice-call"3 src="https://your-domain.daily.co/room-name"4 allow="microphone; camera; autoplay; display-capture"5 style="width:100%;height:400px;border:none;border-radius:12px;"6></iframe>Expected result: A voice chat interface appears in the HTML element with built-in controls for mute, unmute, and leave.
Build call initiation and joining workflows
Build call initiation and joining workflows
Create a 'Start Call' button workflow: Step 1 — call the room creation API to generate a new room. Step 2 — store the room URL in a 'Call' Data Type record linked to the conversation or group. Step 3 — redirect both users to the call page with the room URL as a parameter. For the recipient, send a notification (push, email, or in-app) with a 'Join Call' link that opens the call page with the same room URL.
Expected result: Users can initiate calls that create rooms and notify recipients, who can join with one click.
Handle microphone permissions and call states
Handle microphone permissions and call states
The browser will prompt for microphone permission when the voice client loads. Add a message on the call page explaining that microphone access is required. Track call state in your database: create a 'Call' Data Type with fields for room_url, participants (list of Users), status (ringing/active/ended), and start_time. Update status to 'active' when both users join and 'ended' when the last user leaves. Use a 'Do when condition is true' event to detect when the call iframe is removed or the user navigates away.
Expected result: Call state is tracked in the database, and users see clear prompts for microphone permissions.
Complete working example
1VOICE CHAT — WORKFLOW SUMMARY2================================34SERVICE: Daily.co (or Agora / Twilio)5API KEY: stored in API Connector (private)67DATA TYPE: Call8 room_url (text), participants (list of Users)9 status (text: ringing/active/ended)10 start_time (date), end_time (date)11 conversation (Conversation)1213START CALL WORKFLOW:14 Step 1: API Connector → create Daily.co room15 Step 2: Create Call record (room_url, status = ringing)16 Step 3: Notify recipient (in-app or push)17 Step 4: Navigate to call page with room_url1819CALL PAGE:20 HTML element: Daily.co iframe21 src = room URL from page parameter22 allow = microphone, camera, autoplay23 Microphone permission prompt displayed2425JOIN CALL WORKFLOW:26 Step 1: Navigate to call page with room_url27 Step 2: Update Call status = 'active'28 Step 3: Add Current User to participants list2930END CALL:31 Step 1: User clicks leave or navigates away32 Step 2: Update Call status = 'ended'33 Step 3: Set end_time = Current date/timeCommon mistakes when adding Voice Chat to a Bubble App
Why it's a problem: Exposing the voice service API key in client-side code
How to avoid: Use the API Connector with private parameters and create rooms through backend workflows or actions
Why it's a problem: Not handling microphone permission denial
How to avoid: Add a visible message explaining microphone requirements and provide a troubleshooting link for enabling permissions
Why it's a problem: Creating rooms without expiration times
How to avoid: Set an expiration time on every room (e.g., 2 hours from creation) so they auto-delete
Best practices
- Use a service with a prebuilt UI (Daily.co) for fastest integration
- Store API keys securely as private parameters in the API Connector
- Set room expiration times to auto-clean unused rooms
- Track call history in your database for analytics and user experience
- Add clear microphone permission prompts before loading the voice client
- Test on multiple browsers — Safari has stricter autoplay and WebRTC policies
- Provide a fallback phone number option for users with browser compatibility issues
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I want to add voice calling to my Bubble.io messaging app using Daily.co. How do I create rooms via API, embed the voice client, and manage call states between two users?
Add a voice chat feature to my messaging app. Use Daily.co for the voice service. Create a Start Call button that generates a room, embeds the voice client in an HTML element, and notifies the other user to join.
Frequently asked questions
Which voice service is easiest to integrate with Bubble?
Daily.co is the easiest because it provides an embeddable iframe with a prebuilt UI — no custom JavaScript required. Just embed the iframe in an HTML element with the room URL.
How much does voice chat cost?
Daily.co offers 10,000 free participant minutes per month. Beyond that, pricing starts at $0.004/minute. For a small app, costs are typically under $20/month.
Can I add video alongside voice?
Yes. Daily.co and Agora both support video and voice simultaneously. The same iframe embed supports both — just add 'camera' to the allow attribute.
Does voice chat work on mobile browsers?
Yes, WebRTC voice works on mobile Chrome and Safari. iOS Safari requires user interaction before allowing microphone access, so the user must tap a button to join the call.
Can RapidDev help integrate voice and video calling into my Bubble app?
Yes. RapidDev can integrate voice and video calling services, build custom call interfaces, and implement features like call recording and transcription in your Bubble app.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation