Chat en la app

Soporte dentro de tu aplicación, sin SDK

Una URL en una WebView. Sin paquetes que instalar, sin compilaciones que romper y con cada conversación en el mismo buzón que el resto de tu soporte.

01 · Qué es
La respuesta corta

El chat dentro de la app en inrelay es una página de chat alojada en la dirección de tu propio centro de ayuda. Apunta una WebView a /chat y tu app para iOS, Android o React Native tendrá chat en vivo, respuestas con IA y tus artículos de ayuda integrados — sin SDK, sin dependencias y sin tener que publicar actualizaciones en las tiendas de apps para cambiar nada.

La página es el mismo chat que usan los visitantes de tu sitio web, mostrado a pantalla completa en lugar de en una burbuja. Esto significa que hereda todo lo que ya has configurado: tu marca y color principal, tus horarios de atención, el chatbot de IA y su base de conocimientos, el formulario de clientes potenciales y el buzón en el que ya trabaja tu equipo. Activarlo no requiere un gran proyecto — la dirección existe tan pronto como se activa el chat en vivo.

Está incluido en todos los planes. No hay ningún complemento para móviles, ni tarifas por conversación, ni nada que comprar antes de poder probarlo.

Looping animation: one hosted address, help.acme.com/chat, fans out into a chat bubble on a website and a full-screen chat inside an app, and ends marked already live.
02 · Tu dirección

Una URL, tres detalles opcionales

Tu página de chat se encuentra en /chat en la dirección de tu centro de ayuda — el dominio personalizado si has conectado uno o, de lo contrario, la dirección .inrelay.support que reclamaste. Encontrarás la URL exacta, lista para copiar, en Ajustes → Widget de ayuda → En tu app móvil.

https://support.yourbrand.com/chat

Esa URL por sí sola es una integración completa: un visitante puede chatear de forma anónima y la conversación le sigue entre inicios de la app en ese dispositivo. Si tu app sabe quién es el usuario, puedes indicarlo con tres parámetros de consulta — todos opcionales, todos prescindibles:

  • token_id — tu propio identificador opaco y aleatorio para este usuario. Es lo que restaura su conversación en un dispositivo nuevo o tras reinstalar.
  • email — para que una respuesta pueda llegarles cuando la app esté cerrada.
  • name — para que tu equipo sepa a quién está ayudando.
https://support.yourbrand.com/chat?token_id=8f2c…&email=ada%40example.com&name=Ada%20Lovelace

Aplica codificación URL a los valores. A menos que actives la identidad verificada (a continuación), trata token_id como un secreto: cualquiera que tenga uno puede reanudar esa conversación, así que genera valores aleatorios largos — nunca una dirección de correo, un nombre de usuario o un id secuencial.

03 · Las recetas

Tres formas de abrirlo

Cada una de estas opciones es la integración completa. Los dos ajustes que importan en cualquier plataforma son JavaScript y el almacenamiento DOM — el almacenamiento DOM es lo que conserva la conversación del visitante entre inicios de la app.

iOS — WKWebView

import UIKit
import WebKit

final class SupportViewController: UIViewController {
  private let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())

  override func viewDidLoad() {
    super.viewDidLoad()
    webView.frame = view.bounds
    webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    webView.scrollView.bounces = false
    view.addSubview(webView)

    var url = URLComponents(string: "https://support.yourbrand.com/chat")!
    url.queryItems = [
      URLQueryItem(name: "token_id", value: user.supportToken),
      URLQueryItem(name: "email", value: user.email),
      URLQueryItem(name: "name", value: user.fullName)
    ]
    webView.load(URLRequest(url: url.url!))
  }
}

Android — WebView

class SupportActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val webView = WebView(this)
    setContentView(webView)

    webView.settings.javaScriptEnabled = true
    webView.settings.domStorageEnabled = true   // keeps the conversation across launches
    webView.webViewClient = WebViewClient()     // keep navigation inside the WebView

    val url = Uri.parse("https://support.yourbrand.com/chat")
      .buildUpon()
      .appendQueryParameter("token_id", user.supportToken)
      .appendQueryParameter("email", user.email)
      .appendQueryParameter("name", user.fullName)
      .build()
    webView.loadUrl(url.toString())
  }
}

React Native — react-native-webview

import { SafeAreaView } from 'react-native'
import { WebView } from 'react-native-webview'

const params = new URLSearchParams({
  token_id: user.supportToken,
  email: user.email,
  name: user.fullName
})

export function SupportScreen() {
  return (
    <SafeAreaView style={{ flex: 1 }}>
      <WebView
        source={{ uri: `https://support.yourbrand.com/chat?${params}` }}
        javaScriptEnabled
        domStorageEnabled
        originWhitelist={['https://support.yourbrand.com/*']}
      />
    </SafeAreaView>
  )
}

Dale a la WebView la pantalla completa y deja que gestione su propio desplazamiento — la página ya está adaptada para teléfonos, incluida el área segura inferior.

Restringe la lista de permitidos a tu propia dirección, incluyendo la barra final. Un patrón como https://* permite que cualquier sitio se muestre dentro de tu pantalla de soporte, y uno sin la barra — https://soporte.tumarca.com* — también coincide con soporte.tumarca.com.ejemplo.net. Si también compruebas la URL por tu cuenta, compara el origen analizado en lugar de probar con un prefijo.

04 · Identidad verificada

Demuestra que son realmente ellos

