Contenido del curso
Integración con la API de WhatsApp
Implementación de Servidor Express
Comunicación con la API de WhatsApp
Flujos de Interacción con la API de WhatsApp
Multimedia con WhatsApp API
Avances y Personalización
- 19

Integración de Google Sheets API para Guardar Datos del Bot
07:33 min - 20

Integración de Google Sheets con Node.js para Reservas Automáticas
18:34 min - 21

Conectar tu bot de WhatsApp con la API de OpenAI
08:50 min - 22

Integración de ChatGPT en Flujo de Mensajería con WhatsApp
10:40 min - 23

Enviar contacto de WhatsApp en emergencias
Viendo ahora - 24

Envío de ubicación con mapa en WhatsApp
09:54 min - 25

Refactor DRY en WhatsApp Service
11:03 min - 26

Despliegue de Bots de WhatsApp en Railway con Integración de GitHub
14:29 min - 27

Publicación y configuración de aplicaciones con API de WhatsApp
22:50 min - 28

Creación de Bots en WhatsApp: Domina la API y Optimiza Tu Negocio
02:52 min
Enviar contacto de WhatsApp en emergencias
Resumen
Cuando un bot detecta una emergencia veterinaria, lo que el usuario necesita no es más texto: necesita un teléfono al que llamar. Aquí aprendes a programar el envío automático de una tarjeta de contacto desde WhatsApp Cloud API usando Node.js, integrando la lógica con un flujo conversacional impulsado por GPT.
Esta guía es útil si estás construyendo un asistente con WhatsApp Business API y quieres que, ante ciertas intenciones del usuario, tu bot dispare recursos accionables como un contacto telefónico listo para guardar.
¿Cómo se estructura el envío de un contacto en WhatsApp Cloud API?
La API de WhatsApp permite enviar distintos tipos de mensajes: texto, multimedia, ubicación y también contactos. Para este caso, el type que necesitas en el payload deja de ser text y pasa a ser contacts [01:46].
Dentro de whatsappService.js creamos una nueva función asíncrona llamada sendContactMessage, que recibe dos parámetros: el destinatario (to) y el objeto de contacto. La lógica reutiliza el mismo Axios request que ya teníamos para mensajes, envuelto en un try/catch para manejar errores.
js
async sendContactMessage(to, contact) {
try {
await axios({
method: 'POST',
url: https://graph.facebook.com/v17.0/${process.env.PHONE_ID}/messages,
headers: {
Authorization: Bearer ${process.env.API_TOKEN},
},
data: {
messaging_product: 'whatsapp',
to,
type: 'contacts',
contacts: [contact]
}
});
} catch (error) {
console.error(error);
}
}
La clave está en que contacts es un arreglo, y dentro va el objeto con toda la información del contacto.
¿Qué tipo de mensaje uso para enviar un contacto en WhatsApp API? Debes usar
type: "contacts"en el payload, y enviar la información dentro de un arreglocontacts. No es lo mismo que enviar texto plano con un número.
¿Qué información debe incluir el objeto de contacto?
El objeto de contacto sigue un patrón estándar definido por Meta. Incluye campos como dirección, fecha de nacimiento, emails, nombre, organización, teléfonos y URL del sitio web [03:18].
No todos los campos son obligatorios. Para una clínica veterinaria, lo realmente útil es:
- El nombre de la organización (la clínica).
- Los números de teléfono, incluyendo el principal y el de WhatsApp.
- El email de contacto.
- La URL del sitio web, si existe.
Puedes omitir datos como fecha de nacimiento porque no aportan al caso de uso. Lo importante es que el usuario reciba una vCard funcional que pueda guardar en su agenda con un toque.
¿Dónde se construye este objeto dentro del bot?
En el archivo messageHandler.js creamos una función sendContact(to) que arma el objeto y lo envía al servicio:
js async sendContact(to) { const contact = { name: { formatted_name: 'Clínica Veterinaria', first_name: 'Clínica' }, phones: [{ phone: '+1234567890', type: 'WORK', wa_id: '1234567890' }], emails: [{ email: 'contacto@clinica.com', type: 'WORK' }], urls: [{ url: 'https://clinica.com', type: 'WORK' }] }; await whatsappService.sendContactMessage(to, contact); }
¿Cómo conectar el flujo de emergencia con el envío del contacto?
Dentro del controlador del menú, capturamos las acciones que el usuario selecciona: agendar, consultar, ubicación. Ahora sumamos una nueva: emergencia [04:42].
Cuando GPT detecta que la consulta es urgente (por ejemplo, "mi perro no come y lleva dos días vomitando") y el usuario hace clic en el botón de emergencia, el bot responde con un mensaje del assistant y dispara sendContact.
js case 'emergencia': const response = 'Si esto es una emergencia, te invitamos a llamar a nuestra línea de atención.'; await this.sendMessage(to, response); await this.sendContact(to); break;
Al probarlo, el usuario recibe la vCard en el chat. Al tocarla, WhatsApp muestra el teléfono, el correo, la dirección y la opción de guardar el contacto directamente en la agenda del móvil.
¿Por qué falla mi case en el switch aunque el texto coincide? Probablemente hay diferencia de mayúsculas. Si envías
Emergenciacon E mayúscula y validas conemergenciaen minúscula, el case nunca matchea. Lo más robusto es validar por ID, no por texto.
¿Por qué validar opciones del menú por ID y no por texto?
Durante la prueba aparece un bug sutil: el bot devuelve un mensaje que no corresponde. La causa es que la respuesta llega con E mayúscula (Emergencia) pero el case del switch está escrito en minúscula [07:32].
Validar por texto rompe el flujo apenas cambias una letra, traduces el mensaje o lo personalizas. La práctica correcta es asignar un ID único a cada botón interactivo y hacer el switch sobre ese ID. Así, aunque cambies el copy de "Emergencia" a "Llamar ahora", la lógica sigue funcionando.
Esto separa la capa de presentación de la capa de lógica, un principio básico al construir bots conversacionales escalables.
¿Ya implementaste tu propio flujo de emergencia? Cuéntame en los comentarios cómo estás validando las opciones del menú en tu bot.