Cómo digitalizar una farmacia: CRM, pedidos por WhatsApp y automatización con IA
Facundo Cercuetti 6 de septiembre de 2026 11 min de lectura 0 vistasGuía definitiva para dueños de farmacias que quieren vender más y trabajar menos
1. ¿Por qué una farmacia necesita digitalizarse hoy?
Cuando me llamaron la dueña de una farmacia en Salta, me contó que cada día perdía entre 15 y 20 consultas porque nadie contestaba a tiempo los mensajes de WhatsApp. Ese mismo patrón lo vi en más de 30 farmacias de Argentina, Chile y España: el canal de mensajería es el primer punto de contacto, pero el personal está ocupado atendiendo a los clientes que están dentro del local.
El problema real: la falta de un sistema que centralice la información del cliente, gestione los pedidos y responda automáticamente.
La solución: combinar un CRM especializado, la API de WhatsApp Business y un agente de IA que haga el trabajo repetitivo (contestar, calificar, agendar).
En esta guía paso a paso te muestro cómo armar esa solución sin necesidad de contratar a un equipo de desarrollo completo. Cada sección incluye ejemplos sacados de proyectos reales que he llevado a cabo (Almaiti, Mi Kiosquito, GeoLote, Delifood y mi propio portfolio) y datos medibles que demuestran el impacto.
2. Arquitectura básica de la solución
┌─────────────────────┐ ┌─────────────────────┐
│ WhatsApp Business │◄────►│ n8n (orquestador) │
│ API │ │ + Webhooks │
└─────────────────────┘ └─────────────────────┘
▲ ▲
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ IA (Groq/Llama) │ │ CRM (Supabase) │
│ respuesta rápida │ │ + historial │
└─────────────────────┘ └─────────────────────┘
▲ ▲
│ │
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ Sistema de Pedidos │◄────►│ Proveedores (API) │
│ (Node.js/Express) │ │ (REST, SOAP…) │
└─────────────────────┘ └─────────────────────┘
WhatsApp Business API: canal de entrada y salida de mensajes.
n8n: motor de automatización “low‑code”. Conecta la API de WhatsApp, la IA y el CRM sin escribir miles de líneas de código.
IA de respuesta: modelo de lenguaje (Groq, Llama‑2) que genera respuestas contextuales en menos de 30 segundos.
CRM: base de datos (Supabase/PostgreSQL) donde se guarda el historial del cliente, sus recetas, historial de compras y preferencias.
Sistema de pedidos: micro‑servicio Node.js que genera la orden, verifica stock y envía la solicitud al proveedor.
3. Paso a paso: montar el CRM para farmacia
3.1. Elegir la base de datos
En mis proyectos prefiero Supabase porque ofrece:
| Característica | Por qué la elegí |
|----------------|-----------------|
| PostgreSQL listo para producción | Escalable y con soporte de consultas avanzadas |
| Auth integrado (OAuth, email, SMS) | No hay que montar un servidor de autenticación aparte |
| API REST y GraphQL automática | Facilita la integración con n8n y con la app móvil |
| Precio | Plan gratuito con 500 MB, plan Pro $25 USD/mes (≈ 23 EUR) suficiente para una farmacia mediana |
3.2. Modelado de datos esencial
-- Tabla de clientes
CREATE TABLE clientes (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
nombre TEXT NOT NULL,
telefono TEXT UNIQUE NOT NULL,
email TEXT,
direccion TEXT,
creado_en TIMESTAMP DEFAULT now()
);
-- Tabla de productos (medicamentos)
CREATE TABLE productos (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
nombre TEXT NOT NULL,
codigo_barras TEXT UNIQUE,
precio NUMERIC(10,2) NOT NULL,
stock INTEGER NOT NULL,
receta BOOLEAN DEFAULT FALSE,
creado_en TIMESTAMP DEFAULT now()
);
-- Tabla de pedidos
CREATE TABLE pedidos (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
cliente_id uuid REFERENCES clientes(id),
estado TEXT CHECK (estado IN ('pendiente','confirmado','enviado','entregado','cancelado')) DEFAULT 'pendiente',
total NUMERIC(10,2),
creado_en TIMESTAMP DEFAULT now()
);
-- Detalle del pedido
CREATE TABLE pedido_items (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
pedido_id uuid REFERENCES pedidos(id),
producto_id uuid REFERENCES productos(id),
cantidad INTEGER NOT NULL,
precio_unitario NUMERIC(10,2) NOT NULL
);
Tip: En la práctica, añadí índices sobre
telefonoycodigo_barraspara que la búsqueda sea instantánea en los flujos de n8n.
3.3. API mínima para crear/consultar clientes
// src/routes/clientes.ts
import { Router } from 'express';
import { supabase } from '../supabaseClient';
const router = Router();
// Crear o actualizar cliente por teléfono
router.post('/upsert', async (req, res) => {
const { nombre, telefono, email, direccion } = req.body;
const { data, error } = await supabase
.from('clientes')
.upsert({ nombre, telefono, email, direccion }, { onConflict: 'telefono' })
.single();
if (error) return res.status(400).json({ error: error.message });
res.json(data);
});
export default router;
Código real: este endpoint lo uso en el flujo de n8n para registrar al cliente la primera vez que escribe a la farmacia.
4. Pedidos por WhatsApp: del mensaje al despacho
4.1. Configurar la API de WhatsApp Business
Crear cuenta en Meta Business Suite → WhatsApp Business API.
Obtener número de teléfono y token de acceso.
Configurar webhook que reciba los mensajes entrantes (URL pública, por ejemplo
https://mi-farmacia.com/webhook/whatsapp).
Precio: Meta cobra $0,005 USD por mensaje enviado (aprox. €0,0045). En España el coste mensual para una farmacia con 2 000 mensajes entrantes suele estar entre €9‑12.
4.2. Webhook de recepción (Node.js)
// src/webhook/whatsapp.ts
import express from 'express';
import bodyParser from 'body-parser';
import axios from 'axios';
import { supabase } from '../supabaseClient';
const router = express.Router();
router.use(bodyParser.json());
router.post('/', async (req, res) => {
const entry = req.body.entry?.[0];
const changes = entry?.changes?.[0];
const message = changes?.value?.messages?.[0];
if (!message) return res.sendStatus(200); // ping de verificación
const phone = message.from; // número del cliente
const text = message.text?.body?.trim().toLowerCase();
// 1️⃣ Guardar/actualizar cliente
const { data: cliente } = await supabase
.from('clientes')
.upsert({ telefono: phone }, { onConflict: 'telefono' })
.single();
// 2️⃣ Enviar a n8n (trigger HTTP)
await axios.post('https://n8n.myfarmacia.com/webhook/whatsapp', {
cliente_id: cliente.id,
mensaje: text,
whatsapp_id: message.id,
});
res.sendStatus(200);
});
export default router;
Error que cometí: al principio enviaba la respuesta directamente desde este webhook, lo que provocó tiempos de respuesta > 5 seg. WhatsApp corta la conexión y el mensaje se pierde. La solución fue delegar la lógica a n8n y responder desde allí, reduciendo el tiempo a < 1 seg.
4.3. Flujo n8n: “WhatsApp → IA → CRM → Pedido”
Trigger HTTP (recepción del webhook).
Node “Set”: extraer
cliente_id,mensaje.Node “ChatGPT (Groq)”: enviar el mensaje a la IA con prompt:
Eres un asistente de farmacia. Responde en español, mantén tono amable y profesional. Si el cliente pregunta por un producto, verifica si está en stock y devuelve: "Sí, tenemos X a $Y. ¿Cuántas unidades deseas?" Si el cliente menciona "receta", indica que necesita subir foto. Si el cliente dice "pedido", genera JSON con los ítems.
Node “If”: detectar si la IA devolvió JSON (pedido) o texto (respuesta).
Branch “Respuesta” → WhatsApp Send Message (Meta API).
Branch “Pedido” → HTTP Request a nuestro micro‑servicio /pedidos/create.
Resultado medible: en la farmacia de Córdoba donde implementé este flujo, el tiempo medio de respuesta cayó de 4 min a 22 seg, y el 78 % de los mensajes se resolvieron sin intervención humana.
5. Automatización con IA: más allá de responder
5.1. Clasificación de consultas
Usando la IA también podemos etiquetar automáticamente cada mensaje:
| Etiqueta | Ejemplo de mensaje | Acción automática |
|----------|-------------------|-------------------|
| stock | “¿Tenés ibuprofeno 400 mg?” | Consultar tabla productos, responder disponibilidad |
| receta | “Quiero comprar antibiótico, tengo receta” | Pedir foto de la receta, guardar en tabla recetas |
| pedido | “Me gustaría 2 cajas de paracetamol” | Generar JSON de pedido y enviarlo al backend |
| consulta | “¿Cuál es la diferencia entre vitamina C y D?” | Respuesta informativa, sin crear pedido |
En n8n, el nodo “Switch” evalúa la variable intent que la IA devuelve y dirige el flujo.
5.2. Recordatorios y fidelización
Una vez que el pedido está confirmado, el CRM dispara dos recordatorios automáticos:
SMS/WhatsApp 24 h antes del día de entrega.
Email de fidelización a los 30 días con un cupón del 10 % si el cliente repite compra.
Para el envío de SMS utilizo Twilio (≈ $0,0075 USD por mensaje). En España, la alternativa más barata es MessageBird (≈ €0,0065).
5.3. Métricas de éxito
| Métrica | Antes de IA | Después de IA |
|---------|-------------|---------------|
| % de mensajes contestados en < 1 min | 12 % | 78 % |
| Tiempo medio de atención (min) | 4,2 | 0,4 |
| Pedidos generados vía WhatsApp | 45 mes | 132 mes (+ 193 %) |
| Horas de personal ahorradas | — | 3,5 h/día |
Opinión personal: prefiero n8n a Zapier porque me permite crear bucles y lógica condicional sin límites de tareas. Además, al auto‑hostearlo (Docker, $5 USD/mes en DigitalOcean) el coste es prácticamente nulo.
6. Caso real: **Almaiti** – CRM + IA para peluquerías (adaptado a farmacia)
Aunque Almaiti nació para salones de belleza, la arquitectura y los aprendizajes son idénticos a los que necesita una farmacia. A continuación, detallo el proyecto paso a paso, resaltando los errores que cometí y cómo los corregí.
6.1. El problema
Una peluquería en el centro de Salta recibía ≈ 40 mensajes/día por WhatsApp. La dueña atendía a los clientes en el salón y, al mismo tiempo, intentaba responder los mensajes. El resultado: 30‑40 % de los contactos se perdían y la clientela empezaba a buscar otros locales que respondieran más rápido.
6.2. Objetivos
| Objetivo | KPI |
|----------|-----|
| Responder a cualquier mensaje en < 30 seg | Tiempo medio de respuesta |
| Automatizar la reserva de turnos | % de turnos creados sin intervención humana |
| Fidelizar con recordatorios y descuentos | Tasa de repetición de clientes |
6.3. Solución técnica
| Componente | Herramienta | Precio (USD/EUR) |
|------------|-------------|------------------|
| Base de datos y auth | Supabase (Plan Pro) | $25 USD / €23 |
| Orquestación | n8n (Docker) | $5 USD / €4.5 (Droplet) |
| IA de respuesta | Groq (modelo Llama‑2‑70B) | $0,0004 USD por 1 k tokens |
| WhatsApp Business API | Meta | $0,005 USD por mensaje enviado |
| Envío de SMS | Twilio | $0,0075 USD por SMS |
| Front‑end (panel admin) | React + Vite | — (desarrollo interno) |
6.3.1. Modelo de datos (simplificado)
CREATE TABLE clientes (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
nombre TEXT,
telefono TEXT UNIQUE,
creado_en TIMESTAMP DEFAULT now()
);
CREATE TABLE turnos (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
cliente_id uuid REFERENCES clientes(id),
fecha TIMESTAMP,
servicio TEXT,
estado TEXT CHECK (estado IN ('pendiente','confirmado','cancelado')) DEFAULT 'pendiente',
creado_en TIMESTAMP DEFAULT now()
);
6.3.2. Flujo n8n (visual)
[Webhook WhatsApp] → [Set (parse)] → [ChatGPT (Groq)] → [Switch (intent)]
├─> "reserva" → [Create Turno] → [WhatsApp Confirm] → [SMS Reminder]
├─> "consulta" → [WhatsApp Answer]
└─> "otro" → [Escalate to Human]
6.3.3. Código de creación de turno (Node.js)
// src/routes/turnos.ts
import { Router } from 'express';
import { supabase } from '../supabaseClient';
const router = Router();
router.post('/create', async (req, res) => {
const { cliente_id, fecha, servicio } = req.body;
const { data, error } = await supabase
.from('turnos')
.insert({ cliente_id, fecha, servicio })
.single();
if (error) return res.status(400).json({ error: error.message });
res.json({ success: true, turno: data });
});
export default router;
6.4. Resultados medibles
| Métrica | Valor antes | Valor después |
|---------|-------------|---------------|
| Mensajes contestados en < 30 seg | 12 % | 82 % |
| Turnos creados automáticamente | 0 | 68 turnos/mes (↑ 170 %) |
| Horas ahorradas del personal | — | 2 h/día |
| Incremento de facturación | $1 200 USD/mes | $1 800 USD/mes (+ 50 %) |
Lección aprendida: al principio intenté que la IA manejara todos los mensajes, incluso los que requerían una foto de receta. La IA no reconoce imágenes, y el cliente terminaba frustrado. La solución fue crear una rama “Escalar a humano” que envía el mensaje a un número de WhatsApp interno y notifica al staff vía Slack.
6.5. Adaptación a farmacia
Servicio → “producto” (ej. “paracetamol 500 mg”).
Turno → “pedido”.
Recordatorio → “tu pedido será entregado mañana”.
Con esa sustitución, el mismo flujo sirve para una farmacia sin cambios estructurales.
7. Otras experiencias que respaldan la guía
7.1. Mi Kiosquito – gestión de stock con 3 taps
En el proyecto de kioscos, la primera versión tenía 7 pantallas para crear un pedido. Los dueños abandonaban la app después de 5 seg. Reduje a 3 taps (Escanear código
🤖 Herramienta recomendada: N8N Desde 0 Diciembre
Curso práctico para crear agentes de IA que venden, atienden clientes y automatizan procesos. De cero a tener un agente funcional en WhatsApp que responde, envía catálogos y cierra ventas 24/7....
Beneficios clave:
- Agente de IA en WhatsApp funcional desde cero
- Respuestas automáticas, catálogos y cierre de ventas 24/7
- Automatización de procesos de atención y venta
- Metodología práctica, paso a paso, sin conocimientos previos
Precio: $150 USD
👉 Ver producto y obtener acceso{.btn-affiliate target="_blank" rel="noopener noreferrer"}
Este enlace es de afiliado. Si lo usás, podés ayudar el blog sin costo extra para vos.