Opcional, desactivado por defecto y con un conmutador en lugar de una migración: cada espacio de trabajo ya tiene un secreto de firma esperando en Ajustes → Widget de ayuda.

The In your mobile app settings block with the verification toggle

Con la verificación activada, los datos que pase tu app deben llegar con una firma generada por tu servidor. Todo lo que no esté firmado — o esté firmado para otro usuario — se ignorará: el chat se abrirá de todos modos, pero de forma anónima. Nunca falla de manera drástica, porque una pantalla de soporte que no carga es peor que una que no sabe tu nombre.

Firma esta cadena exacta, uniendo los tres valores con saltos de línea y utilizando una cadena vacía para todo lo que omitas:

token_id + "\n" + email + "\n" + name
// on your server, never in the app binary
import { createHmac } from 'node:crypto'

const payload = [tokenId, email ?? '', name ?? ''].join('\n')
const signature = createHmac('sha256', INRELAY_EMBED_SECRET)
  .update(payload)
  .digest('hex')

Añádelo como &signature=…. Firma los valores exactamente como los pones en la URL — sin recortar espacios ni convertir a minúsculas — y firma los tres: una firma que solo cubra el token no validará una solicitud cuyo correo difiera. Se rechazarán los valores que contengan saltos de línea.

  • El secreto reside en tu servidor y lo lee el nuestro. Nunca debe estar en el binario de tu app, donde cualquiera podría extraerlo.
  • Obtén la firma desde tu propio punto de enlace autenticado cuando el usuario abra la ayuda y, a continuación, construye la URL.
  • Activa la verificación antes de publicar, si vas a usarla. Añadirla después de que tus usuarios ya estén chateando implica volver a emitir cada token.
05 · Cuando la app está cerrada

Las respuestas les llegan por correo electrónico

Alguien hace una pregunta, cierra tu app y tu equipo responde diez minutos más tarde. La respuesta se envía por correo electrónico a la dirección asociada a la conversación — procedente de los parámetros de identidad de la app o del correo que solicitó el chat — y, cuando vuelva a abrir la ayuda, todo el hilo seguirá allí.

Para ser claros sobre esto: no hay notificaciones push en la app en esta versión. No hay ningún SDK con el que registrar un token de dispositivo, así que una respuesta no puede iluminar el globo de notificación de tu app. El correo electrónico es la vía de entrega, y un cliente que haya dejado su dirección siempre recibirá respuesta.

  • La conversación permanece en el dispositivo y sigue un token_id si se cambia a otro nuevo.
  • Todo lo que ve el visitante es el chat integrado: respuestas con IA, tus artículos de ayuda y tus horarios de atención.
  • Las notificaciones push en la app no forman parte de esta versión — las respuestas llegan por correo electrónico mientras la app está cerrada.
  • No ofrecemos una interfaz de chat nativa ni SDK para plataformas. Es una página alojada en una WebView, de forma deliberada.
06 · Configuración

Listo en cuatro pasos

Activa el chat en vivo

Ajustes → Widget de ayuda. Si el widget de tu sitio web ya permite chatear, has terminado este paso.

Copia la URL de tu chat

El bloque “En tu app móvil” la tiene, con un botón para copiar. Reclama primero una dirección del centro de ayuda si quieres una personalizada.

Abrirlo en una WebView

Pega una de las plantillas anteriores en tu pantalla de atención. Activa JavaScript y el almacenamiento DOM.

Añade identidad, si quieres

Pasa un token, correo y nombre, y activa la verificación con la firma cuando estés listo.

07 · Alternativas cercanas

El resto del buzón.

El chat en la aplicación es una puerta de entrada a las funciones de inrelay; estas son en las que se apoya.

Empieza hoy

Tu aplicación, con atención integrada.

Empieza gratis con tu propio buzón — todas las funciones, sin tarjeta, nunca por usuario.

Preguntas y respuestas.

¿Tengo que añadir una dependencia a mi aplicación?
No. No hay paquete de inrelay para iOS, Android, React Native o Flutter: abres una URL en la WebView que tu plataforma ya incluye. Nada que actualizar y ninguna versión nuestra que mantener a la par con la tuya.
¿Qué ocurre si no paso ningún parámetro?
El chat funciona. El visitante es anónimo, su conversación se mantiene en ese dispositivo y el propio chat le pide un correo si tu formulario de clientes potenciales está activado, por lo que la respuesta aún puede llegarle.
¿Alguien puede leer una conversación si adivina un token?
Con la verificación desactivada, cualquiera que tenga un token_id válido puede reanudar esa conversación; por eso los tokens deben ser largos y aleatorios, y por eso existe el interruptor de verificación. Al activarla, un token sin firmar se ignora por completo.
¿El cliente recibe una notificación push cuando respondemos?
En esta versión no. Las respuestas les llegan por correo mientras la aplicación está cerrada y la conversación les espera cuando vuelven a abrir la atención. Las notificaciones push en la aplicación requerirían un SDK, que es exactamente lo que este enfoque evita de forma deliberada.
¿El chat en la aplicación está en todos los planes?
Sí. Es el mismo chat en vivo que ya tienes, ofrecido como una página: no hay complemento móvil ni tarifa por conversación.

Empieza a gestionar tus mensajes directos.

Ofrece a tus clientes respuestas más rápidas y devuelve a tu equipo sus tardes libres.

Escritorio y móvil. Gratis para uso individual.