AzterDocs

Integraciones

Conectar tu tienda

Azter atiende mejor cuando conoce el catálogo, los pedidos y lo que cada visitante hace en tu sitio. Esta guía explica qué enviar y cómo, con WooCommerce o con un desarrollo propio.

Dos caminos

  • Tienda WooCommerce: conecta la tienda desde el panel (Canales → WooCommerce). El catálogo, los pedidos y los compradores llegan solos. Solo necesitas enviar los eventos del sitio.
  • Tienda WooCommerce con frontend propio (headless): igual que la anterior. Los datos salen de WooCommerce; tu frontend envía los eventos del sitio y, si quieres, recibe el carrito conversacional.
  • Desarrollo propio sin plataforma conocida: envía todo por el conector — eventos, pedidos, clientes y catálogo.

Qué recibe el agente

Con el catálogo responde precios, stock, tallas y colores. Con los pedidos responde estado, entrega y seguimiento del cliente que le escribe. Con los eventos del sitio se pueden activar seguimientos de carrito y pago pendiente.

El conector y la firma

Un conector identifica a tu tienda y trae un secreto. Se crea desde el panel (Integraciones → Integración personalizada). Todas las llamadas de esta guía van al mismo endpoint, con la misma firma, y siempre desde tu servidor: el secreto nunca llega al navegador.

Llamada firmada
1POST https://jvmpkvslwwnrijdnuxxq.supabase.co/functions/v1/commerce-intake
2Content-Type: application/json
3X-Azter-Connector-Id: <id del conector>
4X-Azter-Timestamp: <hora Unix en milisegundos>
5X-Azter-Signature: hex(HMAC_SHA256(secreto, timestamp + "." + cuerpo_crudo))
  • La firma se calcula sobre el cuerpo exacto que envías, no sobre un JSON reserializado.
  • El timestamp se acepta con cinco minutos de diferencia.
  • La empresa a la que pertenecen los datos sale del conector, nunca del cuerpo.

Eventos del sitio

Avisa lo que hace cada visitante. Los eventos son product_viewed, add_to_cart, checkout_started, checkout_abandoned y cart_abandoned.

Checkout iniciado
1{
2 "event": "checkout_started",
3 "event_id": "c7b0e2c4-1f0a-4d7e-9a53-2b6f0c1d8e44",
4 "occurred_at": "2026-10-07T15:30:00-03:00",
5 "visitor_id": "0f9d1c7e-5a53-4c0e-9d61-3b1c2a7f8e10",
6 "contact": {
7 "email": "cliente@ejemplo.cl",
8 "phone_e164": "+56912345678",
9 "name": "Nombre Apellido"
10 },
11 "cart": {
12 "cart_id": "9a3e6d52-77c1-4b8e-b0a4-5d2f1e3c6a90",
13 "currency": "CLP",
14 "total": 25980,
15 "items": [
16 {
17 "product_id": "123",
18 "sku": "PK-01",
19 "name": "Producto",
20 "qty": 2,
21 "price": 12990
22 }
23 ],
24 "recovery_url": "https://shop.example/carrito?recover=9a3e6d52"
25 }
26}

Cuatro reglas para que sirvan

  • visitor_id en todos los eventos: un identificador anónimo y estable por navegador (cookie propia, por ejemplo un UUID). Nunca un dato personal.
  • Un solo cart_id por carrito, desde el primer producto agregado hasta el checkout o el abandono.
  • Envía contact (email o teléfono en formato +569…) apenas el visitante lo escriba. Con un evento identificado, Azter une a ese contacto la navegación anterior de ese navegador y la siguiente.
  • Avisa un abandono solo si el pedido sigue sin pago después de una espera real. Sugerimos 60 minutos desde la última actividad.

event_id identifica cada evento: reenviar el mismo no duplica. Si el visitante autorizó mensajes, envía whatsapp_consent con granted, timestamp y source.

Pedidos

Solo para desarrollos propios

Si tu tienda es WooCommerce, los pedidos ya llegan por la conexión de la tienda. No los envíes por aquí.
Pedido
1{
2 "resource": "order",
3 "customer": {
4 "email": "cliente@ejemplo.cl",
5 "phone_e164": "+56912345678",
6 "name": "Nombre Apellido"
7 },
8 "order": {
9 "id": "A-100",
10 "number": "100",
11 "status": "paid",
12 "status_label": "En preparación",
13 "created_at": "2026-10-07T10:00:00-03:00",
14 "currency": "CLP",
15 "total": 25980,
16 "shipping_method": "Despacho a domicilio",
17 "tracking": [
18 {
19 "carrier": "Starken",
20 "number": "TRK-1"
21 }
22 ],
23 "items": [
24 {
25 "name": "Polera Rosa",
26 "quantity": 2,
27 "sku": "POL-R",
28 "variant": "4T / Rosa"
29 }
30 ]
31 }
32}
  • Obligatorios: order.id, order.status, order.total y customer.email o customer.phone_e164.
  • status: pending, paid, fulfilled, cancelled o refunded. status_label es el texto propio de tu tienda que verá el agente.
  • Envía el pedido al crearlo y en cada cambio de estado. Es un reemplazo por order.id: repetirlo no duplica.
  • Un pedido de los últimos siete días avisa a las automatizaciones; uno más antiguo se guarda sin avisar. Así puedes cargar tu historial.
  • No envíes dirección, documentos de identidad ni datos de pago.

Clientes

Cliente
1{
2 "resource": "customer",
3 "customer": {
4 "email": "cliente@ejemplo.cl",
5 "phone_e164": "+56912345678",
6 "name": "Nombre Apellido"
7 }
8}

Crea el contacto o completa lo que falta, sin reemplazar datos que ya existen. Tener un contacto no autoriza a escribirle: el consentimiento se registra aparte.

Producto con variantes
1{
2 "resource": "product",
3 "product": {
4 "id": "P-1",
5 "name": "Polera Rosa",
6 "sku": "POL",
7 "description": "Algodón",
8 "status": "active",
9 "url": "https://shop.example/p/polera",
10 "images": [
11 "https://shop.example/a.jpg"
12 ],
13 "category": "Poleras",
14 "currency": "CLP",
15 "variants": [
16 {
17 "id": "V-1",
18 "sku": "POL-4T",
19 "price": 12990,
20 "compare_at_price": 15990,
21 "stock": 3,
22 "options": {
23 "Talla": "4T",
24 "Color": "Rosa"
25 }
26 }
27 ]
28 }
29}
  • Obligatorios: product.id, product.name y el precio (en cada variante, o en el producto si no tiene variantes).
  • stock: null significa stock no gestionado; 0 significa sin stock.
  • Envía el producto completo en cada cambio: las variantes que ya no vengan se eliminan.
  • Para retirarlo: { "resource": "product", "deleted": true, "product": { "id": "P-1" } }.
  • El SKU es único por empresa; uno repetido se rechaza con un error claro.

Carrito conversacional

El agente puede armar una selección en el chat y entregarla a tu checkout con un enlace firmado. Tu tienda verifica la firma, carga el carrito y continúa con su flujo de compra habitual. El contrato está en la guía de Carritos y checkout (/docs/checkout), publicada como preview: esa capacidad todavía no está activa.

Respuestas y reintentos

text
1200 aceptado — el cuerpo indica qué se creó o actualizó
2400 cuerpo inválido — el campo error explica el motivo
3401 firma, timestamp o conector inválidos
4403 conector deshabilitado
5500 error de Azter — reintenta con el mismo cuerpo

Todo es idempotente: ante una duda, reenvía. Los eventos se deduplican por event_id; los pedidos, clientes y productos por su identificador en tu tienda.