VoIP Phone & Call Center
VoIP Phone & Call Center adds a SIP/WebRTC softphone to the Odoo backend. Agents place and receive browser calls, work today's phone activities, send and receive SMS texts, keep call records, and use standard in-call controls. The app opens on a live dashboard, and supervisors get a filtered live board — both computed from real call records. This page describes ecosire_voip exactly as version 19.0.1.3.0 ships today.
| Technical name | ecosire_voip |
| Odoo version | 19.0 (Community or Enterprise) |
| Current shipped version | 19.0 → 19.0.1.3.0 |
| Price | $499 USD — one-time |
| Odoo module licence | OPL-1 |
| Category | Productivity / Phone & VoIP |
Overview
The module provides:
- A persistent Phone softphone in the Odoo systray with Keypad, Recent, Contacts, Activities, and Messages tabs, docked or floating with a remembered position, keyboard dialing, missed-call badge, browser notifications, and ringing for background tabs.
- Outbound click-to-dial from read-only Odoo phone fields and inbound caller matching against contact phone numbers.
- Mute, hold/resume, DTMF keypad tones, blind transfer, attended-transfer flow, hangup, Do Not Disturb (DND), and output-device selection.
voip.callrecords with direction, outcome, timestamps, duration, agent, provider, contact, source record, notes, chatter, graph, and pivot views.- Company-level browser recording policy, optional consent notice, WebM playback, and daily retention cleanup.
- A supervisor-only live board with call KPIs, agent states, running calls, daily volume, outcomes, and recent calls.
- A connection doctor for microphone permission, secure WebSocket reachability, STUN/TURN media-path discovery, and SIP registration.
- A Phone dashboard landing page with calls today, answer rate, average duration, missed callbacks pending, hourly volume, a 7-day trend, and top agents.
- SMS through any HTTP SMS gateway, sent from the softphone and received on a token-protected webhook.
- Optional AI transcription and summary of recordings using your own provider key — off by default and consent-gated.
- Provider presets for generic SIP-over-WSS, OnSIP, Asterisk/FreePBX, and 3CX, and auto-install bridges for CRM, HR employees, and recruitment applicants.
There is no IVR designer or queue/ACD configuration in this release.
Requirements
| Requirement | Detail |
|---|---|
| Odoo | 19.0 Community or Enterprise, self-hosted or Odoo.sh. Odoo Online cannot install third-party modules |
| Odoo apps | base, web, mail, and phone_validation — Odoo installs missing dependencies |
| Voice service | A SIP provider or PBX that supports browser WebRTC clients and SIP signaling over a secure WebSocket (wss://) |
| Per-user credentials | A SIP username and secret for every agent |
| Browser | A current browser with microphone, WebRTC, Web Audio, and MediaRecorder support; output-device selection also requires browser support for setSinkId |
| Network | HTTPS access to Odoo, outbound access to the PBX WSS endpoint, and a usable ICE path through STUN and, where needed, TURN |
WSS, STUN, and TURN
The browser connects directly to the provider's SIP-over-WebSocket endpoint. Enter the exact wss:// address supplied by the PBX administrator and use a publicly trusted TLS certificate. A normal sip:, ws://, UDP, or TCP registrar address is not a substitute for the required WSS endpoint.
STUN helps a browser behind NAT discover a public-facing media candidate. TURN relays media when direct peer-to-peer traversal is blocked by symmetric NAT, restrictive corporate firewalls, carrier-grade NAT, or similar network policies. Configure TURN, including its username and secret, when agents cannot establish a usable media path with STUN alone. The module passes the configured ICE servers to the browser; it does not include or operate a STUN/TURN server.
Installation and access
- Extract the archive so
/opt/odoo/addons/ecosire_voip/__manifest__.pyexists. - Restart Odoo, enable developer mode, and choose Apps → Update Apps List.
- Search for VoIP Phone & Call Center and click Install.
- Under Settings → Users & Companies → Users, grant the appropriate Phone & VoIP access level:
- VoIP User — use the phone and work with call records.
- VoIP Supervisor — includes user access and permits the Live Board.
- VoIP Administrator — includes supervisor access and can manage providers and settings.
The module installs standalone. It has no separate ECOSIRE licence-client dependency or activation screen.
Setup
1. Create the provider
As a VoIP Administrator, open Phone → Configuration → Providers, create a provider, and fill in:
| Field | Required | Purpose |
|---|---|---|
| Provider Preset | Yes | Starting point: Generic SIP over WSS, OnSIP, Asterisk/FreePBX, or 3CX. The preset pre-fills typical values and shows a setup guide |
| Name | Yes | Unique provider label within the company |
| SIP Domain | Yes | Registrar/domain used to construct SIP addresses |
| Secure WebSocket URL | Yes | Browser-reachable SIP signaling endpoint, such as wss://pbx.example.com/ws |
| Mode | Yes | Demo or Production label shown in the softphone |
| Company | Yes | Company that owns the provider |
| STUN URL | No | ICE discovery server, such as stun:stun.example.com:3478 |
| TURN URL | No | ICE relay server, such as turn:turn.example.com:3478 |
| TURN Username / Secret | No | Credentials for the configured TURN relay |
Provider records and calls are company-scoped. Users only see providers for their allowed companies.
Preset notes:
- OnSIP pre-fills
wss://edge.sip.onsip.com/ws; set the SIP domain to your OnSIP account domain. - Asterisk / FreePBX pre-fills the usual
:8089/wspath; the PBX needs its built-in HTTP server with TLS andwebrtc=yesendpoints on a WSS transport. - 3CX blocks third-party WebRTC clients from registering directly. Use 3CX's own web client or place a WebRTC gateway (for example a small Asterisk bridge) in front of 3CX and point the provider at the gateway.
The mode changes the Demo or Production badge in the phone. It does not create a test PBX, fake media, or bypass registration. The optional Odoo demo data uses .invalid addresses and intentionally contains no live credentials; it cannot place calls. Use a provider-controlled test extension or test PBX for a real trial.
2. Assign each user's SIP credentials
Each agent opens their user menu and selects Preferences. In the VoIP section, set:
- VoIP Provider
- SIP Username
- SIP Secret
The secret is masked. A regular user can access only their own secret; a VoIP Administrator can administer user settings. The phone shows a setup prompt until all three values are present.
The same Preferences section stores Ring Device and Do Not Disturb, but it is easier to choose the output device from the softphone after the browser has enumerated devices.
3. Register the phone
Open the phone icon in the top bar and click Connect. The status changes from idle to connecting and then registered when the SIP server accepts the credentials. Registration is not automatic merely because the preferences are saved.
Using the softphone
Tabs
| Tab | What it shows |
|---|---|
| Keypad | A number-and-name field, live contact suggestions with initials avatars, a letter keypad (ABC…WXYZ), backspace, keyboard dialing (typing digits or letters fills the pad; Enter calls), and Connect/Call. During a call the keypad sends DTMF |
| Recent | The current user's latest 30 voip.call records grouped by day with color-coded missed/answered/outgoing states; one tap calls the number back, and unmatched numbers offer Create contact |
| Contacts | Up to 30 contacts with a phone value, searched by name or number |
| Activities | Up to 30 phone-call activities assigned to the current user and due today. Call dials the record's own phone number; Open and Done behave as elsewhere in Odoo |
| Messages | The company's recent SMS thread with a composer, backed by the configured SMS gateway |
Numbers must normalize to international E.164 form, for example +12025550123. A number beginning with 00 is converted to +; short or otherwise invalid numbers are rejected.
Outbound and click-to-dial
- Enter a number or select a contact in the softphone, ensure the status is registered, and click Call.
- Clicking a read-only phone field anywhere in the Odoo backend opens the softphone with that number and remembers the source record.
- When a source-linked call ends, the module posts its direction, number, outcome, and duration to that record's chatter.
Inbound calls
While the browser phone is registered, an inbound SIP session opens the phone, plays ringing, and shows the matched contact or caller number with Accept and Reject (plus Create contact for unknown numbers). If the Odoo tab is in the background and you granted browser notifications, a system notification is shown too. Contact matching uses the last nine digits of the caller number against the contact's phone field.
If DND is enabled, the module declines the session and records it as Missed without showing the accept flow. DND persists in the user's preferences.
In-call controls and transfers
- Mute disables the outgoing audio track.
- Hold and Resume use the SIP.js session hold controls.
- Keypad presses during an active call send DTMF.
- Blind transfer sends the current session to the entered SIP target.
- Attended starts a call to the target before attempting the transfer.
- End hangs up the current session.
Transfers require the provider/PBX to support SIP REFER. Attended-transfer behavior is especially provider-specific, so test it with your PBX before relying on it in production.
DND and ring/output device
Use the DND switch in the phone header to enable or disable Do Not Disturb. Under Connection doctor & audio, choose a detected audio-output device or System default. The selection is saved to the user's preferences and applied through the browser's output-device API when that API is available. Browser permission and device-label behavior varies; if selection is unavailable, use the operating system's default output device.
Call recording
Recording is performed in the agent's browser. The module merges the active call's local and remote audio tracks, creates a WebM recording, and uploads it to the owned voip.call record when recording stops or the call ends. The recording is playable from Phone → Calls. An upload is limited to 100 MB and the server accepts WebM content only.
Configure the policy under Phone → Configuration → Settings:
| Policy | On answer | Agent controls | Server upload rule |
|---|---|---|---|
| Enforced | Recording starts automatically after the call is answered | No Start/Stop buttons | WebM uploads accepted |
| User controlled | Recording starts only when the agent clicks Record | Record and Stop recording are available during an active call | WebM uploads accepted |
| Off | No recording starts | Recording controls are hidden | Uploads are rejected |
You are responsible for choosing a lawful policy and notice for every jurisdiction and participant. The optional notice is an on-screen browser notification for the Odoo agent; the code does not play an audio announcement to the remote party and does not capture affirmative consent.
Consent notice
Enable Consent Notice and edit its text to show an accessible warning immediately before browser recording starts. It is off by default. The shipped default says that the call may be recorded and reminds the agent to follow applicable consent and privacy requirements.
Retention
Set Recording Retention to the number of days recordings should remain attached. A daily scheduled action, VoIP: Purge Expired Recordings, deletes attachments from ended calls older than that cutoff. Set the value to 0 to retain recordings indefinitely. The purge still applies to recordings captured under an earlier policy if recording is later switched off.
Phone dashboard
The Phone app opens on the dashboard. Every figure is computed from the company's voip.call rows visible to you — nothing is hardcoded:
- KPIs: calls today, answer rate today, average answered duration today, missed callbacks pending over 7 days, and your own calls today.
- Calls per hour for today, a 7-day answered/missed trend, top agents over 7 days, the latest calls today, and one-tap call back buttons for pending missed numbers.
A company with no calls yet sees an explicit empty state. The supervisor Live Board below remains the operations view.
SMS messages
Send and receive texts from the softphone's Messages tab through any HTTP SMS gateway. A VoIP Administrator creates the gateway under Phone → Configuration → SMS Gateways:
| Field | Purpose |
|---|---|
| Endpoint template | URL with {phone}, {message} and optional {sender} placeholders |
| Method | GET (placeholders in the URL) or POST (JSON body) |
| Auth token | Optional Authorization: Bearer header value |
| Inbound token | Secret path segment of the inbound webhook |
Point your SMS provider's delivery webhook at /ecosire_voip/sms/<inbound token>. Inbound JSON payloads are read for a phone number (phone, from, number, sender, or originator) and the text (configurable dotted JSON path). Received messages are matched to contacts and logged on the partner's chatter. Failed sends stay on the record with their error and can be retried.
AI transcription and summary
Optional and off by default. Under Phone → Configuration → Settings → AI Transcription & Summary, enable the feature, acknowledge the processing consent, choose a provider (OpenAI, Groq, Anthropic, or a custom OpenAI-compatible endpoint), and store your own API key. Transcription requires an OpenAI-compatible audio endpoint (OpenAI or Groq); Anthropic supports summaries of an existing transcript.
On a call with a recording, open the call form's AI Transcript page and click Transcribe & Summarize. The transcript and a structured summary are stored on the call. No request reaches any AI provider until the feature is enabled and consent is acknowledged; failures are recorded on the call with their error.
Recording consent law still governs the recording itself, and you are responsible for lawful processing when sending recordings to your chosen AI provider.
Bridges: CRM, HR, Recruitment
Three auto-install bridges link calls to the records they belong to:
| Bridge | Installs with | Adds |
|---|---|---|
ecosire_voip_crm | CRM | Call smart button and filter on leads/opportunities |
ecosire_voip_hr | Employees | Call smart button on employee forms; calls link to the employee |
ecosire_voip_recruitment | Recruitment | Call smart button on applicant forms; calls link to the applicant |
Calls placed from a record (click-to-dial) already log their outcome to that record's chatter; the bridges make the relationship visible on both sides. Odoo Community ships no Helpdesk or Subscriptions app, so no bridge targets them.
Supervisor board
Users with VoIP Supervisor access can open Phone → Live Board. It shows:
- KPIs for total calls, answered calls, missed calls, average answered-call duration, calls live now, and answer rate.
- Agent tiles showing DND, on-call, or available status together with Odoo presence.
- Running calls with live elapsed duration.
- Daily call volume, answered-versus-missed outcomes, and up to 100 recent calls.
- Date, allowed-company, and agent filters.
The board refreshes from Odoo bus notifications when calls or DND state change; the one-second browser timer only advances displayed running durations. Date ranges are limited to 366 days, and results are bounded to 100 call rows and 100 agents. A regular VoIP User cannot open the board.
Connection doctor and troubleshooting
Open the phone, expand Connection doctor & audio, and click Run diagnostics. The doctor checks four independent layers:
| Failed check | Failure class | What to verify |
|---|---|---|
| Microphone | Browser permission or missing input device | Allow microphone access for the Odoo site, confirm a microphone exists, and reload the page after changing permission |
| Secure WebSocket | Wrong WSS path, DNS/firewall block, timeout, TLS trust failure, or endpoint not speaking the expected WebSocket protocol | Copy the PBX's exact wss:// URL, allow it through firewalls/proxies, and install a publicly trusted certificate |
| STUN/TURN media path | NAT traversal failed; no server-reflexive (srflx) or relay candidate was gathered | Verify STUN reachability. On symmetric/restricted NAT or blocked UDP networks, configure a reachable TURN relay and correct TURN credentials/firewall rules |
| SIP registration | Bad SIP username/secret/domain, wrong PBX WebRTC endpoint, or registration rejected | Recheck the user's credentials, SIP Domain, WSS endpoint, and the PBX registration logs |
Additional symptoms:
| Symptom | Cause and fix |
|---|---|
| Phone says Set up your phone | Provider, SIP username, or SIP secret is missing in the current user's Preferences |
| WSS passes but registration fails | Network signaling is reachable, but SIP authentication or domain configuration is wrong |
| Registration succeeds but there is no audio | Signaling and media take different paths. Run the STUN/TURN check; a TURN relay is commonly required on restrictive or symmetric NAT |
| Calls work on one network but not another | The failing network likely blocks WebSocket/TLS or WebRTC ICE traffic. Compare doctor results and provide TURN for restricted networks |
| Transfer reports that the provider does not support it | The active SIP session does not expose REFER; enable transfer support on the PBX or do not use that control |
| Recording cannot start | Both local and remote audio tracks must be ready, and the browser must support MediaRecorder and AudioContext |
| Output-device choice has no effect | The browser does not support setSinkId, device permission is incomplete, or the selected device disappeared; use System default and check OS audio routing |
FAQ
Does the module include a SIP service or PBX?
No. It is a browser client and Odoo call-record layer. Supply a compatible SIP provider/PBX, WSS endpoint, extensions, and any needed STUN/TURN service.
Does Demo mode make test calls without a provider?
No. Demo and Production are labels displayed in the phone. Both use the provider values and credentials you configure.
Does it support Odoo 17 or 18?
This shipped page and module build are for Odoo 19.0 only: 19.0.1.3.0.
Can agents call local-format numbers?
The dial contract requires a number that normalizes to E.164. Store numbers in international form such as +12025550123; a 00 international prefix is converted to +.
Are calls automatically recorded?
Only when the company policy is Enforced, and only after the browser call is answered and both audio streams are available. User controlled requires the agent to start recording; Off disables it.
Does the consent option announce recording to the caller?
No. It displays text to the Odoo agent immediately before recording. It does not play an audio prompt or collect the remote party's response.
Can supervisors listen to live calls?
No. The Live Board shows status, duration, numbers, agents, and aggregate call data. It does not provide live monitoring, whisper, or barge controls.
Does this version provide SMS, IVR, queues, or transcription?
Version 19.0.1.3.0 provides SMS through an HTTP gateway and optional AI transcription/summary with your own key. It still has no IVR/ACD designer and no call-queue configuration.