<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Tech-Sed Blog</title>
        <link>https://blog.tech-sed.com/en/</link>
        <description>El blog de Tech-Sed</description>
        <lastBuildDate>Mon, 15 Jun 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Tech-Sed.</copyright>
        <item>
            <title><![CDATA[Odoo Live Chat in external apps]]></title>
            <link>https://blog.tech-sed.com/en/livechat-odoo-apps-externas</link>
            <guid>https://blog.tech-sed.com/en/livechat-odoo-apps-externas</guid>
            <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How we connect the support chat of any company app with Odoo, keeping every conversation linked to its contact.]]></description>
            <content:encoded><![CDATA[<p><strong>Conversational support with the data centralized in the ERP.</strong> How at TechSed we
connect the support chat of any company app with Odoo, keeping every conversation
linked to its contact and project.</p>
<!-- -->
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem-we-wanted-to-solve">The problem we wanted to solve<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#the-problem-we-wanted-to-solve" class="hash-link" aria-label="Direct link to The problem we wanted to solve" title="Direct link to The problem we wanted to solve" translate="no">​</a></h2>
<p>Several of our applications needed a <strong>live support</strong> channel. A concrete example is our
<strong>Yurumi fleet-control module</strong>, used by field staff to log dispatches and daily
reports: when something doesn't work, they need to message support without leaving the
app.</p>
<p>We didn't want to reinvent a chat system or add <strong>yet another external tool</strong> (think
Intercom or Zendesk) that ends up fragmenting customer data into silos separate from the
ERP. Odoo <strong>already has Live Chat</strong>, so the question was: how do we use it from our apps?</p>
<p>The problem: the Live Chat widget, embedded in an external app, <strong>always opens as an
anonymous "Visitor" and can't be linked to a contact</strong>. The operator doesn't know who's
on the other side and the conversation isn't associated with any contact — context is
missing. We wanted that, when a user <strong>already identified in our app</strong> starts a chat,
that conversation gets <strong>automatically linked to their contact</strong> in Odoo — without asking
them to log in again and without breaking the ongoing chat.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-use-odoos-live-chat-and-not-something-else">Why use Odoo's Live Chat (and not something else)<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#why-use-odoos-live-chat-and-not-something-else" class="hash-link" aria-label="Direct link to Why use Odoo's Live Chat (and not something else)" title="Direct link to Why use Odoo's Live Chat (and not something else)" translate="no">​</a></h2>
<ul>
<li class=""><strong>It's already where the business lives:</strong> sales, projects, inventory, contacts… it's
all in Odoo. Support should be there too.</li>
<li class=""><strong>No new tools or licenses:</strong> operators handle chats from Discuss, the same place where
they already work.</li>
<li class=""><strong>Embeddable in any app:</strong> the widget is inserted with a couple of scripts — in an app,
a web portal or a mobile app.</li>
<li class=""><strong>Centralized data:</strong> history, metrics and contacts stay inside Odoo, not in a third
party.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-technical-challenge">The technical challenge<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#the-technical-challenge" class="hash-link" aria-label="Direct link to The technical challenge" title="Direct link to The technical challenge" translate="no">​</a></h2>
<p>Solving it had its complexity. Three constraints shaped the design:</p>
<ul>
<li class=""><strong>The widget opens as a guest.</strong> Embedded cross-origin, the only identifier the browser
exposes for the chat is a <code>guest_token</code> that Odoo stores in <code>localStorage</code>.</li>
<li class=""><strong>Users aren't Odoo users.</strong> In our apps people authenticate with their own credentials
(employee, magic link). You can't use Odoo's native login.</li>
<li class=""><strong>You can't break the live chat.</strong> A first "heavy-handed" attempt — reassigning the
conversation member from the guest to the contact — broke the session: on reload, the
widget lost the chat and opened a new one. That was the big lesson.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-solution-a-small-generic-add-on">The solution: a small, generic add-on<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#the-solution-a-small-generic-add-on" class="hash-link" aria-label="Direct link to The solution: a small, generic add-on" title="Direct link to The solution: a small, generic add-on" translate="no">​</a></h2>
<p>We built an Odoo module, <strong><code>livechat_partner_link</code></strong>, whose only job is to <strong>link an
ongoing chat to a contact</strong> (a <code>res.partner</code>). It's deliberately small and generic: it
depends only on <code>im_livechat</code>, so it can be reused in any company app.</p>
<figure class="lcd-fig"><style>.lcd-fig{font-family:var(--ifm-font-family-base,"IBM Plex Sans",system-ui,sans-serif);margin:2rem 0;container-type:inline-size}.lcd-card{box-sizing:border-box;background:#fff;border:1px solid #e6e9ef;border-radius:24px;padding:40px 40px 36px;box-shadow:0 1px 2px #0f172a0a,0 20px 48px -32px #0f172a47}.lcd-cap{text-align:center;color:#64748b;margin:.7rem 0 0;font-size:.9rem;font-style:italic}.lcd-title{color:#0f172a;letter-spacing:-.02em;margin:0;font-size:1.85rem;font-weight:700;line-height:1.12}.lcd-sub{color:#64748b;margin:.4rem 0 0;font-size:1.1rem;line-height:1.4}.lcd-mono{font-family:IBM Plex Mono,ui-monospace,SFMono-Regular,monospace}.lcd-chip{border-radius:5px;padding:1px 6px;font-family:IBM Plex Mono,ui-monospace,monospace;font-size:.82em}.lcd-legend{flex-wrap:wrap;gap:10px 24px;margin-top:18px;display:flex}.lcd-legend span.dot{border-radius:3px;width:12px;height:12px;display:inline-block}.lcd-legend>div{color:#475569;align-items:center;gap:8px;font-size:.92rem;font-weight:500;display:flex}.lcd-steps{align-items:stretch;gap:0;margin-top:28px;display:flex}.lcd-step{border-radius:18px;flex-direction:column;flex:1;display:flex;overflow:hidden}.lcd-step .bar{height:6px}.lcd-step .pad{flex-direction:column;gap:13px;padding:22px 20px 24px;display:flex}.lcd-step .head{align-items:center;gap:12px;display:flex}.lcd-badge{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:40px;height:40px;font-size:19px;font-weight:700;display:flex}.lcd-step .st{color:#0f172a;font-size:1.12rem;font-weight:700;line-height:1.15}.lcd-step .tx{color:#475569;font-size:.95rem;line-height:1.55}.lcd-arrow{color:#cbd5e1;flex:0 0 40px;justify-content:center;align-items:center;display:flex}.lcd-arrow.down{display:none}.lcd-key{background:#f6fdf9;border:1px solid #c9efd7;border-radius:16px;align-items:center;gap:15px;margin-top:28px;padding:18px 22px;display:flex}.lcd-key .ic{background:#16a34a;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;display:flex}.lcd-key .tx{color:#14532d;font-size:1rem;line-height:1.5}.lcd-central{align-items:center;gap:0;margin-top:30px;display:flex}.lcd-apps{flex-direction:column;flex:0 0 360px;gap:22px;display:flex}.lcd-app{box-sizing:border-box;border-radius:16px;flex-direction:column;justify-content:center;gap:6px;min-height:104px;padding:18px 22px;display:flex}.lcd-app .nm{color:#0f172a;font-size:1.18rem;font-weight:700}.lcd-app .sm{color:#64748b;font-size:.95rem}.lcd-mid{flex:0 0 220px;height:356px;position:relative}.lcd-mid svg{position:absolute;inset:0}.lcd-mid .lbl{white-space:nowrap;position:absolute;top:118px;left:50%;transform:translate(-50%)}.lcd-mid .lbl span{color:#475569;text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:6px 12px;font-family:IBM Plex Mono,monospace;font-size:.82rem;font-weight:500;line-height:1.5;display:inline-block}.lcd-mid-mobile{display:none}.lcd-odoo{box-sizing:border-box;background:#f8fafc;border:1.5px solid #1e293b;border-radius:20px;flex-direction:column;flex:auto;gap:16px;min-width:0;padding:24px 26px;display:flex}.lcd-odoo .oh{align-items:center;gap:12px;display:flex}.lcd-odoo .oh .tab{background:#7c3aed;border-radius:4px;width:11px;height:32px}.lcd-odoo .oh .nm{color:#0f172a;font-size:1.4rem;font-weight:700;line-height:1.1}.lcd-odoo .oh .sm{color:#64748b;font-size:.92rem}.lcd-sub-card{background:#fff;border:1px solid #e2e8f0;border-radius:13px;flex-direction:column;gap:4px;padding:14px 18px;display:flex}.lcd-sub-card .t{color:#0f172a;font-size:1.05rem;font-weight:600}.lcd-sub-card .d{color:#64748b;font-size:.92rem}@container (width<=860px){.lcd-card{border-radius:18px;padding:26px 20px 24px}.lcd-title{font-size:1.5rem}.lcd-sub{font-size:1rem}.lcd-steps{flex-direction:column}.lcd-step{flex:none}.lcd-arrow{flex:none;height:34px;transform:rotate(90deg)}.lcd-central{flex-direction:column;align-items:stretch}.lcd-apps{flex:none}.lcd-mid{display:none}.lcd-mid-mobile{color:#94a3b8;flex-direction:column;align-items:center;gap:8px;padding:8px 0 4px;display:flex}.lcd-mid-mobile .lbl{color:#475569;text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:6px 12px;font-family:IBM Plex Mono,monospace;font-size:.8rem;line-height:1.5}}</style><div class="lcd-card"><h3 class="lcd-title">How a conversation gets linked to a contact</h3><p class="lcd-sub">The visitor keeps chatting in the same conversation; only the contact’s identity is added.</p><div class="lcd-legend"><div><span class="dot" style="background:#16a34a"></span>Client (browser)</div><div><span class="dot" style="background:#2563eb"></span>App server</div><div><span class="dot" style="background:#7c3aed"></span>Odoo</div></div><div class="lcd-steps"><div class="lcd-step" style="background:#f6fdf9;border:1px solid #c9efd7"><div class="bar" style="background:#16a34a"></div><div class="pad"><div class="head"><div class="lcd-badge" style="background:#16a34a;box-shadow:0 4px 10px -2px rgba(22,163,74,.5)">1</div><div class="st">Embedded widget</div></div><div class="tx">The user opens Odoo live chat in the app. The conversation starts anonymous <code class="lcd-chip" style="color:#15803d;background:#e7f8ee">guest</code>.</div></div></div><div class="lcd-arrow"><svg width="30" height="20" viewBox="0 0 32 22" fill="none" aria-hidden="true"><path d="M2 11h25M21 4l8 7-8 7" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="lcd-step" style="background:#f6fdf9;border:1px solid #c9efd7"><div class="bar" style="background:#16a34a"></div><div class="pad"><div class="head"><div class="lcd-badge" style="background:#16a34a;box-shadow:0 4px 10px -2px rgba(22,163,74,.5)">2</div><div class="st lcd-mono" style="font-size:1.02rem;font-weight:600">guest_token</div></div><div class="tx">The browser stores it in <code class="lcd-chip" style="color:#15803d;background:#e7f8ee">localStorage</code>: the only identifier the widget exposes.</div></div></div><div class="lcd-arrow"><svg width="30" height="20" viewBox="0 0 32 22" fill="none" aria-hidden="true"><path d="M2 11h25M21 4l8 7-8 7" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="lcd-step" style="background:#f4f8ff;border:1px solid #c7dcfb"><div class="bar" style="background:#2563eb"></div><div class="pad"><div class="head"><div class="lcd-badge" style="background:#2563eb;box-shadow:0 4px 10px -2px rgba(37,99,235,.5)">3</div><div class="st">Resolve contact</div></div><div class="tx">The backend (technical user) looks up the <code class="lcd-chip" style="color:#1d4ed8;background:#e6effd">res.partner</code> by email and creates it if it doesn’t exist.</div></div></div><div class="lcd-arrow"><svg width="30" height="20" viewBox="0 0 32 22" fill="none" aria-hidden="true"><path d="M2 11h25M21 4l8 7-8 7" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="lcd-step" style="background:#f4f8ff;border:1px solid #c7dcfb"><div class="bar" style="background:#2563eb"></div><div class="pad"><div class="head"><div class="lcd-badge" style="background:#2563eb;box-shadow:0 4px 10px -2px rgba(37,99,235,.5)">4</div><div class="st">Link</div></div><div class="tx"><code class="lcd-chip" style="color:#1d4ed8;background:#e6effd">POST /livechat/partner-link</code> with the token and the partner. The module links the conversation.</div></div></div><div class="lcd-arrow"><svg width="30" height="20" viewBox="0 0 32 22" fill="none" aria-hidden="true"><path d="M2 11h25M21 4l8 7-8 7" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="lcd-step" style="background:#faf6ff;border:1px solid #e0caf9"><div class="bar" style="background:#7c3aed"></div><div class="pad"><div class="head"><div class="lcd-badge" style="background:#7c3aed;box-shadow:0 4px 10px -2px rgba(124,58,237,.5)">5</div><div class="st">Operator</div></div><div class="tx">In Odoo the operator sees the contact and the <strong style="color:#6d28d9;font-weight:600">“View Contact”</strong> button, and it lands in reporting.</div></div></div></div><div class="lcd-key"><div class="ic"><svg width="17" height="17" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M5 13l4 4L19 7" stroke="#fff" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="tx"><strong style="font-weight:700">Key:</strong> the conversation’s “live member” is still the guest, so the widget session never breaks. The contact is added in the <strong style="font-weight:600">reporting</strong> layer.</div></div></div><figcaption class="lcd-cap">End-to-end flow: from the anonymous widget to the identified contact in Odoo.</figcaption></figure>
<p>The path is simple: the user opens the chat, the browser stores the <code>guest_token</code>, the
app backend resolves (or creates) the contact and calls the module's endpoint to link the
chat. From there, the operator sees who the customer is.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-interesting-technical-bits">The interesting technical bits<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#the-interesting-technical-bits" class="hash-link" aria-label="Direct link to The interesting technical bits" title="Direct link to The interesting technical bits" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-non-invasive-solution">A non-invasive solution<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#a-non-invasive-solution" class="hash-link" aria-label="Direct link to A non-invasive solution" title="Direct link to A non-invasive solution" translate="no">​</a></h3>
<p>The key to the final design: <strong>the chat's "live member" remains the guest</strong>. We never
reassign it. So everything the widget needs keeps working intact: channel membership,
session restore on reload, the realtime bus and sending messages.</p>
<p>The contact is added in the <strong>reporting layer</strong>: the visitor's history is pointed to the
<code>res.partner</code>, the guest is renamed with the contact's name, and a <strong>"View Contact"</strong>
button is exposed in the operator's panel. The visitor simply keeps chatting, now
identified.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p><strong>The key</strong>
The chat's "current member" remains the guest, so the widget session doesn't break.
The contact is added in the reporting layer.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-endpoint">The endpoint<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#the-endpoint" class="hash-link" aria-label="Direct link to The endpoint" title="Direct link to The endpoint" translate="no">​</a></h3>
<p>The app, authenticated as a <strong>technical user</strong>, calls a single endpoint:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">POST /livechat/partner-link</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"guest_token"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"42|&lt;token&gt;"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"partner_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">17</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">Response</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"ok"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"data"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"linked"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"thread_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"..."</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"..."</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>It's <strong>idempotent</strong> (re-linking the same chat does nothing) and generic: <strong>resolving or
creating the contact</strong> — for example, looking it up by email and creating it if it doesn't
exist — is done by each app with the standard <code>res.partner</code> API. The module doesn't get
involved in that, which is why it works for any integration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="use-cases">Use cases<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#use-cases" class="hash-link" aria-label="Direct link to Use cases" title="Direct link to Use cases" translate="no">​</a></h2>
<ul>
<li class=""><strong>Apps fully separate from Odoo:</strong> users open support from the app and the support team
already knows who's writing and from which app.</li>
<li class=""><strong>Customer portal / website:</strong> the logged-in customer chats and the conversation stays
tied to their CRM record.</li>
<li class=""><strong>Mobile or satellite apps:</strong> any app with its own users can offer support without
duplicating contacts.</li>
<li class=""><strong>After-sales and onboarding:</strong> conversational follow-up with the customer's full
history at hand.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-big-win-everything-centralized-in-odoo">The big win: everything centralized in Odoo<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#the-big-win-everything-centralized-in-odoo" class="hash-link" aria-label="Direct link to The big win: everything centralized in Odoo" title="Direct link to The big win: everything centralized in Odoo" translate="no">​</a></h2>
<p>Beyond the convenience, the real value is in <strong>data centralization</strong>. Every company app
embeds its own support channel, and it all ends up in one place.</p>
<figure class="lcd-fig"><style>.lcd-fig{font-family:var(--ifm-font-family-base,"IBM Plex Sans",system-ui,sans-serif);margin:2rem 0;container-type:inline-size}.lcd-card{box-sizing:border-box;background:#fff;border:1px solid #e6e9ef;border-radius:24px;padding:40px 40px 36px;box-shadow:0 1px 2px #0f172a0a,0 20px 48px -32px #0f172a47}.lcd-cap{text-align:center;color:#64748b;margin:.7rem 0 0;font-size:.9rem;font-style:italic}.lcd-title{color:#0f172a;letter-spacing:-.02em;margin:0;font-size:1.85rem;font-weight:700;line-height:1.12}.lcd-sub{color:#64748b;margin:.4rem 0 0;font-size:1.1rem;line-height:1.4}.lcd-mono{font-family:IBM Plex Mono,ui-monospace,SFMono-Regular,monospace}.lcd-chip{border-radius:5px;padding:1px 6px;font-family:IBM Plex Mono,ui-monospace,monospace;font-size:.82em}.lcd-legend{flex-wrap:wrap;gap:10px 24px;margin-top:18px;display:flex}.lcd-legend span.dot{border-radius:3px;width:12px;height:12px;display:inline-block}.lcd-legend>div{color:#475569;align-items:center;gap:8px;font-size:.92rem;font-weight:500;display:flex}.lcd-steps{align-items:stretch;gap:0;margin-top:28px;display:flex}.lcd-step{border-radius:18px;flex-direction:column;flex:1;display:flex;overflow:hidden}.lcd-step .bar{height:6px}.lcd-step .pad{flex-direction:column;gap:13px;padding:22px 20px 24px;display:flex}.lcd-step .head{align-items:center;gap:12px;display:flex}.lcd-badge{color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:40px;height:40px;font-size:19px;font-weight:700;display:flex}.lcd-step .st{color:#0f172a;font-size:1.12rem;font-weight:700;line-height:1.15}.lcd-step .tx{color:#475569;font-size:.95rem;line-height:1.55}.lcd-arrow{color:#cbd5e1;flex:0 0 40px;justify-content:center;align-items:center;display:flex}.lcd-arrow.down{display:none}.lcd-key{background:#f6fdf9;border:1px solid #c9efd7;border-radius:16px;align-items:center;gap:15px;margin-top:28px;padding:18px 22px;display:flex}.lcd-key .ic{background:#16a34a;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;display:flex}.lcd-key .tx{color:#14532d;font-size:1rem;line-height:1.5}.lcd-central{align-items:center;gap:0;margin-top:30px;display:flex}.lcd-apps{flex-direction:column;flex:0 0 360px;gap:22px;display:flex}.lcd-app{box-sizing:border-box;border-radius:16px;flex-direction:column;justify-content:center;gap:6px;min-height:104px;padding:18px 22px;display:flex}.lcd-app .nm{color:#0f172a;font-size:1.18rem;font-weight:700}.lcd-app .sm{color:#64748b;font-size:.95rem}.lcd-mid{flex:0 0 220px;height:356px;position:relative}.lcd-mid svg{position:absolute;inset:0}.lcd-mid .lbl{white-space:nowrap;position:absolute;top:118px;left:50%;transform:translate(-50%)}.lcd-mid .lbl span{color:#475569;text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:6px 12px;font-family:IBM Plex Mono,monospace;font-size:.82rem;font-weight:500;line-height:1.5;display:inline-block}.lcd-mid-mobile{display:none}.lcd-odoo{box-sizing:border-box;background:#f8fafc;border:1.5px solid #1e293b;border-radius:20px;flex-direction:column;flex:auto;gap:16px;min-width:0;padding:24px 26px;display:flex}.lcd-odoo .oh{align-items:center;gap:12px;display:flex}.lcd-odoo .oh .tab{background:#7c3aed;border-radius:4px;width:11px;height:32px}.lcd-odoo .oh .nm{color:#0f172a;font-size:1.4rem;font-weight:700;line-height:1.1}.lcd-odoo .oh .sm{color:#64748b;font-size:.92rem}.lcd-sub-card{background:#fff;border:1px solid #e2e8f0;border-radius:13px;flex-direction:column;gap:4px;padding:14px 18px;display:flex}.lcd-sub-card .t{color:#0f172a;font-size:1.05rem;font-weight:600}.lcd-sub-card .d{color:#64748b;font-size:.92rem}@container (width<=860px){.lcd-card{border-radius:18px;padding:26px 20px 24px}.lcd-title{font-size:1.5rem}.lcd-sub{font-size:1rem}.lcd-steps{flex-direction:column}.lcd-step{flex:none}.lcd-arrow{flex:none;height:34px;transform:rotate(90deg)}.lcd-central{flex-direction:column;align-items:stretch}.lcd-apps{flex:none}.lcd-mid{display:none}.lcd-mid-mobile{color:#94a3b8;flex-direction:column;align-items:center;gap:8px;padding:8px 0 4px;display:flex}.lcd-mid-mobile .lbl{color:#475569;text-align:center;background:#fff;border:1px solid #e2e8f0;border-radius:10px;padding:6px 12px;font-family:IBM Plex Mono,monospace;font-size:.8rem;line-height:1.5}}</style><div class="lcd-card"><h3 class="lcd-title">A single Odoo as the source of truth</h3><p class="lcd-sub">Every company app embeds the same support channel; all the data stays centralized in Odoo.</p><div class="lcd-central"><div class="lcd-apps"><div class="lcd-app" style="background:#f6fdf9;border:1.5px solid #16a34a"><div class="nm">Operations PWA</div><div class="sm">Employees (badge / magic link)</div></div><div class="lcd-app" style="background:#f4f8ff;border:1.5px solid #2563eb"><div class="nm">Portal / Website</div><div class="sm">End customers</div></div><div class="lcd-app" style="background:#faf6ff;border:1.5px solid #7c3aed"><div class="nm">Another company app</div><div class="sm">Mobile, satellite ERP, etc.</div></div></div><div class="lcd-mid"><svg width="220" height="356" viewBox="0 0 220 356" fill="none" aria-hidden="true"><defs><marker id="lcdah" markerWidth="9" markerHeight="9" refX="6.5" refY="4.5" orient="auto"><path d="M1 1L7 4.5L1 8" stroke="#94a3b8" stroke-width="1.7" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></marker></defs><path d="M0 52 C110 52, 130 178, 214 178" stroke="#94a3b8" stroke-width="3" fill="none" marker-end="url(#lcdah)"></path><path d="M0 178 L214 178" stroke="#94a3b8" stroke-width="3" fill="none" marker-end="url(#lcdah)"></path><path d="M0 304 C110 304, 130 178, 214 178" stroke="#94a3b8" stroke-width="3" fill="none" marker-end="url(#lcdah)"></path><circle cx="0" cy="52" r="4" fill="#94a3b8"></circle><circle cx="0" cy="178" r="4" fill="#94a3b8"></circle><circle cx="0" cy="304" r="4" fill="#94a3b8"></circle></svg><div class="lbl"><span>same widget<br>+ /livechat/partner-link</span></div></div><div class="lcd-mid-mobile"><div class="lbl">same widget + /livechat/partner-link</div><svg width="22" height="30" viewBox="0 0 22 30" fill="none" aria-hidden="true"><path d="M11 2v23M4 19l7 7 7-7" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><div class="lcd-odoo"><div class="oh"><div class="tab"></div><div><div class="nm">Odoo</div><div class="sm">Single source of truth</div></div></div><div class="lcd-sub-card"><div class="t">Contacts <span class="lcd-mono" style="font-size:.82em;font-weight:500;color:#7c3aed">(res.partner)</span></div><div class="d">A single contact per person, with no data duplicated across apps.</div></div><div class="lcd-sub-card"><div class="t">Live Chat conversations</div><div class="d">Each chat tied to its contact, handled from Discuss.</div></div><div class="lcd-sub-card"><div class="t">Reporting and history</div><div class="d">Support metrics and per-customer traceability, all in one place.</div></div></div></div></div><figcaption class="lcd-cap">Multiple apps, a single source of truth: contacts, conversations and reporting in Odoo.</figcaption></figure>
<ul>
<li class=""><strong>One contact per person:</strong> no duplicated or out-of-sync data across applications.</li>
<li class=""><strong>Conversations and history in one place:</strong> the support team works from Discuss, with
the full CRM context (sales, projects, tickets).</li>
<li class=""><strong>Reporting and traceability:</strong> support metrics and per-customer follow-up, native to
Odoo.</li>
<li class=""><strong>Lower costs and fewer fragile integrations:</strong> no third-party licenses or syncs that
break.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frequently-asked-questions">Frequently asked questions<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently asked questions" title="Direct link to Frequently asked questions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="can-you-use-odoo-live-chat-inside-an-external-app">Can you use Odoo Live Chat inside an external app?<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#can-you-use-odoo-live-chat-inside-an-external-app" class="hash-link" aria-label="Direct link to Can you use Odoo Live Chat inside an external app?" title="Direct link to Can you use Odoo Live Chat inside an external app?" translate="no">​</a></h3>
<p>Yes. The Odoo Live Chat widget can be embedded in any app, even cross-origin. By default
it opens as an anonymous visitor; with the <code>livechat_partner_link</code> module the conversation
is automatically linked to the contact (<code>res.partner</code>) of the user already identified in
the app.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-is-a-live-chat-conversation-linked-to-an-odoo-contact">How is a Live Chat conversation linked to an Odoo contact?<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#how-is-a-live-chat-conversation-linked-to-an-odoo-contact" class="hash-link" aria-label="Direct link to How is a Live Chat conversation linked to an Odoo contact?" title="Direct link to How is a Live Chat conversation linked to an Odoo contact?" translate="no">​</a></h3>
<p>The app, authenticated as a technical user, calls a single idempotent endpoint
(<code>POST /livechat/partner-link</code>) with the chat <code>guest_token</code>. The module points the visitor
history to the <code>res.partner</code>, renames the guest with the contact name, and exposes a
<strong>View Contact</strong> button in the operator panel.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="do-you-need-an-external-tool-like-intercom-or-zendesk">Do you need an external tool like Intercom or Zendesk?<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#do-you-need-an-external-tool-like-intercom-or-zendesk" class="hash-link" aria-label="Direct link to Do you need an external tool like Intercom or Zendesk?" title="Direct link to Do you need an external tool like Intercom or Zendesk?" translate="no">​</a></h3>
<p>No. Odoo already includes Live Chat, so conversational support lives inside the same ERP
as sales, projects, inventory and contacts, without fragmenting customer data into
separate silos.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="does-the-module-break-the-widget-session-when-linking-the-contact">Does the module break the widget session when linking the contact?<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#does-the-module-break-the-widget-session-when-linking-the-contact" class="hash-link" aria-label="Direct link to Does the module break the widget session when linking the contact?" title="Direct link to Does the module break the widget session when linking the contact?" translate="no">​</a></h3>
<p>No. It is a <strong>non-invasive</strong> solution: the chat’s “live member” remains the guest, so
channel membership, session restore on reload and the realtime bus keep working. The
contact is added only in the reporting layer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>With a small, generic and <strong>non-invasive</strong> add-on, any company application can offer live
support using Odoo's Live Chat, keeping every conversation tied to its contact. Reusable,
with no external tools and with all the data where it belongs: <strong>inside Odoo</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="have-a-similar-challenge-with-odoo">Have a similar challenge with Odoo?<a href="https://blog.tech-sed.com/en/livechat-odoo-apps-externas#have-a-similar-challenge-with-odoo" class="hash-link" aria-label="Direct link to Have a similar challenge with Odoo?" title="Direct link to Have a similar challenge with Odoo?" translate="no">​</a></h2>
<p>At TechSed we work with Odoo every day. This module was born from a concrete need on a
project and we kept it generic so we could reuse it; it happens to us often that a
specific requirement, solved well, ends up being a solid, reusable piece.</p>
<p>If you're thinking about something like this — connecting Odoo with your own application,
automating a process or a custom development — write to us and let's look at it together.
We prefer to understand the problem well before proposing: often the best solution is the
simplest one and, sometimes, the most honest thing is to recommend building nothing.</p>
<p><strong>Shall we talk? Write to us at <a href="mailto:hola@tech-sed.com" target="_blank" rel="noopener noreferrer" class="">hola@tech-sed.com</a> and tell us
what you need.</strong></p>]]></content:encoded>
            <category>Odoo</category>
            <category>Live Chat</category>
            <category>Integrations</category>
            <category>Support</category>
        </item>
    </channel>
</rss>