Skip to content

Fix Odoo Bus Notifications Not Working: Discuss, Live Chat, and Real-Time Updates

DeployMonkey Team · March 23, 2026 10 min read

The Problem

Odoo's real-time features rely on the bus service (longpolling). When it breaks, you experience: Discuss messages that only appear after page refresh, live chat not working for website visitors, status indicators showing everyone as offline, and no desktop notifications for new messages. The system works but feels broken because nothing updates in real time.

Common Symptoms

  • Discuss messages require manual page refresh to see new messages
  • Live chat widget not appearing on the website
  • All users show as "offline" in Discuss
  • No real-time notifications (chatter, assignments)
  • Browser console shows longpolling errors
  • "Bus connection lost" message in the Odoo interface

How the Odoo Bus Works

Odoo uses a longpolling mechanism for real-time communication:

  1. The browser opens a long-lived HTTP connection to /longpolling/poll
  2. The server holds this connection open until there is a new message (or timeout)
  3. When a message arrives, the server responds and the browser immediately reconnects
  4. This requires a separate gevent worker process (not the standard Odoo workers)

Causes and Fixes

1. Gevent/Longpolling Worker Not Running

In multi-worker mode, Odoo needs a separate gevent-based worker for longpolling. Without it, the /longpolling/poll endpoint does not exist.

Fix:

# In odoo.conf, ensure workers > 0:
workers = 4

# Odoo automatically starts a gevent worker for longpolling
# The longpolling port defaults to: main port + 1
# e.g., if Odoo runs on 8069, longpolling is on 8072

# Verify the gevent worker is running:
ps aux | grep gevent
ps aux | grep odoo | grep 8072

In development mode (workers=0), longpolling works in the main thread but only with the --dev flag or gevent installed.

2. Nginx Not Proxying Longpolling

The most common cause in production. Your nginx config proxies regular requests to port 8069 but does not proxy /longpolling to port 8072.

Fix:

# nginx configuration:
upstream odoo {
    server 127.0.0.1:8069;
}

upstream odoo-longpolling {
    server 127.0.0.1:8072;
}

server {
    listen 443 ssl;
    server_name your-domain.com;

    # Regular Odoo traffic
    location / {
        proxy_pass http://odoo;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Longpolling - MUST proxy to different port
    location /longpolling {
        proxy_pass http://odoo-longpolling;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Websocket support (Odoo 16+)
    location /websocket {
        proxy_pass http://odoo-longpolling;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3. Websocket Not Configured (Odoo 16+)

Starting from Odoo 16, the bus uses websockets instead of longpolling. The endpoint changed from /longpolling/poll to /websocket.

Fix: Add the websocket location block to nginx (shown above). The key headers are:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

Without these headers, the websocket handshake fails and falls back to polling (which may also not work).

4. Firewall Blocking the Longpolling Port

Port 8072 may not be open in the firewall or security group.

Fix:

# Check if port 8072 is listening:
ss -tlnp | grep 8072

# If using ufw:
sudo ufw allow 8072/tcp

# Note: if nginx proxies longpolling, only nginx needs 
# access to 8072 (localhost), not external traffic.

5. proxy_mode Not Set

Without proxy_mode = True, Odoo behind a reverse proxy may not generate correct URLs for the bus endpoint.

Fix: Add to odoo.conf:

proxy_mode = True

6. Gevent Not Installed

The longpolling worker requires the gevent Python package.

Fix:

# Check if gevent is installed:
python3 -c "import gevent; print(gevent.__version__)"

# Install if missing:
pip3 install gevent

7. Browser Blocking Long Connections

Some browser configurations, VPNs, or corporate proxies kill long-lived HTTP connections.

Fix:

  • Check if it works from a different network (e.g., mobile hotspot)
  • Check browser console for connection timeout errors
  • Test with curl: curl -v https://your-domain.com/longpolling/poll

8. Database Name Not in Allowed List

If dbfilter is set in odoo.conf, the longpolling endpoint also needs to resolve the database name.

Fix: Ensure your dbfilter matches the database name, or set db_name explicitly.

Testing the Bus

# Test longpolling endpoint directly:
curl -X POST http://localhost:8072/longpolling/poll \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc": "2.0", "params": {"channels": [], "last": 0}}'

# Should return a JSON response (may timeout after 50s - that's normal)
# If you get "Connection refused" - gevent worker is not running
# If you get 404 - wrong port or endpoint

# For Odoo 16+ websocket:
curl -i -N \
  -H "Upgrade: websocket" \
  -H "Connection: Upgrade" \
  http://localhost:8072/websocket

# Check browser console for bus errors:
# F12 > Console > look for "bus" or "longpolling" errors
# F12 > Network > filter by "poll" or "websocket"

Quick Diagnostic Checklist

  1. Is the gevent worker running? ps aux | grep gevent
  2. Is port 8072 listening? ss -tlnp | grep 8072
  3. Does nginx proxy /longpolling and /websocket to 8072?
  4. Is proxy_mode = True set in odoo.conf?
  5. Is gevent installed? python3 -c "import gevent"
  6. Check browser Network tab for failed longpolling/websocket requests