<?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/</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>es</language>
        <copyright>Copyright © 2026 Tech-Sed.</copyright>
        <item>
            <title><![CDATA[Live Chat de Odoo en aplicaciones externas]]></title>
            <link>https://blog.tech-sed.com/livechat-odoo-apps-externas</link>
            <guid>https://blog.tech-sed.com/livechat-odoo-apps-externas</guid>
            <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Cómo conectamos el chat de soporte de cualquier app de la empresa con Odoo, dejando cada conversación vinculada a su contacto.]]></description>
            <content:encoded><![CDATA[<p><strong>Soporte conversacional con los datos centralizados en el ERP.</strong> Cómo en TechSed
conectamos el chat de soporte de cualquier app de la empresa con Odoo, dejando cada
conversación vinculada a su contacto y proyecto.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="el-problema-que-queríamos-resolver">El problema que queríamos resolver<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#el-problema-que-quer%C3%ADamos-resolver" class="hash-link" aria-label="Enlace directo al El problema que queríamos resolver" title="Enlace directo al El problema que queríamos resolver" translate="no">​</a></h2>
<p>Varias de nuestras aplicaciones necesitaban un canal de <strong>soporte en vivo</strong>. Un
ejemplo concreto es nuestro modulo <strong>Yurumi, para control de flota</strong>, que usa el personal
de campo para registrar despachos y partes diarios: cuando algo no funciona, necesitan poder
escribirle a soporte sin salir de la app.</p>
<p>No queríamos reinventar un sistema de chat ni sumar <strong>otra herramienta externa</strong> (tipo
Intercom o Zendesk) que termine fragmentando los datos de los clientes en silos
separados del ERP. Odoo <strong>ya tiene Live Chat</strong>, así que la pregunta era: ¿cómo lo
usamos desde nuestras apps?</p>
<p>El problema: el widget de Live Chat, embebido en una app externa, <strong>abre siempre como
“Visitante” anónimo y no se puede vincular con un contacto</strong>. El operador no sabe quién
está del otro lado y la conversación no queda asociada a ningún contacto, falta contexto.
Queríamos que, cuando un usuario <strong>ya identificado en nuestra app</strong> inicia una charla,
esa conversación quede <strong>vinculada automáticamente a su contacto</strong> en Odoo — sin pedirle
que se loguee de nuevo y sin romper la charla en curso.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="por-qué-usar-el-live-chat-de-odoo-y-no-otra-cosa">Por qué usar el Live Chat de Odoo (y no otra cosa)<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#por-qu%C3%A9-usar-el-live-chat-de-odoo-y-no-otra-cosa" class="hash-link" aria-label="Enlace directo al Por qué usar el Live Chat de Odoo (y no otra cosa)" title="Enlace directo al Por qué usar el Live Chat de Odoo (y no otra cosa)" translate="no">​</a></h2>
<ul>
<li class=""><strong>Ya está donde vive el negocio:</strong> ventas, proyectos, inventario, contactos… todo
está en Odoo. El soporte también debería estar ahí.</li>
<li class=""><strong>Sin herramientas ni licencias nuevas:</strong> los operadores atienden desde Discuss, el
mismo lugar donde ya trabajan.</li>
<li class=""><strong>Embebible en cualquier app:</strong> el widget se inserta con un par de scripts, en un app,
un portal web o una app móvil.</li>
<li class=""><strong>Datos centralizados:</strong> historial, métricas y contactos quedan dentro de Odoo, no
en un tercero.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="el-desafío-técnico">El desafío técnico<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#el-desaf%C3%ADo-t%C3%A9cnico" class="hash-link" aria-label="Enlace directo al El desafío técnico" title="Enlace directo al El desafío técnico" translate="no">​</a></h2>
<p>Resolverlo tuvo su complejidad. Tres restricciones marcaron el diseño:</p>
<ul>
<li class=""><strong>El widget abre como invitado.</strong> Embebido cross-origin, el único identificador que
el navegador expone de la charla es un <code>guest_token</code> que Odoo guarda en
<code>localStorage</code>.</li>
<li class=""><strong>Los usuarios no son usuarios de Odoo.</strong> En nuestras apps la gente se autentica con
sus credenciales propias (empleado, magic link). No se puede usar el login nativo de
Odoo.</li>
<li class=""><strong>No se puede romper la charla viva.</strong> Un primer intento “fuerte” —reasignar el
miembro de la conversación del invitado al contacto— rompía la sesión: al recargar,
el widget perdía la charla y abría una nueva. Ese fue el gran aprendizaje.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="la-solución-un-addon-chico-y-genérico">La solución: un addon chico y genérico<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#la-soluci%C3%B3n-un-addon-chico-y-gen%C3%A9rico" class="hash-link" aria-label="Enlace directo al La solución: un addon chico y genérico" title="Enlace directo al La solución: un addon chico y genérico" translate="no">​</a></h2>
<p>Construimos un módulo de Odoo, <strong><code>livechat_partner_link</code></strong>, cuyo único trabajo es
<strong>vincular una charla en curso a un contacto</strong> (un <code>res.partner</code>). Es deliberadamente
pequeño y genérico: depende solo de <code>im_livechat</code>, así que se puede reutilizar en
cualquier app de la empresa.</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">Cómo se vincula una conversación a un contacto</h3><p class="lcd-sub">El visitante sigue chateando en la misma charla; solo se le agrega la identidad del contacto.</p><div class="lcd-legend"><div><span class="dot" style="background:#16a34a"></span>Cliente (navegador)</div><div><span class="dot" style="background:#2563eb"></span>Servidor de la app</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">Widget embebido</div></div><div class="tx">El usuario abre el live chat de Odoo en la app. La charla arranca anónima <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">El navegador lo guarda en <code class="lcd-chip" style="color:#15803d;background:#e7f8ee">localStorage</code>: el único identificador que expone el widget.</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">Resolver contacto</div></div><div class="tx">El backend (usuario técnico) busca el <code class="lcd-chip" style="color:#1d4ed8;background:#e6effd">res.partner</code> por email y lo crea si no existe.</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">Vincular</div></div><div class="tx"><code class="lcd-chip" style="color:#1d4ed8;background:#e6effd">POST /livechat/partner-link</code> con el token y el partner. El módulo asocia la charla.</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">Operador</div></div><div class="tx">En Odoo el operador ve el contacto y el botón <strong style="color:#6d28d9;font-weight:600">“View Contact”</strong>, y queda en el 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">Clave:</strong> el “miembro vivo” de la charla sigue siendo el invitado, así la sesión del widget no se rompe. El contacto se agrega en la capa de <strong style="font-weight:600">reporting</strong>.</div></div></div><figcaption class="lcd-cap">Flujo de punta a punta: del widget anónimo al contacto identificado en Odoo.</figcaption></figure>
<p>El recorrido es simple: el usuario abre el chat, el navegador guarda el <code>guest_token</code>,
el backend de la app resuelve (o crea) el contacto y llama al endpoint del módulo para
asociar la charla. A partir de ahí, el operador ve quién es el cliente.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="los-aspectos-técnicos-interesantes">Los aspectos técnicos interesantes<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#los-aspectos-t%C3%A9cnicos-interesantes" class="hash-link" aria-label="Enlace directo al Los aspectos técnicos interesantes" title="Enlace directo al Los aspectos técnicos interesantes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="una-solución-no-invasiva">Una solución no invasiva<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#una-soluci%C3%B3n-no-invasiva" class="hash-link" aria-label="Enlace directo al Una solución no invasiva" title="Enlace directo al Una solución no invasiva" translate="no">​</a></h3>
<p>La clave del diseño final: <strong>el “miembro vivo” de la charla sigue siendo el
invitado</strong>. Nunca lo reasignamos. Así, todo lo que el widget necesita sigue
funcionando intacto: la membresía del canal, la restauración de la sesión al recargar,
el bus en tiempo real y el envío de mensajes.</p>
<p>El contacto se agrega en la <strong>capa de reporting</strong>: se apunta el historial del visitante
al <code>res.partner</code>, se renombra al invitado con el nombre del contacto y se expone un
botón <strong>“View Contact”</strong> en el panel del operador. El visitante simplemente sigue
chateando, ahora identificado.</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>La clave</strong>
El “miembro actual” de la charla sigue siendo el invitado, así la sesión del widget no se
rompe.
El contacto se agrega en la capa de reporting.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="el-endpoint">El endpoint<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#el-endpoint" class="hash-link" aria-label="Enlace directo al El endpoint" title="Enlace directo al El endpoint" translate="no">​</a></h3>
<p>La app, autenticada como un <strong>usuario técnico</strong>, llama a un único 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">Respuesta</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>Es <strong>idempotente</strong> (volver a vincular la misma charla no hace nada) y genérico:
<strong>resolver o crear el contacto</strong> —por ejemplo, buscándolo por email y dándolo de alta
si no existe— lo hace cada app con la API estándar de <code>res.partner</code>. El módulo no se
mete en eso, por eso sirve para cualquier integración.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="casos-de-uso">Casos de uso<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#casos-de-uso" class="hash-link" aria-label="Enlace directo al Casos de uso" title="Enlace directo al Casos de uso" translate="no">​</a></h2>
<ul>
<li class=""><strong>Apps totalmente separadas de Odoo:</strong> Los usuarios abre soporte desde la app y el equipo de soporte
ya sabe quién escribe y desde qué app.</li>
<li class=""><strong>Portal de clientes / sitio web:</strong> el cliente logueado chatea y la conversación
queda atada a su ficha del CRM.</li>
<li class=""><strong>Apps móviles o satélites:</strong> cualquier app con sus propios usuarios puede ofrecer
soporte sin duplicar contactos.</li>
<li class=""><strong>Post-venta y onboarding:</strong> seguimiento conversacional con el historial completo del
cliente a mano.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="la-gran-ventaja-todo-centralizado-en-odoo">La gran ventaja: todo centralizado en Odoo<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#la-gran-ventaja-todo-centralizado-en-odoo" class="hash-link" aria-label="Enlace directo al La gran ventaja: todo centralizado en Odoo" title="Enlace directo al La gran ventaja: todo centralizado en Odoo" translate="no">​</a></h2>
<p>Más allá de la comodidad, el verdadero valor está en la <strong>centralización de datos</strong>.
Cada app de la empresa embebe su propio canal de soporte, y todo termina en un solo
lugar.</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">Un solo Odoo como fuente de verdad</h3><p class="lcd-sub">Cada app de la empresa embebe el mismo canal de soporte; todo el dato queda centralizado en 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">PWA de Operaciones</div><div class="sm">Empleados (badge / magic link)</div></div><div class="lcd-app" style="background:#f4f8ff;border:1.5px solid #2563eb"><div class="nm">Portal / Sitio Web</div><div class="sm">Clientes finales</div></div><div class="lcd-app" style="background:#faf6ff;border:1.5px solid #7c3aed"><div class="nm">Otra app de la empresa</div><div class="sm">Mobile, ERP satélite, 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>mismo widget<br>+ /livechat/partner-link</span></div></div><div class="lcd-mid-mobile"><div class="lbl">mismo 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">Fuente única de verdad</div></div></div><div class="lcd-sub-card"><div class="t">Contactos <span class="lcd-mono" style="font-size:.82em;font-weight:500;color:#7c3aed">(res.partner)</span></div><div class="d">Un único contacto por persona, sin duplicar datos por app.</div></div><div class="lcd-sub-card"><div class="t">Conversaciones de Live Chat</div><div class="d">Cada charla ligada a su contacto, atendida desde Discuss.</div></div><div class="lcd-sub-card"><div class="t">Reporting e historial</div><div class="d">Métricas de soporte y trazabilidad por cliente, en un solo lugar.</div></div></div></div></div><figcaption class="lcd-cap">Múltiples apps, una sola fuente de verdad: contactos, conversaciones y reporting en Odoo.</figcaption></figure>
<ul>
<li class=""><strong>Un solo contacto por persona:</strong> sin datos duplicados ni desincronizados entre
aplicaciones.</li>
<li class=""><strong>Conversaciones e historial en un solo lugar:</strong> el equipo de soporte trabaja desde
Discuss, con el contexto completo del CRM (ventas, proyectos, tickets).</li>
<li class=""><strong>Reporting y trazabilidad:</strong> métricas de soporte y seguimiento por cliente, nativos
de Odoo.</li>
<li class=""><strong>Menos costos y menos integraciones frágiles:</strong> nada de licencias de terceros ni
sincronizaciones que se rompen.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusión">Conclusión<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#conclusi%C3%B3n" class="hash-link" aria-label="Enlace directo al Conclusión" title="Enlace directo al Conclusión" translate="no">​</a></h2>
<p>Con un addon chico, genérico y <strong>no invasivo</strong>, cualquier aplicación de la empresa
puede ofrecer soporte en vivo usando el Live Chat de Odoo, dejando cada conversación
atada a su contacto. Reutilizable, sin herramientas externas y con todos los datos
donde tienen que estar: <strong>dentro de Odoo</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tenés-un-desafío-parecido-con-odoo">¿Tenés un desafío parecido con Odoo?<a href="https://blog.tech-sed.com/livechat-odoo-apps-externas#ten%C3%A9s-un-desaf%C3%ADo-parecido-con-odoo" class="hash-link" aria-label="Enlace directo al ¿Tenés un desafío parecido con Odoo?" title="Enlace directo al ¿Tenés un desafío parecido con Odoo?" translate="no">​</a></h2>
<p>En TechSed trabajamos con Odoo todos los días. Este módulo nació de una necesidad
concreta de un proyecto y lo dejamos genérico como para reutilizarlo; nos
pasa seguido que un requerimiento puntual, bien resuelto, termina siendo una pieza
sólida y reutilizable.</p>
<p>Si estás pensando en algo así —conectar Odoo con una aplicación propia, automatizar un
proceso o una customización a medida— escribínos y lo vemos juntos.
Preferimos entender bien el problema antes de proponer: muchas veces la mejor solución
es la más simple y, a veces, lo más honesto es recomendar no desarrollar nada.</p>
<p><strong>¿Charlamos? Escribinos a <a href="mailto:hola@tech-sed.com" target="_blank" rel="noopener noreferrer" class="">hola@tech-sed.com</a> y contanos qué
necesitás.</strong></p>]]></content:encoded>
            <category>Odoo</category>
            <category>Live Chat</category>
            <category>Integraciones</category>
            <category>Soporte</category>
        </item>
    </channel>
</rss>